packages feed

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 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}