packages feed

vpn-router-0.0.1: test/VpnRouter/Test/Net.hs

module VpnRouter.Test.Net where

import Test.Tasty ( TestTree, testGroup )
import Test.Tasty.HUnit ( assertEqual, testCase, (@?=) )
import VpnRouter.Net.Iptables ( parseIptablesLine )
import VpnRouter.Net.IpTool
    ( mainRoutingTableName,
      parseDefaultRoutingLine,
      parseRoutingTableMarkLine )
import VpnRouter.Net.Types
    ( parseIpV4,
      ClientAdr(ClientAdr),
      HostIp(HostIp),
      LineNumber(LineNumber),
      PacketMark(PacketMark),
      RoutingTableId(RoutingTableId),
      RuleId(RuleId) )
import VpnRouter.Prelude
    ( ($), Maybe(Just, Nothing), IO, Tagged(Tagged) )

unit_parseIpV4 :: IO ()
unit_parseIpV4 = do
  assertEqual "4 zeros" (Just $ HostIp 0x0) (parseIpV4 "0.0.0.0")
  assertEqual "all 255" (Just $ HostIp 0xff_ff_ff_ff) (parseIpV4 "255.255.255.255")

test_line_parsers :: TestTree
test_line_parsers =
  testGroup "line parsers"
  [ testCase "parseIptablesLine"
    $ parseIptablesLine iptl @?= Just (LineNumber 1, PacketMark 2, ClientAdr $ HostIp 0x10_01_00_FE)
  , testGroup "parseDefaultRoutingLine"
    [ testCase "table match"
      $ parseDefaultRoutingLine rt3 rt3l @?= Just (Tagged $ HostIp 0x01_01_01_01, Tagged "wlp2s0")
    , testCase "table don't match" $ parseDefaultRoutingLine rt3 rt33l @?= Nothing
    , testCase "main table match"
      $ parseDefaultRoutingLine mainRoutingTableName mtl
      @?= Just (Tagged $ HostIp 0x01_01_01_01, Tagged "wlp2s0")
    ]
  , testGroup "ip rules"
    [ testCase "ok"
      $ parseRoutingTableMarkLine ruleL @?= Just (RuleId 32765, PacketMark 2)
    ]
  ]
  where
    ruleL = "32765:\tfrom all fwmark 0x2 lookup 7"
    iptl = "1   MARK       all  --  254.0.1.16        0.0.0.0/0            MARK set 0x2"
    rt3l = "default via 1.1.1.1 dev wlp2s0 table 3"
    rt33l = "default via 1.1.1.1 dev wlp2s0 table 33"
    mtl = "default via 1.1.1.1 dev wlp2s0 ee"
    rt3 = RoutingTableId 3