Annotation of embedaddon/bird2/lib/fletcher16_test.c, revision 1.1.1.1
1.1 misho 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: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>