]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Birdtest: Add Fletcher-16 Checksum Tests
authorPavel Tvrdík <pawel.tvrdik@gmail.cz>
Tue, 4 Aug 2015 12:14:34 +0000 (14:14 +0200)
committerPavel Tvrdík <pawel.tvrdik@gmail.cz>
Tue, 4 Aug 2015 12:23:12 +0000 (14:23 +0200)
lib/fletcher16_test.c [new file with mode: 0644]

diff --git a/lib/fletcher16_test.c b/lib/fletcher16_test.c
new file mode 100644 (file)
index 0000000..f9c5b4c
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ *     BIRD Library -- Fletcher-16 checksum Tests
+ *
+ *     (c) 2015 Ondrej Zajicek <santiago@crfreenet.org>
+ *     (c) 2015 CZ.NIC z.s.p.o.
+ *
+ *     Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#include "test/birdtest.h"
+#include "test/birdtest_support.h"     /* REMOVE ME */
+
+#include "lib/fletcher16.h"
+
+struct in {
+  u8 *data;
+  int count;
+};
+
+static u16
+straightforward_fletcher16_compute(const char *data)
+{
+  int count = strlen(data);
+
+  u16 sum1 = 0;
+  u16 sum2 = 0;
+  int index;
+
+  for(index = 0; index < count; ++index)
+  {
+    sum1 = (sum1 + data[index]) % 255;
+    sum2 = (sum2 + sum1) % 255;
+  }
+
+  return (sum2 << 8) | sum1;
+}
+
+static u16
+straightforward_fletcher16_checksum(const char *data)
+{
+  u16 csum;
+  u8 c0,c1,f0,f1;
+
+  csum = straightforward_fletcher16_compute(data);
+  f0 = csum & 0xff;
+  f1 = (csum >> 8) & 0xff;
+  c0 = 0xff - ((f0 + f1) % 0xff);
+  c1 = 0xff - ((f0 + c0) % 0xff);
+
+  return (c1 << 8) | c0;
+}
+
+static u16
+get_fletcher16_compute(const char *str)
+{
+  struct fletcher16_context ctxt;
+
+  fletcher16_init(&ctxt);
+  fletcher16_update(&ctxt, str, strlen(str));
+  u16 f;
+  put_u16(&f, fletcher16_compute(&ctxt));
+  return f;
+}
+
+static u16
+get_fletcher16_checksum(const char *str)
+{
+  struct fletcher16_context ctxt;
+
+  int len = strlen(str);
+
+  fletcher16_init(&ctxt);
+  fletcher16_update(&ctxt, str, len);
+  u16 f;
+  put_u16(&f, fletcher16_final(&ctxt, len, len));
+  return f;
+}
+
+static int
+t_fletcher16_compute(void)
+{
+  struct in_out {
+    char *in;
+    u16 out;
+  } in_out[] = {
+      {
+         .in  = "\001\002",
+         .out = 0x0403,
+      },
+      {
+         .in  = "",
+         .out = straightforward_fletcher16_compute(""),
+      },
+      {
+         .in  = "a",
+         .out = straightforward_fletcher16_compute("a"),
+      },
+      {
+         .in  = "abcd",
+         .out = straightforward_fletcher16_compute("abcd"),
+      },
+      {
+         .in  = "message digest",
+         .out = straightforward_fletcher16_compute("message digest"),
+      },
+      {
+         .in  = "abcdefghijklmnopqrstuvwxyz",
+         .out = straightforward_fletcher16_compute("abcdefghijklmnopqrstuvwxyz"),
+      },
+      {
+         .in  = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+         .out = straightforward_fletcher16_compute("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"),
+      },
+      {
+         .in  = "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
+         .out = straightforward_fletcher16_compute("12345678901234567890123456789012345678901234567890123456789012345678901234567890"),
+      },
+  };
+
+  bt_assert_out_fn_in(get_fletcher16_compute, in_out, "'%s'", "0x%04X");
+
+  return BT_SUCCESS;
+}
+
+static int
+t_fletcher16_checksum(void)
+{
+  struct in_out {
+    char *in;
+    u16 out;
+  } in_out[] = {
+      {
+         .in  = "\001\002",
+         .out = straightforward_fletcher16_checksum("\001\002"),
+      },
+      {
+         .in  = "",
+         .out = straightforward_fletcher16_checksum(""),
+      },
+      {
+         .in  = "a",
+         .out = straightforward_fletcher16_checksum("a"),
+      },
+      {
+         .in  = "abcd",
+         .out = straightforward_fletcher16_checksum("abcd"),
+      },
+      {
+         .in  = "message digest",
+         .out = straightforward_fletcher16_checksum("message digest"),
+      },
+      {
+         .in  = "abcdefghijklmnopqrstuvwxyz",
+         .out = straightforward_fletcher16_checksum("abcdefghijklmnopqrstuvwxyz"),
+      },
+      {
+         .in  = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+         .out = straightforward_fletcher16_checksum("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"),
+      },
+      {
+         .in  = "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
+         .out = straightforward_fletcher16_checksum("12345678901234567890123456789012345678901234567890123456789012345678901234567890"),
+      },
+  };
+
+  bt_assert_out_fn_in(get_fletcher16_checksum, in_out, "'%s'", "0x%04X");
+
+  return BT_SUCCESS;
+}
+
+int
+main(int argc, char *argv[])
+{
+  bt_init(argc, argv);
+
+  bt_test_suite(t_fletcher16_compute, "Fletcher-16 Compute Tests");
+  bt_test_suite(t_fletcher16_checksum, "Fletcher-16 Checksum Tests");
+
+  return bt_end();
+}