Skip to content

Commit 022531e

Browse files
committed
More resilient peekVar tests
In case of deadlocks
1 parent 11c2fd8 commit 022531e

File tree

1 file changed

+44
-29
lines changed

1 file changed

+44
-29
lines changed

test/Test/Main.purs

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,24 @@ import Control.Monad.Error.Class (throwError)
1313
import Control.Monad.Rec.Class (Step(..), tailRecM)
1414
import Control.Parallel (parallel, sequential)
1515
import Data.Either (either, fromLeft, fromRight)
16+
import Data.Maybe (Maybe(..))
1617
import Data.Unfoldable (replicate)
1718
import Partial.Unsafe (unsafePartial)
1819

1920
type Test a = forall e. Aff (console :: CONSOLE | e) a
2021
type TestAVar a = forall e. Aff (console :: CONSOLE, avar :: AVAR | e) a
2122

23+
timeout :: Int TestAVar Unit TestAVar Unit
24+
timeout ms aff = do
25+
exn <- makeVar
26+
clr1 <- forkAff (later' ms (putVar exn (Just "Timed out")))
27+
clr2 <- forkAff (aff *> putVar exn Nothing)
28+
res ← takeVar exn
29+
log (show res)
30+
case res of
31+
Nothing -> void (clr1 `cancel` error "Done")
32+
Just e -> void (clr2 `cancel` error "Done") *> throwError (error e)
33+
2234
replicateArray :: forall a. Int -> a -> Array a
2335
replicateArray = replicate
2436

@@ -69,35 +81,38 @@ test_putTakeVar = do
6981

7082
test_peekVar :: TestAVar Unit
7183
test_peekVar = do
72-
v <- makeVar
73-
forkAff (later $ putVar v 1.0)
74-
a1 <- peekVar v
75-
a2 <- takeVar v
76-
when (a1 /= a2) do
77-
throwError (error "Something horrible went wrong - peeked var is not equal to taken var")
78-
log ("Success: Peeked value not consumed")
79-
80-
w <- makeVar
81-
putVar w true
82-
b <- peekVar w
83-
when (not b) do
84-
throwError (error "Something horrible went wrong - peeked var is not true")
85-
log ("Success: Peeked value read from written var")
86-
87-
x <- makeVar
88-
res <- makeVar' 1
89-
forkAff do
90-
c <- peekVar x
91-
putVar x 1000
92-
d <- peekVar x
93-
modifyVar (_ + (c + d)) res
94-
putVar x 10
95-
count <- takeVar res
96-
e <- takeVar x
97-
f <- takeVar x
98-
when (not (count == 21 && e == 10 && f == 1000)) do
99-
throwError (error "Something horrible went wrong - peeked consumers/producer ordering")
100-
log "Success: peekVar consumer/producer order maintained"
84+
timeout 1000 do
85+
v <- makeVar
86+
forkAff (later $ putVar v 1.0)
87+
a1 <- peekVar v
88+
a2 <- takeVar v
89+
when (a1 /= a2) do
90+
throwError (error "Something horrible went wrong - peeked var is not equal to taken var")
91+
log ("Success: Peeked value not consumed")
92+
93+
timeout 1000 do
94+
w <- makeVar
95+
putVar w true
96+
b <- peekVar w
97+
when (not b) do
98+
throwError (error "Something horrible went wrong - peeked var is not true")
99+
log ("Success: Peeked value read from written var")
100+
101+
timeout 1000 do
102+
x <- makeVar
103+
res <- makeVar' 1
104+
forkAff do
105+
c <- peekVar x
106+
putVar x 1000
107+
d <- peekVar x
108+
modifyVar (_ + (c + d)) res
109+
putVar x 10
110+
count <- takeVar res
111+
e <- takeVar x
112+
f <- takeVar x
113+
when (not (count == 21 && e == 10 && f == 1000)) do
114+
throwError (error "Something horrible went wrong - peeked consumers/producer ordering")
115+
log "Success: peekVar consumer/producer order maintained"
101116

102117
test_killFirstForked :: Test Unit
103118
test_killFirstForked = do

0 commit comments

Comments
 (0)