X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=haskell-dns.git;a=blobdiff_plain;f=DNSUnitTest.hs;h=a77b049a40343cab60e89dbbc1f4170f7fbe229e;hp=07d3adff52fdbe6a28ecf3ab62482a35c495b602;hb=HEAD;hpb=86893ea772a5628f813bc83ff4f36327a8d13842 diff --git a/DNSUnitTest.hs b/DNSUnitTest.hs index 07d3adf..a77b049 100644 --- a/DNSUnitTest.hs +++ b/DNSUnitTest.hs @@ -2,106 +2,215 @@ import Data.Binary import qualified Data.ByteString.Lazy as LBS import Data.Word import Network.DNS.Message -import Network.Socket -import System.IO.Unsafe +import Network.Socket.IsString () import Test.HUnit -parseMsg :: [Word8] -> Message -parseMsg = decode . LBS.pack - - -testData :: [Test] -testData = [ (parseMsg [ 0x22, 0x79, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00 - , 0x00, 0x00, 0x00, 0x00, 0x04, 0x6D, 0x61, 0x69 - , 0x6C, 0x0A, 0x63, 0x69, 0x65, 0x6C, 0x6F, 0x6E - , 0x65, 0x67, 0x72, 0x6F, 0x03, 0x6F, 0x72, 0x67 - , 0x00, 0x00, 0x05, 0x00, 0x01 - ] - ~?= - Message { - msgHeader = Header { - hdMessageID = 8825 - , hdMessageType = Query - , hdOpcode = StandardQuery - , hdIsAuthoritativeAnswer = False - , hdIsTruncated = False - , hdIsRecursionDesired = True - , hdIsRecursionAvailable = False - , hdResponseCode = NoError - } - , msgQuestions = [ Question { - qName = mkDomainName "mail.cielonegro.org." - , qType = wrapQueryType CNAME - , qClass = IN - } - ] - , msgAnswers = [] - , msgAuthorities = [] - , msgAdditionals = [] - } +messages :: [([Word8], Message)] +messages = [ ( [ 0x22, 0x79, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00 + , 0x00, 0x00, 0x00, 0x00, 0x04, 0x6D, 0x61, 0x69 + , 0x6C, 0x0A, 0x63, 0x69, 0x65, 0x6C, 0x6F, 0x6E + , 0x65, 0x67, 0x72, 0x6F, 0x03, 0x6F, 0x72, 0x67 + , 0x00, 0x00, 0x05, 0x00, 0x01 + ] + , Message { + msgHeader = Header { + hdMessageID = 8825 + , hdMessageType = Query + , hdOpcode = StandardQuery + , hdIsAuthoritativeAnswer = False + , hdIsTruncated = False + , hdIsRecursionDesired = True + , hdIsRecursionAvailable = False + , hdResponseCode = NoError + } + , msgQuestions = [ wrapQuestion $ + Question { + qName = "mail.cielonegro.org." + , qType = CNAME + , qClass = IN + } + ] + , msgAnswers = [] + , msgAuthorities = [] + , msgAdditionals = [] + } + ) + , ( [ 0x22, 0x79, 0x85, 0x00, 0x00, 0x01, 0x00, 0x01 + , 0x00, 0x01, 0x00, 0x01, 0x04, 0x6D, 0x61, 0x69 + , 0x6C, 0x0A, 0x63, 0x69, 0x65, 0x6C, 0x6F, 0x6E + , 0x65, 0x67, 0x72, 0x6F, 0x03, 0x6F, 0x72, 0x67 + , 0x00, 0x00, 0x05, 0x00, 0x01, 0xC0, 0x0C, 0x00 + , 0x05, 0x00, 0x01, 0x00, 0x01, 0x51, 0x80, 0x00 + , 0x06, 0x03, 0x6E, 0x65, 0x6D, 0xC0, 0x11, 0xC0 + , 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0E + , 0x10, 0x00, 0x02, 0xC0, 0x31, 0xC0, 0x31, 0x00 + , 0x01, 0x00, 0x01, 0x00, 0x00, 0x0E, 0x10, 0x00 + , 0x04, 0xDB, 0x5E, 0x82, 0x8B + ] + , Message { + msgHeader = Header { + hdMessageID = 8825 + , hdMessageType = Response + , hdOpcode = StandardQuery + , hdIsAuthoritativeAnswer = True + , hdIsTruncated = False + , hdIsRecursionDesired = True + , hdIsRecursionAvailable = False + , hdResponseCode = NoError + } + , msgQuestions = [ wrapQuestion $ + Question { + qName = "mail.cielonegro.org." + , qType = CNAME + , qClass = IN + } + ] + , msgAnswers = [ wrapRecord $ + ResourceRecord { + rrName = "mail.cielonegro.org." + , rrType = CNAME + , rrClass = IN + , rrTTL = 86400 + , rrData = "nem.cielonegro.org." + } + ] + , msgAuthorities = [ wrapRecord $ + ResourceRecord { + rrName = "cielonegro.org." + , rrType = NS + , rrClass = IN + , rrTTL = 3600 + , rrData = "nem.cielonegro.org." + } + ] + , msgAdditionals = [ wrapRecord $ + ResourceRecord { + rrName = "nem.cielonegro.org." + , rrType = A + , rrClass = IN + , rrTTL = 3600 + , rrData = "219.94.130.139" + } + ] + } + ) + , ( [ 0xED, 0x68, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00 + , 0x00, 0x00, 0x00, 0x00, 0x0A, 0x63, 0x69, 0x65 + , 0x6C, 0x6F, 0x6E, 0x65, 0x67, 0x72, 0x6F, 0x03 + , 0x6F, 0x72, 0x67, 0x00, 0x00, 0x06, 0x00, 0x01 + ] + , Message { + msgHeader = Header { + hdMessageID = 60776 + , hdMessageType = Query + , hdOpcode = StandardQuery + , hdIsAuthoritativeAnswer = False + , hdIsTruncated = False + , hdIsRecursionDesired = True + , hdIsRecursionAvailable = False + , hdResponseCode = NoError + } + , msgQuestions = [ wrapQuestion $ + Question { + qName = "cielonegro.org." + , qType = SOA + , qClass = IN + } + ] + , msgAnswers = [] + , msgAuthorities = [] + , msgAdditionals = [] + } ) - , (parseMsg [ 0x22, 0x79, 0x85, 0x00, 0x00, 0x01, 0x00, 0x01 - , 0x00, 0x01, 0x00, 0x01, 0x04, 0x6D, 0x61, 0x69 - , 0x6C, 0x0A, 0x63, 0x69, 0x65, 0x6C, 0x6F, 0x6E - , 0x65, 0x67, 0x72, 0x6F, 0x03, 0x6F, 0x72, 0x67 - , 0x00, 0x00, 0x05, 0x00, 0x01, 0xC0, 0x0C, 0x00 - , 0x05, 0x00, 0x01, 0x00, 0x01, 0x51, 0x80, 0x00 - , 0x06, 0x03, 0x6E, 0x65, 0x6D, 0xC0, 0x11, 0xC0 - , 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x0E - , 0x10, 0x00, 0x02, 0xC0, 0x31, 0xC0, 0x31, 0x00 - , 0x01, 0x00, 0x01, 0x00, 0x00, 0x0E, 0x10, 0x00 - , 0x04, 0xDB, 0x5E, 0x82, 0x8B - ] - ~?= - Message { - msgHeader = Header { - hdMessageID = 8825 - , hdMessageType = Response - , hdOpcode = StandardQuery - , hdIsAuthoritativeAnswer = True - , hdIsTruncated = False - , hdIsRecursionDesired = True - , hdIsRecursionAvailable = False - , hdResponseCode = NoError - } - , msgQuestions = [ Question { - qName = mkDomainName "mail.cielonegro.org." - , qType = wrapQueryType CNAME - , qClass = IN - } - ] - , msgAnswers = [ wrapRecord $ - ResourceRecord { - rrName = mkDomainName "mail.cielonegro.org." - , rrType = CNAME - , rrClass = IN - , rrTTL = 86400 - , rrData = mkDomainName "nem.cielonegro.org." - } - ] - , msgAuthorities = [ wrapRecord $ - ResourceRecord { - rrName = mkDomainName "cielonegro.org." - , rrType = NS - , rrClass = IN - , rrTTL = 3600 - , rrData = mkDomainName "nem.cielonegro.org." - } - ] - , msgAdditionals = [ wrapRecord $ - ResourceRecord { - rrName = mkDomainName "nem.cielonegro.org." - , rrType = A - , rrClass = IN - , rrTTL = 3600 - , rrData = unsafePerformIO (inet_addr "219.94.130.139") - } - ] - } + , ( [ 0xED, 0x68, 0x85, 0x00, 0x00, 0x01, 0x00, 0x01 + , 0x00, 0x01, 0x00, 0x01, 0x0A, 0x63, 0x69, 0x65 + , 0x6C, 0x6F, 0x6E, 0x65, 0x67, 0x72, 0x6F, 0x03 + , 0x6F, 0x72, 0x67, 0x00, 0x00, 0x06, 0x00, 0x01 + , 0xC0, 0x0C, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00 + , 0x0E, 0x10, 0x00, 0x21, 0x03, 0x6E, 0x65, 0x6D + , 0xC0, 0x0C, 0x04, 0x72, 0x6F, 0x6F, 0x74, 0xC0 + , 0x2C, 0x77, 0xAF, 0xFC, 0x84, 0x00, 0x00, 0x0E + , 0x10, 0x00, 0x00, 0x03, 0x84, 0x00, 0x36, 0xEE + , 0x80, 0x00, 0x00, 0x0E, 0x10, 0xC0, 0x0C, 0x00 + , 0x02, 0x00, 0x01, 0x00, 0x00, 0x0E, 0x10, 0x00 + , 0x02, 0xC0, 0x2C, 0xC0, 0x2C, 0x00, 0x01, 0x00 + , 0x01, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0xDB + , 0x5E, 0x82, 0x8B + ] + , Message { + msgHeader = Header { + hdMessageID = 60776 + , hdMessageType = Response + , hdOpcode = StandardQuery + , hdIsAuthoritativeAnswer = True + , hdIsTruncated = False + , hdIsRecursionDesired = True + , hdIsRecursionAvailable = False + , hdResponseCode = NoError + } + , msgQuestions = [ wrapQuestion $ + Question { + qName = "cielonegro.org." + , qType = SOA + , qClass = IN + } + ] + , msgAnswers = [ wrapRecord $ + ResourceRecord { + rrName = "cielonegro.org." + , rrType = SOA + , rrClass = IN + , rrTTL = 3600 + , rrData = SOAFields { + soaMasterNameServer = "nem.cielonegro.org." + , soaResponsibleMailbox = "root.nem.cielonegro.org." + , soaSerialNumber = 2008022148 + , soaRefreshInterval = 3600 + , soaRetryInterval = 900 + , soaExpirationLimit = 3600000 + , soaMinimumTTL = 3600 + } + } + ] + , msgAuthorities = [ wrapRecord $ + ResourceRecord { + rrName = "cielonegro.org." + , rrType = NS + , rrClass = IN + , rrTTL = 3600 + , rrData = "nem.cielonegro.org." + } + ] + , msgAdditionals = [ wrapRecord $ + ResourceRecord { + rrName = "nem.cielonegro.org." + , rrType = A + , rrClass = IN + , rrTTL = 3600 + , rrData = "219.94.130.139" + } + ] + } ) ] +packMsg :: Message -> [Word8] +packMsg = LBS.unpack . encode + +unpackMsg :: [Word8] -> Message +unpackMsg = decode . LBS.pack + +testData :: [Test] +testData = map mkPackTest messages + ++ + map mkUnpackTest messages + where + mkPackTest :: ([Word8], Message) -> Test + mkPackTest (bin, msg) = packMsg msg ~?= bin + + mkUnpackTest :: ([Word8], Message) -> Test + mkUnpackTest (bin, msg) = unpackMsg bin ~?= msg main :: IO () main = runTestTT (test testData) >> return () \ No newline at end of file