{-# LANGUAGE OverloadedStrings #-} import Test.Framework (defaultMain, testGroup) import Test.Framework.Providers.HUnit import Test.HUnit import Codec.Encryption.OpenPGP.Serialize (getPackets, putPackets) import Codec.Encryption.OpenPGP.ASCIIArmor (armor, decodeArmor) import Codec.Encryption.OpenPGP.Types import Data.ByteString (ByteString) import qualified Data.ByteString as B import Data.Digest.CRC24 (crc24) import Data.Serialize.Get (runGet) import Data.Serialize.Put (runPut) import Data.Word (Word32) testSerialization :: FilePath -> Assertion testSerialization fp = do bs <- B.readFile $ "tests/data/" ++ fp let firstpass = runGet getPackets bs case firstpass of Left err -> assertFailure $ "First pass failed on " ++ fp Right packs -> do let roundtrip = runPut $ putPackets packs let secondpass = runGet getPackets roundtrip assertEqual ("for " ++ fp) firstpass secondpass testCRC24 :: ByteString -> Word32 -> Assertion testCRC24 bs crc = assertEqual "crc24" crc (crc24 bs) testArmorDecode :: FilePath -> Armor Int -> Assertion testArmorDecode fp target = do bs <- B.readFile $ "tests/data/" ++ fp case decodeArmor bs of Left err -> assertFailure $ "Decode failed on " ++ fp Right arm -> do assertEqual ("for " ++ fp) target arm testArmorEncode :: Armor Int -> ByteString -> Assertion testArmorEncode arm target = assertEqual ("literaldata") (armor arm) target tests = [ testGroup "Serialization group" [ testCase "000001-006.public_key" (testSerialization "000001-006.public_key") , testCase "000002-013.user_id" (testSerialization "000002-013.user_id") , testCase "000003-002.sig" (testSerialization "000003-002.sig") , testCase "000004-012.ring_trust" (testSerialization "000004-012.ring_trust") , testCase "000005-002.sig" (testSerialization "000005-002.sig") , testCase "000006-012.ring_trust" (testSerialization "000006-012.ring_trust") , testCase "000007-002.sig" (testSerialization "000007-002.sig") , testCase "000008-012.ring_trust" (testSerialization "000008-012.ring_trust") , testCase "000009-002.sig" (testSerialization "000009-002.sig") , testCase "000010-012.ring_trust" (testSerialization "000010-012.ring_trust") , testCase "000011-002.sig" (testSerialization "000011-002.sig") , testCase "000012-012.ring_trust" (testSerialization "000012-012.ring_trust") , testCase "000013-014.public_subkey" (testSerialization "000013-014.public_subkey") , testCase "000014-002.sig" (testSerialization "000014-002.sig") , testCase "000015-012.ring_trust" (testSerialization "000015-012.ring_trust") , testCase "000016-006.public_key" (testSerialization "000016-006.public_key") , testCase "000017-002.sig" (testSerialization "000017-002.sig") , testCase "000018-012.ring_trust" (testSerialization "000018-012.ring_trust") , testCase "000019-013.user_id" (testSerialization "000019-013.user_id") , testCase "000020-002.sig" (testSerialization "000020-002.sig") , testCase "000021-012.ring_trust" (testSerialization "000021-012.ring_trust") , testCase "000022-002.sig" (testSerialization "000022-002.sig") , testCase "000023-012.ring_trust" (testSerialization "000023-012.ring_trust") , testCase "000024-014.public_subkey" (testSerialization "000024-014.public_subkey") , testCase "000025-002.sig" (testSerialization "000025-002.sig") , testCase "000026-012.ring_trust" (testSerialization "000026-012.ring_trust") , testCase "000027-006.public_key" (testSerialization "000027-006.public_key") , testCase "000028-002.sig" (testSerialization "000028-002.sig") , testCase "000029-012.ring_trust" (testSerialization "000029-012.ring_trust") , testCase "000030-013.user_id" (testSerialization "000030-013.user_id") , testCase "000031-002.sig" (testSerialization "000031-002.sig") , testCase "000032-012.ring_trust" (testSerialization "000032-012.ring_trust") , testCase "000033-002.sig" (testSerialization "000033-002.sig") , testCase "000034-012.ring_trust" (testSerialization "000034-012.ring_trust") , testCase "000035-006.public_key" (testSerialization "000035-006.public_key") , testCase "000036-013.user_id" (testSerialization "000036-013.user_id") , testCase "000037-002.sig" (testSerialization "000037-002.sig") , testCase "000038-012.ring_trust" (testSerialization "000038-012.ring_trust") , testCase "000039-002.sig" (testSerialization "000039-002.sig") , testCase "000040-012.ring_trust" (testSerialization "000040-012.ring_trust") , testCase "000041-017.attribute" (testSerialization "000041-017.attribute") , testCase "000042-002.sig" (testSerialization "000042-002.sig") , testCase "000043-012.ring_trust" (testSerialization "000043-012.ring_trust") , testCase "000044-014.public_subkey" (testSerialization "000044-014.public_subkey") , testCase "000045-002.sig" (testSerialization "000045-002.sig") , testCase "000046-012.ring_trust" (testSerialization "000046-012.ring_trust") , testCase "000047-005.secret_key" (testSerialization "000047-005.secret_key") , testCase "000048-013.user_id" (testSerialization "000048-013.user_id") , testCase "000049-002.sig" (testSerialization "000049-002.sig") , testCase "000050-012.ring_trust" (testSerialization "000050-012.ring_trust") , testCase "000051-007.secret_subkey" (testSerialization "000051-007.secret_subkey") , testCase "000052-002.sig" (testSerialization "000052-002.sig") , testCase "000053-012.ring_trust" (testSerialization "000053-012.ring_trust") , testCase "000054-005.secret_key" (testSerialization "000054-005.secret_key") , testCase "000055-002.sig" (testSerialization "000055-002.sig") , testCase "000056-012.ring_trust" (testSerialization "000056-012.ring_trust") , testCase "000057-013.user_id" (testSerialization "000057-013.user_id") , testCase "000058-002.sig" (testSerialization "000058-002.sig") , testCase "000059-012.ring_trust" (testSerialization "000059-012.ring_trust") , testCase "000060-007.secret_subkey" (testSerialization "000060-007.secret_subkey") , testCase "000061-002.sig" (testSerialization "000061-002.sig") , testCase "000062-012.ring_trust" (testSerialization "000062-012.ring_trust") , testCase "000063-005.secret_key" (testSerialization "000063-005.secret_key") , testCase "000064-002.sig" (testSerialization "000064-002.sig") , testCase "000065-012.ring_trust" (testSerialization "000065-012.ring_trust") , testCase "000066-013.user_id" (testSerialization "000066-013.user_id") , testCase "000067-002.sig" (testSerialization "000067-002.sig") , testCase "000068-012.ring_trust" (testSerialization "000068-012.ring_trust") , testCase "000069-005.secret_key" (testSerialization "000069-005.secret_key") , testCase "000070-013.user_id" (testSerialization "000070-013.user_id") , testCase "000071-002.sig" (testSerialization "000071-002.sig") , testCase "000072-012.ring_trust" (testSerialization "000072-012.ring_trust") , testCase "000073-017.attribute" (testSerialization "000073-017.attribute") , testCase "000074-002.sig" (testSerialization "000074-002.sig") , testCase "000075-012.ring_trust" (testSerialization "000075-012.ring_trust") , testCase "000076-007.secret_subkey" (testSerialization "000076-007.secret_subkey") , testCase "000077-002.sig" (testSerialization "000077-002.sig") , testCase "000078-012.ring_trust" (testSerialization "000078-012.ring_trust") , testCase "pubring.gpg" (testSerialization "pubring.gpg") , testCase "secring.gpg" (testSerialization "secring.gpg") ], testGroup "CRC24 group" [ testCase "CRC24: A" (testCRC24 "A" 16680698) , testCase "CRC24: Haskell" (testCRC24 "Haskell" 15612750) , testCase "CRC24: hOpenPGP and friends" (testCRC24 "hOpenPGP and friends" 11940960) ], testGroup "ASCII armor group" [ testCase "Decode sample armor" (testArmorDecode "msg1.asc" (Armor ArmorMessage [("Version","OpenPrivacy 0.99")] [CompressedData ZIP ";m\150\196\DC1\239\236\239\ETB\236\239\227\202\NUL\EOT\206\137y\234%\n\137y\149\249y\169\n\217\169\169\ENQ\n\137\n\197\169\201E\169@\193\162\252\210\188\DC4\133\140\212\162T{.\NUL"])) , testCase "Encode sample armor" (testArmorEncode (Armor ArmorMessage [("Comment", "Test")] [LiteralData UTF8Data "notlob.txt" 12345 "These are the days of literal data.\n"]) "-----BEGIN PGP MESSAGE-----\nComment: Test\n\nyzR1Cm5vdGxvYi50eHQAADA5VGhlc2UgYXJlIHRoZSBkYXlzIG9mIGxpdGVyYWwgZGF0YS4K\n=AAKY\n-----END PGP MESSAGE-----\n") ] ] -- main = runTestTT tests -- specs :: Specs -- specs = describe "Round-trip serialization" [it "000001-006.public_key" (testSerialization "000001-006.public_key") -- , it "000002-013.user_id" (testSerialization "000002-013.user_id") -- , it "000003-002.sig" (testSerialization "000003-002.sig") -- , it "000004-012.ring_trust" (testSerialization "000004-012.ring_trust") -- , it "000005-014.public_subkey" (testSerialization "000005-014.public_subkey") -- , it "000006-002.sig" (testSerialization "000006-002.sig") -- , it "000007-012.ring_trust" (testSerialization "000007-012.ring_trust") -- , it "000008-006.public_key" (testSerialization "000008-006.public_key") -- , it "000009-013.user_id" (testSerialization "000009-013.user_id") -- , it "000010-002.sig" (testSerialization "000010-002.sig") -- , it "000011-012.ring_trust" (testSerialization "000011-012.ring_trust") -- , it "000012-014.public_subkey" (testSerialization "000012-014.public_subkey") -- , it "000013-002.sig" (testSerialization "000013-002.sig") -- , it "000014-012.ring_trust" (testSerialization "000014-012.ring_trust") -- , it "000015-006.public_key" (testSerialization "000015-006.public_key") -- , it "000016-013.user_id" (testSerialization "000016-013.user_id") -- , it "000017-002.sig" (testSerialization "000017-002.sig") -- , it "000018-012.ring_trust" (testSerialization "000018-012.ring_trust") -- , it "000019-006.public_key" (testSerialization "000019-006.public_key") -- , it "000020-013.user_id" (testSerialization "000020-013.user_id") -- , it "000021-002.sig" (testSerialization "000021-002.sig") -- , it "000022-012.ring_trust" (testSerialization "000022-012.ring_trust") -- , it "000023-005.secret_key" (testSerialization "000023-005.secret_key") -- , it "000024-013.user_id" (testSerialization "000024-013.user_id") -- , it "000025-002.sig" (testSerialization "000025-002.sig") -- , it "000026-012.ring_trust" (testSerialization "000026-012.ring_trust") -- , it "000027-007.secret_subkey" (testSerialization "000027-007.secret_subkey") -- , it "000028-002.sig" (testSerialization "000028-002.sig") -- , it "000029-012.ring_trust" (testSerialization "000029-012.ring_trust") -- , it "000030-005.secret_key" (testSerialization "000030-005.secret_key") -- , it "000031-013.user_id" (testSerialization "000031-013.user_id") -- , it "000032-002.sig" (testSerialization "000032-002.sig") -- , it "000033-012.ring_trust" (testSerialization "000033-012.ring_trust") -- , it "000034-007.secret_subkey" (testSerialization "000034-007.secret_subkey") -- , it "000035-002.sig" (testSerialization "000035-002.sig") -- , it "000036-012.ring_trust" (testSerialization "000036-012.ring_trust") -- , it "000037-005.secret_key" (testSerialization "000037-005.secret_key") -- , it "000038-013.user_id" (testSerialization "000038-013.user_id") -- , it "000039-002.sig" (testSerialization "000039-002.sig") -- , it "000040-012.ring_trust" (testSerialization "000040-012.ring_trust") -- , it "000041-005.secret_key" (testSerialization "000041-005.secret_key") -- , it "000042-013.user_id" (testSerialization "000042-013.user_id") -- , it "000043-002.sig" (testSerialization "000043-002.sig") -- , it "000044-012.ring_trust" (testSerialization "000044-012.ring_trust") -- , it "pubring.gpg" (testSerialization "pubring.gpg") -- , it "secring.gpg" (testSerialization "secring.gpg") -- ] -- main = hspec specs main = defaultMain tests