mirror of
https://github.com/OpenVPN/openvpn.git
synced 2026-02-20 00:10:43 -05:00
mbuf: Add unit tests
Some checks failed
Build / Check code style with clang-format (push) Has been cancelled
Build / Android - arm64-v8a (push) Has been cancelled
Build / gcc-mingw - x64 - Debug - OSSL (push) Has been cancelled
Build / gcc-mingw - x64 - Release - OSSL (push) Has been cancelled
Build / gcc-mingw - x86 - Debug - OSSL (push) Has been cancelled
Build / gcc-mingw - x86 - Release - OSSL (push) Has been cancelled
Build / gcc - ubuntu-24.04 - OpenSSL 3.0.13 --enable-pkcs11 (push) Has been cancelled
Build / gcc - ubuntu-22.04 - OpenSSL 3.0.2 --enable-pkcs11 (push) Has been cancelled
Build / clang-asan - ubuntu-22.04 - openssl (push) Has been cancelled
Build / clang-asan - ubuntu-24.04 - openssl (push) Has been cancelled
Build / macos-14 - libressl - asan (push) Has been cancelled
Build / macos-14 - openssl@3 - asan (push) Has been cancelled
Build / macos-15 - libressl - asan (push) Has been cancelled
Build / macos-15 - openssl@3 - asan (push) Has been cancelled
Build / macos-26 - libressl - asan (push) Has been cancelled
Build / macos-26 - openssl@3 - asan (push) Has been cancelled
Build / macos-14 - libressl - normal (push) Has been cancelled
Build / macos-14 - openssl@3 - normal (push) Has been cancelled
Build / macos-15 - libressl - normal (push) Has been cancelled
Build / macos-15 - openssl@3 - normal (push) Has been cancelled
Build / macos-26 - libressl - normal (push) Has been cancelled
Build / macos-26 - openssl@3 - normal (push) Has been cancelled
Build / msbuild - amd64 - openssl (push) Has been cancelled
Build / msbuild - amd64-clang - openssl (push) Has been cancelled
Build / msbuild - arm64 - openssl (push) Has been cancelled
Build / msbuild - x86 - openssl (push) Has been cancelled
Build / msbuild - x86-clang - openssl (push) Has been cancelled
Build / clang asan - ubuntu-22.04 - libressl (push) Has been cancelled
Build / gcc normal - ubuntu-22.04 - libressl (push) Has been cancelled
Build / clang asan - ubuntu-22.04 - mbedtls3 (push) Has been cancelled
Build / gcc normal - ubuntu-22.04 - mbedtls3 (push) Has been cancelled
Build / clang asan - ubuntu-24.04 - awslc (push) Has been cancelled
Build / gcc normal - ubuntu-24.04 - awslc (push) Has been cancelled
Deploy Doxygen documentation to Pages / build (push) Has been cancelled
Build / mingw unittest argv - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest auth_token - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest buffer - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest crypto - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest cryptoapi - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest misc - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest ncp - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest options_parse - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest packet_id - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest pkt - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest provider - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest ssl - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest tls_crypt - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest user_pass - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest argv - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest auth_token - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest buffer - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest crypto - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest cryptoapi - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest misc - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest ncp - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest options_parse - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest packet_id - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest pkt - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest provider - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest ssl - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest tls_crypt - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest user_pass - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest argv - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest auth_token - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest buffer - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest crypto - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest cryptoapi - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest misc - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest ncp - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest options_parse - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest packet_id - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest pkt - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest provider - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest ssl - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest tls_crypt - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest user_pass - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest argv - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest auth_token - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest buffer - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest crypto - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest cryptoapi - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest misc - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest ncp - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest options_parse - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest packet_id - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest pkt - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest provider - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest ssl - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest tls_crypt - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest user_pass - x86 - Release - OSSL (push) Has been cancelled
Deploy Doxygen documentation to Pages / deploy (push) Has been cancelled
Some checks failed
Build / Check code style with clang-format (push) Has been cancelled
Build / Android - arm64-v8a (push) Has been cancelled
Build / gcc-mingw - x64 - Debug - OSSL (push) Has been cancelled
Build / gcc-mingw - x64 - Release - OSSL (push) Has been cancelled
Build / gcc-mingw - x86 - Debug - OSSL (push) Has been cancelled
Build / gcc-mingw - x86 - Release - OSSL (push) Has been cancelled
Build / gcc - ubuntu-24.04 - OpenSSL 3.0.13 --enable-pkcs11 (push) Has been cancelled
Build / gcc - ubuntu-22.04 - OpenSSL 3.0.2 --enable-pkcs11 (push) Has been cancelled
Build / clang-asan - ubuntu-22.04 - openssl (push) Has been cancelled
Build / clang-asan - ubuntu-24.04 - openssl (push) Has been cancelled
Build / macos-14 - libressl - asan (push) Has been cancelled
Build / macos-14 - openssl@3 - asan (push) Has been cancelled
Build / macos-15 - libressl - asan (push) Has been cancelled
Build / macos-15 - openssl@3 - asan (push) Has been cancelled
Build / macos-26 - libressl - asan (push) Has been cancelled
Build / macos-26 - openssl@3 - asan (push) Has been cancelled
Build / macos-14 - libressl - normal (push) Has been cancelled
Build / macos-14 - openssl@3 - normal (push) Has been cancelled
Build / macos-15 - libressl - normal (push) Has been cancelled
Build / macos-15 - openssl@3 - normal (push) Has been cancelled
Build / macos-26 - libressl - normal (push) Has been cancelled
Build / macos-26 - openssl@3 - normal (push) Has been cancelled
Build / msbuild - amd64 - openssl (push) Has been cancelled
Build / msbuild - amd64-clang - openssl (push) Has been cancelled
Build / msbuild - arm64 - openssl (push) Has been cancelled
Build / msbuild - x86 - openssl (push) Has been cancelled
Build / msbuild - x86-clang - openssl (push) Has been cancelled
Build / clang asan - ubuntu-22.04 - libressl (push) Has been cancelled
Build / gcc normal - ubuntu-22.04 - libressl (push) Has been cancelled
Build / clang asan - ubuntu-22.04 - mbedtls3 (push) Has been cancelled
Build / gcc normal - ubuntu-22.04 - mbedtls3 (push) Has been cancelled
Build / clang asan - ubuntu-24.04 - awslc (push) Has been cancelled
Build / gcc normal - ubuntu-24.04 - awslc (push) Has been cancelled
Deploy Doxygen documentation to Pages / build (push) Has been cancelled
Build / mingw unittest argv - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest auth_token - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest buffer - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest crypto - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest cryptoapi - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest misc - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest ncp - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest options_parse - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest packet_id - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest pkt - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest provider - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest ssl - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest tls_crypt - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest user_pass - x64 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest argv - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest auth_token - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest buffer - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest crypto - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest cryptoapi - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest misc - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest ncp - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest options_parse - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest packet_id - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest pkt - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest provider - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest ssl - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest tls_crypt - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest user_pass - x64 - Release - OSSL (push) Has been cancelled
Build / mingw unittest argv - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest auth_token - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest buffer - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest crypto - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest cryptoapi - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest misc - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest ncp - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest options_parse - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest packet_id - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest pkt - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest provider - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest ssl - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest tls_crypt - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest user_pass - x86 - Debug - OSSL (push) Has been cancelled
Build / mingw unittest argv - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest auth_token - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest buffer - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest crypto - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest cryptoapi - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest misc - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest ncp - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest options_parse - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest packet_id - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest pkt - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest provider - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest ssl - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest tls_crypt - x86 - Release - OSSL (push) Has been cancelled
Build / mingw unittest user_pass - x86 - Release - OSSL (push) Has been cancelled
Deploy Doxygen documentation to Pages / deploy (push) Has been cancelled
While fixing the conversion warning I was somewhat confused how this works, so added UTs to verify I understood it. v2: - disable assert test for MS VS - add define for memory-intensive UTs and only enable it by default for CMake builds, so we do not break a lot of builds out there due to memory allocation failures Change-Id: Icab68a5fd1b6288955f0073179f1ddde1468d951 Signed-off-by: Frank Lichtenheld <frank@lichtenheld.com> Acked-by: Gert Doering <gert@greenie.muc.de> Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1432 Message-Id: <20251212120352.17402-1-gert@greenie.muc.de> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg35050.html Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
parent
2b8149a4fe
commit
75cc34eccc
7 changed files with 209 additions and 5 deletions
|
|
@ -633,6 +633,7 @@ if (NOT WIN32)
|
|||
endif ()
|
||||
endif ()
|
||||
|
||||
option(UT_ALLOW_BIG_ALLOC "Allow unit-tests to use > 1 GB of memory" ON)
|
||||
|
||||
if (BUILD_TESTING)
|
||||
find_package(cmocka CONFIG)
|
||||
|
|
@ -649,6 +650,7 @@ if (BUILD_TESTING)
|
|||
"test_buffer"
|
||||
"test_crypto"
|
||||
"test_dhcp"
|
||||
"test_mbuf"
|
||||
"test_misc"
|
||||
"test_ncp"
|
||||
"test_options_parse"
|
||||
|
|
@ -739,6 +741,9 @@ if (BUILD_TESTING)
|
|||
# for compat with IDEs like Clion that ignore the tests properties
|
||||
# for the environment variable srcdir when running tests as fallback
|
||||
target_compile_definitions(${test_name} PRIVATE "UNIT_TEST_SOURCEDIR=\"${_UT_SOURCE_DIR}\"")
|
||||
if (UT_ALLOW_BIG_ALLOC)
|
||||
target_compile_definitions(${test_name} PRIVATE UNIT_TEST_ALLOW_BIG_ALLOC)
|
||||
endif ()
|
||||
|
||||
if (NOT ${test_name} STREQUAL "test_buffer")
|
||||
target_sources(${test_name} PRIVATE
|
||||
|
|
@ -800,6 +805,12 @@ if (BUILD_TESTING)
|
|||
src/openvpn/xkey_provider.c
|
||||
)
|
||||
|
||||
target_sources(test_mbuf PRIVATE
|
||||
tests/unit_tests/openvpn/mock_get_random.c
|
||||
src/openvpn/buffer.c
|
||||
src/openvpn/mbuf.c
|
||||
)
|
||||
|
||||
target_sources(test_misc PRIVATE
|
||||
tests/unit_tests/openvpn/mock_get_random.c
|
||||
src/openvpn/options_util.c
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@
|
|||
struct mbuf_set *
|
||||
mbuf_init(unsigned int size)
|
||||
{
|
||||
ASSERT(size <= MBUF_SIZE_MAX);
|
||||
|
||||
struct mbuf_set *ret;
|
||||
ALLOC_OBJ_CLEAR(ret, struct mbuf_set);
|
||||
ret->capacity = adjust_power_of_2(size);
|
||||
|
|
@ -121,6 +123,7 @@ mbuf_extract_item(struct mbuf_set *ms, struct mbuf_item *item)
|
|||
bool ret = false;
|
||||
if (ms)
|
||||
{
|
||||
ASSERT(item);
|
||||
while (ms->len)
|
||||
{
|
||||
*item = ms->array[ms->head];
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@
|
|||
struct multi_instance;
|
||||
|
||||
#define MBUF_INDEX(head, offset, size) (((head) + (offset)) & ((size) - 1))
|
||||
/* limited by adjust_power_of_2 and array_mult_safe */
|
||||
#define MBUF_SIZE_MAX (ALLOC_SIZE_MAX / sizeof(struct mbuf_item))
|
||||
|
||||
struct mbuf_buffer
|
||||
{
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@
|
|||
#include "options_util.h"
|
||||
#include "tun_afunix.h"
|
||||
#include "domain_helper.h"
|
||||
#include "mbuf.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
|
|
@ -7552,7 +7553,7 @@ add_option(struct options *options, char *p[], bool is_inline, const char *file,
|
|||
else if (streq(p[0], "bcast-buffers") && p[1] && !p[2])
|
||||
{
|
||||
VERIFY_PERMISSION(OPT_P_GENERAL);
|
||||
atoi_constrained(p[1], &options->n_bcast_buf, p[0], 1, INT_MAX, msglevel);
|
||||
atoi_constrained(p[1], &options->n_bcast_buf, p[0], 1, MBUF_SIZE_MAX, msglevel);
|
||||
}
|
||||
else if (streq(p[0], "tcp-queue-limit") && p[1] && !p[2])
|
||||
{
|
||||
|
|
|
|||
|
|
@ -6,9 +6,22 @@ AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING) Unit-Tests'
|
|||
|
||||
AM_TESTS_ENVIRONMENT = export LSAN_OPTIONS=suppressions=$(srcdir)/input/leak_suppr.txt;
|
||||
|
||||
test_binaries = argv_testdriver buffer_testdriver crypto_testdriver dhcp_testdriver packet_id_testdriver auth_token_testdriver \
|
||||
ncp_testdriver misc_testdriver options_parse_testdriver pkt_testdriver ssl_testdriver \
|
||||
user_pass_testdriver push_update_msg_testdriver provider_testdriver socket_testdriver
|
||||
test_binaries = argv_testdriver \
|
||||
auth_token_testdriver \
|
||||
buffer_testdriver \
|
||||
crypto_testdriver \
|
||||
dhcp_testdriver \
|
||||
ncp_testdriver \
|
||||
mbuf_testdriver \
|
||||
misc_testdriver \
|
||||
options_parse_testdriver \
|
||||
packet_id_testdriver \
|
||||
pkt_testdriver \
|
||||
provider_testdriver \
|
||||
push_update_msg_testdriver \
|
||||
socket_testdriver \
|
||||
ssl_testdriver \
|
||||
user_pass_testdriver
|
||||
|
||||
if HAVE_LD_WRAP_SUPPORT
|
||||
if !WIN32
|
||||
|
|
@ -327,6 +340,20 @@ ncp_testdriver_SOURCES = test_ncp.c \
|
|||
$(top_srcdir)/src/compat/compat-strsep.c \
|
||||
$(top_srcdir)/src/openvpn/ssl_util.c
|
||||
|
||||
mbuf_testdriver_CFLAGS = \
|
||||
-I$(top_srcdir)/include -I$(top_srcdir)/src/compat -I$(top_srcdir)/src/openvpn \
|
||||
-DSOURCEDIR=\"$(top_srcdir)\" @TEST_CFLAGS@
|
||||
|
||||
mbuf_testdriver_LDFLAGS = @TEST_LDFLAGS@
|
||||
|
||||
mbuf_testdriver_SOURCES = test_mbuf.c \
|
||||
mock_msg.c test_common.h \
|
||||
mock_get_random.c \
|
||||
$(top_srcdir)/src/openvpn/buffer.c \
|
||||
$(top_srcdir)/src/openvpn/win32-util.c \
|
||||
$(top_srcdir)/src/openvpn/platform.c \
|
||||
$(top_srcdir)/src/openvpn/mbuf.c
|
||||
|
||||
misc_testdriver_CFLAGS = \
|
||||
-I$(top_srcdir)/include -I$(top_srcdir)/src/compat -I$(top_srcdir)/src/openvpn \
|
||||
-DSOURCEDIR=\"$(top_srcdir)\" @TEST_CFLAGS@
|
||||
|
|
|
|||
|
|
@ -386,7 +386,7 @@ test_snprintf(void **state)
|
|||
|
||||
/* Instead of trying to trick the compiler here, disable the warnings
|
||||
* for this unit test. We know that the results will be truncated
|
||||
* and we want to test that. Not we need the clang as clang-cl (msvc) does
|
||||
* and we want to test that. Note we need the clang as clang-cl (msvc) does
|
||||
* not define __GNUC__ like it does under UNIX(-like) platforms */
|
||||
#if defined(__GNUC__) || defined(__clang__)
|
||||
/* some clang version do not understand -Wformat-truncation, so ignore the
|
||||
|
|
|
|||
160
tests/unit_tests/openvpn/test_mbuf.c
Normal file
160
tests/unit_tests/openvpn/test_mbuf.c
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
* 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) 2025 OpenVPN Inc. <sales@openvpn.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; if not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "syshead.h"
|
||||
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
|
||||
#include "buffer.h"
|
||||
#include "multi.h"
|
||||
#include "mbuf.h"
|
||||
#include "test_common.h"
|
||||
|
||||
static void
|
||||
test_mbuf_init(void **state)
|
||||
{
|
||||
struct mbuf_set *ms = mbuf_init(256);
|
||||
assert_int_equal(ms->capacity, 256);
|
||||
assert_false(mbuf_defined(ms));
|
||||
assert_non_null(ms->array);
|
||||
mbuf_free(ms);
|
||||
|
||||
ms = mbuf_init(257);
|
||||
assert_int_equal(ms->capacity, 512);
|
||||
mbuf_free(ms);
|
||||
|
||||
#ifdef UNIT_TEST_ALLOW_BIG_ALLOC /* allocates up to 2GB of memory */
|
||||
ms = mbuf_init(MBUF_SIZE_MAX);
|
||||
assert_int_equal(ms->capacity, MBUF_SIZE_MAX);
|
||||
mbuf_free(ms);
|
||||
|
||||
/* NOTE: expect_assert_failure does not seem to work with MSVC */
|
||||
#ifndef _MSC_VER
|
||||
expect_assert_failure(mbuf_init(MBUF_SIZE_MAX + 1));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
test_mbuf_add_remove(void **state)
|
||||
{
|
||||
struct mbuf_set *ms = mbuf_init(4);
|
||||
assert_int_equal(ms->capacity, 4);
|
||||
assert_false(mbuf_defined(ms));
|
||||
assert_non_null(ms->array);
|
||||
|
||||
/* instances */
|
||||
struct multi_instance mi = { 0 };
|
||||
struct multi_instance mi2 = { 0 };
|
||||
/* buffers */
|
||||
struct buffer buf = alloc_buf(16);
|
||||
struct mbuf_buffer *mbuf_buf = mbuf_alloc_buf(&buf);
|
||||
assert_int_equal(mbuf_buf->refcount, 1);
|
||||
struct mbuf_buffer *mbuf_buf2 = mbuf_alloc_buf(&buf);
|
||||
assert_int_equal(mbuf_buf2->refcount, 1);
|
||||
free_buf(&buf);
|
||||
/* items */
|
||||
struct mbuf_item mb_item = { .buffer = mbuf_buf, .instance = &mi };
|
||||
struct mbuf_item mb_item2 = { .buffer = mbuf_buf2, .instance = &mi2 };
|
||||
|
||||
mbuf_add_item(ms, &mb_item);
|
||||
assert_int_equal(mbuf_buf->refcount, 2);
|
||||
assert_int_equal(mbuf_buf2->refcount, 1);
|
||||
assert_int_equal(mbuf_len(ms), 1);
|
||||
assert_int_equal(mbuf_maximum_queued(ms), 1);
|
||||
assert_int_equal(ms->head, 0);
|
||||
assert_ptr_equal(mbuf_peek(ms), &mi);
|
||||
|
||||
mbuf_add_item(ms, &mb_item2);
|
||||
assert_int_equal(mbuf_buf->refcount, 2);
|
||||
assert_int_equal(mbuf_buf2->refcount, 2);
|
||||
assert_int_equal(mbuf_len(ms), 2);
|
||||
assert_int_equal(mbuf_maximum_queued(ms), 2);
|
||||
assert_int_equal(ms->head, 0);
|
||||
assert_ptr_equal(mbuf_peek(ms), &mi);
|
||||
|
||||
mbuf_add_item(ms, &mb_item2);
|
||||
assert_int_equal(mbuf_buf->refcount, 2);
|
||||
assert_int_equal(mbuf_buf2->refcount, 3);
|
||||
assert_int_equal(mbuf_len(ms), 3);
|
||||
assert_int_equal(mbuf_maximum_queued(ms), 3);
|
||||
assert_int_equal(ms->head, 0);
|
||||
assert_ptr_equal(mbuf_peek(ms), &mi);
|
||||
|
||||
mbuf_add_item(ms, &mb_item2);
|
||||
mbuf_add_item(ms, &mb_item2); /* overflow, first item gets removed */
|
||||
assert_int_equal(mbuf_buf->refcount, 1);
|
||||
assert_int_equal(mbuf_buf2->refcount, 5);
|
||||
assert_int_equal(mbuf_len(ms), 4);
|
||||
assert_int_equal(mbuf_maximum_queued(ms), 4);
|
||||
assert_int_equal(ms->head, 1);
|
||||
assert_ptr_equal(mbuf_peek(ms), &mi2);
|
||||
|
||||
mbuf_add_item(ms, &mb_item);
|
||||
assert_int_equal(mbuf_buf->refcount, 2);
|
||||
assert_int_equal(mbuf_buf2->refcount, 4);
|
||||
assert_int_equal(mbuf_len(ms), 4);
|
||||
assert_int_equal(mbuf_maximum_queued(ms), 4);
|
||||
assert_int_equal(ms->head, 2);
|
||||
assert_ptr_equal(mbuf_peek(ms), &mi2);
|
||||
|
||||
struct mbuf_item out_item;
|
||||
assert_true(mbuf_extract_item(ms, &out_item));
|
||||
assert_ptr_equal(out_item.instance, mb_item2.instance);
|
||||
assert_int_equal(mbuf_buf->refcount, 2);
|
||||
assert_int_equal(mbuf_buf2->refcount, 4);
|
||||
assert_int_equal(mbuf_len(ms), 3);
|
||||
assert_int_equal(mbuf_maximum_queued(ms), 4);
|
||||
assert_int_equal(ms->head, 3);
|
||||
assert_ptr_equal(mbuf_peek(ms), &mi2);
|
||||
mbuf_free_buf(out_item.buffer);
|
||||
|
||||
mbuf_dereference_instance(ms, &mi2);
|
||||
assert_int_equal(mbuf_buf->refcount, 2);
|
||||
assert_int_equal(mbuf_buf2->refcount, 1);
|
||||
assert_int_equal(mbuf_len(ms), 3);
|
||||
assert_int_equal(mbuf_maximum_queued(ms), 4);
|
||||
assert_int_equal(ms->head, 3);
|
||||
assert_ptr_equal(mbuf_peek(ms), &mi);
|
||||
|
||||
mbuf_free(ms);
|
||||
assert_int_equal(mbuf_buf->refcount, 1);
|
||||
mbuf_free_buf(mbuf_buf);
|
||||
assert_int_equal(mbuf_buf2->refcount, 1);
|
||||
mbuf_free_buf(mbuf_buf2);
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_mbuf_init),
|
||||
cmocka_unit_test(test_mbuf_add_remove),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests_name("mbuf", tests, NULL, NULL);
|
||||
}
|
||||
Loading…
Reference in a new issue