Skip to content

Commit

Permalink
Merge branch 'cc/test-oidmap' into jch
Browse files Browse the repository at this point in the history
Extend the test coverage a bit.

* cc/test-oidmap:
  test-hashmap: remove 'hash' command
  oidmap: use sha1hash() instead of static hash() function
  t: add t0016-oidmap.sh
  t/helper: add test-oidmap.c
  • Loading branch information
gitster committed Jun 26, 2019
2 parents 7d4913e + a1100d2 commit 0a66ac4
Show file tree
Hide file tree
Showing 8 changed files with 217 additions and 27 deletions.
1 change: 1 addition & 0 deletions Makefile
Expand Up @@ -721,6 +721,7 @@ TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o
TEST_BUILTINS_OBJS += test-match-trees.o
TEST_BUILTINS_OBJS += test-mergesort.o
TEST_BUILTINS_OBJS += test-mktemp.o
TEST_BUILTINS_OBJS += test-oidmap.o
TEST_BUILTINS_OBJS += test-online-cpus.o
TEST_BUILTINS_OBJS += test-parse-options.o
TEST_BUILTINS_OBJS += test-path-utils.o
Expand Down
13 changes: 3 additions & 10 deletions oidmap.c
Expand Up @@ -12,13 +12,6 @@ static int oidmap_neq(const void *hashmap_cmp_fn_data,
&((const struct oidmap_entry *) entry_or_key)->oid);
}

static int hash(const struct object_id *oid)
{
int hash;
memcpy(&hash, oid->hash, sizeof(hash));
return hash;
}

void oidmap_init(struct oidmap *map, size_t initial_size)
{
hashmap_init(&map->map, oidmap_neq, NULL, initial_size);
Expand All @@ -36,7 +29,7 @@ void *oidmap_get(const struct oidmap *map, const struct object_id *key)
if (!map->map.cmpfn)
return NULL;

return hashmap_get_from_hash(&map->map, hash(key), key);
return hashmap_get_from_hash(&map->map, oidhash(key), key);
}

void *oidmap_remove(struct oidmap *map, const struct object_id *key)
Expand All @@ -46,7 +39,7 @@ void *oidmap_remove(struct oidmap *map, const struct object_id *key)
if (!map->map.cmpfn)
oidmap_init(map, 0);

hashmap_entry_init(&entry, hash(key));
hashmap_entry_init(&entry, oidhash(key));
return hashmap_remove(&map->map, &entry, key);
}

Expand All @@ -57,6 +50,6 @@ void *oidmap_put(struct oidmap *map, void *entry)
if (!map->map.cmpfn)
oidmap_init(map, 0);

hashmap_entry_init(&to_put->internal_entry, hash(&to_put->oid));
hashmap_entry_init(&to_put->internal_entry, oidhash(&to_put->oid));
return hashmap_put(&map->map, to_put);
}
9 changes: 1 addition & 8 deletions t/helper/test-hashmap.c
Expand Up @@ -173,14 +173,7 @@ int cmd__hashmap(int argc, const char **argv)
p2 = strtok(NULL, DELIM);
}

if (!strcmp("hash", cmd) && p1) {

/* print results of different hash functions */
printf("%u %u %u %u\n",
strhash(p1), memhash(p1, strlen(p1)),
strihash(p1), memihash(p1, strlen(p1)));

} else if (!strcmp("add", cmd) && p1 && p2) {
if (!strcmp("add", cmd) && p1 && p2) {

/* create entry with key = p1, value = p2 */
entry = alloc_test_entry(hash, p1, p2);
Expand Down
126 changes: 126 additions & 0 deletions t/helper/test-oidmap.c
@@ -0,0 +1,126 @@
#include "test-tool.h"
#include "cache.h"
#include "oidmap.h"
#include "strbuf.h"

/* key is an oid and value is a name (could be a refname for example) */
struct test_entry {
struct oidmap_entry entry;
char name[FLEX_ARRAY];
};

#define DELIM " \t\r\n"

/*
* Read stdin line by line and print result of commands to stdout:
*
* hash oidkey -> sha1hash(oidkey)
* put oidkey namevalue -> NULL / old namevalue
* get oidkey -> NULL / namevalue
* remove oidkey -> NULL / old namevalue
* iterate -> oidkey1 namevalue1\noidkey2 namevalue2\n...
*
*/
int cmd__oidmap(int argc, const char **argv)
{
struct strbuf line = STRBUF_INIT;
struct oidmap map = OIDMAP_INIT;

setup_git_directory();

/* init oidmap */
oidmap_init(&map, 0);

/* process commands from stdin */
while (strbuf_getline(&line, stdin) != EOF) {
char *cmd, *p1 = NULL, *p2 = NULL;
struct test_entry *entry;
struct object_id oid;

/* break line into command and up to two parameters */
cmd = strtok(line.buf, DELIM);
/* ignore empty lines */
if (!cmd || *cmd == '#')
continue;

p1 = strtok(NULL, DELIM);
if (p1)
p2 = strtok(NULL, DELIM);

if (!strcmp("add", cmd) && p1 && p2) {

if (get_oid(p1, &oid)) {
printf("Unknown oid: %s\n", p1);
continue;
}

/* create entry with oidkey from p1, value = p2 */
FLEX_ALLOC_STR(entry, name, p2);
oidcpy(&entry->entry.oid, &oid);

/* add to oidmap */
oidmap_put(&map, entry);

} else if (!strcmp("put", cmd) && p1 && p2) {

if (get_oid(p1, &oid)) {
printf("Unknown oid: %s\n", p1);
continue;
}

/* create entry with oid_key = p1, name_value = p2 */
FLEX_ALLOC_STR(entry, name, p2);
oidcpy(&entry->entry.oid, &oid);

/* add / replace entry */
entry = oidmap_put(&map, entry);

/* print and free replaced entry, if any */
puts(entry ? entry->name : "NULL");
free(entry);

} else if (!strcmp("get", cmd) && p1) {

if (get_oid(p1, &oid)) {
printf("Unknown oid: %s\n", p1);
continue;
}

/* lookup entry in oidmap */
entry = oidmap_get(&map, &oid);

/* print result */
puts(entry ? entry->name : "NULL");

} else if (!strcmp("remove", cmd) && p1) {

if (get_oid(p1, &oid)) {
printf("Unknown oid: %s\n", p1);
continue;
}

/* remove entry from oidmap */
entry = oidmap_remove(&map, &oid);

/* print result and free entry*/
puts(entry ? entry->name : "NULL");
free(entry);

} else if (!strcmp("iterate", cmd)) {

struct oidmap_iter iter;
oidmap_iter_init(&map, &iter);
while ((entry = oidmap_iter_next(&iter)))
printf("%s %s\n", oid_to_hex(&entry->entry.oid), entry->name);

} else {

printf("Unknown command %s\n", cmd);

}
}

strbuf_release(&line);
oidmap_free(&map, 1);
return 0;
}
1 change: 1 addition & 0 deletions t/helper/test-tool.c
Expand Up @@ -35,6 +35,7 @@ static struct test_cmd cmds[] = {
{ "match-trees", cmd__match_trees },
{ "mergesort", cmd__mergesort },
{ "mktemp", cmd__mktemp },
{ "oidmap", cmd__oidmap },
{ "online-cpus", cmd__online_cpus },
{ "parse-options", cmd__parse_options },
{ "path-utils", cmd__path_utils },
Expand Down
1 change: 1 addition & 0 deletions t/helper/test-tool.h
Expand Up @@ -25,6 +25,7 @@ int cmd__lazy_init_name_hash(int argc, const char **argv);
int cmd__match_trees(int argc, const char **argv);
int cmd__mergesort(int argc, const char **argv);
int cmd__mktemp(int argc, const char **argv);
int cmd__oidmap(int argc, const char **argv);
int cmd__online_cpus(int argc, const char **argv);
int cmd__parse_options(int argc, const char **argv);
int cmd__path_utils(int argc, const char **argv);
Expand Down
9 changes: 0 additions & 9 deletions t/t0011-hashmap.sh
Expand Up @@ -9,15 +9,6 @@ test_hashmap() {
test_cmp expect actual
}

test_expect_success 'hash functions' '
test_hashmap "hash key1" "2215982743 2215982743 116372151 116372151" &&
test_hashmap "hash key2" "2215982740 2215982740 116372148 116372148" &&
test_hashmap "hash fooBarFrotz" "1383912807 1383912807 3189766727 3189766727" &&
test_hashmap "hash foobarfrotz" "2862305959 2862305959 3189766727 3189766727"
'

test_expect_success 'put' '
test_hashmap "put key1 value1
Expand Down
84 changes: 84 additions & 0 deletions t/t0016-oidmap.sh
@@ -0,0 +1,84 @@
#!/bin/sh

test_description='test oidmap'
. ./test-lib.sh

# This purposefully is very similar to t0011-hashmap.sh

test_oidmap () {
echo "$1" | test-tool oidmap $3 >actual &&
echo "$2" >expect &&
test_cmp expect actual
}


test_expect_success 'setup' '
test_commit one &&
test_commit two &&
test_commit three &&
test_commit four
'

test_expect_success 'put' '
test_oidmap "put one 1
put two 2
put invalidOid 4
put three 3" "NULL
NULL
Unknown oid: invalidOid
NULL"
'

test_expect_success 'replace' '
test_oidmap "put one 1
put two 2
put three 3
put invalidOid 4
put two deux
put one un" "NULL
NULL
NULL
Unknown oid: invalidOid
2
1"
'

test_expect_success 'get' '
test_oidmap "put one 1
put two 2
put three 3
get two
get four
get invalidOid
get one" "NULL
NULL
NULL
2
NULL
Unknown oid: invalidOid
1"
'

test_expect_success 'iterate' '
test_oidmap "put one 1
put two 2
put three 3
iterate" "NULL
NULL
NULL
$(git rev-parse two) 2
$(git rev-parse one) 1
$(git rev-parse three) 3"
'

test_done

0 comments on commit 0a66ac4

Please sign in to comment.