Skip to content

Commit

Permalink
Ensure that all unit tests use unbuffered stdout and stderr
Browse files Browse the repository at this point in the history
stderr is normally always unbuffered but stdout can be buffered. Especially,
when stdout is redirected it will become buffered while it is normally
unbuffered when connected to a terminal. This mean that if the unit exits
prematurely, the output in the buffered output will be lost.

As the unit test x_msg mock implementation prints even fatal on stdout
we ensure with this setup method that stdout is also unbuffered.

Change-Id: I5c06dc13e9d8ab73997f79b13c30ee8949e5e993
Acked-by: Frank Lichtenheld <[email protected]>
Message-Id: <[email protected]>
URL: https://www.mail-archive.com/[email protected]/msg28122.html
Signed-off-by: Gert Doering <[email protected]>
  • Loading branch information
schwabe authored and cron2 committed Jan 23, 2024
1 parent dc4fde8 commit 7869617
Show file tree
Hide file tree
Showing 14 changed files with 69 additions and 0 deletions.
2 changes: 2 additions & 0 deletions tests/unit_tests/openvpn/test_argv.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include "argv.h"
#include "buffer.h"
#include "test_common.h"

/* Defines for use in the tests and the mock parse_line() */
#define PATH1 "/s p a c e"
Expand Down Expand Up @@ -252,6 +253,7 @@ argv_insert_head__non_empty_argv__head_added(void **state)
int
main(void)
{
openvpn_unit_test_setup();
const struct CMUnitTest tests[] = {
cmocka_unit_test(argv_printf__multiple_spaces_in_format__parsed_as_one),
cmocka_unit_test(argv_printf_cat__multiple_spaces_in_format__parsed_as_one),
Expand Down
2 changes: 2 additions & 0 deletions tests/unit_tests/openvpn/test_auth_token.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include <cmocka.h>

#include "auth_token.c"
#include "test_common.h"

struct test_context {
struct tls_multi multi;
Expand Down Expand Up @@ -407,6 +408,7 @@ auth_token_test_key_load(void **state)
int
main(void)
{
openvpn_unit_test_setup();
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(auth_token_basic_test, setup, teardown),
cmocka_unit_test_setup_teardown(auth_token_fail_invalid_key, setup, teardown),
Expand Down
2 changes: 2 additions & 0 deletions tests/unit_tests/openvpn/test_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

#include "buffer.h"
#include "buffer.c"
#include "test_common.h"

static void
test_buffer_strprefix(void **state)
Expand Down Expand Up @@ -356,6 +357,7 @@ test_character_class(void **state)
int
main(void)
{
openvpn_unit_test_setup();
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_buffer_strprefix),
cmocka_unit_test(test_buffer_printf_catrunc),
Expand Down
40 changes: 40 additions & 0 deletions tests/unit_tests/openvpn/test_common.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* 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-2021 Fox Crypto B.V. <[email protected]>
*
* 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, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#include <stdio.h>
#include <setjmp.h>
#include <cmocka.h>

/**
* Sets up the environment for unit tests like making both stderr and stdout
* non-buffered to avoid messages getting lost if the program exits early.
*
* This has a openvpn prefix to avoid confusion with cmocka's unit_test_setup_*
* methods
*/
void
openvpn_unit_test_setup()
{
assert_int_equal(setvbuf(stdout, NULL, _IONBF, BUFSIZ), 0);
assert_int_equal(setvbuf(stderr, NULL, _IONBF, BUFSIZ), 0);
}
2 changes: 2 additions & 0 deletions tests/unit_tests/openvpn/test_crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include "ssl_backend.h"

#include "mss.h"
#include "test_common.h"

static const char testtext[] = "Dummy text to test PEM encoding";

Expand Down Expand Up @@ -445,6 +446,7 @@ test_mssfix_mtu_calculation(void **state)
int
main(void)
{
openvpn_unit_test_setup();
const struct CMUnitTest tests[] = {
cmocka_unit_test(crypto_pem_encode_decode_loopback),
cmocka_unit_test(crypto_translate_cipher_names),
Expand Down
2 changes: 2 additions & 0 deletions tests/unit_tests/openvpn/test_cryptoapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
#include <openssl/core_names.h>
#include <openssl/evp.h>
#include <openssl/pkcs12.h>
#include "test_common.h"

#include <cryptoapi.h>
#include <cryptoapi.c> /* pull-in the whole file to test static functions */
Expand Down Expand Up @@ -486,6 +487,7 @@ test_parse_hexstring(void **state)
int
main(void)
{
openvpn_unit_test_setup();
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_parse_hexstring),
cmocka_unit_test(import_certs),
Expand Down
2 changes: 2 additions & 0 deletions tests/unit_tests/openvpn/test_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@

#include "ssl_util.h"
#include "options_util.h"
#include "test_common.h"

static void
test_compat_lzo_string(void **state)
Expand Down Expand Up @@ -117,5 +118,6 @@ const struct CMUnitTest misc_tests[] = {
int
main(void)
{
openvpn_unit_test_setup();
return cmocka_run_group_tests(misc_tests, NULL, NULL);
}
2 changes: 2 additions & 0 deletions tests/unit_tests/openvpn/test_ncp.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include <cmocka.h>

#include "ssl_ncp.c"
#include "test_common.h"

/* Defines for use in the tests and the mock parse_line() */

Expand Down Expand Up @@ -272,6 +273,7 @@ const struct CMUnitTest ncp_tests[] = {
int
main(void)
{
openvpn_unit_test_setup();
#if defined(ENABLE_CRYPTO_OPENSSL)
OpenSSL_add_all_algorithms();
#endif
Expand Down
2 changes: 2 additions & 0 deletions tests/unit_tests/openvpn/test_packet_id.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@

#include "packet_id.h"
#include "reliable.h"
#include "test_common.h"

struct test_packet_id_write_data {
struct {
Expand Down Expand Up @@ -273,6 +274,7 @@ test_copy_acks_to_lru(void **state)
int
main(void)
{
openvpn_unit_test_setup();
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(test_packet_id_write_short,
test_packet_id_write_setup,
Expand Down
3 changes: 3 additions & 0 deletions tests/unit_tests/openvpn/test_pkcs11.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,13 @@

#include <setjmp.h>
#include <cmocka.h>
#include "test_common.h"

#define token_name "Test Token"
#define PIN "12345"
#define HASHSIZE 20


struct management *management; /* global */

/* replacement for crypto_print_openssl_errors() */
Expand Down Expand Up @@ -459,6 +461,7 @@ test_tls_ctx_use_pkcs11__management(void **state)
int
main(void)
{
openvpn_unit_test_setup();
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(test_pkcs11_ids, setup_pkcs11,
teardown_pkcs11),
Expand Down
2 changes: 2 additions & 0 deletions tests/unit_tests/openvpn/test_pkt.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include <string.h>
#include <setjmp.h>
#include <cmocka.h>
#include "test_common.h"

#include "crypto.h"
#include "options.h"
Expand Down Expand Up @@ -628,6 +629,7 @@ test_generate_reset_packet_tls_auth(void **ut_state)
int
main(void)
{
openvpn_unit_test_setup();
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_tls_decrypt_lite_none),
cmocka_unit_test(test_tls_decrypt_lite_auth),
Expand Down
3 changes: 3 additions & 0 deletions tests/unit_tests/openvpn/test_provider.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
#include <openssl/core_names.h>
#include <openssl/evp.h>

#include "test_common.h"

struct management *management; /* global */
static int mgmt_callback_called;

Expand Down Expand Up @@ -119,6 +121,7 @@ load_pubkey(const char *pem)
static void
init_test()
{
openvpn_unit_test_setup();
prov[0] = OSSL_PROVIDER_load(NULL, "default");
OSSL_PROVIDER_add_builtin(NULL, prov_name, xkey_provider_init);
prov[1] = OSSL_PROVIDER_load(NULL, prov_name);
Expand Down
3 changes: 3 additions & 0 deletions tests/unit_tests/openvpn/test_ssl.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include "mss.h"
#include "ssl_verify_backend.h"
#include "win32.h"
#include "test_common.h"

/* Mock function to be allowed to include win32.c which is required for
* getting the temp directory */
Expand Down Expand Up @@ -122,6 +123,8 @@ crypto_pem_encode_certificate(void **state)
int
main(void)
{
openvpn_unit_test_setup();

const struct CMUnitTest tests[] = {
cmocka_unit_test(crypto_pem_encode_certificate)
};
Expand Down
2 changes: 2 additions & 0 deletions tests/unit_tests/openvpn/test_tls_crypt.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include <setjmp.h>
#include <cmocka.h>

#include "test_common.h"
#include "tls_crypt.c"

/* Define this function here as dummy since including the ssl_*.c files
Expand Down Expand Up @@ -673,6 +674,7 @@ test_tls_crypt_v2_write_client_key_file_metadata(void **state)
int
main(void)
{
openvpn_unit_test_setup();
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(tls_crypt_loopback,
test_tls_crypt_setup,
Expand Down

0 comments on commit 7869617

Please sign in to comment.