packages feed

sockaddr-0.1.0: test/Spec.hs

module Main (main) where

import Data.Word (Word16, Word8)
import Network.SockAddr
import Network.Socket
import Test.Hspec

v4 :: (Word8, Word8, Word8, Word8) -> SockAddr
v4 t = SockAddrInet 80 (tupleToHostAddress t)

v6 :: (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16) -> SockAddr
v6 t = SockAddrInet6 80 0 (tupleToHostAddress6 t) 0

main :: IO ()
main = hspec $ do
    describe "showSockAddr" $ do
        it "shows IPv4" $ do
            showSockAddr (v4 (127, 0, 0, 1)) `shouldBe` "127.0.0.1"
            showSockAddr (v4 (192, 0, 2, 255)) `shouldBe` "192.0.2.255"
        it "shows IPv4-mapped IPv6 as IPv4" $
            showSockAddr (v6 (0, 0, 0, 0, 0, 0xffff, 0xc000, 0x0201))
                `shouldBe` "192.0.2.1"
        it "shows IPv6 loopback" $
            showSockAddr (v6 (0, 0, 0, 0, 0, 0, 0, 1)) `shouldBe` "::1"
        it "shows IPv6" $
            showSockAddr (v6 (0x2001, 0xdb8, 1, 2, 3, 4, 5, 6))
                `shouldBe` "2001:db8:1:2:3:4:5:6"
        it "compresses zeros (RFC 5952)" $ do
            showSockAddr (v6 (0, 0, 0, 0, 0, 0, 0, 0)) `shouldBe` "::"
            showSockAddr (v6 (0xfe80, 0, 0, 0, 0, 0, 0, 1)) `shouldBe` "fe80::1"
            showSockAddr (v6 (0x2001, 0xdb8, 0, 0, 0, 0, 0, 0)) `shouldBe` "2001:db8::"
            showSockAddr (v6 (0x2001, 0xdb8, 0, 1, 1, 1, 1, 1)) `shouldBe` "2001:db8:0:1:1:1:1:1"
            showSockAddr (v6 (0x2001, 0, 0, 1, 0, 0, 0, 1)) `shouldBe` "2001:0:0:1::1"
            showSockAddr (v6 (0x2001, 0xdb8, 0, 0, 1, 0, 0, 1)) `shouldBe` "2001:db8::1:0:0:1"
            showSockAddr (v6 (0x2001, 0xdb8, 0xABCD, 0, 0, 0, 0, 1)) `shouldBe` "2001:db8:abcd::1"
        it "appends non-zero scope ID" $
            showSockAddr (SockAddrInet6 80 0 (tupleToHostAddress6 (0xfe80, 0, 0, 0, 0, 0, 0, 0x1234)) 4)
                `shouldBe` "fe80::1234%4"
        it "does not expose Unix domain socket path" $
            showSockAddr (SockAddrUnix "/tmp/sock") `shouldBe` "unknownSocket"
    describe "showSockAddrBS" $ do
        it "agrees with showSockAddr" $
            showSockAddrBS (v4 (192, 0, 2, 1)) `shouldBe` "192.0.2.1"
        it "does not expose Unix domain socket path" $
            showSockAddrBS (SockAddrUnix "/tmp/sock") `shouldBe` "unknownSocket"