From 3012d4586fa0950c26aecb8f3562ffb3fb446c79 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Sat, 17 Oct 2020 20:10:40 +0100 Subject: [PATCH] test: switching subscription to another TCP connection --- tests/Test.hs | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/tests/Test.hs b/tests/Test.hs index c76459f4d..e4b9aeed4 100644 --- a/tests/Test.hs +++ b/tests/Test.hs @@ -1,6 +1,7 @@ {-# LANGUAGE BlockArguments #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} +{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PatternSynonyms #-} @@ -10,6 +11,7 @@ import qualified Data.ByteString.Char8 as B import Data.Either import SMPClient import System.IO (Handle) +import System.Timeout import Test.HUnit import Test.Hspec import Transmission @@ -26,8 +28,7 @@ main = hspec do describe "CONN, OFF and DEL commands, SEND messages" testCreateDelete describe "SMP messages" do describe "duplex communication over 2 SMP connections" testDuplex - --- describe "switch subscription to another SMP connection" + describe "switch subscription to another SMP connection" testSwitchSub pattern Resp :: ConnId -> Command 'Broker -> TransmissionOrError pattern Resp connId command = ("", (connId, Right (Cmd SBroker command))) @@ -155,10 +156,11 @@ testDuplex = it "should create 2 simplex connections and exchange messages" $ smpTestN 2 _test where - _test [alice, bob] = duplex alice bob + _test [alice, bob] = _testDuplex alice bob _test _ = error "expected 2 handles" - duplex alice bob = do + _testDuplex :: Handle -> Handle -> IO () + _testDuplex alice bob = do Resp _ (IDS aRcv aSnd) <- sendRecv alice ("", "", "CONN 1234") -- aSnd ID is passed to Bob out-of-band @@ -200,6 +202,40 @@ testDuplex = Resp _ OK <- sendRecv bob ("abcd", bRcv, "ACK") (msg5, "how are you bob") #== "message received from alice" +testSwitchSub :: SpecWith () +testSwitchSub = + it "should create simplex connections and switch subscription to another TCP connection" $ + smpTestN 3 _test + where + _test [rh1, rh2, sh] = _testSwitch rh1 rh2 sh + _test _ = error "expected 3 handles" + + _testSwitch :: Handle -> Handle -> Handle -> IO () + _testSwitch rh1 rh2 sh = do + Resp _ (IDS rId sId) <- sendRecv rh1 ("", "", "CONN 1234") + Resp _ ok1 <- sendRecv sh ("", sId, "SEND :test1") + (ok1, OK) #== "sent test message 1" + + Resp _ (MSG _ _ msg1) <- tGet fromServer rh1 + (msg1, "test1") #== "test message 1 delivered to the 1st TCP connection" + Resp _ OK <- sendRecv rh1 ("1234", rId, "ACK") + + Resp _ ok2 <- sendRecv rh2 ("1234", rId, "SUB") + (ok2, OK) #== "connected to the same simplex connection via another TCP connection" + + Resp _ end <- tGet fromServer rh1 + (end, END) #== "unsubscribed the 1st connection" + + Resp _ OK <- sendRecv sh ("", sId, "SEND :test2") + + Resp _ (MSG _ _ msg2) <- tGet fromServer rh2 + (msg2, "test2") #== "delivered to the 2nd TCP connection" + Resp _ OK <- sendRecv rh1 ("1234", rId, "ACK") + + timeout 1000 (tGet fromServer rh1) >>= \case + Nothing -> return () + Just _ -> error "nothing should be delivered to the 1st TCPconnection" + syntaxTests :: SpecWith () syntaxTests = do it "unknown command" $ [("", "1234", "HELLO")] >#> [("", "1234", "ERR UNKNOWN")]