hans-2.4.0.0: tests/Udp/Packet.hs
module Udp.Packet where
import Hans.Message.Udp
(UdpHeader(..),UdpPort(..),parseUdpHeader,renderUdpHeader)
import Control.Applicative ((<$>),(<*>))
import Data.Serialize (runGet,runPut)
import System.Random (Random)
import Test.Framework (Test,testGroup)
import Test.Framework.Providers.QuickCheck2 (testProperty)
import Test.QuickCheck (Gen,forAll,arbitraryBoundedRandom,arbitrary,choose)
import Test.QuickCheck.Property (Result(..),failed,succeeded)
-- Utilities -------------------------------------------------------------------
arbitraryUdpPacketSize :: (Random a, Num a) => Gen a
arbitraryUdpPacketSize = choose (0,65535 - 8)
arbitraryUdpPort :: Gen UdpPort
arbitraryUdpPort = UdpPort <$> arbitraryBoundedRandom
arbitraryUdpHeader :: Gen UdpHeader
arbitraryUdpHeader = UdpHeader
<$> arbitraryUdpPort
<*> arbitraryUdpPort
<*> arbitraryBoundedRandom -- not necessarily right
-- Properties ------------------------------------------------------------------
udpPacketTests :: Test
udpPacketTests = testGroup "packet parsing"
[ testProperty "prop_headerRoundTrip" prop_headerRoundTrip
]
prop_headerRoundTrip = forAll packet $ \ (len,hdr) ->
case runGet parseUdpHeader (runPut (renderUdpHeader hdr len)) of
Right (hdr',len') | hdr == hdr' && len == len' -> succeeded
| otherwise -> failed
Left err -> failed { reason = err }
where
packet = (,) <$> arbitraryUdpPacketSize <*> arbitraryUdpHeader