diff --git a/Makefile.am b/Makefile.am index fbecea9ed..c8b640654 100644 --- a/Makefile.am +++ b/Makefile.am @@ -33,7 +33,7 @@ EXTRA_DIST+= LICENSING include src/include.am include wolfssh/include.am include examples/include.am -include test/include.am +include tests/include.am include keys/include.am diff --git a/test/include.am b/test/include.am deleted file mode 100644 index 6e6032c66..000000000 --- a/test/include.am +++ /dev/null @@ -1,14 +0,0 @@ -# vim:ft=automake -# included from Top Level Makefile.am -# All paths should be given relative to the root - -check_PROGRAMS += test/unit.test -noinst_PROGRAMS += test/unit.test - -test_unit_test_SOURCES = test/unit.c - -test_unit_test_CFLAGS = -DNO_MAIN_DRIVER $(AM_CFLAGS) -test_unit_test_LDADD = src/libwolfssh.la $(LIB_STATIC_ADD) -test_unit_test_DEPENDENCIES = src/libwolfssh.la - -DISTCLEANFILES+= test/.libs/unit.test diff --git a/tests/api.c b/tests/api.c new file mode 100644 index 000000000..923d2bd6e --- /dev/null +++ b/tests/api.c @@ -0,0 +1,138 @@ +/* api.c + * + * Copyright (C) 2014-2017 wolfSSL Inc. + * + * This file is part of wolfSSH. + * + * wolfSSH 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 3 of the License, or + * (at your option) any later version. + * + * wolfSSH 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. + * + * You should have received a copy of the GNU General Public License + * along with wolfSSH. If not, see . + */ + + +#include +#include + + +#define Fail(description, result) do { \ + printf("\nERROR - %s line %d failed with:", __FILE__, __LINE__); \ + printf("\n expected: "); printf description; \ + printf("\n result: "); printf result; printf("\n\n"); \ + abort(); \ +} while(0) + +#define Assert(test, description, result) if (!(test)) Fail(description, result) + +#define AssertTrue(x) Assert( (x), ("%s is true", #x), (#x " => FALSE")) +#define AssertFalse(x) Assert(!(x), ("%s is false", #x), (#x " => TRUE")) +#define AssertNotNull(x) Assert( (x), ("%s is not null", #x), (#x " => NULL")) + +#define AssertNull(x) do { \ + void* _x = (void *) (x); \ + \ + Assert(!_x, ("%s is null", #x), (#x " => %p", _x)); \ +} while(0) + +#define AssertInt(x, y, op, er) do { \ + int _x = x; \ + int _y = y; \ + \ + Assert(_x op _y, ("%s " #op " %s", #x, #y), ("%d " #er " %d", _x, _y)); \ +} while(0) + +#define AssertIntEQ(x, y) AssertInt(x, y, ==, !=) +#define AssertIntNE(x, y) AssertInt(x, y, !=, ==) +#define AssertIntGT(x, y) AssertInt(x, y, >, <=) +#define AssertIntLT(x, y) AssertInt(x, y, <, >=) +#define AssertIntGE(x, y) AssertInt(x, y, >=, <) +#define AssertIntLE(x, y) AssertInt(x, y, <=, >) + +#define AssertStr(x, y, op, er) do { \ + const char* _x = x; \ + const char* _y = y; \ + int _z = strcmp(_x, _y); \ + \ + Assert(_z op 0, ("%s " #op " %s", #x, #y), \ + ("\"%s\" " #er " \"%s\"", _x, _y));\ +} while(0) + +#define AssertStrEQ(x, y) AssertStr(x, y, ==, !=) +#define AssertStrNE(x, y) AssertStr(x, y, !=, ==) +#define AssertStrGT(x, y) AssertStr(x, y, >, <=) +#define AssertStrLT(x, y) AssertStr(x, y, <, >=) +#define AssertStrGE(x, y) AssertStr(x, y, >=, <) +#define AssertStrLE(x, y) AssertStr(x, y, <=, >) + + +enum WS_TestEndpointTypes { + TEST_GOOD_ENDPOINT_SERVER = WOLFSSH_ENDPOINT_SERVER, + TEST_GOOD_ENDPOINT_CLIENT = WOLFSSH_ENDPOINT_CLIENT, + TEST_BAD_ENDPOINT_NEXT, + TEST_BAD_ENDPOINT_LAST = 255 +}; + +static void test_wolfSSH_CTX_new(void) +{ + WOLFSSH_CTX* ctx; + + AssertNull(ctx = wolfSSH_CTX_new(TEST_BAD_ENDPOINT_NEXT, NULL)); + wolfSSH_CTX_free(ctx); + + AssertNull(ctx = wolfSSH_CTX_new(TEST_BAD_ENDPOINT_LAST, NULL)); + wolfSSH_CTX_free(ctx); + + AssertNotNull(ctx = wolfSSH_CTX_new(TEST_GOOD_ENDPOINT_SERVER, NULL)); + wolfSSH_CTX_free(ctx); + + AssertNotNull(ctx = wolfSSH_CTX_new(TEST_GOOD_ENDPOINT_CLIENT, NULL)); + wolfSSH_CTX_free(ctx); +} + + +static void test_server_wolfSSH_new(void) +{ + WOLFSSH_CTX* ctx; + WOLFSSH* ssh; + + AssertNotNull(ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_SERVER, NULL)); + AssertNotNull(ssh = wolfSSH_new(ctx)); + + wolfSSH_free(ssh); + wolfSSH_CTX_free(ctx); +} + + +static void test_client_wolfSSH_new(void) +{ + WOLFSSH_CTX* ctx; + WOLFSSH* ssh; + + AssertNotNull(ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_CLIENT, NULL)); + AssertNotNull(ssh = wolfSSH_new(ctx)); + + wolfSSH_free(ssh); + wolfSSH_CTX_free(ctx); +} + + +int main(void) +{ + AssertIntEQ(wolfSSH_Init(), WS_SUCCESS); + + test_wolfSSH_CTX_new(); + test_server_wolfSSH_new(); + test_client_wolfSSH_new(); + + AssertIntEQ(wolfSSH_Cleanup(), WS_SUCCESS); + + return 0; +} diff --git a/tests/include.am b/tests/include.am new file mode 100644 index 000000000..162b91be0 --- /dev/null +++ b/tests/include.am @@ -0,0 +1,18 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + +check_PROGRAMS += tests/unit.test tests/api.test +noinst_PROGRAMS += tests/unit.test tests/api.test + +tests_unit_test_SOURCES = tests/unit.c +tests_unit_test_CFLAGS = -DNO_MAIN_DRIVER $(AM_CFLAGS) +tests_unit_test_LDADD = src/libwolfssh.la $(LIB_STATIC_ADD) +tests_unit_test_DEPENDENCIES = src/libwolfssh.la + +tests_api_test_SOURCES = tests/api.c +tests_api_test_CFLAGS = -DNO_MAIN_DRIVER $(AM_CFLAGS) +tests_api_test_LDADD = src/libwolfssh.la $(LIB_STATIC_ADD) +tests_api_test_DEPENDENCIES = src/libwolfssh.la + +DISTCLEANFILES+= tests/.libs/unit.test tests/.libs/api.test diff --git a/test/unit.c b/tests/unit.c similarity index 100% rename from test/unit.c rename to tests/unit.c