packages feed

mptcpanalyzer-0.0.2.0: tests/Net/Tcp/StatsSpec.hs

{-# LANGUAGE ScopedTypeVariables #-}
{-
Module:  StatsSpec
Description :  Description
Maintainer  : matt
Portability : Linux

Load a pcap in chunks and check that it produces the same result
-}
module Net.Tcp.StatsSpec (
  spec
) where
import Frames.Exploration
-- import MptcpAnalyzer.Loader
import MptcpAnalyzer.Pcap
import Test.Hspec
-- import Test.QuickCheck hiding (Success)

-- import Data.Either (fromRight)
-- import Frames
import MptcpAnalyzer.ArtificialFields
-- import MptcpAnalyzer.Cache
-- import MptcpAnalyzer.Stream
import MptcpAnalyzer.Types
import Net.Tcp
import Net.Tcp.Stats
-- import Polysemy (Final, Members, Sem, runFinal)
-- import qualified Polysemy as P
-- import qualified Polysemy.Embed as P
-- import qualified Polysemy.IO as P
-- import qualified Polysemy.Internal as P
-- import Polysemy.Log (Log)
-- import qualified Polysemy.Log as Log
-- import Polysemy.Log.Colog (interpretLogStdout)
-- import qualified Polysemy.State as P
-- import qualified Polysemy.Trace as P
-- import Tshark.Main (defaultTsharkPrefs)
import Utils
import Data.Foldable (foldl')
import Net.Stream

-- cacheConfig :: CacheConfig
-- cacheConfig = CacheConfig {
--   cacheFolder = "/tmp"
--   , cacheEnabled = False
-- }

expectedForwardStats, expectedForwardStats0, expectedForwardStats1 :: TcpUnidirectionalStats
expectedBackwardStats, expectedBackwardStats0, expectedForwardStatsTotal01  :: TcpUnidirectionalStats
expectedForwardStats = mempty
expectedBackwardStats = mempty
expectedForwardStats0 = TcpUnidirectionalStats {tusNrPackets = 16, tusStartTime = 0.0, tusEndTime = 45.831181697, tusMinSeq = 0, tusSndUna = 457, tusSndNext = 457, tusReinjectedBytes = 0}
expectedForwardStats1 = mempty
expectedBackwardStats0 = TcpUnidirectionalStats {tusNrPackets = 13, tusStartTime = 0.184116349, tusEndTime = 45.842675096, tusMinSeq = 0, tusSndUna = 309, tusSndNext = 309, tusReinjectedBytes = 0}
expectedForwardStatsTotal01 = mempty

-- TcpUnidirectionalStats {
--       tusStartPacketId = 0 -- (frameRow frame 0) ^. packetId
--       , tusEndPacketId = 0 -- (frameRow frame (frameLength frame - 1)) ^. packetId
--       , tusNrPackets = frameLength frame
--       , tusStartTime = minTime
--       , tusEndTime = maxTime
--       -- TODO fill it
--       , tusMinSeq = minSeq

--       -- TODO should be max of seen acks
--       , tusSndUna = maxSeqRow ^. tcpSeq + fromIntegral ( maxSeqRow ^. tcpLen) :: Word32
--       , tusSndNext = maxSeqRow ^. tcpSeq + fromIntegral ( maxSeqRow ^. tcpLen ) :: Word32
--       , tusReinjectedBytes = 0
--   }

-- loadAFrame :: IO (FrameFiltered TcpConnection Packet)
-- loadAFrame = do

--   aframe <- P.runM
--     $ interpretLogStdout
--     $ runCache cacheConfig
--       runTests
--   return aframe
--   putStrLn "finished"




-- runTests :: (Members '[P.Embed IO, Log , Cache] r) => Sem r (FrameFiltered TcpConnection Packet)
-- runTests = do
--   -- :: Either String (Frame Packet)
--   frame1 <- loadPcapIntoFrame defaultTsharkPrefs "examples/client_2_cleaned.pcapng"

--   (aframe :: FrameFiltered TcpConnection Packet) <- case buildFrameFromStreamId (fromRight (error "should not happen") frame1) (StreamId 0) of
--     Left err -> error err
--     Right aframe -> return aframe

--   return aframe

  -- TODO run hspec and check FrameLength is the same ?
  -- check stats over the whole file
  -- P.embed $ hspec $


expectedStats :: TcpUnidirectionalStats
-- expectedStats = mempty
expectedStats = TcpUnidirectionalStats {tusNrPackets = 13, tusStartTime = 0.0, tusEndTime = 45.842675096, tusMinSeq = 0, tusSndUna = 0, tusSndNext = 0, tusReinjectedBytes = 0}

splitAFrame :: FrameFiltered TcpConnection Packet -> Int -> [FrameFiltered TcpConnection Packet]
splitAFrame aframe chunkSize  =
  -- takeRows / dropRow
  go aframe []
  where
    go aframe' acc = if aframeLength aframe' < chunkSize then
        acc ++ [aframe']
      else
        go (FrameTcp (ffCon aframe') (dropRows chunkSize $ ffFrame aframe'))
           acc ++ [(FrameTcp (ffCon aframe') (takeRows chunkSize $ ffFrame aframe'))]



-- beforeWith (loadAFrame) $
-- before loadAFrame $ describ
spec :: Spec
spec = before (loadAFrame "examples/client_2_cleaned.pcapng" (StreamId 0)) $
      describe "Checking stats" $ do
        it "Check generated forward stats" $ \aframe ->
          getTcpStatsFromAFrame (addTcpDestinationsToAFrame aframe) RoleServer `shouldBe` expectedForwardStats0
        it "Check generated backwards stats" $ \aframe ->
          getTcpStatsFromAFrame (addTcpDestinationsToAFrame aframe) RoleClient `shouldBe` expectedBackwardStats0

        it "Processing stats in chunks equal processing the full batch" $ \aframe -> let 
            chunks = splitAFrame aframe 2
          in
            foldl' (\origStats newAframe -> origStats <> getTcpStatsFromAFrame (addTcpDestinationsToAFrame newAframe) RoleClient ) mempty chunks `shouldBe` expectedStats

        -- it "Checking two crafted stats" $ \aframe -> let 

  -- it "Test append of stats" $
  --     expectedForwardStats0head <> expectedForwardStats0tail `shouldBe` expectedForwardStats0
  -- pendingWith "test"