chiark / gitweb /
Test for specific exit code
authorKarl Hasselström <kha@treskal.com>
Sun, 6 Jul 2008 16:09:08 +0000 (18:09 +0200)
committerKarl Hasselström <kha@treskal.com>
Tue, 8 Jul 2008 18:35:23 +0000 (20:35 +0200)
When a command is supposed to fail in a test, test for the exact error
code we're expecting, not just that it's non-zero. This makes sure
e.g. that a command that's supposed to fail doesn't do so with an
unhandled exception.

Signed-off-by: Karl Hasselström <kha@treskal.com>
24 files changed:
t/README
t/t0001-subdir-branches.sh
t/t0002-status.sh
t/t1000-branch-create.sh
t/t1001-branch-rename.sh
t/t1002-branch-clone.sh
t/t1200-push-modified.sh
t/t1202-push-undo.sh
t/t1203-push-conflict.sh
t/t1205-push-subdir.sh
t/t1301-repair.sh
t/t1302-repair-interop.sh
t/t1400-patch-history.sh
t/t1501-sink.sh
t/t1600-delete-one.sh
t/t1601-delete-many.sh
t/t2000-sync.sh
t/t2101-pull-policy-pull.sh
t/t2200-rebase.sh
t/t2500-clean.sh
t/t2900-rename.sh
t/t3000-dirty-merge.sh
t/t4000-upgrade.sh
t/test-lib.sh

index 77f0b6cf63e498291aac9b83bb2afb4165eea650..757f8101669f6e17fa287f42124981734d76123c 100644 (file)
--- a/t/README
+++ b/t/README
@@ -163,9 +163,9 @@ library for your script to use.
    yields success, test is considered a failure.
 
    This should _not_ be used for tests that succeed when their
-   commands fail -- use test_expect_success and shell negation (!) for
-   that. test_expect_failure is for cases when a test is known to be
-   broken.
+   commands fail -- use test_expect_success and one of general_error,
+   command_error, and conflict for that. test_expect_failure is for
+   cases when a test is known to be broken.
 
  - test_debug <script>
 
index 0eed3a44088c1d7adede76ab90d090d04b86fba6..69c11a3e24dc7578adc62b04da77b4ae52f8df0a 100755 (executable)
@@ -39,9 +39,9 @@ test_expect_success 'Try new form of id with slashy branch' \
    stg id foo@x/y/z//top'
 
 test_expect_success 'Try old id with slashy branch' '
-   ! stg id foo/ &&
-   ! stg id foo/top &&
-   ! stg id foo@x/y/z/top
+   command_error stg id foo/ &&
+   command_error stg id foo/top &&
+   command_error stg id foo@x/y/z/top
    '
 
 test_expect_success 'Create patch in slashy branch' \
@@ -51,11 +51,11 @@ test_expect_success 'Create patch in slashy branch' \
 
 test_expect_success 'Rename branches' \
   'stg branch --rename master goo/gaa &&
-   ! git show-ref --verify --quiet refs/heads/master &&
+   must_fail git show-ref --verify --quiet refs/heads/master &&
    stg branch --rename goo/gaa x1/x2/x3/x4 &&
-   ! git show-ref --verify --quiet refs/heads/goo/gaa &&
+   must_fail git show-ref --verify --quiet refs/heads/goo/gaa &&
    stg branch --rename x1/x2/x3/x4 servant &&
-   ! git show-ref --verify --quiet refs/heads/x1/x2/x3/x4
+   must_fail git show-ref --verify --quiet refs/heads/x1/x2/x3/x4
 '
 
 test_done
index 86ff419bcf071fc677a107bec18b64de386db1a7..ac92aa8a059a5273ec83a78a479ca4f5486137b3 100755 (executable)
@@ -114,7 +114,7 @@ A fie
 C foo/bar
 EOF
 test_expect_success 'Status after conflicting push' '
-    ! stg push &&
+    conflict_old stg push &&
     stg status > output.txt &&
     test_cmp expected.txt output.txt
 '
index 5a097a405058360ca175ca5af11b3dca5ebed36c..3fff3ee855e8cd540e91b56923ae1a5fbbcdc435 100755 (executable)
@@ -26,7 +26,7 @@ test_expect_success \
 
 test_expect_success \
     'Try to create an stgit branch with a spurious patches/ entry' '
-    ! stg branch -c foo1
+    command_error stg branch -c foo1
 '
 
 test_expect_success \
@@ -43,7 +43,7 @@ test_expect_success \
 
 test_expect_success \
     'Try to create an stgit branch with an existing git branch by that name' '
-    ! stg branch -c foo2
+    command_error stg branch -c foo2
 '
 
 test_expect_success \
@@ -58,7 +58,7 @@ test_expect_success \
 test_expect_success \
     'Create an invalid refs/heads/ entry' '
     touch .git/refs/heads/foo3 &&
-    ! stg branch -c foo3
+    command_error stg branch -c foo3
 '
 
 test_expect_failure \
@@ -87,7 +87,7 @@ test_expect_success \
 
 test_expect_success \
     'Create branch down the stack, behind the conflict caused by the generated file' '
-    ! stg branch --create foo4 master^
+    command_error stg branch --create foo4 master^
 '
 
 test_expect_success \
index dd121326417434b127fd5a265d429f10670494dc..d5d3aefeab699a1c6648cfb36d0b912c31f92b96 100755 (executable)
@@ -19,7 +19,7 @@ test_expect_success \
 
 test_expect_success \
     'Rename the current stgit branch' \
-    '! stg branch -r foo bar
+    'command_error stg branch -r foo bar
 '
 
 test_expect_success \
index b0087e91a3bdd48d95295f04ebdaf05d98502e8f..19bdc457c2bd68df70064d6d6e3428730aa96043 100755 (executable)
@@ -21,7 +21,7 @@ test_expect_success \
 test_expect_success \
     'Try to create a patch in a GIT branch' \
     '
-    ! stg new p0 -m "p0"
+    command_error stg new p0 -m "p0"
     '
 
 test_expect_success \
index ba4f70c43714979f287064d6d6581493ef8f1964..6ebd0a1333dce2ad78e653c3616a697f7832c7c3 100755 (executable)
@@ -49,7 +49,7 @@ test_expect_success \
 
 test_expect_success \
     'Attempt to push the first of those patches without --merged' \
-    "(cd bar && ! stg push
+    "(cd bar && conflict_old stg push
      )
 "
 
index b602643f9018509bc605de1199afe47bd178453e..544fe8d1a2d5f1ca24bb3163aedf24f0c24f61c2 100755 (executable)
@@ -43,7 +43,7 @@ test_expect_success \
 test_expect_success \
        'Push the second patch with conflict' \
        '
-       ! stg push bar
+       conflict_old stg push bar
        '
 
 test_expect_success \
@@ -55,7 +55,7 @@ test_expect_success \
 test_expect_success \
        'Check the push after undo fails as well' \
        '
-       ! stg push bar
+       conflict_old stg push bar
        '
 
 test_expect_success \
index 72bd49fe45b58f73f692891a54f6097614ab3754..96fee15a8340534e7f22cca3c232c1101252cd11 100755 (executable)
@@ -38,7 +38,7 @@ test_expect_success \
 test_expect_success \
        'Push the first patch with conflict' \
        '
-       ! stg push foo
+       conflict_old stg push foo
        '
 
 test_expect_success \
@@ -56,7 +56,7 @@ test_expect_success \
 test_expect_success \
        'Check that pop will fail while there are unmerged conflicts' \
        '
-       ! stg pop
+       command_error stg pop
        '
 
 test_expect_success \
index 175d36d2888987b85505de8810183217e63b3ba2..945eb7446b3e3085397e581c80abe311bcfa556a 100755 (executable)
@@ -47,7 +47,7 @@ test_expect_success 'Conflicting push from subdir' '
     [ "$(echo $(cat x.txt))" = "x0" ] &&
     [ "$(echo $(cat foo/y.txt))" = "y0" ] &&
     cd foo &&
-    ! stg push p2 &&
+    conflict_old stg push p2 &&
     cd .. &&
     [ "$(echo $(stg status --conflict))" = "foo/y.txt x.txt" ]
 '
@@ -62,7 +62,7 @@ test_expect_success 'Conflicting add/unknown file in subdir' '
     stg pop &&
     mkdir -p d &&
     echo bar > d/test &&
-    ! stg push foo &&
+    command_error stg push foo &&
     [ $(stg top) != "foo" ]
 '
 
index b555b93ac11c38393d68de68a3bea142394bde43..33f8f6d0986a43291efec66677d3e160011a1121 100755 (executable)
@@ -5,7 +5,7 @@ test_description='Test the repair command.'
 
 test_expect_success \
     'Repair in a non-initialized repository' \
-    '! stg repair'
+    'command_error stg repair'
 
 test_expect_success \
     'Initialize the StGIT repository' \
index 82c5ed2c81efcb190ccb7b080c7a4a8088f870d5..3ea48e7a173cf3c8cf5821cbdb4643705d8f21ae 100755 (executable)
@@ -27,7 +27,7 @@ test_expect_success 'Create five patches' '
 
 test_expect_success 'Pop two patches with git-reset' '
     git reset --hard HEAD~2 &&
-    ! stg refresh &&
+    command_error stg refresh &&
     stg repair &&
     stg refresh &&
     [ "$(echo $(stg applied))" = "p0 p1 p2" ] &&
@@ -42,7 +42,7 @@ test_expect_success 'Create a new patch' '
 
 test_expect_success 'Go to an unapplied patch with with git-reset' '
     git reset --hard $(stg id p3) &&
-    ! stg refresh &&
+    command_error stg refresh &&
     stg repair &&
     stg refresh &&
     [ "$(echo $(stg applied))" = "p0 p1 p2 p3" ] &&
index a693e75119ab671a186cf205f74aa60bc2a26000..13cd1e338e0cfc576288a7c04507a554bd06e5d8 100755 (executable)
@@ -82,7 +82,7 @@ test_expect_success \
        echo bar > test && stg refresh &&
        stg pop &&
        echo foo > test && stg refresh &&
-       ! stg push &&
+       conflict_old stg push &&
        stg log --full | grep -q -e "^push(c) "
        '
 
index 6af45fedff1536acc557f172c316c3650ccc0873..ac9e25d495ce81e3c01e1627b20608ceb7f1d5d8 100755 (executable)
@@ -17,7 +17,7 @@ test_expect_success 'Initialize StGit stack' '
 '
 
 test_expect_success 'sink without applied patches' '
-    ! stg sink
+    command_error stg sink
 '
 
 test_expect_success 'sink a specific patch without applied patches' '
index c3451d827eaeab07a3c62f21e2210b14255c7714..b526a552c69977898e3241066814c0493231bae7 100755 (executable)
@@ -20,7 +20,7 @@ test_expect_success \
     'Try to delete a non-existing patch' \
     '
     [ $(stg applied | wc -l) -eq 1 ] &&
-    ! stg delete bar &&
+    command_error stg delete bar &&
     [ $(stg applied | wc -l) -eq 1 ]
     '
 
@@ -29,7 +29,7 @@ test_expect_success \
     '
     echo dirty >> foo.txt &&
     [ $(stg applied | wc -l) -eq 1 ] &&
-    ! stg delete foo &&
+    command_error stg delete foo &&
     [ $(stg applied | wc -l) -eq 1 ] &&
     git reset --hard
     '
index 30b0a1dd0a33defbe04a31aeb3550aaaedc8434c..bc5364f90b42e9690efc2cb623100574a56d4718 100755 (executable)
@@ -37,7 +37,7 @@ test_expect_success \
     '
     [ "$(echo $(stg applied))" = "p0 p1 p2" ] &&
     [ "$(echo $(stg unapplied))" = "p5 p8 p9" ] &&
-    ! stg delete p7 p8 p2 p0 &&
+    command_error stg delete p7 p8 p2 p0 &&
     [ "$(echo $(stg applied))" = "p0 p1 p2" ] &&
     [ "$(echo $(stg unapplied))" = "p5 p8 p9" ]
     '
index e489603f3fa4d7d64c31cd52e17f8fd193242911..9852eb87e3c6efab6d5ca859739bdb14de753944 100755 (executable)
@@ -109,7 +109,7 @@ test_expect_success \
 test_expect_success \
     'Synchronise the first two patches with the master branch (to fail)' \
     '
-    ! stg sync -B master -a
+    conflict_old stg sync -B master -a
     '
 
 test_expect_success \
@@ -127,7 +127,7 @@ test_expect_success \
 test_expect_success \
     'Synchronise the third patch with the exported series (to fail)' \
     '
-    ! stg sync -s patches-master/series p3
+    conflict_old stg sync -s patches-master/series p3
     '
 
 test_expect_success \
index ce4b5c89542623e3cdff6baaef14afa9c6617f4a..777ccb5f83b95a15b430a75654054c5b5afcd81b 100755 (executable)
@@ -43,7 +43,7 @@ test_expect_success \
     'Rewind/rewrite upstream commit and pull it from clone, without --merged' \
     '
     (cd upstream && echo b >> file2 && stg refresh) &&
-    (cd clone && ! stg pull)
+    (cd clone && conflict_old stg pull)
     '
 
 test_expect_success \
index ec2a104fc2e089a5d9653faa852cf416b987c909..a6f43bccd3f88239b5a8b50f051965b16e434e8e 100755 (executable)
@@ -34,7 +34,7 @@ test_expect_success \
 test_expect_success \
        'Attempt rebase to non-existing commit' \
        '
-       ! stg rebase not-a-ref
+       command_error stg rebase not-a-ref
        '
 
 test_expect_success \
index ad8f892e624107e5c7104d4d77cd18dcbdba05ca..abde9cf7aabe92b1f9eccf9e3cbe265208d59470 100755 (executable)
@@ -32,7 +32,7 @@ test_expect_success 'Create a conflict' '
     stg new p2 -m p2
     echo quux > foo.txt &&
     stg refresh &&
-    ! stg push
+    conflict_old stg push
 '
 
 test_expect_success 'Make sure conflicting patches are preserved' '
index 5f47f864473422d580e5fbc4b34bdc5cf0160454..0e16d6e8b23230c1109bc0eb4b784045daf23fa0 100755 (executable)
@@ -13,7 +13,7 @@ Tests some parts of the stg rename command.'
 stg init
 
 test_expect_success 'Rename in empty' '
-   ! stg rename foo
+   command_error stg rename foo
 '
 
 test_expect_success 'Rename single top-most' '
@@ -23,7 +23,7 @@ test_expect_success 'Rename single top-most' '
 # bar
 
 test_expect_success 'Rename non-existing' '
-   ! stg rename neithersuchpatch norsuchpatch
+   command_error stg rename neithersuchpatch norsuchpatch
 '
 
 test_expect_success 'Rename with two arguments' '
@@ -33,11 +33,11 @@ test_expect_success 'Rename with two arguments' '
 # foo,baz
 
 test_expect_success 'Rename to existing name' '
-   ! stg rename foo baz
+   command_error stg rename foo baz
 '
 
 test_expect_success 'Rename to same name' '
-   ! stg rename foo foo
+   command_error stg rename foo foo
 '
 
 test_expect_success 'Rename top-most when others exist' '
index d87bba17098ec24aaf79505f0c150c3f6b788fb4..4dd6da36af66730b3d5c412d83bfd51452432ae8 100755 (executable)
@@ -26,7 +26,7 @@ test_expect_success 'Push with dirty worktree' '
     echo 4 > a &&
     [ "$(echo $(stg applied))" = "p1" ] &&
     [ "$(echo $(stg unapplied))" = "p2" ] &&
-    ! stg goto p2 &&
+    conflict stg goto p2 &&
     [ "$(echo $(stg applied))" = "p1" ] &&
     [ "$(echo $(stg unapplied))" = "p2" ] &&
     [ "$(echo $(cat a))" = "4" ]
index 8a308fbf7ef53b24fa1ad0cbfbe5a6c04ad75cbd..ea9bf0b50b0c94726c09caba5b3d6ed1cdfb7ce2 100755 (executable)
@@ -31,7 +31,7 @@ for ver in 0.12 0.8; do
 
     test_expect_success \
         "v$ver: Make sure the base ref is no longer there" '
-        ! git show-ref --verify --quiet refs/bases/master
+        must_fail git show-ref --verify --quiet refs/bases/master
     '
 
     cd ..
index 95e322e89c217fbb7e2e5f977d241621f5bb0318..ad8da684b2c924d5456f29cf906cd99bd4181202 100644 (file)
@@ -285,6 +285,30 @@ test_expect_code () {
        echo >&3 ""
 }
 
+# When running an StGit command that should exit with an error, use
+# these instead of testing for any non-zero exit code with !.
+exit_code () {
+       expected=$1
+       shift
+       "$@"
+       test $? -eq $expected
+}
+general_error () { exit_code 1 "$@" ; }
+command_error () { exit_code 2 "$@" ; }
+conflict () { exit_code 3 "$@" ; }
+
+# Old-infrastructure commands don't exit with the proper value on
+# conflicts. But we don't want half the tests to fail because of that,
+# so use this instead of "conflict" for them.
+conflict_old () { command_error "$@" ; }
+
+# Same thing, but for other commands that StGit where we just want to
+# make sure that they fail instead of crashing.
+must_fail () {
+        "$@"
+        test $? -gt 0 -a $? -le 129
+}
+
 # test_cmp is a helper function to compare actual and expected output.
 # You can use it like:
 #