unit-tests: Add test for crypto_factory_t's rng_create method
authorTobias Brunner <tobias@strongswan.org>
Tue, 6 May 2014 17:56:17 +0000 (19:56 +0200)
committerTobias Brunner <tobias@strongswan.org>
Fri, 20 Jun 2014 14:21:55 +0000 (16:21 +0200)
src/libstrongswan/tests/Makefile.am
src/libstrongswan/tests/suites/test_crypto_factory.c [new file with mode: 0644]
src/libstrongswan/tests/tests.h

index b5fb45a..e8e8090 100644 (file)
@@ -42,6 +42,7 @@ tests_SOURCES = tests.h tests.c \
   suites/test_host.c \
   suites/test_hasher.c \
   suites/test_crypter.c \
+  suites/test_crypto_factory.c \
   suites/test_pen.c \
   suites/test_asn1.c \
   suites/test_asn1_parser.c \
diff --git a/src/libstrongswan/tests/suites/test_crypto_factory.c b/src/libstrongswan/tests/suites/test_crypto_factory.c
new file mode 100644 (file)
index 0000000..4239b7b
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2014 Tobias Brunner
+ * Hochschule fuer Technik Rapperswil
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ */
+
+#include "test_suite.h"
+
+#include <crypto/crypto_factory.h>
+
+static rng_t *rng_create(rng_quality_t quality)
+{
+       rng_quality_t *q = malloc_thing(rng_quality_t);
+       *q = quality;
+       return (rng_t*)q;
+}
+
+static rng_t *rng_create_weak(rng_quality_t quality)
+{
+       ck_assert(quality == RNG_WEAK);
+       return rng_create(RNG_WEAK);
+}
+
+static rng_t *rng_create_strong(rng_quality_t quality)
+{
+       ck_assert(quality <= RNG_STRONG);
+       return rng_create(RNG_STRONG);
+}
+
+static rng_t *rng_create_true(rng_quality_t quality)
+{
+       ck_assert(quality <= RNG_TRUE);
+       return rng_create(RNG_TRUE);
+}
+
+static rng_t *rng_create_true_second(rng_quality_t quality)
+{
+       fail("should never be called");
+       return rng_create(RNG_TRUE);
+}
+
+static rng_quality_t rng_weak = RNG_WEAK;
+static rng_quality_t rng_strong = RNG_STRONG;
+static rng_quality_t rng_true = RNG_TRUE;
+
+static struct {
+       rng_quality_t *exp_weak;
+       rng_quality_t *exp_strong;
+       rng_quality_t *exp_true;
+       struct {
+               rng_quality_t *q;
+               rng_constructor_t create;
+       } data[4];
+} rng_data[] = {
+       { NULL, NULL, NULL, {
+               { NULL, NULL }
+       }},
+       { &rng_weak, NULL, NULL, {
+               { &rng_weak, rng_create_weak },
+               { NULL, NULL }
+       }},
+       { &rng_strong, &rng_strong, NULL, {
+               { &rng_strong, rng_create_strong },
+               { NULL, NULL }
+       }},
+       { &rng_true, &rng_true, &rng_true, {
+               { &rng_true, rng_create_true },
+               { NULL, NULL }
+       }},
+       { &rng_true, &rng_true, &rng_true, {
+               { &rng_true, rng_create_true },
+               { &rng_true, rng_create_true_second },
+               { NULL, NULL }
+       }},
+       { &rng_weak, &rng_true, &rng_true, {
+               { &rng_weak, rng_create_weak },
+               { &rng_true, rng_create_true },
+               { NULL, NULL }
+       }},
+       { &rng_weak, &rng_strong, &rng_true, {
+               { &rng_true, rng_create_true },
+               { &rng_strong, rng_create_strong },
+               { &rng_weak, rng_create_weak },
+               { NULL, NULL }
+       }},
+       { &rng_weak, &rng_strong, &rng_true, {
+               { &rng_weak, rng_create_weak },
+               { &rng_strong, rng_create_strong },
+               { &rng_true, rng_create_true },
+               { NULL, NULL }
+       }},
+};
+
+static void verify_rng(crypto_factory_t *factory, rng_quality_t request,
+                                          rng_quality_t *expected)
+{
+       rng_quality_t *res;
+
+       res = (rng_quality_t*)factory->create_rng(factory, request);
+       if (!expected)
+       {
+               ck_assert(!res);
+       }
+       else
+       {
+               ck_assert(res);
+               ck_assert_int_eq(*expected, *res);
+               free(res);
+       }
+}
+
+START_TEST(test_create_rng)
+{
+       crypto_factory_t *factory;
+       int i;
+
+       factory = crypto_factory_create();
+       for (i = 0; rng_data[_i].data[i].q; i++)
+       {
+               ck_assert(factory->add_rng(factory, *rng_data[_i].data[i].q, "test",
+                                                                  rng_data[_i].data[i].create));
+       }
+       verify_rng(factory, RNG_WEAK, rng_data[_i].exp_weak);
+       verify_rng(factory, RNG_STRONG, rng_data[_i].exp_strong);
+       verify_rng(factory, RNG_TRUE, rng_data[_i].exp_true);
+       for (i = 0; rng_data[_i].data[i].q; i++)
+       {
+               factory->remove_rng(factory, rng_data[_i].data[i].create);
+       }
+       factory->destroy(factory);
+}
+END_TEST
+
+Suite *crypto_factory_suite_create()
+{
+       Suite *s;
+       TCase *tc;
+
+       s = suite_create("crypto-factory");
+
+       tc = tcase_create("create_rng");
+       tcase_add_loop_test(tc, test_create_rng, 0, countof(rng_data));
+       suite_add_tcase(s, tc);
+
+       return s;
+}
index 82a5137..ab0f642 100644 (file)
@@ -35,6 +35,7 @@ TEST_SUITE(host_suite_create)
 TEST_SUITE(printf_suite_create)
 TEST_SUITE(hasher_suite_create)
 TEST_SUITE(crypter_suite_create)
+TEST_SUITE(crypto_factory_suite_create)
 TEST_SUITE(pen_suite_create)
 TEST_SUITE(asn1_suite_create)
 TEST_SUITE(asn1_parser_suite_create)