netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH nft 0/2] pretty print .json-nft files
@ 2023-11-24 12:45 Thomas Haller
  2023-11-24 12:45 ` [PATCH nft 1/2] tests/shell: use generated ruleset for `nft --check` Thomas Haller
  2023-11-24 12:45 ` [PATCH nft 2/2] tests/shell: have .json-nft dumps prettified to wrap lines Thomas Haller
  0 siblings, 2 replies; 5+ messages in thread
From: Thomas Haller @ 2023-11-24 12:45 UTC (permalink / raw)
  To: NetFilter; +Cc: Thomas Haller

The plain `nft -j list ruleset` output is hard to read in diffs.
Instead, commit pretty printed JSON to git and compare that.

Existing .json-nft continue to work, and don't need to be regenerated.
But when the dump content changes, the prettified version is committed
to git.

Thomas Haller (2):
  tests/shell: use generated ruleset for `nft --check`
  tests/shell: have .json-nft dumps prettified to wrap lines

 tests/shell/helpers/json-pretty.sh  | 27 +++++++---
 tests/shell/helpers/test-wrapper.sh | 81 ++++++++++++++++++++---------
 2 files changed, 75 insertions(+), 33 deletions(-)

-- 
2.42.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH nft 1/2] tests/shell: use generated ruleset for `nft --check`
  2023-11-24 12:45 [PATCH nft 0/2] pretty print .json-nft files Thomas Haller
@ 2023-11-24 12:45 ` Thomas Haller
  2023-11-24 12:45 ` [PATCH nft 2/2] tests/shell: have .json-nft dumps prettified to wrap lines Thomas Haller
  1 sibling, 0 replies; 5+ messages in thread
From: Thomas Haller @ 2023-11-24 12:45 UTC (permalink / raw)
  To: NetFilter; +Cc: Thomas Haller

The command `nft [-j] list ruleset | nft [-j] --check -f -` should never
fail. "test-wrapper.sh" already checks for that.

However, previously, we would run check against the .nft/.json-nft
files. In most cases, the generated ruleset and the files in git are
identical. However, when they are not, we (also) want to run the check
against the generated one.

This means, we can also run this check every time, regardless whether a
.nft/.json-nft file exists.

If the .nft/.json-nft file is different from the generated one, (because
a test was skipped or because there is a bug), then also check those
files. But this time, any output is ignored as failures are expected
to happen. We still run the check, to get additional coverage for
valgrind or santizers.

Signed-off-by: Thomas Haller <thaller@redhat.com>
---
 tests/shell/helpers/test-wrapper.sh | 48 ++++++++++++++++-------------
 1 file changed, 26 insertions(+), 22 deletions(-)

diff --git a/tests/shell/helpers/test-wrapper.sh b/tests/shell/helpers/test-wrapper.sh
index 4ffc48184dd7..f0170d763291 100755
--- a/tests/shell/helpers/test-wrapper.sh
+++ b/tests/shell/helpers/test-wrapper.sh
@@ -222,36 +222,40 @@ if [ "$rc" = 1 -o -s "$NFT_TEST_TESTTMPDIR/chkdump" ] ; then
 	show_file "$NFT_TEST_TESTTMPDIR/chkdump" "Command \`$NFT flush ruleset\` failed" >> "$NFT_TEST_TESTTMPDIR/rc-failed-chkdump"
 	rc_chkdump=1
 fi
-# For the dumpfiles, call `nft --check` to possibly cover new code paths.
-if [ -f "$DUMPFILE" ] ; then
-	if [ "$rc_test" -eq 77 ] ; then
-		# The test was skipped. Possibly we don't have the required
-		# features to process this file. Ignore any output and exit
-		# code, but still call the program (for valgrind or sanitizer
-		# issue we hope to find).
-		$NFT --check -f "$DUMPFILE" &>/dev/null || :
+# Check that `nft [-j] list ruleset | nft [-j] --check -f -` works.
+fail=n
+$NFT --check -f "$NFT_TEST_TESTTMPDIR/ruleset-after" &> "$NFT_TEST_TESTTMPDIR/chkdump" || fail=y
+test -s "$NFT_TEST_TESTTMPDIR/chkdump" && fail=y
+if [ "$fail" = y ] ; then
+	show_file "$NFT_TEST_TESTTMPDIR/chkdump" "Command \`$NFT --check -f \"$NFT_TEST_TESTTMPDIR/ruleset-after\"\` failed" >> "$NFT_TEST_TESTTMPDIR/rc-failed-chkdump"
+	rc_chkdump=1
+fi
+if [ -f "$DUMPFILE" ] && ! cmp "$DUMPFILE" "$NFT_TEST_TESTTMPDIR/ruleset-after" &>/dev/null ; then
+	# Also check the $DUMPFILE to hit possibly new code paths. This
+	# is useful to see crashes and with ASAN/valgrind.
+	$NFT --check -f "$DUMPFILE" &>/dev/null || :
+fi
+if [ "$NFT_TEST_HAVE_json" != n ] ; then
+	if [ ! -f "$JDUMPFILE" ] ; then
+		# Optimally, `nft -j list ruleset | nft -j --check -f -` never
+		# fails.  However, there are known issues where this doesn't
+		# work, and we cannot assert hard against that. It's those
+		# tests that don't have a .json-nft file.
+		#
+		# This should be fixed, every test should have a .json-nft
+		# file, and this workaround removed.
+		$NFT -j --check -f "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &>/dev/null || :
 	else
 		fail=n
-		$NFT --check -f "$DUMPFILE" &> "$NFT_TEST_TESTTMPDIR/chkdump" || fail=y
+		$NFT -j --check -f "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &> "$NFT_TEST_TESTTMPDIR/chkdump" || fail=y
 		test -s "$NFT_TEST_TESTTMPDIR/chkdump" && fail=y
 		if [ "$fail" = y ] ; then
-			show_file "$NFT_TEST_TESTTMPDIR/chkdump" "Command \`$NFT --check -f \"$DUMPFILE\"\` failed" >> "$NFT_TEST_TESTTMPDIR/rc-failed-chkdump"
+			show_file "$NFT_TEST_TESTTMPDIR/chkdump" "Command \`$NFT -j --check -f \"$NFT_TEST_TESTTMPDIR/ruleset-after.json\"\` failed" >> "$NFT_TEST_TESTTMPDIR/rc-failed-chkdump"
 			rc_chkdump=1
 		fi
-		rm -f "$NFT_TEST_TESTTMPDIR/chkdump"
 	fi
-fi
-if [ "$NFT_TEST_HAVE_json" != n -a -f "$JDUMPFILE" ] ; then
-	if [ "$rc_test" -eq 77 ] ; then
+	if [ -f "$JDUMPFILE" ] && ! cmp "$JDUMPFILE" "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &>/dev/null ; then
 		$NFT -j --check -f "$JDUMPFILE" &>/dev/null || :
-	else
-		fail=n
-		$NFT -j --check -f "$JDUMPFILE" &> "$NFT_TEST_TESTTMPDIR/chkdump" || fail=y
-		test -s "$NFT_TEST_TESTTMPDIR/chkdump" && fail=y
-		if [ "$fail" = y ] ; then
-			show_file "$NFT_TEST_TESTTMPDIR/chkdump" "Command \`$NFT -j --check -f \"$JDUMPFILE\"\` failed" >> "$NFT_TEST_TESTTMPDIR/rc-failed-chkdump"
-			rc_chkdump=1
-		fi
 	fi
 fi
 rm -f "$NFT_TEST_TESTTMPDIR/chkdump"
-- 
2.42.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH nft 2/2] tests/shell: have .json-nft dumps prettified to wrap lines
  2023-11-24 12:45 [PATCH nft 0/2] pretty print .json-nft files Thomas Haller
  2023-11-24 12:45 ` [PATCH nft 1/2] tests/shell: use generated ruleset for `nft --check` Thomas Haller
@ 2023-11-24 12:45 ` Thomas Haller
  2023-12-07  9:08   ` [PATCH nft 2/2 v2] " Thomas Haller
  1 sibling, 1 reply; 5+ messages in thread
From: Thomas Haller @ 2023-11-24 12:45 UTC (permalink / raw)
  To: NetFilter; +Cc: Thomas Haller

Previously, the .json-nft file in git contains the output of `nft -j
list ruleset`. This is one long line and makes diffs harder to review.

Instead, have the prettified .json-nft file committed to git.

- the diff now operates on the prettified version. That means, it
  compares essentially

     - `nft -j list ruleset | json-sanitize-ruleset.sh | json-pretty.sh`
     - `cat "$TEST.json-nft" | json-pretty.sh`

  The script "json-diff-pretty.sh" is no longer used. It is kept
  however, because it might be a useful for manual comparing files.

  Note that "json-sanitize-ruleset.sh" and "json-pretty.sh" are still
  two separate scripts and called at different times. They also do
  something different. The former mangles the JSON to account for changes
  that are not stable (in the JSON data itself), while the latter only
  pretty prints it.

- when generating a new .json-nft dump file, the file will be updated to
  use the new, prettified format, unless the file is in the old format
  and needs no update. This means, with DUMPGEN=y, old style is preserved
  unless an update becomes necessary.

This requires "json-pretty.sh" having stable output, as those files are
committed to git. This is probably fine.

Signed-off-by: Thomas Haller <thaller@redhat.com>
---
 tests/shell/helpers/json-pretty.sh  | 27 ++++++++++++++-----
 tests/shell/helpers/test-wrapper.sh | 41 +++++++++++++++++++++++------
 2 files changed, 53 insertions(+), 15 deletions(-)

diff --git a/tests/shell/helpers/json-pretty.sh b/tests/shell/helpers/json-pretty.sh
index 0d6972b81e2f..5407a8420058 100755
--- a/tests/shell/helpers/json-pretty.sh
+++ b/tests/shell/helpers/json-pretty.sh
@@ -1,17 +1,30 @@
 #!/bin/bash -e
 
-# WARNING: the output is not guaranteed to be stable.
+exec_pretty() {
+	# The output of this command must be stable (and `jq` and python
+	# fallback must generate the same output.
 
-if command -v jq &>/dev/null ; then
-	# If we have, use `jq`
-	exec jq
-fi
+	if command -v jq &>/dev/null ; then
+		# If we have, use `jq`
+		exec jq
+	fi
 
-# Fallback to python.
-exec python -c '
+	# Fallback to python.
+	exec python -c '
 import json
 import sys
 
 parsed = json.load(sys.stdin)
 print(json.dumps(parsed, indent=2))
 '
+}
+
+[ "$#" -le 1 ] || { echo "At most one argument supported" ; exit 1 ; }
+
+if [ "$#" -eq 1 ] ; then
+	# One argument passed. This must be a JSON file.
+	[ -f "$1" ] || { echo "File \"$1\" does not exist" ; exit 1 ; }
+	exec_pretty < "$1"
+fi
+
+exec_pretty
diff --git a/tests/shell/helpers/test-wrapper.sh b/tests/shell/helpers/test-wrapper.sh
index f0170d763291..529dc1aada7d 100755
--- a/tests/shell/helpers/test-wrapper.sh
+++ b/tests/shell/helpers/test-wrapper.sh
@@ -25,6 +25,10 @@ show_file() {
 	printf "<<<<\n"
 }
 
+json_pretty() {
+	"$NFT_TEST_BASEDIR/helpers/json-pretty.sh" "$@" 2>&1 || :
+}
+
 TEST="$1"
 TESTBASE="$(basename "$TEST")"
 TESTDIR="$(dirname "$TEST")"
@@ -140,6 +144,7 @@ if [ "$NFT_TEST_HAVE_json" != n ] ; then
 	fi
 	# JSON output needs normalization/sanitization, otherwise it's not stable.
 	"$NFT_TEST_BASEDIR/helpers/json-sanitize-ruleset.sh" "$NFT_TEST_TESTTMPDIR/ruleset-after.json"
+	json_pretty "$NFT_TEST_TESTTMPDIR/ruleset-after.json" > "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty"
 fi
 
 read tainted_after < /proc/sys/kernel/tainted
@@ -186,7 +191,12 @@ if [ "$rc_test" -eq 0 -a '(' "$DUMPGEN" = all -o "$DUMPGEN" = y ')' ] ; then
 		cat "$NFT_TEST_TESTTMPDIR/ruleset-after" > "$DUMPFILE"
 	fi
 	if [ "$NFT_TEST_HAVE_json" != n -a "$gen_jdumpfile" = y ] ; then
-		cat "$NFT_TEST_TESTTMPDIR/ruleset-after.json" > "$JDUMPFILE"
+		if cmp "$NFT_TEST_TESTTMPDIR/ruleset-after.json" "$JDUMPFILE" &>/dev/null ; then
+			# The .json-nft file is still the non-pretty variant. Keep it.
+			:
+		else
+			cat "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty" > "$JDUMPFILE"
+		fi
 	fi
 fi
 
@@ -201,12 +211,16 @@ if [ "$rc_test" -ne 77 -a "$dump_written" != y ] ; then
 		fi
 	fi
 	if [ "$NFT_TEST_HAVE_json" != n -a -f "$JDUMPFILE" ] ; then
-		if ! $DIFF -u "$JDUMPFILE" "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &> "$NFT_TEST_TESTTMPDIR/ruleset-diff.json" ; then
-			"$NFT_TEST_BASEDIR/helpers/json-diff-pretty.sh" \
-				"$JDUMPFILE" \
-				"$NFT_TEST_TESTTMPDIR/ruleset-after.json" \
-				2>&1 > "$NFT_TEST_TESTTMPDIR/ruleset-diff.json.pretty"
-			show_file "$NFT_TEST_TESTTMPDIR/ruleset-diff.json" "Failed \`$DIFF -u \"$JDUMPFILE\" \"$NFT_TEST_TESTTMPDIR/ruleset-after.json\"\`" >> "$NFT_TEST_TESTTMPDIR/rc-failed-dump"
+		JDUMPFILE2="$NFT_TEST_TESTTMPDIR/json-nft-pretty"
+		json_pretty "$JDUMPFILE" > "$JDUMPFILE2"
+		if cmp "$JDUMPFILE" "$JDUMPFILE2" &>/dev/null ; then
+			# The .json-nft file is already prettified. We can use
+			# it directly.
+			rm -rf "$JDUMPFILE2"
+			JDUMPFILE2="$JDUMPFILE"
+		fi
+		if ! $DIFF -u "$NFT_TEST_TESTTMPDIR/json-nft-pretty" "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty" &> "$NFT_TEST_TESTTMPDIR/ruleset-diff.json" ; then
+			show_file "$NFT_TEST_TESTTMPDIR/ruleset-diff.json" "Failed \`$DIFF -u \"$JDUMPFILE2\" \"$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty\"\`" >> "$NFT_TEST_TESTTMPDIR/rc-failed-dump"
 			rc_dump=1
 		else
 			rm -f "$NFT_TEST_TESTTMPDIR/ruleset-diff.json"
@@ -245,6 +259,7 @@ if [ "$NFT_TEST_HAVE_json" != n ] ; then
 		# This should be fixed, every test should have a .json-nft
 		# file, and this workaround removed.
 		$NFT -j --check -f "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &>/dev/null || :
+		$NFT -j --check -f "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty" &>/dev/null || :
 	else
 		fail=n
 		$NFT -j --check -f "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &> "$NFT_TEST_TESTTMPDIR/chkdump" || fail=y
@@ -253,8 +268,18 @@ if [ "$NFT_TEST_HAVE_json" != n ] ; then
 			show_file "$NFT_TEST_TESTTMPDIR/chkdump" "Command \`$NFT -j --check -f \"$NFT_TEST_TESTTMPDIR/ruleset-after.json\"\` failed" >> "$NFT_TEST_TESTTMPDIR/rc-failed-chkdump"
 			rc_chkdump=1
 		fi
+		fail=n
+		$NFT -j --check -f "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty" &> "$NFT_TEST_TESTTMPDIR/chkdump" || fail=y
+		test -s "$NFT_TEST_TESTTMPDIR/chkdump" && fail=y
+		if [ "$fail" = y ] ; then
+			show_file "$NFT_TEST_TESTTMPDIR/chkdump" "Command \`$NFT -j --check -f \"$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty\"\` failed" >> "$NFT_TEST_TESTTMPDIR/rc-failed-chkdump"
+			rc_chkdump=1
+		fi
 	fi
-	if [ -f "$JDUMPFILE" ] && ! cmp "$JDUMPFILE" "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &>/dev/null ; then
+	if [ -f "$JDUMPFILE" ] \
+	     && ! cmp "$JDUMPFILE" "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &>/dev/null \
+	     && ! cmp "$JDUMPFILE" "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty" &>/dev/null ; \
+	then
 		$NFT -j --check -f "$JDUMPFILE" &>/dev/null || :
 	fi
 fi
-- 
2.42.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH nft 2/2 v2] tests/shell: have .json-nft dumps prettified to wrap lines
  2023-11-24 12:45 ` [PATCH nft 2/2] tests/shell: have .json-nft dumps prettified to wrap lines Thomas Haller
@ 2023-12-07  9:08   ` Thomas Haller
  2024-02-08 17:31     ` Phil Sutter
  0 siblings, 1 reply; 5+ messages in thread
From: Thomas Haller @ 2023-12-07  9:08 UTC (permalink / raw)
  To: NetFilter; +Cc: Thomas Haller

Previously, the .json-nft file in git contains the output of `nft -j
list ruleset`. This is one long line and makes diffs harder to review.

Instead, have the prettified .json-nft file committed to git.

- the diff now operates on the prettified version. That means, it
  compares essentially

     - `nft -j list ruleset | json-sanitize-ruleset.sh | json-pretty.sh`
     - `cat "$TEST.json-nft" | json-pretty.sh`

  The script "json-diff-pretty.sh" is no longer used. It is kept
  however, because it might be a useful for manual comparing files.

  Note that "json-sanitize-ruleset.sh" and "json-pretty.sh" are still
  two separate scripts and called at different times. They also do
  something different. The former mangles the JSON to account for changes
  that are not stable (in the JSON data itself), while the latter only
  pretty prints it.

- when generating a new .json-nft dump file, the file will be updated to
  use the new, prettified format, unless the file is in the old format
  and needs no update. This means, with DUMPGEN=y, old style is preserved
  unless an update becomes necessary.

This requires "json-pretty.sh" having stable output, as those files are
committed to git. This is probably fine.

Signed-off-by: Thomas Haller <thaller@redhat.com>
---

Changes compared to v1:
- fix bug to use "$JDUMPFILE2" in diff command.

Still open question:
- whether to just re-generate/prettify all .json-nft files once. The
  current patch allows the files on disk to be in either form, and a
  DUMPGEN=y will only update the file, when necessary. Alternative
  would be to merge this patch, followed by regenerating all .json-nft
  files. In that case, this patch could be slightly simplified to not
  supporting the "mixed-mode".

 tests/shell/helpers/json-pretty.sh  | 27 ++++++++++++++-----
 tests/shell/helpers/test-wrapper.sh | 41 +++++++++++++++++++++++------
 2 files changed, 53 insertions(+), 15 deletions(-)

diff --git a/tests/shell/helpers/json-pretty.sh b/tests/shell/helpers/json-pretty.sh
index 0d6972b81e2f..5407a8420058 100755
--- a/tests/shell/helpers/json-pretty.sh
+++ b/tests/shell/helpers/json-pretty.sh
@@ -1,17 +1,30 @@
 #!/bin/bash -e
 
-# WARNING: the output is not guaranteed to be stable.
+exec_pretty() {
+	# The output of this command must be stable (and `jq` and python
+	# fallback must generate the same output.
 
-if command -v jq &>/dev/null ; then
-	# If we have, use `jq`
-	exec jq
-fi
+	if command -v jq &>/dev/null ; then
+		# If we have, use `jq`
+		exec jq
+	fi
 
-# Fallback to python.
-exec python -c '
+	# Fallback to python.
+	exec python -c '
 import json
 import sys
 
 parsed = json.load(sys.stdin)
 print(json.dumps(parsed, indent=2))
 '
+}
+
+[ "$#" -le 1 ] || { echo "At most one argument supported" ; exit 1 ; }
+
+if [ "$#" -eq 1 ] ; then
+	# One argument passed. This must be a JSON file.
+	[ -f "$1" ] || { echo "File \"$1\" does not exist" ; exit 1 ; }
+	exec_pretty < "$1"
+fi
+
+exec_pretty
diff --git a/tests/shell/helpers/test-wrapper.sh b/tests/shell/helpers/test-wrapper.sh
index f0170d763291..f1f33991b454 100755
--- a/tests/shell/helpers/test-wrapper.sh
+++ b/tests/shell/helpers/test-wrapper.sh
@@ -25,6 +25,10 @@ show_file() {
 	printf "<<<<\n"
 }
 
+json_pretty() {
+	"$NFT_TEST_BASEDIR/helpers/json-pretty.sh" "$@" 2>&1 || :
+}
+
 TEST="$1"
 TESTBASE="$(basename "$TEST")"
 TESTDIR="$(dirname "$TEST")"
@@ -140,6 +144,7 @@ if [ "$NFT_TEST_HAVE_json" != n ] ; then
 	fi
 	# JSON output needs normalization/sanitization, otherwise it's not stable.
 	"$NFT_TEST_BASEDIR/helpers/json-sanitize-ruleset.sh" "$NFT_TEST_TESTTMPDIR/ruleset-after.json"
+	json_pretty "$NFT_TEST_TESTTMPDIR/ruleset-after.json" > "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty"
 fi
 
 read tainted_after < /proc/sys/kernel/tainted
@@ -186,7 +191,12 @@ if [ "$rc_test" -eq 0 -a '(' "$DUMPGEN" = all -o "$DUMPGEN" = y ')' ] ; then
 		cat "$NFT_TEST_TESTTMPDIR/ruleset-after" > "$DUMPFILE"
 	fi
 	if [ "$NFT_TEST_HAVE_json" != n -a "$gen_jdumpfile" = y ] ; then
-		cat "$NFT_TEST_TESTTMPDIR/ruleset-after.json" > "$JDUMPFILE"
+		if cmp "$NFT_TEST_TESTTMPDIR/ruleset-after.json" "$JDUMPFILE" &>/dev/null ; then
+			# The .json-nft file is still the non-pretty variant. Keep it.
+			:
+		else
+			cat "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty" > "$JDUMPFILE"
+		fi
 	fi
 fi
 
@@ -201,12 +211,16 @@ if [ "$rc_test" -ne 77 -a "$dump_written" != y ] ; then
 		fi
 	fi
 	if [ "$NFT_TEST_HAVE_json" != n -a -f "$JDUMPFILE" ] ; then
-		if ! $DIFF -u "$JDUMPFILE" "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &> "$NFT_TEST_TESTTMPDIR/ruleset-diff.json" ; then
-			"$NFT_TEST_BASEDIR/helpers/json-diff-pretty.sh" \
-				"$JDUMPFILE" \
-				"$NFT_TEST_TESTTMPDIR/ruleset-after.json" \
-				2>&1 > "$NFT_TEST_TESTTMPDIR/ruleset-diff.json.pretty"
-			show_file "$NFT_TEST_TESTTMPDIR/ruleset-diff.json" "Failed \`$DIFF -u \"$JDUMPFILE\" \"$NFT_TEST_TESTTMPDIR/ruleset-after.json\"\`" >> "$NFT_TEST_TESTTMPDIR/rc-failed-dump"
+		JDUMPFILE2="$NFT_TEST_TESTTMPDIR/json-nft-pretty"
+		json_pretty "$JDUMPFILE" > "$JDUMPFILE2"
+		if cmp "$JDUMPFILE" "$JDUMPFILE2" &>/dev/null ; then
+			# The .json-nft file is already prettified. We can use
+			# it directly.
+			rm -rf "$JDUMPFILE2"
+			JDUMPFILE2="$JDUMPFILE"
+		fi
+		if ! $DIFF -u "$JDUMPFILE2" "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty" &> "$NFT_TEST_TESTTMPDIR/ruleset-diff.json" ; then
+			show_file "$NFT_TEST_TESTTMPDIR/ruleset-diff.json" "Failed \`$DIFF -u \"$JDUMPFILE2\" \"$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty\"\`" >> "$NFT_TEST_TESTTMPDIR/rc-failed-dump"
 			rc_dump=1
 		else
 			rm -f "$NFT_TEST_TESTTMPDIR/ruleset-diff.json"
@@ -245,6 +259,7 @@ if [ "$NFT_TEST_HAVE_json" != n ] ; then
 		# This should be fixed, every test should have a .json-nft
 		# file, and this workaround removed.
 		$NFT -j --check -f "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &>/dev/null || :
+		$NFT -j --check -f "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty" &>/dev/null || :
 	else
 		fail=n
 		$NFT -j --check -f "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &> "$NFT_TEST_TESTTMPDIR/chkdump" || fail=y
@@ -253,8 +268,18 @@ if [ "$NFT_TEST_HAVE_json" != n ] ; then
 			show_file "$NFT_TEST_TESTTMPDIR/chkdump" "Command \`$NFT -j --check -f \"$NFT_TEST_TESTTMPDIR/ruleset-after.json\"\` failed" >> "$NFT_TEST_TESTTMPDIR/rc-failed-chkdump"
 			rc_chkdump=1
 		fi
+		fail=n
+		$NFT -j --check -f "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty" &> "$NFT_TEST_TESTTMPDIR/chkdump" || fail=y
+		test -s "$NFT_TEST_TESTTMPDIR/chkdump" && fail=y
+		if [ "$fail" = y ] ; then
+			show_file "$NFT_TEST_TESTTMPDIR/chkdump" "Command \`$NFT -j --check -f \"$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty\"\` failed" >> "$NFT_TEST_TESTTMPDIR/rc-failed-chkdump"
+			rc_chkdump=1
+		fi
 	fi
-	if [ -f "$JDUMPFILE" ] && ! cmp "$JDUMPFILE" "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &>/dev/null ; then
+	if [ -f "$JDUMPFILE" ] \
+	     && ! cmp "$JDUMPFILE" "$NFT_TEST_TESTTMPDIR/ruleset-after.json" &>/dev/null \
+	     && ! cmp "$JDUMPFILE" "$NFT_TEST_TESTTMPDIR/ruleset-after.json-pretty" &>/dev/null ; \
+	then
 		$NFT -j --check -f "$JDUMPFILE" &>/dev/null || :
 	fi
 fi
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH nft 2/2 v2] tests/shell: have .json-nft dumps prettified to wrap lines
  2023-12-07  9:08   ` [PATCH nft 2/2 v2] " Thomas Haller
@ 2024-02-08 17:31     ` Phil Sutter
  0 siblings, 0 replies; 5+ messages in thread
From: Phil Sutter @ 2024-02-08 17:31 UTC (permalink / raw)
  To: Thomas Haller; +Cc: NetFilter, Florian Westphal, Pablo Neira Ayuso

On Thu, Dec 07, 2023 at 10:08:50AM +0100, Thomas Haller wrote:
> Previously, the .json-nft file in git contains the output of `nft -j
> list ruleset`. This is one long line and makes diffs harder to review.
> 
> Instead, have the prettified .json-nft file committed to git.
> 
> - the diff now operates on the prettified version. That means, it
>   compares essentially
> 
>      - `nft -j list ruleset | json-sanitize-ruleset.sh | json-pretty.sh`
>      - `cat "$TEST.json-nft" | json-pretty.sh`
> 
>   The script "json-diff-pretty.sh" is no longer used. It is kept
>   however, because it might be a useful for manual comparing files.
> 
>   Note that "json-sanitize-ruleset.sh" and "json-pretty.sh" are still
>   two separate scripts and called at different times. They also do
>   something different. The former mangles the JSON to account for changes
>   that are not stable (in the JSON data itself), while the latter only
>   pretty prints it.
> 
> - when generating a new .json-nft dump file, the file will be updated to
>   use the new, prettified format, unless the file is in the old format
>   and needs no update. This means, with DUMPGEN=y, old style is preserved
>   unless an update becomes necessary.
> 
> This requires "json-pretty.sh" having stable output, as those files are
> committed to git. This is probably fine.
> 
> Signed-off-by: Thomas Haller <thaller@redhat.com>

Patch applied and pushed along with a bulk dump file conversion to
pretty format.

Thanks, Phil

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-02-08 17:31 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-24 12:45 [PATCH nft 0/2] pretty print .json-nft files Thomas Haller
2023-11-24 12:45 ` [PATCH nft 1/2] tests/shell: use generated ruleset for `nft --check` Thomas Haller
2023-11-24 12:45 ` [PATCH nft 2/2] tests/shell: have .json-nft dumps prettified to wrap lines Thomas Haller
2023-12-07  9:08   ` [PATCH nft 2/2 v2] " Thomas Haller
2024-02-08 17:31     ` Phil Sutter

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 NNTP newsgroup(s).