crypto/shachain: new module
[ccan] / ccan / crypto / shachain / test / run.c
1 #include <ccan/crypto/shachain/shachain.h>
2 /* Include the C files directly. */
3 #include <ccan/crypto/shachain/shachain.c>
4 #include <ccan/tap/tap.h>
5
6 #define NUM_TESTS 50
7
8 int main(void)
9 {
10         struct sha256 seed;
11         struct shachain chain;
12         struct sha256 expect[NUM_TESTS];
13         size_t i, j;
14
15         /* This is how many tests you plan to run */
16         plan_tests(NUM_TESTS + NUM_TESTS * (NUM_TESTS + 1) + NUM_TESTS);
17
18         memset(&seed, 0, sizeof(seed));
19         /* Generate a whole heap. */
20         for (i = 0; i < NUM_TESTS; i++) {
21                 shachain_from_seed(&seed, i, &expect[i]);
22                 if (i == 0)
23                         ok1(memcmp(&expect[i], &seed, sizeof(expect[i])));
24                 else
25                         ok1(memcmp(&expect[i], &expect[i-1], sizeof(expect[i])));
26         }
27
28         shachain_init(&chain);
29
30         for (i = 0; i < NUM_TESTS; i++) {
31                 struct sha256 hash;
32
33                 shachain_add_hash(&chain, i, &expect[i]);
34                 for (j = 0; j <= i; j++) {
35                         ok1(shachain_get_hash(&chain, j, &hash));
36                         ok1(memcmp(&hash, &expect[j], sizeof(hash)) == 0);
37                 }
38                 ok1(!shachain_get_hash(&chain, i+1, &hash));
39         }
40
41         return exit_status();
42 }