]>
git.ipfire.org Git - thirdparty/bird.git/blob - lib/fletcher16_test.c
2 * BIRD Library -- Fletcher-16 Tests
4 * (c) 2015 CZ.NIC z.s.p.o.
6 * Can be freely distributed and used under the terms of the GNU GPL.
9 #include "test/birdtest.h"
10 #include "lib/fletcher16.h"
13 straightforward_fletcher16_compute(const char *data
)
15 int count
= strlen(data
);
21 for (index
= 0; index
< count
; ++index
)
23 sum1
= (sum1
+ data
[index
]) % 255;
24 sum2
= (sum2
+ sum1
) % 255;
27 sum2
= (sum2
+ sum1
) % 255;
28 sum2
= (sum2
+ sum1
) % 255;
30 return (sum1
<< 8) | sum2
;
34 straightforward_fletcher16_checksum(const char *data
)
39 csum
= straightforward_fletcher16_compute(data
);
40 c0
= (csum
>> 8) & 0xff;
43 x
= (255 + c0
- c1
) % 255;
44 y
= (510 - 2*c0
+ c1
) % 255;
52 const u8 zero16
[2] = {};
55 test_fletcher16(void *out_
, const void *in_
, const void *expected_out_
)
59 const u16
*expected_out
= expected_out_
;
61 struct fletcher16_context ctxt
;
63 fletcher16_init(&ctxt
);
64 fletcher16_update(&ctxt
, in
, strlen(in
));
65 fletcher16_update(&ctxt
, zero16
, 2);
66 *out
= fletcher16_compute(&ctxt
);
68 return *out
== *expected_out
;
72 test_fletcher16_checksum(void *out_
, const void *in_
, const void *expected_out_
)
76 const u16
*expected_out
= expected_out_
;
78 struct fletcher16_context ctxt
;
81 fletcher16_init(&ctxt
);
82 fletcher16_update(&ctxt
, in
, len
);
83 fletcher16_update(&ctxt
, zero16
, 2);
84 *out
= fletcher16_final(&ctxt
, len
+2, len
);
86 return *out
== *expected_out
;
90 t_fletcher16_compute(void)
92 struct bt_pair test_vectors
[] = {
95 .out
= & ((const u16
) { straightforward_fletcher16_compute("\001\002") }),
99 .out
= & ((const u16
) { straightforward_fletcher16_compute("") }),
103 .out
= & ((const u16
) { straightforward_fletcher16_compute("a") }),
107 .out
= & ((const u16
) { straightforward_fletcher16_compute("abcd") }),
110 .in
= "message digest",
111 .out
= & ((const u16
) { straightforward_fletcher16_compute("message digest") }),
114 .in
= "abcdefghijklmnopqrstuvwxyz",
115 .out
= & ((const u16
) { straightforward_fletcher16_compute("abcdefghijklmnopqrstuvwxyz") }),
118 .in
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
119 .out
= & ((const u16
) { straightforward_fletcher16_compute("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") }),
122 .in
= "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
123 .out
= & ((const u16
) { straightforward_fletcher16_compute("12345678901234567890123456789012345678901234567890123456789012345678901234567890") }),
127 return bt_assert_batch(test_vectors
, test_fletcher16
, bt_fmt_str
, bt_fmt_unsigned
);
131 t_fletcher16_checksum(void)
133 struct bt_pair test_vectors
[] = {
136 .out
= & ((const u16
) { straightforward_fletcher16_checksum("\001\002") }),
140 .out
= & ((const u16
) { straightforward_fletcher16_checksum("") }),
144 .out
= & ((const u16
) { straightforward_fletcher16_checksum("a") }),
148 .out
= & ((const u16
) { straightforward_fletcher16_checksum("abcd") }),
151 .in
= "message digest",
152 .out
= & ((const u16
) { straightforward_fletcher16_checksum("message digest") }),
155 .in
= "abcdefghijklmnopqrstuvwxyz",
156 .out
= & ((const u16
) { straightforward_fletcher16_checksum("abcdefghijklmnopqrstuvwxyz") }),
159 .in
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
160 .out
= & ((const u16
) { straightforward_fletcher16_checksum("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") }),
163 .in
= "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
164 .out
= & ((const u16
) { straightforward_fletcher16_checksum("12345678901234567890123456789012345678901234567890123456789012345678901234567890") }),
168 return bt_assert_batch(test_vectors
, test_fletcher16_checksum
, bt_fmt_str
, bt_fmt_unsigned
);
172 main(int argc
, char *argv
[])
176 bt_test_suite(t_fletcher16_compute
, "Fletcher-16 Compute Tests");
177 bt_test_suite(t_fletcher16_checksum
, "Fletcher-16 Checksum Tests");
179 return bt_exit_value();