packages feed

hans-3.0.2: tests/Tests/IP4/Icmp4.hs

module Tests.IP4.Icmp4 where

import Tests.IP4.Packet (arbitraryIP4)
import Tests.Utils

import Hans.IP4.Icmp4

import qualified Data.ByteString as S
import           Test.Tasty (TestTree,testGroup)
import           Test.Tasty.QuickCheck (testProperty)
import           Test.QuickCheck
                     (Gen,oneof,arbitraryBoundedRandom,elements,listOf,listOf1
                     ,vectorOf)


-- Packet Generation -----------------------------------------------------------

arbitraryIcmp4Packet :: Gen Icmp4Packet
arbitraryIcmp4Packet  = oneof
  [ do a <- arbitraryIdentifier
       b <- arbitrarySequenceNumber
       c <- arbitraryEchoPayload
       return $! EchoReply a b c

  , do a <- arbitraryDestinationUnreachableCode
       b <- arbitraryPayload
       return $! DestinationUnreachable a b

  , do a <- arbitraryPayload
       return $! SourceQuench a

  , do a <- arbitraryRedirectCode
       b <- arbitraryIP4
       c <- arbitraryPayload
       return $! Redirect a b c

  , do a <- arbitraryIdentifier
       b <- arbitrarySequenceNumber
       c <- arbitraryEchoPayload
       return $! Echo a b c

  , do a <- arbitraryBoundedRandom
       b <- listOf1 arbitraryRouterAddress
       return $! RouterAdvertisement a b

  , return RouterSolicitation

  , do a <- arbitraryTimeExceededCode
       b <- arbitraryPayload
       return $! TimeExceeded a b

  , do a <- arbitraryBoundedRandom
       b <- arbitraryPayload
       return $! ParameterProblem a b

  , do a <- arbitraryIdentifier
       b <- arbitrarySequenceNumber
       c <- arbitraryBoundedRandom
       d <- arbitraryBoundedRandom
       e <- arbitraryBoundedRandom
       return $! Timestamp a b c d e

  , do a <- arbitraryIdentifier
       b <- arbitrarySequenceNumber
       c <- arbitraryBoundedRandom
       d <- arbitraryBoundedRandom
       e <- arbitraryBoundedRandom
       return $! TimestampReply a b c d e

  , do a <- arbitraryIdentifier
       b <- arbitrarySequenceNumber
       return $! Information a b

  , do a <- arbitraryIdentifier
       b <- arbitrarySequenceNumber
       return $! InformationReply a b

  , do a <- arbitraryTraceRouteCode
       b <- arbitraryIdentifier
       c <- arbitraryBoundedRandom
       d <- arbitraryBoundedRandom
       e <- arbitraryBoundedRandom
       f <- arbitraryBoundedRandom
       return $! TraceRoute a b c d e f

  , do a <- arbitraryIdentifier
       b <- arbitrarySequenceNumber
       return $! AddressMask a b

  , do a <- arbitraryIdentifier
       b <- arbitrarySequenceNumber
       c <- arbitraryBoundedRandom
       return $! AddressMaskReply a b c
  ]

arbitraryIdentifier :: Gen Identifier
arbitraryIdentifier  = arbitraryBoundedRandom

arbitrarySequenceNumber :: Gen SequenceNumber
arbitrarySequenceNumber  = arbitraryBoundedRandom

arbitraryEchoPayload :: Gen S.ByteString
arbitraryEchoPayload  =
  do bytes <- listOf arbitraryBoundedRandom
     return $! S.pack bytes

arbitraryPayload :: Gen S.ByteString
arbitraryPayload  =
  do bytes <- vectorOf 28 arbitraryBoundedRandom
     return $! S.pack bytes

arbitraryDestinationUnreachableCode :: Gen DestinationUnreachableCode
arbitraryDestinationUnreachableCode  = elements
  [ NetUnreachable
  , HostUnreachable
  , ProtocolUnreachable
  , PortUnreachable
  , FragmentationUnreachable
  , SourceRouteFailed
  , DestinationNetworkUnknown
  , DestinationHostUnknown
  , SourceHostIsolatedError
  , AdministrativelyProhibited
  , HostAdministrativelyProhibited
  , NetworkUnreachableForTOS
  , HostUnreachableForTOS
  , CommunicationAdministrativelyProhibited
  , HostPrecedenceViolation
  , PrecedenceCutoffInEffect
  ]

arbitraryRedirectCode :: Gen RedirectCode
arbitraryRedirectCode  = elements
  [ RedirectForNetwork
  , RedirectForHost
  , RedirectForTypeOfServiceAndNetwork
  , RedirectForTypeOfServiceAndHost
  ]

arbitraryRouterAddress :: Gen RouterAddress
arbitraryRouterAddress  =
  do a <- arbitraryIP4
     b <- arbitraryPreferenceLevel
     return $! RouterAddress a b

arbitraryPreferenceLevel :: Gen PreferenceLevel
arbitraryPreferenceLevel  = arbitraryBoundedRandom

arbitraryTimeExceededCode :: Gen TimeExceededCode
arbitraryTimeExceededCode  = elements
  [ TimeToLiveExceededInTransit
  , FragmentReassemblyTimeExceeded
  ]

arbitraryTraceRouteCode :: Gen TraceRouteCode
arbitraryTraceRouteCode  = elements
  [ TraceRouteForwarded
  , TraceRouteDiscarded
  ]

-- Packet Tests ----------------------------------------------------------------

icmp4Tests :: TestTree
icmp4Tests  = testGroup "Icmp4"
  [ testProperty "Packet encode/decode" $
    encodeDecodeIdentity putIcmp4Packet getIcmp4Packet arbitraryIcmp4Packet
  ]