summaryrefslogtreecommitdiffstats
path: root/test/units/testsuite-04.journal-append.sh
diff options
context:
space:
mode:
authorFrantisek Sumsal <frantisek@sumsal.cz>2023-05-13 17:39:35 +0200
committerFrantisek Sumsal <frantisek@sumsal.cz>2023-07-06 22:41:27 +0200
commit29bdeb5cb390ab68a42b8710429095d5a1732e11 (patch)
tree1151b51c9d24dff0404e1f5da080a8be4b359811 /test/units/testsuite-04.journal-append.sh
parenttest: measure subtest runtime (diff)
downloadsystemd-29bdeb5cb390ab68a42b8710429095d5a1732e11.tar.xz
systemd-29bdeb5cb390ab68a42b8710429095d5a1732e11.zip
test: append to corrupted journals
Introduce a manual test tool that creates a journal, corrupts it by flipping bits at given offsets, and then attempts to write to the journal. In ideal case we should handle this gracefully without any crash or memory corruption.
Diffstat (limited to '')
-rwxr-xr-xtest/units/testsuite-04.journal-append.sh46
1 files changed, 46 insertions, 0 deletions
diff --git a/test/units/testsuite-04.journal-append.sh b/test/units/testsuite-04.journal-append.sh
new file mode 100755
index 0000000000..35f9433b83
--- /dev/null
+++ b/test/units/testsuite-04.journal-append.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eux
+set -o pipefail
+
+# test-journal-append corrupts the journal file by flipping a bit at a given offset and
+# following it by a write to check if we handle appending messages to corrupted journals
+# gracefully
+
+TEST_JOURNAL_APPEND=/usr/lib/systemd/tests/unit-tests/manual/test-journal-append
+
+[[ -x "$TEST_JOURNAL_APPEND" ]]
+
+# Corrupt the first ~1024 bytes, this should be pretty quick
+"$TEST_JOURNAL_APPEND" --sequential --start-offset=0 --iterations=350 --iteration-step=3
+
+# Skip most of the test when running without acceleration, as it's excruciatingly slow
+# (this shouldn't be an issue, as it should run in nspawn as well)
+if ! [[ "$(systemd-detect-virt -v)" == "qemu" ]]; then
+ # Corrupt the beginning of every 1K block between 1K - 32K
+ for ((i = 1024; i <= (32 * 1024); i += 1024)); do
+ "$TEST_JOURNAL_APPEND" --sequential --start-offset="$i" --iterations=5 --iteration-step=13
+ done
+
+ # Corrupt the beginning of every 16K block between 32K - 128K
+ for ((i = (32 * 1024); i <= (256 * 1024); i += (16 * 1024))); do
+ "$TEST_JOURNAL_APPEND" --sequential --start-offset="$i" --iterations=5 --iteration-step=13
+ done
+
+ # Corrupt the beginning of every 128K block between 128K - 1M
+ for ((i = (128 * 1024); i <= (1 * 1024 * 1024); i += (128 * 1024))); do
+ "$TEST_JOURNAL_APPEND" --sequential --start-offset="$i" --iterations=5 --iteration-step=13
+ done
+
+ # And finally the beginning of every 1M block between 1M and 8M
+ for ((i = (1 * 1024 * 1024); i < (8 * 1024 * 1024); i += (1 * 1024 * 1024))); do
+ "$TEST_JOURNAL_APPEND" --sequential --start-offset="$i" --iterations=5 --iteration-step=13
+ done
+
+ if [[ "$(nproc)" -ge 2 ]]; then
+ # Try to corrupt random bytes throughout the journal
+ "$TEST_JOURNAL_APPEND" --iterations=25
+ fi
+else
+ "$TEST_JOURNAL_APPEND" --iterations=10
+fi