2013-04-16 23:57:21 -04:00
|
|
|
#include "includes.h"
|
2008-07-27 22:19:08 +00:00
|
|
|
|
2013-04-16 23:57:32 -04:00
|
|
|
|
|
|
|
#include "test.h"
|
2013-04-16 23:57:20 -04:00
|
|
|
static void
|
|
|
|
test0 (void) {
|
2008-07-27 22:19:08 +00:00
|
|
|
u_int32_t c = x1764_memory("", 0);
|
2013-04-16 23:59:01 -04:00
|
|
|
assert(c==~(0U));
|
2008-07-27 22:19:08 +00:00
|
|
|
struct x1764 cs;
|
|
|
|
x1764_init(&cs);
|
|
|
|
x1764_add(&cs, "", 0);
|
|
|
|
c = x1764_finish(&cs);
|
2013-04-16 23:59:01 -04:00
|
|
|
assert(c==~(0U));
|
2008-07-27 22:19:08 +00:00
|
|
|
}
|
|
|
|
|
2013-04-16 23:57:20 -04:00
|
|
|
static void
|
|
|
|
test1 (void) {
|
2008-07-28 14:55:41 +00:00
|
|
|
u_int64_t v=0x123456789abcdef0ULL;
|
2008-07-27 22:19:08 +00:00
|
|
|
u_int32_t c;
|
|
|
|
int i;
|
|
|
|
for (i=0; i<=8; i++) {
|
|
|
|
u_int64_t expect64 = (i==8) ? v : v&((1LL<<(8*i))-1);
|
|
|
|
u_int32_t expect = expect64 ^ (expect64>>32);
|
|
|
|
c = x1764_memory(&v, i);
|
|
|
|
//printf("i=%d c=%08x expect=%08x\n", i, c, expect);
|
2013-04-16 23:59:01 -04:00
|
|
|
assert(c==~expect);
|
2008-07-27 22:19:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Compute checksums incrementally, using various strides
|
2013-04-16 23:57:20 -04:00
|
|
|
static void
|
|
|
|
test2 (void) {
|
2008-07-27 22:19:08 +00:00
|
|
|
enum { N=200 };
|
|
|
|
char v[N];
|
|
|
|
int i;
|
2013-04-16 23:57:25 -04:00
|
|
|
for (i=0; i<N; i++) v[i]=(char)random();
|
2008-07-27 22:19:08 +00:00
|
|
|
for (i=0; i<N; i++) {
|
|
|
|
int j;
|
|
|
|
for (j=i; j<=N; j++) {
|
|
|
|
// checksum from i (inclusive to j (exclusive)
|
|
|
|
u_int32_t c = x1764_memory(&v[i], j-i);
|
|
|
|
// Now compute the checksum incrementally with various strides.
|
|
|
|
int stride;
|
|
|
|
for (stride=1; stride<=j-i; stride++) {
|
|
|
|
int k;
|
|
|
|
struct x1764 s;
|
|
|
|
x1764_init(&s);
|
|
|
|
for (k=i; k+stride<=j; k+=stride) {
|
|
|
|
x1764_add(&s, &v[k], stride);
|
|
|
|
}
|
|
|
|
x1764_add(&s, &v[k], j-k);
|
|
|
|
u_int32_t c2 = x1764_finish(&s);
|
|
|
|
assert(c2==c);
|
|
|
|
}
|
|
|
|
// Now use some random strides.
|
|
|
|
{
|
|
|
|
int k=i;
|
|
|
|
struct x1764 s;
|
|
|
|
x1764_init(&s);
|
|
|
|
while (1) {
|
|
|
|
stride=random()%16;
|
|
|
|
if (k+stride>j) break;
|
|
|
|
x1764_add(&s, &v[k], stride);
|
|
|
|
k+=stride;
|
|
|
|
}
|
|
|
|
x1764_add(&s, &v[k], j-k);
|
|
|
|
u_int32_t c2 = x1764_finish(&s);
|
|
|
|
assert(c2==c);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-04-16 23:57:32 -04:00
|
|
|
int
|
|
|
|
test_main (int argc __attribute__((__unused__)), const char *argv[] __attribute__((__unused__))) {
|
2008-07-27 22:19:08 +00:00
|
|
|
test0();
|
|
|
|
test1();
|
|
|
|
test2();
|
|
|
|
return 0;
|
|
|
|
}
|