packages feed

dnsbase-1.0.0.0: bench/bench.hs

{-# LANGUAGE
    OverloadedLists
  , OverloadedStrings
  , RecordWildCards
  , TemplateHaskell
  #-}
module Main (main) where

import qualified Data.ByteString as B
import qualified Data.ByteString.Short as SB
import Data.ByteString.Short (ShortByteString)
import Data.Coerce (coerce)
import Data.Either (fromRight)
import Data.Word (Word8)

import Net.DNSBase

import Test.Tasty.Bench

main :: IO ()
main = defaultMain
    [ bench "towire"       $ whnf makeDomain8 pdom
    , bench "fromwire"     $ whnf presentStrict ldom
    , bench "enc question" $ whnf encodeQuestion question
    , bench "enc answer"   $ whnf encodeAnswer answer
    , bench "compress"     $ whnf encodeDomains dlist
    ]
  where
    bs = B.pack $ map i2w [17..36]
    i2w :: Int -> Word8
    i2w i = fromIntegral $ i*i

    pdom = "12345.example.com"
    ldom = $$(dnLit8 "12345.example.com")

    question = DnsTriple $$(dnLit8 "example.com") MX IN
    encodeQuestion = fromRight B.empty . enc
      where
        enc :: DnsTriple -> Either (EncodeErr (Maybe RData)) B.ByteString
        enc q = encodeVerbatim $ putRequest 0xbeef (RDflag <> ADflag) (Just defaultEDNS) q

    zone = $$(dnLit8 "example.com")

    hash :: ShortByteString
    hash = coerce @Bytes16 "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b"
    pkey, psig :: ShortByteString
    pkey = coerce @Bytes64 "4xQugTVSY2+Xu6J390EnCLmGKAtoR+7h5J9kJa0H/N5W4p8P43aSX4y67OqH4wiW/QD4tKrv0YbdeO6ynhKoTQ=="
    psig = coerce @Bytes64 "EIJK5j86gvtYU90Cb3jbIa+xH8lntJoG8bgG6dkgCu/VY2XenqCi8VHUfq0tjW2hlQmfbYj3c6V9T0g0RQlFH1hHeH/J4gxqzyJZU+EsxxD9fzOYjuHmEmJBE15QD/YQ8mU5K64SVOYs7F+BcFcduwyKWIPkwwOSKK0Y04/mhTvHn9HAjD0J0vfPTDfZs748IKOOvH7RAp5ryAImSn8S4g6wQaFdxgHhzNUT0TNbDFrTBYDheFHbJcNS+8Yy+9pBqwshb3aDjWzQ9i1JoSfXXWNu4n1j6jGOOcflhYBU10NcZn+VDz6tsKqrt3JlTtIjHUVgp3pQhLpJGA5RbJ+IrA=="

    fakesha12 :: ShortByteString
    fakesha12 = SB.pack [1..20]

    mkRD :: KnownRData a => Domain -> a -> RR
    mkRD d a = RR d IN 300 $ RData a

    txt1, txt2, txt3, txt4, txt5, txt6 :: RR;
    txt1 = mkRD $$(dnLit8 "example.nl") $ T_TXT
                $ "offset" :| [" 0"]
    txt2 = mkRD $$(dnLit8 "example.nl") $ T_TXT
                $ "pointer to offset 0" :| []
    txt3 = mkRD $$(dnLit8 "www.example.nl") $ T_TXT
                $ "www -> offset 0" :| []
    txt4 = mkRD $$(dnLit8 "example.dk") $ T_TXT
                $ "new ccTLD" :| []
    txt5 = mkRD $$(dnLit8 "example.dk") $ T_TXT
                $ "pointer to dk ccTLD" :| []
    txt6 = mkRD $$(dnLit8 "www.example.dk") $ T_TXT
                $ "www -> dk ccTLD" :| []

    addr1, addr2 :: RR
    addr1 = mkRD $$(dnLit8 "addr1.example.se") $ T_A "192.0.2.1"
    addr2 = mkRD $$(dnLit8 "www.example.se")   $ T_AAAA "2001:db8::dead:beef"

    cname, dname, ptr :: RR
    cname = mkRD $$(dnLit8 "cname.example.se")
        $ T_CNAME $$(dnLit8 "cname.example")
    dname = mkRD $$(dnLit8 "_tcp.a.example.se")
        $ T_DNAME $$(dnLit8 "_tlsa.name")
    ptr   = mkRD $$(dnLit8 "10.in-addr.arpa")
        $ T_PTR $$(dnLit8 "ptr")

    ds, cds, key, cky, sig :: RR
    ds  = mkRD $$(dnLit8 "ds.example.dk")
        $ T_DS  12345 13 2 hash
    cds = mkRD $$(dnLit8 "cds.example.dk")
        $ T_CDS 12345 13 2 hash
    key = mkRD $$(dnLit8 "dnskey.example.se")
        $ T_DNSKEY  256 3 13 pkey
    cky = mkRD $$(dnLit8 "cdnskey.example.se")
        $ T_CDNSKEY 256 3 13 pkey
    sig = mkRD $$(dnLit8 "rrsig.example.nl")
        $ T_RRSIG SOA 8 1 172800 1582491183 1581333041 40264 $$(dnLit8 "example.nl") psig

    nsec, nsec3, nsec3p :: RR
    nsec = mkRD $$(dnLit8 "nsec.example.dk")
        $ T_NSEC $$(dnLit8 "example.dk")
          [SOA, DNSKEY, NS, RRSIG, MX, NSEC, TXT]
    nsec3 = mkRD $$(dnLit8 "nsec3.example.dk")
        $ T_NSEC3 N3_SHA1 0 0 "" fakesha12
          [SOA, DNSKEY, NS, RRSIG, MX, NSEC, TXT]
    nsec3p = mkRD $$(dnLit8 "nsec3param.example.dk")
        $ T_NSEC3PARAM N3_SHA1 1 0 ""

    ns, soa :: RR
    ns  = mkRD $$(dnLit8 "example.nl")
        $ T_NS $$(dnLit8 "ns1.example.nl")
    soa = mkRD $$(dnLit8 "example.nl") $ T_SOA
               $$(dnLit8 "ns1.example.nl")
               $$(mbLit8 "hostmaster@example.nl") 1 3600 300 (7 * 86400) 300

    opaque :: RR
    opaque = RR $$(dnLit8 "whatami.example") IN 300
        $ opaqueRData 1 "c0000201"

    mx, srv, afs :: RR
    mx  = mkRD $$(dnLit8 "ietf.org")
        $ T_MX 10 $$(dnLit8 "mail.ietf.org")
    srv = mkRD $$(dnLit8 "ietf.org")
        $ T_SRV 100 0 389 $$(dnLit8 "ldap.ietf.org")
    afs = mkRD $$(dnLit8 "athena.mit.edu")
        $ T_AFSDB 1 $$(dnLit8 "afsdb.athena.mit.edu")

    tlsa :: RR
    tlsa = mkRD $$(dnLit8 "_25._tcp.mail.ietf.org")
        $ T_TLSA 3 1 1 hash

    answer = mkAnswer zone MX NOERROR (RDflag <> RAflag <> ADflag) (Just defaultEDNS)
        [ txt1, txt2, txt3, txt4, txt5, txt6
        , addr1, addr2, cname, ptr, ns, dname
        , ds, cds, key, cky, sig, nsec, nsec3, nsec3p
        , soa, opaque, mx, srv, afs, tlsa ]

    mkAnswer qname qtype rc fl edns an = DNSMessage{..}
      where
        dnsMsgId = 0xbeef
        dnsMsgOp = Query
        dnsMsgRC = rc
        dnsMsgFl = fl
        dnsMsgEx = edns
        dnsMsgQu = [DnsTriple qname qtype IN]
        dnsMsgAn = an
        dnsMsgNs = []
        dnsMsgAr = []

    encodeAnswer :: DNSMessage -> B.ByteString
    encodeAnswer   = fromRight B.empty . enc
      where
        enc :: DNSMessage -> Either (EncodeErr (Maybe RData)) B.ByteString
        enc msg = encodeCompressed $ putMessage msg

    dlist = [zone, zone, mx1, zone, mx2, mx1, mx2]
      where
        mx1 = $$(dnLit8 "mx1.example.com")
        mx2 = $$(dnLit8 "mx2.example.com")

    encodeDomains :: [Domain] -> B.ByteString
    encodeDomains = fromRight B.empty . enc
      where
        enc :: [Domain] -> Either (EncodeErr (Maybe ())) B.ByteString
        enc doms = encodeCompressed $ mapM_ putDomain doms