aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSteffan Karger2017-05-05 19:44:51 +0200
committerGert Doering2017-05-05 20:53:05 +0200
commita87e1431baccd49a9344cfc63ab7446c4317fa2f (patch)
tree76986d49406587eccfebb17a26965277023df959 /tests
parent79ea67f77ca3afe91222f62e17df885a30409285 (diff)
downloadopenvpn-a87e1431baccd49a9344cfc63ab7446c4317fa2f.zip
openvpn-a87e1431baccd49a9344cfc63ab7446c4317fa2f.tar.gz
cleanup: merge packet_id_alloc_outgoing() into packet_id_write()
The functions packet_id_alloc_outgoing() and packet_id_write() were always called in tandem. Instead of forcing the caller to allocate a packet_id_net to do so, merge the two functions. This simplifies the API and reduces the chance on mistakes in the future. This patch adds unit tests to verify the behaviour of packet_id_write(). Verifying that we assert out correctly required the change to mock_msg.c. Signed-off-by: Steffan Karger <steffan.karger@fox-it.com> Acked-by: Gert Doering <gert@greenie.muc.de> Acked-by: David Sommerseth <davids@openvpn.net> Message-Id: <1494006291-3522-1-git-send-email-steffan.karger@fox-it.com> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg14541.html Signed-off-by: Gert Doering <gert@greenie.muc.de>
Diffstat (limited to 'tests')
-rw-r--r--tests/unit_tests/openvpn/Makefile.am13
-rw-r--r--tests/unit_tests/openvpn/mock_msg.c15
-rw-r--r--tests/unit_tests/openvpn/test_packet_id.c168
3 files changed, 186 insertions, 10 deletions
diff --git a/tests/unit_tests/openvpn/Makefile.am b/tests/unit_tests/openvpn/Makefile.am
index b902b20..5d7123e 100644
--- a/tests/unit_tests/openvpn/Makefile.am
+++ b/tests/unit_tests/openvpn/Makefile.am
@@ -3,7 +3,7 @@ AUTOMAKE_OPTIONS = foreign
check_PROGRAMS=
if HAVE_LD_WRAP_SUPPORT
-check_PROGRAMS += argv_testdriver buffer_testdriver
+check_PROGRAMS += argv_testdriver buffer_testdriver packet_id_testdriver
endif
if ENABLE_CRYPTO
@@ -31,6 +31,17 @@ buffer_testdriver_SOURCES = test_buffer.c mock_msg.c \
$(openvpn_srcdir)/buffer.c \
$(openvpn_srcdir)/platform.c
+packet_id_testdriver_CFLAGS = @TEST_CFLAGS@ \
+ -I$(openvpn_includedir) -I$(compat_srcdir) -I$(openvpn_srcdir) \
+ $(OPTIONAL_CRYPTO_CFLAGS)
+packet_id_testdriver_LDFLAGS = @TEST_LDFLAGS@ \
+ $(OPTIONAL_CRYPTO_LIBS)
+packet_id_testdriver_SOURCES = test_packet_id.c mock_msg.c \
+ $(openvpn_srcdir)/buffer.c \
+ $(openvpn_srcdir)/otime.c \
+ $(openvpn_srcdir)/packet_id.c \
+ $(openvpn_srcdir)/platform.c
+
tls_crypt_testdriver_CFLAGS = @TEST_CFLAGS@ \
-I$(openvpn_includedir) -I$(compat_srcdir) -I$(openvpn_srcdir) \
$(OPTIONAL_CRYPTO_CFLAGS)
diff --git a/tests/unit_tests/openvpn/mock_msg.c b/tests/unit_tests/openvpn/mock_msg.c
index eb0d5e9..060588f 100644
--- a/tests/unit_tests/openvpn/mock_msg.c
+++ b/tests/unit_tests/openvpn/mock_msg.c
@@ -29,9 +29,12 @@
#endif
#include <stdarg.h>
-#include <stdbool.h>
+#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
#include "errlevel.h"
#include "error.h"
@@ -70,14 +73,8 @@ x_msg(const unsigned int flags, const char *format, ...)
void
assert_failed(const char *filename, int line, const char *condition)
{
- if (condition)
- {
- printf("Assertion failed at %s:%d (%s)", filename, line, condition);
- }
- else
- {
- printf("Assertion failed at %s:%d", filename, line);
- }
+ mock_assert(false, condition ? condition : "", filename, line);
+ /* Keep compiler happy. Should not happen, mock_assert() does not return */
exit(1);
}
diff --git a/tests/unit_tests/openvpn/test_packet_id.c b/tests/unit_tests/openvpn/test_packet_id.c
new file mode 100644
index 0000000..5627a5b
--- /dev/null
+++ b/tests/unit_tests/openvpn/test_packet_id.c
@@ -0,0 +1,168 @@
+/*
+ * OpenVPN -- An application to securely tunnel IP networks
+ * over a single UDP port, with support for SSL/TLS-based
+ * session authentication and key exchange,
+ * packet encryption, packet authentication, and
+ * packet compression.
+ *
+ * Copyright (C) 2016 Fox Crypto B.V. <openvpn@fox-it.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see the file COPYING included with this
+ * distribution); if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#elif defined(_MSC_VER)
+#include "config-msvc.h"
+#endif
+
+#include "syshead.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+#include "packet_id.h"
+
+#include "mock_msg.h"
+
+struct test_packet_id_write_data {
+ struct {
+ uint32_t buf_id;
+ uint32_t buf_time;
+ } test_buf_data;
+ struct buffer test_buf;
+ struct packet_id_send pis;
+};
+
+static int
+test_packet_id_write_setup(void **state) {
+ struct test_packet_id_write_data *data =
+ calloc(1, sizeof(struct test_packet_id_write_data));
+
+ if (!data)
+ {
+ return -1;
+ }
+
+ data->test_buf.data = (void *) &data->test_buf_data;
+ data->test_buf.capacity = sizeof(data->test_buf_data);
+
+ *state = data;
+ return 0;
+}
+
+static int
+test_packet_id_write_teardown(void **state) {
+ free(*state);
+ return 0;
+}
+
+static void
+test_packet_id_write_short(void **state)
+{
+ struct test_packet_id_write_data *data = *state;
+
+ now = 5010;
+ assert_true(packet_id_write(&data->pis, &data->test_buf, false, false));
+ assert_true(data->pis.id == 1);
+ assert_true(data->test_buf_data.buf_id == htonl(1));
+ assert_true(data->test_buf_data.buf_time == 0);
+}
+
+static void
+test_packet_id_write_long(void **state)
+{
+ struct test_packet_id_write_data *data = *state;
+
+ now = 5010;
+ assert_true(packet_id_write(&data->pis, &data->test_buf, true, false));
+ assert(data->pis.id == 1);
+ assert(data->pis.time == now);
+ assert_true(data->test_buf_data.buf_id == htonl(1));
+ assert_true(data->test_buf_data.buf_time == htonl(now));
+}
+
+static void
+test_packet_id_write_short_prepend(void **state)
+{
+ struct test_packet_id_write_data *data = *state;
+
+ data->test_buf.offset = sizeof(packet_id_type);
+ now = 5010;
+ assert_true(packet_id_write(&data->pis, &data->test_buf, false, true));
+ assert_true(data->pis.id == 1);
+ assert_true(data->test_buf_data.buf_id == htonl(1));
+ assert_true(data->test_buf_data.buf_time == 0);
+}
+
+static void
+test_packet_id_write_long_prepend(void **state)
+{
+ struct test_packet_id_write_data *data = *state;
+
+ data->test_buf.offset = sizeof(data->test_buf_data);
+ now = 5010;
+ assert_true(packet_id_write(&data->pis, &data->test_buf, true, true));
+ assert(data->pis.id == 1);
+ assert(data->pis.time == now);
+ assert_true(data->test_buf_data.buf_id == htonl(1));
+ assert_true(data->test_buf_data.buf_time == htonl(now));
+}
+
+static void
+test_packet_id_write_short_wrap(void **state)
+{
+ struct test_packet_id_write_data *data = *state;
+
+ data->pis.id = ~0;
+ expect_assert_failure(
+ packet_id_write(&data->pis, &data->test_buf, false, false));
+}
+
+static void
+test_packet_id_write_long_wrap(void **state)
+{
+ struct test_packet_id_write_data *data = *state;
+
+ data->pis.id = ~0;
+ now = 5010;
+ assert_true(packet_id_write(&data->pis, &data->test_buf, true, false));
+ assert(data->pis.id == 1);
+ assert(data->pis.time == now);
+ assert_true(data->test_buf_data.buf_id == htonl(1));
+ assert_true(data->test_buf_data.buf_time == htonl(now));
+}
+
+int
+main(void) {
+ const struct CMUnitTest tests[] = {
+ cmocka_unit_test_setup_teardown(test_packet_id_write_short,
+ test_packet_id_write_setup, test_packet_id_write_teardown),
+ cmocka_unit_test_setup_teardown(test_packet_id_write_long,
+ test_packet_id_write_setup, test_packet_id_write_teardown),
+ cmocka_unit_test_setup_teardown(test_packet_id_write_short_prepend,
+ test_packet_id_write_setup, test_packet_id_write_teardown),
+ cmocka_unit_test_setup_teardown(test_packet_id_write_long_prepend,
+ test_packet_id_write_setup, test_packet_id_write_teardown),
+ cmocka_unit_test_setup_teardown(test_packet_id_write_short_wrap,
+ test_packet_id_write_setup, test_packet_id_write_teardown),
+ cmocka_unit_test_setup_teardown(test_packet_id_write_long_wrap,
+ test_packet_id_write_setup, test_packet_id_write_teardown),
+ };
+
+ return cmocka_run_group_tests_name("packet_id tests", tests, NULL, NULL);
+}