public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: Stefano Brivio <sbrivio@redhat.com>
To: passt-dev@passt.top
Subject: [PATCH 8/8] test: Add log file tests for pasta plus corresponding layout and setup
Date: Fri, 07 Oct 2022 02:47:42 +0200	[thread overview]
Message-ID: <20221007004742.1188933-9-sbrivio@redhat.com> (raw)
In-Reply-To: <20221007004742.1188933-1-sbrivio@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 7997 bytes --]

To test log files on a tmpfs mount, we need to unshare the mount
namespace, which means using a context for the passt pane is not
really practical at the moment, as we can't open a shell there, so
we would have to encapsulate all the commands under 'unshare -rUm',
plus the "inner" pasta command, running in turn a tcp_rr server.

It might be worth fixing this by e.g. detecting we are trying to
spawn an interactive shell and adding a special path in the context
setup with some form of stdin redirection -- I'm not sure it's doable
though.

For this reason, add a new layout, using a context only for the host
pane, while keeping the old command dispatch mechanism for the passt
pane.

We also need a new setup function that doesn't start pasta: we want
to start and restart it with different options.

Further, we need a 'pint' directive, to send an interrupt to the
passt pane: add that in lib/test.

All the tests before the one involving tmpfs and a detached mount
namespace were also tested with the context mechanism. To make an
eventual conversion easier, pass tcp_crr directly as a command on
pasta's command line where feasible.

While at it, fix the comment to the teardown_pasta() function.

The new test set can be semi-conveniently run as:

  ./run pasta_options/log_to_file

and it checks basic log creation, size of the log file after flooding
it with debug entries, rotations, and basic consistency after
rotations, on both an existing filesystem and a tmpfs, chosen as
it doesn't support collapsing data ranges via fallocate(), hence
triggering the fall-back mechanism for logging rotation.

Signed-off-by: Stefano Brivio <sbrivio(a)redhat.com>
---
 test/lib/layout                | 39 +++++++++++++++
 test/lib/setup                 | 15 +++++-
 test/lib/test                  |  3 ++
 test/pasta_options/log_to_file | 90 ++++++++++++++++++++++++++++++++++
 test/run                       |  4 ++
 5 files changed, 150 insertions(+), 1 deletion(-)
 create mode 100644 test/pasta_options/log_to_file

diff --git a/test/lib/layout b/test/lib/layout
index 79a6c80..fcd1db4 100644
--- a/test/lib/layout
+++ b/test/lib/layout
@@ -43,6 +43,45 @@ layout_host() {
 	sleep 1
 }
 
+# layout_pasta_simple() - Panes for host and pasta
+layout_pasta_simple() {
+	sleep 3
+
+	tmux kill-pane -a -t 0
+	cmd_write 0 clear
+
+	tmux split-window -v -t passt_test
+	tmux split-window -h -t passt_test
+
+	PANE_PASST=0
+	PANE_HOST=1
+	PANE_INFO=2
+
+	get_info_cols
+
+	tmux send-keys -l -t ${PANE_INFO} 'while cat '"$STATEBASE/log_pipe"'; do :; done'
+	tmux send-keys -t ${PANE_INFO} -N 100 C-m
+	tmux select-pane -t ${PANE_INFO} -T "test log"
+
+	if context_exists host; then
+		pane_watch_contexts ${PANE_HOST} host host
+	else
+		tmux pipe-pane -O -t ${PANE_HOST} "cat >> ${LOGDIR}/pane_host.log"
+		tmux select-pane -t ${PANE_HOST} -T "host"
+	fi
+
+	if context_exists passt; then
+		pane_watch_contexts ${PANE_PASST} host host
+	else
+		tmux pipe-pane -O -t ${PANE_PASST} "cat >> ${LOGDIR}/pane_passt.log"
+		tmux select-pane -t ${PANE_PASST} -T "pasta"
+	fi
+
+	info_layout "single pasta instance"
+
+	sleep 1
+}
+
 # layout_pasta() - Panes for host, pasta, and separate one for namespace
 layout_pasta() {
 	sleep 3
diff --git a/test/lib/setup b/test/lib/setup
index 071e11d..e2d0ff0 100755
--- a/test/lib/setup
+++ b/test/lib/setup
@@ -106,6 +106,13 @@ setup_pasta() {
 	wait_for [ -f "${STATESETUP}/passt.pid" ]
 }
 
+# setup_pasta_options() - Set up layout and host context without starting pasta
+setup_pasta_options() {
+	context_setup_host host
+
+	layout_pasta_simple
+}
+
 # setup_passt_in_ns() - Set up namespace (with pasta), run qemu and passt into it
 setup_passt_in_ns() {
 	context_setup_host host
@@ -294,7 +301,7 @@ teardown_passt() {
 	teardown_context_watch ${PANE_GUEST} qemu guest
 }
 
-# teardown_passt() - Exit namespace, kill pasta process
+# teardown_pasta() - Exit namespace, kill pasta process
 teardown_pasta() {
 	${NSHOLDER} "${STATESETUP}/ns.hold" stop
 	context_wait unshare
@@ -304,6 +311,12 @@ teardown_pasta() {
 	teardown_context_watch ${PANE_NS} unshare ns
 }
 
+# teardown_pasta_options() - Tear down pasta and host context, no namespace
+teardown_pasta_options() {
+	teardown_context_watch ${PANE_HOST} host
+	teardown_context_watch ${PANE_PASST} passt
+}
+
 # teardown_passt_in_ns() - Exit namespace, kill qemu and pasta, remove pid file
 teardown_passt_in_ns() {
 	context_run ns kill $(cat "${STATESETUP}/qemu.pid")
diff --git a/test/lib/test b/test/lib/test
index 558d0f0..4c271a5 100755
--- a/test/lib/test
+++ b/test/lib/test
@@ -137,6 +137,9 @@ test_one_line() {
 	"passtw")
 		pane_or_context_wait passt || TEST_ONE_nok=1
 		;;
+	"pint")
+		tmux send-keys -t ${PANE_PASST} "C-c"
+		;;
 	"pout")
 		__varname="${__arg%% *}"
 		__output="$(pane_or_context_output passt "${__arg#* }")"
diff --git a/test/pasta_options/log_to_file b/test/pasta_options/log_to_file
new file mode 100644
index 0000000..587bf8e
--- /dev/null
+++ b/test/pasta_options/log_to_file
@@ -0,0 +1,90 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+#
+# PASST - Plug A Simple Socket Transport
+#  for qemu/UNIX domain socket mode
+#
+# PASTA - Pack A Subtle Tap Abstraction
+#  for network namespace/tap device mode
+#
+# test/pasta_options/log_to_file - Check log creation, rotations and consistency
+#
+# Copyright (c) 2022 Red Hat GmbH
+# Author: Stefano Brivio <sbrivio(a)redhat.com>
+
+htools	wc tcp_rr tail cut tr sort
+
+def	flood_log_server
+passtb	tcp_crr --nolog -P 10001 -C 10002 -6
+sleep	1
+endef
+
+def	flood_log_client
+host	tcp_crr --nolog -P 10001 -C 10002 -6 -c -H ::1
+endef
+
+def	check_log_size_mountns
+pout	SIZE cat __LOG_FILE__ | wc -c
+check	[ __SIZE__ -gt $((50 * 1024)) ]
+check	[ __SIZE__ -lt $((100 * 1024)) ]
+endef
+
+test	Log creation
+
+set	PORTS -t 10001,10002 -u 10001,10002
+set	LOG_FILE __STATEDIR__/pasta.log
+
+passt	./pasta -l __LOG_FILE__
+passt	exit
+check	[ -s __LOG_FILE__ ]
+
+test	Log truncated on creation
+passt	./pasta -l __LOG_FILE__
+passt	exit
+check	[ $(cat __LOG_FILE__ | wc -l) -eq 1 ]
+
+test	Maximum log size
+passtb	./pasta --config-net -d -f -l __LOG_FILE__ --log-size $((100 * 1024)) -- sh -c 'while true; do tcp_crr --nolog -P 10001 -C 10002 -6; done'
+sleep	1
+
+flood_log_client
+check	[ $(cat __LOG_FILE__ | wc -c) -gt $((50 * 1024)) ]
+check	[ $(cat __LOG_FILE__ | wc -c) -lt $((100 * 1024)) ]
+
+flood_log_client
+check	[ $(cat __LOG_FILE__ | wc -c) -gt $((50 * 1024)) ]
+check	[ $(cat __LOG_FILE__ | wc -c) -lt $((100 * 1024)) ]
+
+flood_log_client
+check	[ $(cat __LOG_FILE__ | wc -c) -gt $((50 * 1024)) ]
+check	[ $(cat __LOG_FILE__ | wc -c) -lt $((100 * 1024)) ]
+
+pint
+
+test	Timestamp consistency after rotations
+check	tail -n +2 __LOG_FILE__ | cut -f1 -d' ' | tr -d [.:] | sort -c
+
+test	Maximum log size on tmpfs (no FALLOC_FL_COLLAPSE_RANGE)
+passt	unshare -rUm
+passt	mkdir __STATEDIR__/t
+passt	mount -t tmpfs none __STATEDIR__/t
+set	LOG_FILE __STATEDIR__/t/log
+passt	./pasta --config-net -d -l __LOG_FILE__ --log-size $((100 * 1024))
+
+flood_log_server
+flood_log_client
+check_log_size_mountns
+
+flood_log_server
+flood_log_client
+check_log_size_mountns
+
+flood_log_server
+flood_log_client
+check_log_size_mountns
+
+test	Timestamp consistency after rotations (no FALLOC_FL_COLLAPSE_RANGE)
+check	tail -n +2 __LOG_FILE__ | cut -f1 -d' ' | tr -d [.:] | sort -c
+
+passt	exit
+passt	umount __STATEDIR__/t
+passt	exit
diff --git a/test/run b/test/run
index 1ae270e..0bf79d4 100755
--- a/test/run
+++ b/test/run
@@ -80,6 +80,10 @@ run() {
 	test passt/shutdown
 	teardown pasta
 
+	setup pasta_options
+	test pasta_options/log_to_file
+	teardown pasta_options
+
 	setup passt
 	test passt/ndp
 	test passt/dhcp
-- 
@@ -80,6 +80,10 @@ run() {
 	test passt/shutdown
 	teardown pasta
 
+	setup pasta_options
+	test pasta_options/log_to_file
+	teardown pasta_options
+
 	setup passt
 	test passt/ndp
 	test passt/dhcp
-- 
2.35.1


  parent reply	other threads:[~2022-10-07  0:47 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-07  0:47 [PATCH 0/8] Add support for log file, version display, and tests Stefano Brivio
2022-10-07  0:47 ` [PATCH 1/8] Move logging functions to a new file, log.c Stefano Brivio
2022-10-07  6:13   ` David Gibson
2022-10-07  0:47 ` [PATCH 2/8] conf: Drop duplicate, diverging optstring assignments Stefano Brivio
2022-10-07  6:20   ` David Gibson
2022-10-07  0:47 ` [PATCH 3/8] passt.h: Include netinet/if_ether.h before struct ctx declaration Stefano Brivio
2022-10-07  6:23   ` David Gibson
2022-10-07  7:44     ` Stefano Brivio
2022-10-07  8:40       ` David Gibson
2022-10-07 11:36         ` Stefano Brivio
2022-10-07  0:47 ` [PATCH 4/8] log, conf: Add support for logging to file Stefano Brivio
2022-10-07  6:51   ` David Gibson
2022-10-07  8:11     ` Stefano Brivio
2022-10-07  8:57       ` David Gibson
2022-10-07 10:27         ` Stefano Brivio
2022-10-07  0:47 ` [PATCH 5/8] log: Add missing function comment for trace_init() Stefano Brivio
2022-10-07  6:52   ` David Gibson
2022-10-07  0:47 ` [PATCH 6/8] conf, log, Makefile: Add versioning information Stefano Brivio
2022-10-07  6:57   ` David Gibson
2022-10-07  8:15     ` Stefano Brivio
2022-10-07  9:03       ` David Gibson
2022-10-07 10:12         ` Stefano Brivio
2022-10-07  0:47 ` [PATCH 7/8] util: Check return value of lseek() while reading bound ports from procfs Stefano Brivio
2022-10-07  6:58   ` David Gibson
2022-10-07  0:47 ` Stefano Brivio [this message]
2022-10-07  8:37   ` [PATCH 8/8] test: Add log file tests for pasta plus corresponding layout and setup David Gibson
2022-10-07  9:47     ` Stefano Brivio
2022-10-24 21:00       ` Stefano Brivio
2022-10-26  7:26         ` Stefano Brivio

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221007004742.1188933-9-sbrivio@redhat.com \
    --to=sbrivio@redhat.com \
    --cc=passt-dev@passt.top \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).