@@ -16,6 +16,10 @@ import Data.List (inits)
16import Network.Transport
16import Network.Transport
17import Network.Transport.TCP (createTransport, defaultTCPParameters)
17import Network.Transport.TCP (createTransport, defaultTCPParameters)
19+--------------------------------------------------------------------------------
20+-- Script infrastructure --
21+--------------------------------------------------------------------------------
19data ScriptCmd =
23data ScriptCmd =
20 NewEndPoint
24 NewEndPoint
21 | Connect Int Int
25 | Connect Int Int
@@ -24,63 +28,6 @@ data ScriptCmd =
25type Script = [ScriptCmd]
29type Script = [ScriptCmd]
27−logShow :: Show a => a -> IO ()
28−logShow = appendFile "log" . (++ "\n") . show
30−throwIfLeft :: Exception a => IO (Either a b) -> IO b
37−script_NewEndPoint :: Int -> Gen Script
38−script_NewEndPoint numEndPoints = return (replicate numEndPoints NewEndPoint)
40−script_Connect :: Int -> Gen Script
41−script_Connect numEndPoints = do
43− return (replicate numEndPoints NewEndPoint ++ script)
47− next <- choose (0, 1) :: Gen Int
50− fr <- choose (0, numEndPoints - 1)
51− to <- choose (0, numEndPoints - 1)
53− return (Connect fr to : cmds)
57−script_ConnectClose :: Int -> Gen Script
58−script_ConnectClose numEndPoints = do
59− script <- go Map.empty
60− return (replicate numEndPoints NewEndPoint ++ script)
62− go :: Map Int Bool -> Gen Script
64− next <- choose (0, 2) :: Gen Int
67− fr <- choose (0, numEndPoints - 1)
68− to <- choose (0, numEndPoints - 1)
69− cmds <- go (Map.insert (Map.size conns) True conns)
70− return (Connect fr to : cmds)
72− mConn <- choose (0, Map.size conns - 1) `suchThatMaybe` isOpen conns
76− cmds <- go (Map.insert conn False conns)
77− return (Close conn : cmds)
81− isOpen :: Map Int Bool -> Int -> Bool
82− isOpen conns connIx = connIx `Map.member` conns && conns Map.! connIx
84execScript :: Transport -> Script -> IO (Map Int [Event])
31execScript :: Transport -> Script -> IO (Map Int [Event])
85execScript transport script = do
32execScript transport script = do
86 chan <- newChan
33 chan <- newChan
@@ -155,6 +102,61 @@ verify script = go script []
155 go cmds conns (Map.insert epIx epEvs evs)
102 go cmds conns (Map.insert epIx epEvs evs)
156 _ -> Just $ "Missing (ConnectionClosed " ++ show connId ++ ") event in " ++ show evs
103 _ -> Just $ "Missing (ConnectionClosed " ++ show connId ++ ") event in " ++ show evs
105+--------------------------------------------------------------------------------
106+-- Script generators --
107+--------------------------------------------------------------------------------
109+script_NewEndPoint :: Int -> Gen Script
110+script_NewEndPoint numEndPoints = return (replicate numEndPoints NewEndPoint)
112+script_Connect :: Int -> Gen Script
113+script_Connect numEndPoints = do
115+ return (replicate numEndPoints NewEndPoint ++ script)
119+ next <- choose (0, 1) :: Gen Int
122+ fr <- choose (0, numEndPoints - 1)
123+ to <- choose (0, numEndPoints - 1)
125+ return (Connect fr to : cmds)
129+script_ConnectClose :: Int -> Gen Script
130+script_ConnectClose numEndPoints = do
131+ script <- go Map.empty
132+ return (replicate numEndPoints NewEndPoint ++ script)
134+ go :: Map Int Bool -> Gen Script
136+ next <- choose (0, 2) :: Gen Int
139+ fr <- choose (0, numEndPoints - 1)
140+ to <- choose (0, numEndPoints - 1)
141+ cmds <- go (Map.insert (Map.size conns) True conns)
142+ return (Connect fr to : cmds)
144+ mConn <- choose (0, Map.size conns - 1) `suchThatMaybe` isOpen conns
148+ cmds <- go (Map.insert conn False conns)
149+ return (Close conn : cmds)
153+ isOpen :: Map Int Bool -> Int -> Bool
154+ isOpen conns connIx = connIx `Map.member` conns && conns Map.! connIx
156+--------------------------------------------------------------------------------
157+-- Individual scripts to test specific bugs --
158+--------------------------------------------------------------------------------
158testScript1 :: Script
160testScript1 :: Script
159testScript1 = [
161testScript1 = [
160 NewEndPoint
162 NewEndPoint
@@ -166,6 +168,29 @@ testScript1 = [
166 , Connect 1 0
168 , Connect 1 0
171+--------------------------------------------------------------------------------
172+-- Main application driver --
173+--------------------------------------------------------------------------------
175+tests :: Transport -> [Test]
177+ testGroup "Unidirectional" [
178+ -- testProperty "NewEndPoint" (genericProp transport (script_NewEndPoint 2))
179+ --, testProperty "Connect" (genericProp transport (script_Connect 2))
180+ testCase "testScript1" (testOneScript transport testScript1)
181+ -- testProperty "ConnectClose" (genericProp transport (script_ConnectClose 2))
187+ Right transport <- createTransport "127.0.0.1" "8080" defaultTCPParameters
188+ defaultMain (tests transport)
190+--------------------------------------------------------------------------------
191+-- Test infrastructure --
192+--------------------------------------------------------------------------------
169genericProp :: Transport -> Gen Script -> Property
194genericProp :: Transport -> Gen Script -> Property
170genericProp transport scriptGen =
195genericProp transport scriptGen =
171 forAll scriptGen $ \script ->
196 forAll scriptGen $ \script ->
@@ -187,17 +212,17 @@ testOneScript transport script = do
187 Just err -> assertFailure $ "Failed with script " ++ show script ++ ": " ++ err
212 Just err -> assertFailure $ "Failed with script " ++ show script ++ ": " ++ err
188 Nothing -> return ()
213 Nothing -> return ()
190−tests :: Transport -> [Test]
215+--------------------------------------------------------------------------------
191−tests transport = [
216+-- Auxiliary
192− testGroup "Unidirectional" [
217+--------------------------------------------------------------------------------
193− -- testProperty "NewEndPoint" (genericProp transport (script_NewEndPoint 2))
218+
194− --, testProperty "Connect" (genericProp transport (script_Connect 2))
219+logShow :: Show a => a -> IO ()
195− testCase "testScript1" (testOneScript transport testScript1)
220+logShow = appendFile "log" . (++ "\n") . show
196− -- testProperty "ConnectClose" (genericProp transport (script_ConnectClose 2))
221+
197− ]
222+throwIfLeft :: Exception a => IO (Either a b) -> IO b
198− ]
223+throwIfLeft p = do
202− Right transport <- createTransport "127.0.0.1" "8080" defaultTCPParameters
203− defaultMain (tests transport)