packages feed

hssh-0.1.0.0: test/Spec/TStreamingQueue.hs

{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE FlexibleContexts           #-}
module Spec.TStreamingQueue ( tests ) where

import           Control.Monad.STM
import           Control.Concurrent.STM.TVar

import           Test.Tasty
import           Test.Tasty.HUnit

import           Network.SSH.Internal

tests :: TestTree
tests = testGroup "Network.SSH.TStreamingQueue"
    [ test01
    , test02
    , test03
    , test04
    , test05
    ]

test01 :: TestTree
test01 = testCase "send 3 bytes, send 3 bytes, receive up to 6 bytes" $ do
    window <- newTVarIO 1000000
    q <- atomically $ newTStreamingQueue 10 window
    assertEqual "sent" 3 =<< atomically (enqueue q "ABC")
    assertEqual "sent" 3 =<< atomically (enqueue q "DEF")
    assertEqual "received" "ABCDEF" =<< atomically (dequeue q 6)

test02 :: TestTree
test02 = testCase "send 3 bytes, send 3 bytes, receive up to 7 bytes" $ do
    window <- newTVarIO 1000000
    q <- atomically $ newTStreamingQueue 10 window
    assertEqual "sent" 3 =<< atomically (enqueue q "ABC")
    assertEqual "sent" 3 =<< atomically (enqueue q "DEF")
    assertEqual "received" "ABCDEF" =<< atomically (dequeue q 7)

test03 :: TestTree
test03 = testCase "send 3 bytes, send eof, receive up to 7 bytes" $ do
    window <- newTVarIO 1000000
    q <- atomically $ newTStreamingQueue 10 window
    assertEqual "sent" 3 =<< atomically (enqueue q "ABC")
    atomically $ terminate q
    assertEqual "received" "ABC" =<< atomically (dequeue q 7)

test04 :: TestTree
test04 = testCase "send 0 bytes" $ do
    window <- newTVarIO 1000000
    q <- atomically $ newTStreamingQueue 10 window
    assertEqual "sent" 0 =<< atomically (enqueue q "")

test05 :: TestTree
test05 = testCase "send 4, receive 3, send 4, receive 3, sent eof, receive 3" $ do
    window <- newTVarIO 1000000
    q <- atomically $ newTStreamingQueue 10 window
    assertEqual "sent" 4 =<< atomically (enqueue q "1234")
    assertEqual "rcvd" "123" =<< atomically (dequeue q 3)
    assertEqual "sent" 4 =<< atomically (enqueue q "5678")
    assertEqual "rcvd" "456" =<< atomically (dequeue q 3)
    atomically $ terminate q
    assertEqual "rcvd" "78" =<< atomically (dequeue q 3)