* [PATCH v2 1/2] sha1-array: add test-sha1-array and basic tests
@ 2014-10-01 15:00 René Scharfe
2014-10-01 15:02 ` [PATCH v2 2/2] sha1-lookup: handle duplicates in sha1_pos() René Scharfe
2014-10-01 15:19 ` [PATCH v2 1/2] sha1-array: add test-sha1-array and basic tests Jeff King
0 siblings, 2 replies; 3+ messages in thread
From: René Scharfe @ 2014-10-01 15:00 UTC (permalink / raw)
To: Git Mailing List
Cc: Junio C Hamano, Jeff King, Christian Couder, Eric Sunshine
Helped-by: Jeff King <peff@peff.net>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
---
Added a test for looking up a non-existing entry in an array that
contains duplicates, as suggested by Jeff. Changed echo20() to add
a space after the prefix as needed, as suggested by Eric.
.gitignore | 1 +
Makefile | 1 +
t/t0064-sha1-array.sh | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++
test-sha1-array.c | 34 +++++++++++++++++++++++
4 files changed, 110 insertions(+)
create mode 100755 t/t0064-sha1-array.sh
create mode 100644 test-sha1-array.c
diff --git a/.gitignore b/.gitignore
index 5bfb234..9ec40fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -199,6 +199,7 @@
/test-revision-walking
/test-run-command
/test-sha1
+/test-sha1-array
/test-sigchain
/test-string-list
/test-subprocess
diff --git a/Makefile b/Makefile
index f34a2d4..356feb5 100644
--- a/Makefile
+++ b/Makefile
@@ -568,6 +568,7 @@ TEST_PROGRAMS_NEED_X += test-revision-walking
TEST_PROGRAMS_NEED_X += test-run-command
TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
TEST_PROGRAMS_NEED_X += test-sha1
+TEST_PROGRAMS_NEED_X += test-sha1-array
TEST_PROGRAMS_NEED_X += test-sigchain
TEST_PROGRAMS_NEED_X += test-string-list
TEST_PROGRAMS_NEED_X += test-subprocess
diff --git a/t/t0064-sha1-array.sh b/t/t0064-sha1-array.sh
new file mode 100755
index 0000000..3f26e11
--- /dev/null
+++ b/t/t0064-sha1-array.sh
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+test_description='basic tests for the SHA1 array implementation'
+. ./test-lib.sh
+
+echo20() {
+ prefix="${1:+$1 }"
+ shift
+ while test $# -gt 0
+ do
+ echo "$prefix$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1"
+ shift
+ done
+}
+
+test_expect_success 'ordered enumeration' '
+ echo20 "" 44 55 88 aa >expect &&
+ {
+ echo20 append 88 44 aa 55 &&
+ echo for_each_unique
+ } | test-sha1-array >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'ordered enumeration with duplicate suppression' '
+ echo20 "" 44 55 88 aa >expect &&
+ {
+ echo20 append 88 44 aa 55 &&
+ echo20 append 88 44 aa 55 &&
+ echo for_each_unique
+ } | test-sha1-array >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'lookup' '
+ {
+ echo20 append 88 44 aa 55 &&
+ echo20 lookup 55
+ } | test-sha1-array >actual &&
+ n=$(cat actual) &&
+ test "$n" -eq 1
+'
+
+test_expect_success 'lookup non-existing entry' '
+ {
+ echo20 append 88 44 aa 55 &&
+ echo20 lookup 33
+ } | test-sha1-array >actual &&
+ n=$(cat actual) &&
+ test "$n" -lt 0
+'
+
+test_expect_success 'lookup with duplicates' '
+ {
+ echo20 append 88 44 aa 55 &&
+ echo20 append 88 44 aa 55 &&
+ echo20 lookup 55
+ } | test-sha1-array >actual &&
+ n=$(cat actual) &&
+ test "$n" -ge 2 &&
+ test "$n" -le 3
+'
+
+test_expect_success 'lookup non-existing entry with duplicates' '
+ {
+ echo20 append 88 44 aa 55 &&
+ echo20 append 88 44 aa 55 &&
+ echo20 lookup 66
+ } | test-sha1-array >actual &&
+ n=$(cat actual) &&
+ test "$n" -lt 0
+'
+
+test_done
diff --git a/test-sha1-array.c b/test-sha1-array.c
new file mode 100644
index 0000000..ddc491e
--- /dev/null
+++ b/test-sha1-array.c
@@ -0,0 +1,34 @@
+#include "cache.h"
+#include "sha1-array.h"
+
+static void print_sha1(const unsigned char sha1[20], void *data)
+{
+ puts(sha1_to_hex(sha1));
+}
+
+int main(int argc, char **argv)
+{
+ struct sha1_array array = SHA1_ARRAY_INIT;
+ struct strbuf line = STRBUF_INIT;
+
+ while (strbuf_getline(&line, stdin, '\n') != EOF) {
+ const char *arg;
+ unsigned char sha1[20];
+
+ if (skip_prefix(line.buf, "append ", &arg)) {
+ if (get_sha1_hex(arg, sha1))
+ die("not a hexadecimal SHA1: %s", arg);
+ sha1_array_append(&array, sha1);
+ } else if (skip_prefix(line.buf, "lookup ", &arg)) {
+ if (get_sha1_hex(arg, sha1))
+ die("not a hexadecimal SHA1: %s", arg);
+ printf("%d\n", sha1_array_lookup(&array, sha1));
+ } else if (!strcmp(line.buf, "clear"))
+ sha1_array_clear(&array);
+ else if (!strcmp(line.buf, "for_each_unique"))
+ sha1_array_for_each_unique(&array, print_sha1, NULL);
+ else
+ die("unknown command: %s", line.buf);
+ }
+ return 0;
+}
--
2.1.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v2 2/2] sha1-lookup: handle duplicates in sha1_pos()
2014-10-01 15:00 [PATCH v2 1/2] sha1-array: add test-sha1-array and basic tests René Scharfe
@ 2014-10-01 15:02 ` René Scharfe
2014-10-01 15:19 ` [PATCH v2 1/2] sha1-array: add test-sha1-array and basic tests Jeff King
1 sibling, 0 replies; 3+ messages in thread
From: René Scharfe @ 2014-10-01 15:02 UTC (permalink / raw)
To: Git Mailing List
Cc: Junio C Hamano, Jeff King, Christian Couder, Eric Sunshine
If the first 18 bytes of the SHA1's of all entries are the same then
sha1_pos() dies and reports that the lower and upper limits of the
binary search were the same that this wasn't supposed to happen. This
is wrong because the remaining two bytes could still differ.
Furthermore: It wouldn't be a problem if they actually were the same,
i.e. if all entries have the same SHA1. The code already handles
duplicates just fine. Simply remove the erroneous check.
Signed-off-by: Rene Scharfe <l.s.r@web.de>
---
sha1-lookup.c | 2 --
t/t0064-sha1-array.sh | 20 ++++++++++++++++++++
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/sha1-lookup.c b/sha1-lookup.c
index 2dd8515..5f06921 100644
--- a/sha1-lookup.c
+++ b/sha1-lookup.c
@@ -84,8 +84,6 @@ int sha1_pos(const unsigned char *sha1, void *table, size_t nr,
die("BUG: assertion failed in binary search");
}
}
- if (18 <= ofs)
- die("cannot happen -- lo and hi are identical");
}
do {
diff --git a/t/t0064-sha1-array.sh b/t/t0064-sha1-array.sh
index 3f26e11..dbbe2e9 100755
--- a/t/t0064-sha1-array.sh
+++ b/t/t0064-sha1-array.sh
@@ -71,4 +71,24 @@ test_expect_success 'lookup non-existing entry with duplicates' '
test "$n" -lt 0
'
+test_expect_success 'lookup with almost duplicate values' '
+ {
+ echo "append 5555555555555555555555555555555555555555" &&
+ echo "append 555555555555555555555555555555555555555f" &&
+ echo20 lookup 55
+ } | test-sha1-array >actual &&
+ n=$(cat actual) &&
+ test "$n" -eq 0
+'
+
+test_expect_success 'lookup with single duplicate value' '
+ {
+ echo20 append 55 55 &&
+ echo20 lookup 55
+ } | test-sha1-array >actual &&
+ n=$(cat actual) &&
+ test "$n" -ge 0 &&
+ test "$n" -le 1
+'
+
test_done
--
2.1.2
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2 1/2] sha1-array: add test-sha1-array and basic tests
2014-10-01 15:00 [PATCH v2 1/2] sha1-array: add test-sha1-array and basic tests René Scharfe
2014-10-01 15:02 ` [PATCH v2 2/2] sha1-lookup: handle duplicates in sha1_pos() René Scharfe
@ 2014-10-01 15:19 ` Jeff King
1 sibling, 0 replies; 3+ messages in thread
From: Jeff King @ 2014-10-01 15:19 UTC (permalink / raw)
To: René Scharfe
Cc: Git Mailing List, Junio C Hamano, Christian Couder, Eric Sunshine
On Wed, Oct 01, 2014 at 05:00:33PM +0200, René Scharfe wrote:
> Helped-by: Jeff King <peff@peff.net>
> Helped-by: Eric Sunshine <sunshine@sunshineco.com>
> Signed-off-by: Rene Scharfe <l.s.r@web.de>
> ---
> Added a test for looking up a non-existing entry in an array that
> contains duplicates, as suggested by Jeff. Changed echo20() to add
> a space after the prefix as needed, as suggested by Eric.
Both patches look good to me.
-Peff
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-10-01 15:19 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-01 15:00 [PATCH v2 1/2] sha1-array: add test-sha1-array and basic tests René Scharfe
2014-10-01 15:02 ` [PATCH v2 2/2] sha1-lookup: handle duplicates in sha1_pos() René Scharfe
2014-10-01 15:19 ` [PATCH v2 1/2] sha1-array: add test-sha1-array and basic tests Jeff King
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).