test suite partially converted to use tasty test framework

This is a win. Will need to wait for tasty getting into Debian,
and do a trivial conversion of the remainder of the hunit tests.
This commit is contained in:
Joey Hess 2013-08-06 00:12:06 -04:00
parent a613117b82
commit 8189738b13
2 changed files with 94 additions and 112 deletions

204
Test.hs
View file

@ -9,12 +9,15 @@
module Test where
import Test.Tasty
import Test.Tasty.Runners
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
import Test.HUnit
import Test.QuickCheck
import Test.QuickCheck.Test
import System.PosixCompat.Files
import Control.Exception.Extensible
import Data.Monoid
import qualified Data.Map as M
import System.IO.HVFS (SystemFS(..))
import qualified Text.JSON
@ -66,83 +69,57 @@ type TestEnv = M.Map String String
main :: IO ()
main = do
divider
putStrLn "First, some automated quick checks of properties ..."
divider
qcok <- all isSuccess <$> sequence quickcheck
divider
putStrLn "Now, some broader checks ..."
putStrLn " (Do not be alarmed by odd output here; it's normal."
putStrLn " wait for the last line to see how it went.)"
rs <- runhunit =<< prepare False
#ifndef mingw32_HOST_OS
directrs <- runhunit =<< prepare True
indirectenv <- prepare False
directenv <- prepare True
let tests = testGroup "Tests"
[ properties
, unitTests indirectenv "(indirect)"
, unitTests directenv "(direct)"
]
#else
-- Windows is only going to use direct mode, so don't test twice.
let directrs = []
env <- prepare False
let tests = testGroup "Tests"
[properties, unitTests env ""]
#endif
divider
propigate (rs++directrs) qcok
where
divider = putStrLn $ replicate 70 '-'
runhunit env = do
r <- forM hunit $ \t -> do
divider
t env
cleanup tmpdir
return r
runUI mempty tests =<< launchTestTree mempty tests
propigate :: [Counts] -> Bool -> IO ()
propigate cs qcok
| countsok && qcok = putStrLn "All tests ok."
| otherwise = do
unless qcok $
putStrLn "Quick check tests failed! This is a bug in git-annex."
unless countsok $ do
putStrLn "Some tests failed!"
putStrLn " (This could be due to a bug in git-annex, or an incompatability"
putStrLn " with utilities, such as git, installed on this system.)"
exitFailure
where
noerrors (Counts { errors = e , failures = f }) = e + f == 0
countsok = all noerrors cs
quickcheck :: [IO Result]
quickcheck =
[ check "prop_idempotent_deencode_git" Git.Filename.prop_idempotent_deencode
, check "prop_idempotent_deencode" Utility.Format.prop_idempotent_deencode
, check "prop_idempotent_fileKey" Locations.prop_idempotent_fileKey
, check "prop_idempotent_key_encode" Types.Key.prop_idempotent_key_encode
, check "prop_idempotent_shellEscape" Utility.SafeCommand.prop_idempotent_shellEscape
, check "prop_idempotent_shellEscape_multiword" Utility.SafeCommand.prop_idempotent_shellEscape_multiword
, check "prop_idempotent_configEscape" Logs.Remote.prop_idempotent_configEscape
, check "prop_parse_show_Config" Logs.Remote.prop_parse_show_Config
, check "prop_parentDir_basics" Utility.Path.prop_parentDir_basics
, check "prop_relPathDirToFile_basics" Utility.Path.prop_relPathDirToFile_basics
, check "prop_relPathDirToFile_regressionTest" Utility.Path.prop_relPathDirToFile_regressionTest
, check "prop_cost_sane" Config.Cost.prop_cost_sane
, check "prop_matcher_sane" Utility.Matcher.prop_matcher_sane
, check "prop_HmacSha1WithCipher_sane" Crypto.prop_HmacSha1WithCipher_sane
, check "prop_TimeStamp_sane" Logs.UUIDBased.prop_TimeStamp_sane
, check "prop_addLog_sane" Logs.UUIDBased.prop_addLog_sane
, check "prop_verifiable_sane" Utility.Verifiable.prop_verifiable_sane
, check "prop_segment_regressionTest" Utility.Misc.prop_segment_regressionTest
, check "prop_read_write_transferinfo" Logs.Transfer.prop_read_write_transferinfo
, check "prop_read_show_inodecache" Utility.InodeCache.prop_read_show_inodecache
, check "prop_parse_show_log" Logs.Presence.prop_parse_show_log
, check "prop_read_show_TrustLevel" Types.TrustLevel.prop_read_show_TrustLevel
, check "prop_parse_show_TrustLog" Logs.Trust.prop_parse_show_TrustLog
properties :: TestTree
properties = testGroup "QuickCheck"
[ testProperty "prop_idempotent_deencode_git" Git.Filename.prop_idempotent_deencode
, testProperty "prop_idempotent_deencode" Utility.Format.prop_idempotent_deencode
, testProperty "prop_idempotent_fileKey" Locations.prop_idempotent_fileKey
, testProperty "prop_idempotent_key_encode" Types.Key.prop_idempotent_key_encode
, testProperty "prop_idempotent_shellEscape" Utility.SafeCommand.prop_idempotent_shellEscape
, testProperty "prop_idempotent_shellEscape_multiword" Utility.SafeCommand.prop_idempotent_shellEscape_multiword
, testProperty "prop_idempotent_configEscape" Logs.Remote.prop_idempotent_configEscape
, testProperty "prop_parse_show_Config" Logs.Remote.prop_parse_show_Config
, testProperty "prop_parentDir_basics" Utility.Path.prop_parentDir_basics
, testProperty "prop_relPathDirToFile_basics" Utility.Path.prop_relPathDirToFile_basics
, testProperty "prop_relPathDirToFile_regressionTest" Utility.Path.prop_relPathDirToFile_regressionTest
, testProperty "prop_cost_sane" Config.Cost.prop_cost_sane
, testProperty "prop_matcher_sane" Utility.Matcher.prop_matcher_sane
, testProperty "prop_HmacSha1WithCipher_sane" Crypto.prop_HmacSha1WithCipher_sane
, testProperty "prop_TimeStamp_sane" Logs.UUIDBased.prop_TimeStamp_sane
, testProperty "prop_addLog_sane" Logs.UUIDBased.prop_addLog_sane
, testProperty "prop_verifiable_sane" Utility.Verifiable.prop_verifiable_sane
, testProperty "prop_segment_regressionTest" Utility.Misc.prop_segment_regressionTest
, testProperty "prop_read_write_transferinfo" Logs.Transfer.prop_read_write_transferinfo
, testProperty "prop_read_show_inodecache" Utility.InodeCache.prop_read_show_inodecache
, testProperty "prop_parse_show_log" Logs.Presence.prop_parse_show_log
, testProperty "prop_read_show_TrustLevel" Types.TrustLevel.prop_read_show_TrustLevel
, testProperty "prop_parse_show_TrustLog" Logs.Trust.prop_parse_show_TrustLog
]
where
check desc prop = do
putStrLn desc
quickCheckResult prop
hunit :: [TestEnv -> IO Counts]
hunit =
unitTests :: TestEnv -> String -> TestTree
unitTests env note = testGroup ("Unit Tests " ++ note)
-- test order matters, later tests may rely on state from earlier
[ check "init" test_init
, check "add" test_add
, check "add sha1dup" test_add_sha1dup
, check "add subdirs" test_add_subdirs
{-
, check "reinject" test_reinject
, check "unannex" test_unannex
, check "drop" test_drop
@ -174,57 +151,62 @@ hunit =
, check "bup remote" test_bup_remote
, check "crypto" test_crypto
, check "preferred content" test_preferred_content
-}
, check "global cleanup" test_global_cleanup
]
where
check desc t env = do
putStrLn desc
runTestTT (t env)
check desc t = testCase desc (t env)
test_init :: TestEnv -> Test
test_init env = "git-annex init" ~: TestCase $ innewrepo env $ do
test_global_cleanup :: TestEnv -> Assertion
test_global_cleanup env = cleanup tmpdir
test_init :: TestEnv -> Assertion
test_init env = innewrepo env $ do
git_annex env "init" [reponame] @? "init failed"
handleforcedirect env
where
reponame = "test repo"
test_add :: TestEnv -> Test
test_add env = "git-annex add" ~: TestList [basic, sha1dup, subdirs]
where
-- this test case runs in the main repo, to set up a basic
-- annexed file that later tests will use
basic = TestCase $ inmainrepo env $ do
writeFile annexedfile $ content annexedfile
git_annex env "add" [annexedfile] @? "add failed"
annexed_present annexedfile
writeFile sha1annexedfile $ content sha1annexedfile
git_annex env "add" [sha1annexedfile, "--backend=SHA1"] @? "add with SHA1 failed"
annexed_present sha1annexedfile
checkbackend sha1annexedfile backendSHA1
writeFile wormannexedfile $ content wormannexedfile
git_annex env "add" [wormannexedfile, "--backend=WORM"] @? "add with WORM failed"
annexed_present wormannexedfile
checkbackend wormannexedfile backendWORM
boolSystem "git" [Params "rm --force -q", File wormannexedfile] @? "git rm failed"
writeFile ingitfile $ content ingitfile
boolSystem "git" [Param "add", File ingitfile] @? "git add failed"
boolSystem "git" [Params "commit -q -m commit"] @? "git commit failed"
git_annex env "add" [ingitfile] @? "add ingitfile should be no-op"
unannexed ingitfile
sha1dup = TestCase $ intmpclonerepo env $ do
writeFile sha1annexedfiledup $ content sha1annexedfiledup
git_annex env "add" [sha1annexedfiledup, "--backend=SHA1"] @? "add of second file with same SHA1 failed"
annexed_present sha1annexedfiledup
annexed_present sha1annexedfile
subdirs = TestCase $ intmpclonerepo env $ do
createDirectory "dir"
writeFile ("dir" </> "foo") $ content annexedfile
git_annex env "add" ["dir"] @? "add of subdir failed"
createDirectory "dir2"
writeFile ("dir2" </> "foo") $ content annexedfile
-- this test case runs in the main repo, to set up a basic
-- annexed file that later tests will use
test_add :: TestEnv -> Assertion
test_add env = inmainrepo env $ do
writeFile annexedfile $ content annexedfile
git_annex env "add" [annexedfile] @? "add failed"
annexed_present annexedfile
writeFile sha1annexedfile $ content sha1annexedfile
git_annex env "add" [sha1annexedfile, "--backend=SHA1"] @? "add with SHA1 failed"
annexed_present sha1annexedfile
checkbackend sha1annexedfile backendSHA1
writeFile wormannexedfile $ content wormannexedfile
git_annex env "add" [wormannexedfile, "--backend=WORM"] @? "add with WORM failed"
annexed_present wormannexedfile
checkbackend wormannexedfile backendWORM
boolSystem "git" [Params "rm --force -q", File wormannexedfile] @? "git rm failed"
writeFile ingitfile $ content ingitfile
boolSystem "git" [Param "add", File ingitfile] @? "git add failed"
boolSystem "git" [Params "commit -q -m commit"] @? "git commit failed"
git_annex env "add" [ingitfile] @? "add ingitfile should be no-op"
unannexed ingitfile
test_add_sha1dup :: TestEnv -> Assertion
test_add_sha1dup env = intmpclonerepo env $ do
writeFile sha1annexedfiledup $ content sha1annexedfiledup
git_annex env "add" [sha1annexedfiledup, "--backend=SHA1"] @? "add of second file with same SHA1 failed"
annexed_present sha1annexedfiledup
annexed_present sha1annexedfile
test_add_subdirs :: TestEnv -> Assertion
test_add_subdirs env = intmpclonerepo env $ do
createDirectory "dir"
writeFile ("dir" </> "foo") $ content annexedfile
git_annex env "add" ["dir"] @? "add of subdir failed"
createDirectory "dir2"
writeFile ("dir2" </> "foo") $ content annexedfile
#ifndef mingw32_HOST_OS
{- This does not work on Windows, for whatever reason. -}
setCurrentDirectory "dir"
git_annex env "add" [".." </> "dir2"] @? "add of ../subdir failed"
{- This does not work on Windows, for whatever reason. -}
setCurrentDirectory "dir"
git_annex env "add" [".." </> "dir2"] @? "add of ../subdir failed"
#endif
test_reinject :: TestEnv -> Test

View file

@ -97,7 +97,7 @@ Executable git-annex
Build-Depends: unix
if flag(TestSuite)
Build-Depends: HUnit
Build-Depends: HUnit, tasty, tasty-hunit, tasty-quickcheck
CPP-Options: -DWITH_TESTSUITE
if flag(TDFA)