enhan: CRCFail test added
authorMax Voit <max.voit+gtdv@with-eyes.net>
Wed, 29 Jul 2015 10:45:20 +0000 (12:45 +0200)
committerMax Voit <max.voit+gtdv@with-eyes.net>
Wed, 29 Jul 2015 10:45:20 +0000 (12:45 +0200)
acid-state-dist.cabal
test/CRCFail.hs

index edc1ed4..c77cfe6 100644 (file)
@@ -114,6 +114,15 @@ test-suite SlaveUpdates
   build-depends:    base, directory, mtl,
                     safecopy, acid-state, acid-state-dist
 
+test-suite CRCFail
+  main-is:          CRCFail.hs
+  type:             exitcode-stdio-1.0
+  hs-source-dirs:   test
+  ghc-options:      -Wall -threaded
+  default-language: Haskell2010
+  build-depends:    base, directory, mtl,
+                    safecopy, acid-state, acid-state-dist
+
 test-suite CheckpointSync
   main-is:          CheckpointSync.hs
   type:             exitcode-stdio-1.0
index 9e1e6d4..459c84a 100644 (file)
@@ -8,6 +8,8 @@ import Control.Concurrent (threadDelay, forkIO)
 import System.Exit (exitSuccess, exitFailure)
 import System.Directory (doesDirectoryExist, removeDirectoryRecursive)
 
+import Control.Exception (handle, SomeException)
+
 -- state structures
 import IntCommon
 
@@ -21,22 +23,27 @@ cleanup path = do
     when sp $ removeDirectoryRecursive path
 
 -- actual test
-slave :: IO ()
-slave = do
+slave :: AcidState IntState -> IO ()
+slave master = handle eHandler $ do
     acid <- enslaveStateFrom "state/CRCFail/s1" "localhost" 3333 (IntState 23)
-    -- TODO: at this point happens the crc fail - we need to check for an
-    -- exception and thereby determine whether the test was successful
-    delaySec 5
-    val <- query acid GetState
+    -- at this point happens the crc fail - we check for an exception and
+    -- thereby determine whether the test was successful
+    delaySec 2
+    -- this should never be executed
     closeAcidState acid
-    when (val /= 23) $ putStrLn "Slave hasn't got value." >> exitFailure
+    exitFailure
+    where
+        eHandler :: SomeException -> IO ()
+        eHandler e = when (show e == "Data.Acid.Centered.Slave: CRC mismatch after sync. Exiting.") $ do
+            closeAcidState master
+            exitSuccess
 
 main :: IO ()
 main = do
     cleanup "state/CRCFail"
     acid <- openMasterStateFrom "state/CRCFail/m" "127.0.0.1" 3333 (IntState 0)
-    void $ forkIO slave
-    delaySec 10
+    void $ forkIO $ slave acid
+    delaySec 4
     closeAcidState acid
     exitSuccess