]> git.ipfire.org Git - thirdparty/bird.git/blob - lib/fletcher16_test.c
Birdtest: Replace BT_SUCCESS and BT_FAILURE with 1 and 0
[thirdparty/bird.git] / lib / fletcher16_test.c
1 /*
2 * BIRD Library -- Fletcher-16 Tests
3 *
4 * (c) 2015 CZ.NIC z.s.p.o.
5 *
6 * Can be freely distributed and used under the terms of the GNU GPL.
7 */
8
9 #include "test/birdtest.h"
10 #include "lib/fletcher16.h"
11
12 static u16
13 straightforward_fletcher16_compute(const char *data)
14 {
15 int count = strlen(data);
16
17 u16 sum1 = 0;
18 u16 sum2 = 0;
19 int index;
20
21 for (index = 0; index < count; ++index)
22 {
23 sum1 = (sum1 + data[index]) % 255;
24 sum2 = (sum2 + sum1) % 255;
25 }
26
27 return (sum2 << 8) | sum1;
28 }
29
30 static u16
31 straightforward_fletcher16_checksum(const char *data)
32 {
33 u16 csum;
34 u8 c0,c1,f0,f1;
35
36 csum = straightforward_fletcher16_compute(data);
37 f0 = csum & 0xff;
38 f1 = (csum >> 8) & 0xff;
39 c0 = 0xff - ((f0 + f1) % 0xff);
40 c1 = 0xff - ((f0 + c0) % 0xff);
41
42 return (c1 << 8) | c0;
43 }
44
45 static int
46 test_fletcher16(void *out_, const void *in_, const void *expected_out_)
47 {
48 u16 *out = out_;
49 const char *in = in_;
50 const u16 *expected_out = expected_out_;
51
52 struct fletcher16_context ctxt;
53
54 fletcher16_init(&ctxt);
55 fletcher16_update(&ctxt, in, strlen(in));
56 put_u16(out, fletcher16_compute(&ctxt));
57
58 return *out == *expected_out;
59 }
60
61 static int
62 test_fletcher16_checksum(void *out_, const void *in_, const void *expected_out_)
63 {
64 u16 *out = out_;
65 const char *in = in_;
66 const u16 *expected_out = expected_out_;
67
68 struct fletcher16_context ctxt;
69 int len = strlen(in);
70
71 fletcher16_init(&ctxt);
72 fletcher16_update(&ctxt, in, len);
73 put_u16(out, fletcher16_final(&ctxt, len, len));
74
75 return *out == *expected_out;
76 }
77
78 static int
79 t_fletcher16_compute(void)
80 {
81 struct bt_pair test_vectors[] = {
82 {
83 .in = "\001\002",
84 .out = & (const u16) { 0x0403 },
85 },
86 {
87 .in = "",
88 .out = & ((const u16) { straightforward_fletcher16_compute("") }),
89 },
90 {
91 .in = "a",
92 .out = & ((const u16) { straightforward_fletcher16_compute("a") }),
93 },
94 {
95 .in = "abcd",
96 .out = & ((const u16) { straightforward_fletcher16_compute("abcd") }),
97 },
98 {
99 .in = "message digest",
100 .out = & ((const u16) { straightforward_fletcher16_compute("message digest") }),
101 },
102 {
103 .in = "abcdefghijklmnopqrstuvwxyz",
104 .out = & ((const u16) { straightforward_fletcher16_compute("abcdefghijklmnopqrstuvwxyz") }),
105 },
106 {
107 .in = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
108 .out = & ((const u16) { straightforward_fletcher16_compute("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") }),
109 },
110 {
111 .in = "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
112 .out = & ((const u16) { straightforward_fletcher16_compute("12345678901234567890123456789012345678901234567890123456789012345678901234567890") }),
113 },
114 };
115
116 return bt_assert_batch(test_vectors, test_fletcher16, bt_fmt_str, bt_fmt_unsigned);
117 }
118
119 static int
120 t_fletcher16_checksum(void)
121 {
122 struct bt_pair test_vectors[] = {
123 {
124 .in = "\001\002",
125 .out = & ((const u16) { straightforward_fletcher16_checksum("\001\002") }),
126 },
127 {
128 .in = "",
129 .out = & ((const u16) { straightforward_fletcher16_checksum("") }),
130 },
131 {
132 .in = "a",
133 .out = & ((const u16) { straightforward_fletcher16_checksum("a") }),
134 },
135 {
136 .in = "abcd",
137 .out = & ((const u16) { straightforward_fletcher16_checksum("abcd") }),
138 },
139 {
140 .in = "message digest",
141 .out = & ((const u16) { straightforward_fletcher16_checksum("message digest") }),
142 },
143 {
144 .in = "abcdefghijklmnopqrstuvwxyz",
145 .out = & ((const u16) { straightforward_fletcher16_checksum("abcdefghijklmnopqrstuvwxyz") }),
146 },
147 {
148 .in = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
149 .out = & ((const u16) { straightforward_fletcher16_checksum("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") }),
150 },
151 {
152 .in = "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
153 .out = & ((const u16) { straightforward_fletcher16_checksum("12345678901234567890123456789012345678901234567890123456789012345678901234567890") }),
154 },
155 };
156
157 return bt_assert_batch(test_vectors, test_fletcher16_checksum, bt_fmt_str, bt_fmt_unsigned);
158 }
159
160 int
161 main(int argc, char *argv[])
162 {
163 bt_init(argc, argv);
164
165 bt_test_suite(t_fletcher16_compute, "Fletcher-16 Compute Tests");
166 bt_test_suite(t_fletcher16_checksum, "Fletcher-16 Checksum Tests");
167
168 return bt_exit_value();
169 }