From 02188b851f34b3323b7a8b046d4602a9107eebc4 Mon Sep 17 00:00:00 2001 From: Riccardo Attilio Galli Date: Mon, 10 Jun 2013 13:50:01 +0200 Subject: [PATCH 1/3] Don't let the shell evaluate arguments --- assert.sh | 2 +- tests.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/assert.sh b/assert.sh index f3d03d8..5f92202 100644 --- a/assert.sh +++ b/assert.sh @@ -92,7 +92,7 @@ assert() { [[ -n "$DISCOVERONLY" ]] && return # printf required for formatting printf -v expected "x${2:-}" # x required to overwrite older results - result="$(eval 2>/dev/null $1 <<< ${3:-})" + result=$(eval 2>/dev/null "$1" <<< ${3:-}) # Note: $expected is already decorated if [[ "x$result" == "$expected" ]]; then [[ -n "$DEBUG" ]] && echo -n . diff --git a/tests.sh b/tests.sh index 27793f0..229c03c 100755 --- a/tests.sh +++ b/tests.sh @@ -12,6 +12,7 @@ assert "seq 2" "1\n2" # multi-line output expected assert_raises 'read a; exit $a' 42 "42" # variables still work assert "echo 1; echo 2 # ^" "1\n2" # semicolon required! +assert 'echo " * "' " * " # don't let the shell evaluate arguments assert_end demo _clean() { From 2054681a1ca6c520df84b44b4730473ab3611c6a Mon Sep 17 00:00:00 2001 From: Riccardo Attilio Galli Date: Mon, 10 Jun 2013 14:46:10 +0200 Subject: [PATCH 2/3] Avoid printf since we can't both format strings and escape printf specific rules --- assert.sh | 3 +-- tests.sh | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assert.sh b/assert.sh index 5f92202..1597d37 100644 --- a/assert.sh +++ b/assert.sh @@ -90,8 +90,7 @@ assert() { # assert [stdin] (( tests_ran++ )) [[ -n "$DISCOVERONLY" ]] && return - # printf required for formatting - printf -v expected "x${2:-}" # x required to overwrite older results + expected=$(echo -e "x${2:-}") # x required to overwrite older results result=$(eval 2>/dev/null "$1" <<< ${3:-}) # Note: $expected is already decorated if [[ "x$result" == "$expected" ]]; then diff --git a/tests.sh b/tests.sh index 229c03c..2aa21cc 100755 --- a/tests.sh +++ b/tests.sh @@ -13,6 +13,7 @@ assert_raises 'read a; exit $a' 42 "42" # variables still work assert "echo 1; echo 2 # ^" "1\n2" # semicolon required! assert 'echo " * "' " * " # don't let the shell evaluate arguments +assert "echo '%s --'" "%s --" # don't escape user content assert_end demo _clean() { From df02b94c5b89ae52e575f18ff96075706af56e11 Mon Sep 17 00:00:00 2001 From: Riccardo Attilio Galli Date: Mon, 10 Jun 2013 18:31:19 +0200 Subject: [PATCH 3/3] Interpretation of backslash escapes --- assert.sh | 2 +- tests.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/assert.sh b/assert.sh index 1597d37..013c7d5 100644 --- a/assert.sh +++ b/assert.sh @@ -91,7 +91,7 @@ assert() { (( tests_ran++ )) [[ -n "$DISCOVERONLY" ]] && return expected=$(echo -e "x${2:-}") # x required to overwrite older results - result=$(eval 2>/dev/null "$1" <<< ${3:-}) + result=$(echo -e "$(eval 2>/dev/null "$1" <<< ${3:-})") # Note: $expected is already decorated if [[ "x$result" == "$expected" ]]; then [[ -n "$DEBUG" ]] && echo -n . diff --git a/tests.sh b/tests.sh index 2aa21cc..370ff90 100755 --- a/tests.sh +++ b/tests.sh @@ -14,6 +14,7 @@ assert "echo 1; echo 2 # ^" "1\n2" # semicolon required! assert 'echo " * "' " * " # don't let the shell evaluate arguments assert "echo '%s --'" "%s --" # don't escape user content +assert "echo \"foo\nbar\"" "foo\nbar" # interpretation of backslash escape assert_end demo _clean() {