packages feed

quic-0.0.0: test/RecoverySpec.hs

{-# LANGUAGE OverloadedStrings #-}

module RecoverySpec where

import Data.ByteString.Short ()
import qualified Data.Sequence as Seq
import Data.UnixTime
import Test.Hspec

import Network.QUIC.Internal

spec :: Spec
spec = do
    describe "persistent congestion" $ do
        it "does not find a pair" $ do
            findDuration (Seq.fromList [sp0]) 0 `shouldBe` Nothing
            findDuration (Seq.fromList [sp0,sp1]) 0 `shouldBe` Nothing
            findDuration (Seq.fromList [sp0,sp1,sp2]) 0 `shouldBe` Nothing
            findDuration (Seq.fromList [sp0,sp2,sp2,sp3]) 0 `shouldBe` Nothing
            findDuration (Seq.fromList [sp0,sp2,sp2,sp3,sp4]) 0 `shouldBe` Nothing
            findDuration (Seq.fromList [sp0,sp2,sp2,sp3,sp5]) 0 `shouldBe` Nothing
            findDuration (Seq.fromList [sp0,sp2,sp2,sp3,sp4,sp5]) 2 `shouldBe` Nothing
        it "finds a pair" $ do
            findDuration (Seq.fromList [sp0,sp1,sp2,sp3,sp4,sp5]) 0 `shouldBe` Just (UnixDiffTime 4 0)
            findDuration (Seq.fromList [sp0,sp1,sp2,sp3,sp4,sp5,sp6]) 0 `shouldBe` Just (UnixDiffTime 4 0)
            findDuration (Seq.fromList [sp0,sp1,sp2,sp3,sp4,sp5,sp6,sp7]) 0 `shouldBe` Just (UnixDiffTime 6 0)
            findDuration (Seq.fromList [sp0,sp1,sp2,sp3,sp4,sp5,sp6,sp7]) 3 `shouldBe` Just (UnixDiffTime 2 0)
            findDuration (Seq.fromList [sp0,sp1,sp2,sp3,sp4,sp5,sp6,sp7,sp8,sp9,sp10]) 2 `shouldBe` Just (UnixDiffTime 5 0)
            findDuration (Seq.fromList [sp0,sp1,sp2,sp3,sp4,sp5,sp6,sp7,sp8,sp9]) 0 `shouldBe` Just (UnixDiffTime 6 0)
            findDuration (Seq.fromList [sp0,sp1,sp2,sp3,sp4,sp5,sp6,sp7,sp8,sp9,sp10]) 0 `shouldBe` Just (UnixDiffTime 9 0)
            findDuration (Seq.fromList [sp0,sp1,sp2,sp3,sp4,sp5,sp6,sp7,sp8,sp9,sp10,sp20,sp21]) 0 `shouldBe` Just (UnixDiffTime 22 0)
            findDuration (Seq.fromList [sp0,sp1,sp2,sp3,sp4,sp5,sp6,sp7,sp8,sp9,sp10,sp20,sp21,sp30,sp31,sp32,sp33]) 0 `shouldBe` Just (UnixDiffTime 29 0)

sp0,sp1,sp2,sp3,sp4,sp5,sp6,sp7,sp8,sp9,sp10,sp20,sp21,sp30,sp31,sp32,sp33 :: SentPacket
sp0  = sp  0 False $ UnixTime  0 0
sp1  = sp  1 True  $ UnixTime  1 0
sp2  = sp  2 False $ UnixTime  2 0
sp3  = sp  3 False $ UnixTime  3 0
sp4  = sp  4 False $ UnixTime  4 0
sp5  = sp  5 True  $ UnixTime  5 0
sp6  = sp  6 False $ UnixTime  6 0
sp7  = sp  7 True  $ UnixTime  7 0
sp8  = sp  8 False $ UnixTime  8 0
sp9  = sp  9 False $ UnixTime  9 0
sp10 = sp 10 True  $ UnixTime 10 0
sp20 = sp 20 True  $ UnixTime 22 0
sp21 = sp 21 True  $ UnixTime 44 0
sp30 = sp 30 False $ UnixTime 50 0
sp31 = sp 31 True  $ UnixTime 51 0
sp32 = sp 32 False $ UnixTime 55 0
sp33 = sp 33 True  $ UnixTime 80 0

sp :: PacketNumber -> Bool -> TimeMicrosecond -> SentPacket
sp mypn ackeli tm = spkt { spTimeSent = tm }
  where
    ppkt = PlainPacket (Short $ toCID "") (Plain (Flags 0) 0 [] 0)
    spkt = mkSentPacket mypn InitialLevel ppkt emptyPeerPacketNumbers ackeli