diff --git a/test/Network/Rpc/MultiplexerSpec.hs b/test/Network/Rpc/MultiplexerSpec.hs index 812303bc3f42db63fe52653d707507d2c4fd9c3c..63a95fa2e75f65c925ed19a3a0d1c3b4a3ca9ae1 100644 --- a/test/Network/Rpc/MultiplexerSpec.hs +++ b/test/Network/Rpc/MultiplexerSpec.hs @@ -36,6 +36,52 @@ spec = describe "runMultiplexerProtocol" $ parallel $ do tryReadMVar recvMVar `shouldReturn` Nothing + it "it can create sub-channels" $ do + recvMVar <- newEmptyMVar + withEchoServer $ \channel -> do + channelSetHandler channel $ ((\_ -> putMVar recvMVar) :: ReceivedMessageResources -> BSL.ByteString -> IO ()) + SentMessageResources{createdChannels=[_]} <- channelSend_ channel [CreateChannelHeader] "create a channel" + takeMVar recvMVar `shouldReturn` "create a channel" + SentMessageResources{createdChannels=[_, _, _]} <- channelSend_ channel [CreateChannelHeader, CreateChannelHeader, CreateChannelHeader] "create more channels" + takeMVar recvMVar `shouldReturn` "create more channels" + tryReadMVar recvMVar `shouldReturn` Nothing + + it "it can send messages on sub-channels" $ do + recvMVar <- newEmptyMVar + c1RecvMVar <- newEmptyMVar + c2RecvMVar <- newEmptyMVar + c3RecvMVar <- newEmptyMVar + withEchoServer $ \channel -> do + channelSetHandler channel $ ((\_ -> putMVar recvMVar) :: ReceivedMessageResources -> BSL.ByteString -> IO ()) + channelSendSimple channel "foobar" + takeMVar recvMVar `shouldReturn` "foobar" + + SentMessageResources{createdChannels=[c1, c2]} <- channelSend_ channel [CreateChannelHeader, CreateChannelHeader] "create channels" + takeMVar recvMVar `shouldReturn` "create channels" + + channelSetHandler c1 $ ((\_ -> putMVar c1RecvMVar) :: ReceivedMessageResources -> BSL.ByteString -> IO ()) + channelSetHandler c2 $ ((\_ -> putMVar c2RecvMVar) :: ReceivedMessageResources -> BSL.ByteString -> IO ()) + + channelSendSimple c1 "test" + takeMVar c1RecvMVar `shouldReturn` "test" + channelSendSimple c2 "test2" + takeMVar c2RecvMVar `shouldReturn` "test2" + channelSendSimple c2 "test3" + takeMVar c2RecvMVar `shouldReturn` "test3" + channelSendSimple c1 "test4" + takeMVar c1RecvMVar `shouldReturn` "test4" + + SentMessageResources{createdChannels=[c3]} <- channelSend_ channel [CreateChannelHeader] "create another channel" + takeMVar recvMVar `shouldReturn` "create another channel" + channelSetHandler c3 $ ((\_ -> putMVar c3RecvMVar) :: ReceivedMessageResources -> BSL.ByteString -> IO ()) + + channelSendSimple c3 "test5" + takeMVar c3RecvMVar `shouldReturn` "test5" + channelSendSimple c1 "test6" + takeMVar c1RecvMVar `shouldReturn` "test6" + + tryReadMVar recvMVar `shouldReturn` Nothing + withEchoServer :: (Channel -> IO a) -> IO a withEchoServer fn = bracket setup close (\(channel, _) -> fn channel)