1 #include <ccan/rune/rune.c>
2 #include <ccan/rune/coding.c>
3 #include <ccan/tal/grab_file/grab_file.h>
4 #include <ccan/tal/str/str.h>
5 #include <ccan/tap/tap.h>
7 static const char *check(const tal_t *ctx,
8 const struct rune *rune,
9 const struct rune_altern *alt,
12 const char *val = NULL;
14 for (size_t i = 1; parts[i]; i++) {
15 if (strstarts(parts[i], alt->fieldname)
16 && parts[i][strlen(alt->fieldname)] == '=')
17 val = parts[i] + strlen(alt->fieldname) + 1;
20 /* If it's an integer, hand it like that */
23 s64 v = strtol(val, &endp, 10);
24 if (*endp == '\0' && endp != val)
25 return rune_alt_single_int(ctx, alt, v);
26 return rune_alt_single_str(ctx, alt, val, strlen(val));
28 return rune_alt_single_missing(ctx, alt);
35 static const u8 secret_zero[16];
38 /* Test vector rune uses all-zero secret */
39 mr = rune_new(NULL, secret_zero, sizeof(secret_zero), NULL);
41 /* Python runes library generates test vectors */
42 vecs = grab_file(mr, "test/test_vectors.csv");
44 lines = tal_strsplit(mr, take(vecs), "\n", STR_NO_EMPTY);
48 for (size_t i = 0; lines[i]; i++) {
49 struct rune *rune1, *rune2;
52 parts = tal_strsplit(lines, lines[i], ",", STR_EMPTY_OK);
53 if (streq(parts[0], "VALID")) {
54 diag("test %s %s", parts[0], parts[1]);
55 rune1 = rune_from_string(parts, parts[2]);
57 rune2 = rune_from_base64(parts, parts[3]);
59 ok1(rune_eq(rune1, rune2));
60 ok1(streq(rune_to_string(parts, rune2), parts[2]));
61 ok1(streq(rune_to_base64(parts, rune1), parts[3]));
62 ok1(rune_is_derived_anyversion(mr, rune1) == NULL);
63 ok1(rune_is_derived_anyversion(mr, rune2) == NULL);
67 ok1(streq(rune1->version, parts[5]));
68 ok1(streq(rune1->unique_id, parts[4]));
71 ok1(!rune1->unique_id);
74 } else if (streq(parts[0], "DERIVE")) {
75 struct rune_restr *restr;
76 diag("test %s %s", parts[0], parts[1]);
77 rune1 = rune_from_base64(parts, parts[2]);
79 rune2 = rune_from_base64(parts, parts[3]);
81 ok1(rune_is_derived_anyversion(mr, rune1) == NULL);
82 ok1(rune_is_derived_anyversion(mr, rune2) == NULL);
83 ok1(rune_is_derived_anyversion(rune1, rune2) == NULL);
85 restr = rune_restr_new(NULL);
86 for (size_t i = 4; parts[i]; i+=3) {
87 struct rune_altern *alt;
88 alt = rune_altern_new(NULL,
92 rune_restr_add_altern(restr, take(alt));
94 rune_add_restr(rune1, take(restr));
95 ok1(rune_eq(rune1, rune2));
96 } else if (streq(parts[0], "MALFORMED")) {
97 diag("test %s %s", parts[0], parts[1]);
98 rune1 = rune_from_string(parts, parts[2]);
100 rune2 = rune_from_base64(parts, parts[3]);
102 } else if (streq(parts[0], "BAD DERIVATION")) {
103 diag("test %s %s", parts[0], parts[1]);
104 rune1 = rune_from_string(parts, parts[2]);
106 rune2 = rune_from_base64(parts, parts[3]);
108 ok1(rune_eq(rune1, rune2));
109 ok1(rune_is_derived(mr, rune1) != NULL);
110 ok1(rune_is_derived(mr, rune2) != NULL);
113 diag("test %s", parts[0]);
114 err = rune_test(parts, mr, rune1, check, parts);
115 if (streq(parts[0], "PASS")) {
118 assert(streq(parts[0], "FAIL"));
125 /* This exits depending on whether all tests passed */
126 return exit_status();