test for git's "Fix big left-shifts of unsigned char" delta bug
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
diff --git a/include/got_error.h b/include/got_error.h
index 83ea51a..4376f1b 100644
--- a/include/got_error.h
+++ b/include/got_error.h
@@ -61,6 +61,7 @@
#define GOT_ERR_ITER_NEED_MORE 45
#define GOT_ERR_ITER_COMPLETED 46
#define GOT_ERR_RANGE 47
+#define GOT_ERR_EXPECTED 48 /* for use in regress tests only */
static const struct got_error {
int code;
@@ -110,6 +111,7 @@ static const struct got_error {
{ GOT_ERR_ITER_NEED_MORE,"more items needed to continue iteration" },
{ GOT_ERR_ITER_COMPLETED,"iteration completed" },
{ GOT_ERR_RANGE, "value out of range" },
+ { GOT_ERR_EXPECTED, "expected an error but have no error" },
};
/*
diff --git a/regress/delta/delta_test.c b/regress/delta/delta_test.c
index 09019b9..21e8c3d 100644
--- a/regress/delta/delta_test.c
+++ b/regress/delta/delta_test.c
@@ -34,16 +34,21 @@
struct delta_test {
const char *base;
+ size_t base_len;
const char *delta;
size_t delta_len;
const char *expected;
+ size_t result_len;
} delta_tests[] = {
/* base len 0, target len 4, append 4 'x' */
- { "", "\x00\x04\x04xxxx", 7, "xxxx" },
+ { "", 0, "\x00\x04\x04xxxx", 7, "xxxx", 4 },
/* copy 4 bytes at offset 0 from base, append 4 'x' */
- { "aabbccdd", "\x08\x08\x90\x04\x04xxxx", 9, "aabbxxxx" },
+ { "aabbccdd", 8, "\x08\x08\x90\x04\x04xxxx", 9, "aabbxxxx", 8 },
/* copy 4 bytes at offset 4 from base, append 4 'x' */
- { "aabbccdd", "\x08\x08\x91\x04\x04\x04xxxx", 10, "ccddxxxx" },
+ { "aabbccdd", 8, "\x08\x08\x91\x04\x04\x04xxxx", 10, "ccddxxxx", 8 },
+ /* git 48fb7deb5 Fix big left-shifts of unsigned char, 2009-06-17) */
+ { "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+ 16, "\x10\x10\xff\xff\xff\xff\xff\x10\00\00", 10 , NULL, 0 }
};
static int
@@ -61,36 +66,45 @@ delta_apply(void)
struct delta_test *dt = &delta_tests[i];
FILE *base_file;
char buf[1024];
- size_t n, len, result_len;
+ size_t n, result_len;
- len = strlen(dt->base);
base_file = got_opentemp();
if (base_file == NULL) {
err = got_error_from_errno();
break;
}
- n = fwrite(dt->base, 1, len, base_file);
- if (n != len) {
+ n = fwrite(dt->base, 1, dt->base_len, base_file);
+ if (n != dt->base_len) {
err = got_ferror(base_file, GOT_ERR_IO);
break;
}
rewind(base_file);
err = got_delta_apply(base_file, dt->delta, dt->delta_len,
- result_file, &len);
+ result_file, &result_len);
fclose(base_file);
- if (err)
- break;
- result_len = strlen(dt->expected);
- if (result_len != len) {
- err = got_ferror(result_file, GOT_ERR_BAD_DELTA);
- break;
- }
- n = fread(buf, result_len, 1, result_file);
- if (n != 1 || strncmp(buf, dt->expected, result_len) != 0) {
- err = got_ferror(result_file, GOT_ERR_BAD_DELTA);
- break;
+ if (dt->expected == NULL) {
+ /* Invalid delta, expect an error. */
+ if (err == NULL)
+ err = got_error(GOT_ERR_EXPECTED);
+ else if (err->code == GOT_ERR_BAD_DELTA)
+ err = NULL;
+ } else {
+ if (err)
+ break;
+ if (result_len != dt->result_len) {
+ err = got_ferror(result_file,
+ GOT_ERR_BAD_DELTA);
+ break;
+ }
+ n = fread(buf, result_len, 1, result_file);
+ if (n != 1 ||
+ strncmp(buf, dt->expected, result_len) != 0) {
+ err = got_ferror(result_file,
+ GOT_ERR_BAD_DELTA);
+ break;
+ }
}
rewind(result_file);
}