Annotation of embedaddon/bird2/lib/fletcher16_test.c, revision 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>