1-- test the websocket server
3import qualified Network.WebSockets as WS
4import ProjectM36.Server.WebSocket
5import ProjectM36.Server.Config
6import ProjectM36.Server
7import ProjectM36.Client
9import Control.Exception
10import Control.Concurrent
13import Data.Text hiding (map)
16import qualified Data.Map as M
17import qualified Data.ByteString.Lazy as BS
18import ProjectM36.Relation
19import Network.Transport.TCP (decodeEndPointAddress)
21--start the websocket server
22-- run some tutoriald against it
24launchTestServer :: IO (PortNumber, DatabaseName)
26 addressMVar <- newEmptyMVar
27 let config = defaultServerConfig { databaseName = testDatabaseName,
29 testDatabaseName = "test"
30 -- start normal server
31 _ <- forkIO (launchServer config (Just addressMVar) >> pure ())
32 serverAddress <- takeMVar addressMVar
33 let wsServerHost = "127.0.0.1"
35 Just (dbHost, dbPort, _) = decodeEndPointAddress serverAddress
36 -- start websocket server proxy -- runServer doesn't support returning an arbitrary socket
37 _ <- forkIO (WS.runServer wsServerHost wsServerPort (websocketProxyServer (read dbPort) dbHost))
38 --wait for socket to be listening
39 waitForListenSocket 5 (fromIntegral wsServerPort)
40 pure (fromIntegral wsServerPort, testDatabaseName)
42data TestException = WaitForSocketListenException
43 deriving (Show, Typeable)
45instance Exception TestException
47waitForListenSocket :: Int -> PortNumber -> IO ()
48waitForListenSocket secondsToTry port =
49 if secondsToTry <= 0 then
50 throw WaitForSocketListenException
52 hostaddr <- inet_addr "127.0.0.1"
53 sock <- socket AF_INET Stream defaultProtocol
54 let handler :: IOException -> IO ()
57 waitForListenSocket (secondsToTry - 1) port
58 catch (connect sock (SockAddrInet port hostaddr)) handler
62 (port, dbname) <- launchTestServer
63 tcounts <- runTestTT (testList port dbname)
64 if errors tcounts + failures tcounts > 0 then exitFailure else exitSuccess
66testList :: PortNumber -> DatabaseName -> Test
67testList port dbName = TestList $ map (\f -> f port dbName) [testBasicConnection,
70basicConnection :: PortNumber -> WS.ClientApp () -> IO ()
71basicConnection port = WS.runClient "127.0.0.1" (fromIntegral port) "/"
73basicConnectionWithDatabase :: PortNumber -> DatabaseName -> WS.ClientApp () -> IO ()
74basicConnectionWithDatabase port dbname block = basicConnection port (\conn -> do
75 WS.sendTextData conn ("connectdb:" `append` pack dbname)
78testBasicConnection :: PortNumber -> DatabaseName -> Test
79testBasicConnection port _ = TestCase $ basicConnection port (\conn -> WS.sendClose conn ("test close"::Text))
81testTutorialD :: PortNumber -> DatabaseName -> Test
82testTutorialD port dbname = TestCase $ basicConnectionWithDatabase port dbname testtutd
84 discardPromptInfo conn = do
85 response <- WS.receiveData conn :: IO BS.ByteString
86 let decoded = decode response :: Maybe (M.Map Text (M.Map Text Text))
89 Nothing -> assertFailure ("failed to decode prompt info: " ++ show response)
92 discardPromptInfo conn
93 WS.sendTextData conn ("executetutd:" `append` ":showexpr true")
94 discardPromptInfo conn
95 discardPromptInfo conn
97 --receive relation response
98 response <- WS.receiveData conn :: IO BS.ByteString
99 let decoded = decode response :: Maybe (M.Map Text Relation)
102 Just val -> assertEqual "round-trip true relation" (M.lookup "displayrelation" val) (Just relationTrue) >> WS.sendClose conn ("test close"::Text)
103 Nothing -> assertFailure ("failed to decode relation from: " ++ show response)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list