hans-2.4.0.0: tests/IP4/Packet.hs
module IP4.Packet where
import IP4.Addr
import Utils
import Hans.Message.Ip4
import Control.Applicative ((<$>))
import Data.Word (Word16)
import System.Random ()
import Test.Framework (Test,testGroup)
import Test.Framework.Providers.QuickCheck2 (testProperty)
import Test.QuickCheck (Gen,arbitrary,arbitraryBoundedRandom,choose,forAll)
-- Packet Generation -----------------------------------------------------------
arbitraryIP4Header :: Gen IP4Header
arbitraryIP4Header = do
tos <- arbitraryBoundedRandom
ident <- arbitraryIdent
df <- arbitrary
mf <- arbitrary
off <- arbitraryFragmentOffset
ttl <- arbitraryBoundedRandom
prot <- arbitraryIP4Protocol
src <- arbitraryIP4
dst <- arbitraryIP4
return emptyIP4Header
{ ip4TypeOfService = tos
, ip4DontFragment = df
, ip4MoreFragments = mf
, ip4FragmentOffset = off
, ip4TimeToLive = ttl
, ip4Protocol = prot
, ip4SourceAddr = src
, ip4DestAddr = dst
}
arbitraryIdent :: Gen Ident
arbitraryIdent = Ident <$> arbitraryBoundedRandom
arbitraryFragmentOffset :: Gen Word16
arbitraryFragmentOffset = (8*) <$> choose (0,0x1fff)
arbitraryIP4Protocol :: Gen IP4Protocol
arbitraryIP4Protocol = IP4Protocol <$> arbitraryBoundedRandom
arbitraryIP4PacketLen :: Gen Int
arbitraryIP4PacketLen = choose (0,65535 - 20)
-- Packet Tests ----------------------------------------------------------------
ip4PacketTests :: Test
ip4PacketTests = testGroup "packet parsing"
[ testProperty "prop_headerRoundTrip" prop_headerRoundTrip
]
prop_headerRoundTrip = forAll arbitraryIP4PacketLen $ \ pktLen ->
let parse = do
(hdr,_,_) <- getIP4Packet
return hdr
render hdr = putIP4Header hdr pktLen
in roundTrip arbitraryIP4Header parse render