happstack-state 0.4.1 → 0.5.0
raw patch · 14 files changed
+51/−68 lines, 14 filesdep +networkdep ~QuickCheckdep ~happstack-datadep ~happstack-utilsetup-changed
Dependencies added: network
Dependency ranges changed: QuickCheck, happstack-data, happstack-util
Files
- Setup.hs +1/−1
- happstack-state.cabal +4/−5
- src/Happstack/State/Checkpoint.hs +0/−3
- src/Happstack/State/ComponentSystem.hs +0/−1
- src/Happstack/State/Control.hs +0/−3
- src/Happstack/State/Monad.hs +0/−1
- src/Happstack/State/Saver/Impl/File.hs +0/−1
- src/Happstack/State/Transaction.hs +0/−1
- src/Happstack/State/TxControl.hs +0/−1
- src/Happstack/State/Types.hs +0/−1
- src/Happstack/State/Util.hs +0/−1
- tests/Happstack/State/Tests/CheckpointProperties.hs +9/−11
- tests/Happstack/State/Tests/Helpers.hs +3/−9
- tests/Happstack/State/Tests/SaverProperties.hs +34/−29
Setup.hs view
@@ -1,3 +1,3 @@ #!/usr/bin/env runhaskell import Distribution.Simple-main = defaultMainWithHooks defaultUserHooks+main = defaultMainWithHooks simpleUserHooks
happstack-state.cabal view
@@ -1,5 +1,5 @@ Name: happstack-state-Version: 0.4.1+Version: 0.5.0 Synopsis: Event-based distributed state. Description: Unplug your machine and restart and have your app recover to exactly where it left off. Happstack-State spares you the need to deal with all the marshalling, consistency, and configuration headache that you would have if you used an external DBMS for this purpose. Its component model makes it easy to compose big applications from smaller reliable parts. Use event subscription to trigger IO actions and support comet-style or irc-bot applications. License: BSD3@@ -37,6 +37,7 @@ Happstack.State.ComponentTH Happstack.State.ComponentSystem if flag(tests)+ Build-Depends: QuickCheck >= 2 && <3, HUnit, network Exposed-modules: Happstack.State.Tests Happstack.State.Tests.Helpers@@ -60,8 +61,8 @@ extensible-exceptions, filepath, hslogger >= 1.0.2,- happstack-util >= 0.4.1 && < 0.5,- happstack-data >= 0.4.1 && < 0.5,+ happstack-util >= 0.5 && < 0.6,+ happstack-data >= 0.5 && < 0.6, mtl, old-time, random,@@ -81,8 +82,6 @@ Build-Depends: base >= 4 && < 5, syb else Build-Depends: base < 4- if flag(tests)- Build-Depends: QuickCheck < 2, HUnit hs-source-dirs: src if flag(tests)
src/Happstack/State/Checkpoint.hs view
@@ -9,7 +9,6 @@ import Happstack.Data.Serialize import Happstack.Data.SerializeTH import Happstack.State.Transaction-import Happstack.State.ComponentSystem import Data.Typeable import Data.Maybe@@ -17,8 +16,6 @@ import Control.Monad import Control.Exception as E import qualified Data.ByteString.Lazy.Char8 as L-import qualified Data.Map as M-import System.IO import qualified Data.Map as M import System.Log.Logger
src/Happstack/State/ComponentSystem.hs view
@@ -3,7 +3,6 @@ module Happstack.State.ComponentSystem where import Happstack.Data.Serialize-import Happstack.Data.Proxy import Happstack.State.Types import Data.Typeable
src/Happstack/State/Control.hs view
@@ -13,10 +13,7 @@ import System.Log.Handler.Simple import System.Log.Handler.Syslog -import Control.Monad-import Data.List import Data.Char-import Data.Maybe import System.Environment import System.IO import System.Exit
src/Happstack/State/Monad.hs view
@@ -9,7 +9,6 @@ import Control.Monad.State import Control.Monad.Reader-import Control.Monad instance (Monad m) => Monad (Ev m) where return x = Ev $ \_ -> return x
src/Happstack/State/Saver/Impl/File.hs view
@@ -16,7 +16,6 @@ import qualified Data.ByteString as B import System.Directory ( createDirectoryIfMissing, removeFile, renameFile, doesFileExist ) import System.IO-import qualified System.IO.Error as SE import System.Random ( randomIO ) import System.Log.Logger import Text.Printf
src/Happstack/State/Transaction.hs view
@@ -22,7 +22,6 @@ import Happstack.Data.Serialize import Happstack.Data.SerializeTH import Happstack.State.Types-import Happstack.Util.Common (Seconds) import Data.Dynamic import GHC.Base
src/Happstack/State/TxControl.hs view
@@ -7,7 +7,6 @@ ) where import System.Log.Logger-import System.IO import Control.Monad import Control.Exception import Control.Concurrent
src/Happstack/State/Types.hs view
@@ -15,7 +15,6 @@ import Control.Monad.State import Control.Monad.Reader-import Control.Monad.Trans import Data.Generics -- Monad things
src/Happstack/State/Util.hs view
@@ -7,7 +7,6 @@ ) where import Control.Concurrent.STM-import Control.Monad.State import System.Random import Happstack.State.Monad
tests/Happstack/State/Tests/CheckpointProperties.hs view
@@ -2,7 +2,6 @@ module Happstack.State.Tests.CheckpointProperties ( testCongestedCheckpoint , congestedCheckpoint- , checkCheckpointProperties , checkpointProperties , runRestoreCongestionKnownFailures ) where@@ -22,7 +21,6 @@ import Text.Printf import Test.QuickCheck-import Test.QuickCheck.Batch import Test.HUnit (Test(..),(~:), assertBool, assertFailure) --------------------------------------------------------------@@ -179,7 +177,7 @@ forkIO $ createCheckpoint ctl `finally` putMVar mv () takeMVar mv replicateM_ (length values) (waitQSem sem)-+{- checkCheckpointProperties :: IO () checkCheckpointProperties = tryTests ("runRestore") options [run (prop_runRestoreId saver)@@ -187,20 +185,20 @@ ,run (prop_runRestoreMultipleCheckpoint saver) ,run (prop_runRestoreAsync saver) ,run (prop_runRestoreCongestion saver)]- where options = defOpt{length_of_tests=5}+ where args = stdArgs {maxSize=5} saver = withQueueSaver withMemorySaver-+-} checkpointProperties :: Test checkpointProperties = "checkpointProperties" ~: - [ "prop_runRestoreId" ~: qccheck config (prop_runRestoreId saver)- , "prop_runRestoreCheckpoint" ~: qccheck config (prop_runRestoreCheckpoint saver)- , "prop_runRestoreMultipleCheckpoint" ~: qccheck config (prop_runRestoreMultipleCheckpoint saver)- , "prop_runRestoreAsync" ~: qccheck config (prop_runRestoreAsync saver)- , "prop_runRestoreCongestion" ~: qccheck config (prop_runRestoreCongestion saver)+ [ "prop_runRestoreId" ~: qccheck args (prop_runRestoreId saver)+ , "prop_runRestoreCheckpoint" ~: qccheck args (prop_runRestoreCheckpoint saver)+ , "prop_runRestoreMultipleCheckpoint" ~: qccheck args (prop_runRestoreMultipleCheckpoint saver)+ , "prop_runRestoreAsync" ~: qccheck args (prop_runRestoreAsync saver)+ , "prop_runRestoreCongestion" ~: qccheck args (prop_runRestoreCongestion saver) ] where- config = defaultConfig { configMaxTest = 100 }+ args = stdArgs { maxSize = 100 } saver = withQueueSaver withMemorySaver
tests/Happstack/State/Tests/Helpers.hs view
@@ -12,23 +12,16 @@ import Control.Exception import Control.Concurrent -import Test.QuickCheck-import Test.QuickCheck.Batch+import Test.QuickCheck (Arbitrary(arbitrary), choose) import Text.Printf -instance Arbitrary Char where- arbitrary = choose ('a','z')- coarbitrary = undefined- instance (Arbitrary a, Num a) => Arbitrary (Abs a) where arbitrary = liftM (Abs . abs) arbitrary- coarbitrary = undefined instance (Arbitrary a) => Arbitrary (NonEmpty a) where arbitrary = do x <- arbitrary xs <- arbitrary return $ NonEmpty (x:xs)- coarbitrary = undefined data Abs a = Abs a instance (Show a) => Show (Abs a) where@@ -88,7 +81,7 @@ , ("File", withFileSaver) , ("Queue File", \action -> withFileSaver (action . Queue)) ]-+{- tryTests :: String -> TestOptions -> [TestOptions -> IO TestResult] -> IO () tryTests name opt tests = do printf "%25s : " name@@ -106,3 +99,4 @@ putStrLn (" ** " ++ show exp) exitWith (ExitFailure 1) putChar '\n'+-}
tests/Happstack/State/Tests/SaverProperties.hs view
@@ -1,44 +1,43 @@ module Happstack.State.Tests.SaverProperties- ( checkSaverProperties- , saverProperties+ ( saverProperties ) where-+import Control.Monad+import Control.Exception+import Control.Concurrent+import Data.Char (isAlphaNum)+import Data.List import Happstack.State.Saver import Happstack.State.Saver.Impl.Memory import Happstack.State.Tests.Helpers-import Happstack.Util.Testing (qctest, qcrun)-+import Happstack.Util.Testing (qctest, qccheck) import System.Directory import System.Random import System.FilePath import System.IO.Unsafe-import Control.Monad-import Control.Exception-import Control.Concurrent-import Data.List -import Test.QuickCheck-import Test.QuickCheck.Batch-import Test.HUnit (Test(TestCase),(~:), assertFailure)+import Test.QuickCheck (Args(maxSize), Property, (==>), stdArgs)+import Test.HUnit (Test(TestCase),(~:)) -------------------------------------------------------------- -- Tests -------------------------------------------------------------- -- read (write values) == values-prop_getSetId withSaver key cutoff values- = not (null key) ==>- cutoff > 0 ==>+prop_getSetId :: ((Saver -> IO Bool) -> IO Bool) -> {- String -> -} Int -> [Int] -> Property+prop_getSetId withSaver {- (NonEmpty key) -} cutoff values+ = (abs cutoff) > 0 ==> ioProperty $ withSaver $ \saver ->- do writer <- createWriter saver key cutoff+ do writer <- createWriter saver key (abs cutoff) forM_ values $ \value -> writerAdd writer (value::Int) $ return () writerClose writer - reader <- createReader saver key cutoff+ reader <- createReader saver key (abs cutoff) out <- readerGetUncut reader return $ values == out+ where+ key = "key" -- not sure if randomly generating the key is useful. But it was causing trouble because it contain ~ / and other meaningful characters -prop_seqReadWrite withSaver (NonEmpty key) (Abs cutoff) valss+prop_seqReadWrite withSaver {-(NonEmpty key) -} (Abs cutoff) valss = ioProperty $ withSaver $ \saver -> do writer <- createWriter saver key cutoff forM_ valss $ \vals -> do forM_ vals $ \val -> writerAdd writer (val::Int) $ return ()@@ -48,8 +47,10 @@ reader <- createReader saver key cutoff (out,newCut) <- readerGet reader return $ out == concat valss && newCut == length valss + 1+ where+ key = "key" -prop_cutDrop withSaver (NonEmpty key) (Abs cutoff) a b+prop_cutDrop withSaver {- (NonEmpty key) -} (Abs cutoff) a b = ioProperty $ withSaver $ \saver -> do writer <- createWriter saver key cutoff forM_ a $ \val -> writerAdd writer (val::Int) $ return ()@@ -60,8 +61,10 @@ reader <- createReader saver key newCut (out,_) <- readerGet reader return $ b `isSuffixOf` out+ where+ key = "key" -prop_atomic withSaver (NonEmpty key) (Abs cutoff) value+prop_atomic withSaver {- (NonEmpty key) -} (Abs cutoff) value = ioProperty $ withSaver $ \saver -> do writer <- createWriter saver key cutoff writerAtomicReplace writer (value::Int)@@ -71,24 +74,26 @@ out <- readerGetUncut reader readerClose reader return $ out == [value]-+ where+ key = "key"+{- checkSaverProperties :: IO () checkSaverProperties = forEachSaver_ $ \name withSaver ->- tryTests (name ++ " saver") options [run (prop_getSetId withSaver)+ tryTests (name ++ " saver") args [run (prop_getSetId withSaver) ,run (prop_seqReadWrite withSaver) ,run (prop_cutDrop withSaver) ,run (prop_atomic withSaver)]- where options = defOpt{length_of_tests=5}-+ where args = stdArgs{maxSize=5}+-} saverProperties :: Test saverProperties = "saverProperties" ~: ((forEachSaver $ \name withSaver -> name ~:- [ "prop_getSetId" ~: qcrun (prop_getSetId withSaver) options- , "prop_seqReadWrite" ~: qcrun (prop_seqReadWrite withSaver) options- , "prop_cutDrop" ~: qcrun (prop_cutDrop withSaver) options- , "prop_atomic" ~: qcrun (prop_atomic withSaver) options+ [ "prop_getSetId" ~: qccheck args (prop_getSetId withSaver)+ , "prop_seqReadWrite" ~: qccheck args (prop_seqReadWrite withSaver)+ , "prop_cutDrop" ~: qccheck args (prop_cutDrop withSaver)+ , "prop_atomic" ~: qccheck args (prop_atomic withSaver) ]))- where options = defOpt{length_of_tests=5}+ where args = stdArgs{maxSize=5}