@@ -8,10 +8,13 @@ import Test.Hydra.Prelude
8
8
import Data.Aeson (Value (.. ))
9
9
import Data.Aeson qualified as Aeson
10
10
import Data.Text qualified as Text
11
+ import Hydra.Logging (Envelope (.. ), Verbosity (Verbose ), withTracer )
11
12
import Hydra.Persistence (Persistence (.. ), PersistenceIncremental (.. ), createPersistence , createPersistenceIncremental , loadAll )
13
+ import Hydra.PersistenceLog
12
14
import Test.QuickCheck (checkCoverage , cover , elements , oneof , suchThat , (===) )
13
15
import Test.QuickCheck.Gen (listOf )
14
16
import Test.QuickCheck.Monadic (monadicIO , monitor , pick , run )
17
+ import Test.Util (captureTracer )
15
18
16
19
spec :: Spec
17
20
spec = do
@@ -35,12 +38,25 @@ spec = do
35
38
pure $ actualResult === Just item
36
39
37
40
describe " PersistenceIncremental" $ do
38
- it " can handle empty files " $ do
41
+ it " can ignore invalid lines and emits warning " $ do
39
42
withTempDir " hydra-persistence" $ \ tmpDir -> do
43
+ (tracer, getTraces) <- captureTracer " persistence-incremental"
40
44
let fp = tmpDir <> " /data"
41
- writeFileBS fp " "
42
- p <- createPersistenceIncremental fp
43
- loadAll p `shouldReturn` ([] :: [Aeson. Value ])
45
+ writeFileBS fp " \" abc\"\n {\" xyz\" : "
46
+ p <- createPersistenceIncremental tracer fp
47
+ loadAll p `shouldReturn` ([Aeson. String " abc" ] :: [Aeson. Value ])
48
+ traces <- getTraces
49
+ let rightMsg [Envelope {message = FailedToDecodeJson {}}] = True
50
+ rightMsg _ = False
51
+ traces `shouldSatisfy` rightMsg
52
+
53
+ it " can handle empty files" $ do
54
+ withTracer (Verbose " persistence-incremental" ) $ \ tracer -> do
55
+ withTempDir " hydra-persistence" $ \ tmpDir -> do
56
+ let fp = tmpDir <> " /data"
57
+ writeFileBS fp " "
58
+ p <- createPersistenceIncremental tracer fp
59
+ loadAll p `shouldReturn` ([] :: [Aeson. Value ])
44
60
45
61
it " is consistent after multiple append calls in presence of new-lines" $
46
62
checkCoverage $
@@ -50,24 +66,26 @@ spec = do
50
66
monitor (cover 10 (containsNewLine items) " some item contains a new line" )
51
67
52
68
actualResult <- run $
53
- withTempDir " hydra-persistence" $ \ tmpDir -> do
54
- p <- createPersistenceIncremental $ tmpDir <> " /data"
55
- forM_ items $ append p
56
- loadAll p
69
+ withTracer (Verbose " persistence-incremental" ) $ \ tracer -> do
70
+ withTempDir " hydra-persistence" $ \ tmpDir -> do
71
+ p <- createPersistenceIncremental tracer $ tmpDir <> " /data"
72
+ forM_ items $ append p
73
+ loadAll p
57
74
pure $ actualResult === items
58
75
59
76
it " it cannot load from a different thread once having started appending" $
60
77
monadicIO $ do
61
78
items <- pick $ listOf genPersistenceItem
62
79
moreItems <- pick $ listOf genPersistenceItem `suchThat` ((> 2 ) . length )
63
80
pure $
64
- withTempDir " hydra-persistence" $ \ tmpDir -> do
65
- p <- createPersistenceIncremental $ tmpDir <> " /data"
66
- forM_ items $ append p
67
- loadAll p `shouldReturn` items
68
- raceLabelled_
69
- (" forever-load-all" , forever $ threadDelay 0.01 >> loadAll p)
70
- (" append-more-items" , forM_ moreItems $ \ item -> append p item >> threadDelay 0.01 )
81
+ withTracer (Verbose " persistence-incremental" ) $ \ tracer -> do
82
+ withTempDir " hydra-persistence" $ \ tmpDir -> do
83
+ p <- createPersistenceIncremental tracer $ tmpDir <> " /data"
84
+ forM_ items $ append p
85
+ loadAll p `shouldReturn` items
86
+ raceLabelled_
87
+ (" forever-load-all" , forever $ threadDelay 0.01 >> loadAll p)
88
+ (" append-more-items" , forM_ moreItems $ \ item -> append p item >> threadDelay 0.01 )
71
89
72
90
genPersistenceItem :: Gen Aeson. Value
73
91
genPersistenceItem =
0 commit comments