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>