{-# LANGUAGE OverloadedStrings #-} import Test.Tasty import Test.Tasty.HUnit import Dhcp.Lease import Data.Monoid import qualified Data.List as L import qualified Data.ByteString as B import qualified Net.IPv4 as IPv4 import qualified Net.Mac as Mac import qualified Chronos.Datetime as DT import qualified Chronos.Posix as PX import qualified Data.Attoparsec.ByteString as AB main :: IO () main = defaultMain tests tests :: TestTree tests = testGroup "Tests" [unitTests] unitTests :: TestTree unitTests = testGroup "Unit tests" [ testCase "000" $ oneLease "sample/000.txt" $ Lease (IPv4.fromOctets 10 160 23 253) [ ValueStarts $ PX.fromDatetime $ DT.fromYmdhms 2016 1 11 18 31 21 , ValueEnds $ PX.fromDatetime $ DT.fromYmdhms 2016 02 08 18 38 1 , ValueTstp $ PX.fromDatetime $ DT.fromYmdhms 2016 02 08 18 38 1 , ValueBindingState BindingStateFree , ValueHardware $ Hardware "ethernet" $ Mac.fromOctets 0x00 0x02 0x80 0x05 0x3E 0x9A ] , testCase "001" $ oneLease "sample/001.txt" $ Lease (IPv4.fromOctets 10 152 33 140) [ ValueStarts $ PX.fromDatetime $ DT.fromYmdhms 2017 5 18 14 05 18 , ValueEnds $ PX.fromDatetime $ DT.fromYmdhms 2017 06 15 14 11 58 , ValueBindingState BindingStateActive , ValueNextBindingState BindingStateFree , ValueHardware $ Hardware "ethernet" $ Mac.fromOctets 0x00 0x02 0x80 0x04 0x30 0x63 , ValueUid $ "\o001\o000\o002\o200\o004" <> "0c" , ValueClientHostname "000280043063" ] , testCase "002" $ oneLease "sample/002.txt" $ Lease (IPv4.fromOctets 10 102 18 226) [ ValueStarts $ PX.fromDatetime $ DT.fromYmdhms 2017 5 18 5 40 43 , ValueEnds $ PX.fromDatetime $ DT.fromYmdhms 2017 05 19 0 40 43 , ValueBindingState BindingStateActive , ValueNextBindingState BindingStateFree , ValueHardware $ Hardware "ethernet" $ Mac.fromOctets 0x00 0x02 0xA1 0x23 0x03 0x80 , ValueUid "\o001\o000\o002\o241#\o003\o200" ] , testCase "003" $ manyLeases "sample/003.txt" 3 ] oneLease :: String -> Lease -> Assertion oneLease filename expected = do bs <- B.readFile filename case AB.parseOnly (parserLease <* AB.endOfInput) bs of Left err -> fail ("parse failed with: " ++ err) Right actual -> assertEqual "Lease Equality" (LeaseWrap expected) (LeaseWrap actual) manyLeases :: String -- ^ Filename -> Int -- ^ expected number of leases -> Assertion manyLeases filename expectedLen = do bs <- B.readFile filename case AB.parseOnly (parserLeases <* AB.endOfInput) bs of Left err -> fail ("parse failed with: " ++ err) Right actual -> assertEqual "Lease List Length Equality" expectedLen (L.length actual) newtype LeaseWrap = LeaseWrap Lease deriving (Show) instance Eq LeaseWrap where LeaseWrap a == LeaseWrap b = leaseEq a b leaseEq :: Lease -> Lease -> Bool leaseEq (Lease ipA valsA) (Lease ipB valsB) = ipA == ipB && L.sort valsA == L.sort valsB