module Main(main) where
+import Data.IORef
import Test.QuickCheck.Batch
+import System.IO
+import System.Exit
+import System (getArgs)
+
import Ganeti.HTools.QC
-options = TestOptions
- { no_of_tests = 500
- , length_of_tests = 5
- , debug_tests = False }
+fast :: TestOptions
+fast = TestOptions
+ { no_of_tests = 500
+ , length_of_tests = 10
+ , debug_tests = False }
+
+slow :: TestOptions
+slow = TestOptions
+ { no_of_tests = 50
+ , length_of_tests = 100
+ , debug_tests = False }
+
+incIORef :: IORef Int -> IO ()
+incIORef ir = atomicModifyIORef ir (\x -> (x + 1, ()))
+
+-- | Wrapper over a test runner with error counting
+wrapTest :: IORef Int
+ -> (TestOptions -> IO TestResult)
+ -> TestOptions -> IO TestResult
+wrapTest ir t to = do
+ tr <- t to
+ case tr of
+ TestFailed _ _ -> incIORef ir
+ TestAborted e -> do
+ incIORef ir
+ putStrLn ("Failure during test: <" ++ show e ++ ">")
+ _ -> return ()
+ return tr
+
+allTests :: [(String, TestOptions, [TestOptions -> IO TestResult])]
+allTests =
+ [ ("Utils", fast, testUtils)
+ , ("PeerMap", fast, testPeerMap)
+ , ("Container", fast, testContainer)
+ , ("Instance", fast, testInstance)
+ , ("Node", fast, testNode)
+ , ("Text", fast, testText)
+ , ("OpCodes", fast, testOpCodes)
+ , ("Jobs", fast, testJobs)
+ , ("Loader", fast, testLoader)
+ , ("Cluster", slow, testCluster)
+ ]
+main :: IO ()
main = do
- runTests "PeerMap" options test_PeerMap
- runTests "Container" options test_Container
- runTests "Instance" options test_Instance
- runTests "Node" options test_Node
- runTests "Text" options test_Text
- runTests "Cluster" options test_Cluster
+ errs <- newIORef 0
+ let wrap = map (wrapTest errs)
+ args <- getArgs
+ let tests = if null args
+ then allTests
+ else filter (\(name, _, _) -> name `elem` args) allTests
+ mapM_ (\(name, opts, tl) -> runTests name opts (wrap tl)) tests
+ terr <- readIORef errs
+ (if terr > 0
+ then do
+ hPutStrLn stderr $ "A total of " ++ show terr ++ " tests failed."
+ exitWith $ ExitFailure 1
+ else putStrLn "All tests succeeded.")