packages feed

content-store-0.2.0: tests/Data/ContentStore/DigestSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Data.ContentStore.DigestSpec(spec) where

import Test.Hspec
import Data.Maybe(fromJust)
import Data.ContentStore.Digest
import qualified Data.ByteString as B
import qualified Data.ByteArray as BA

{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}

testInput :: B.ByteString
testInput = "The Dude abides."

specBLAKE2 :: Spec
specBLAKE2 =
    describe "Digest.DigestAlgorithm" $ do
        it "knows about BLAKE2" $
            digestName <$> getDigestAlgorithm "BLAKE2" `shouldBe` Just "Blake2b_512"

        let daBLAKE2 = fromJust $ getDigestAlgorithm "BLAKE2"
        it "has the correct size for BLAKE2" $
            digestSize daBLAKE2 `shouldBe` 64

        let od = digestByteString daBLAKE2 testInput
        let hex = toHex od

        it "does BLAKE2 correctly" $
            BA.convert od `shouldBe` testDigest

        it "converts ObjectDigest to hex" $
            hex `shouldBe` testHex
 where
    testDigest :: B.ByteString
    testDigest = "\x0e\x5e\xf4\x9c\x6b\x5d\xf5\x6f\xca\x89\x9f\xef\xde\x64\x8e\xc6\xc5\x42\x95\xe4\x40\x68\x9d\xe9\xd0\x2c\xaf\xc4\x87\xa6\xdb\xac\x7c\x79\x60\x1e\x2d\xa7\xb3\x13\xc8\x52\xa7\xba\xdd\x1d\x31\x97\x22\xa9\x6b\xd0\xd9\x1c\x06\x75\x97\x4b\x07\x69\xbe\x12\x45\x94"

    testHex :: String
    testHex = "0e5ef49c6b5df56fca899fefde648ec6c54295e440689de9d02cafc487a6dbac7c79601e2da7b313c852a7badd1d319722a96bd0d91c0675974b0769be124594"

specBLAKE2b :: Spec
specBLAKE2b =
    describe "Digest.DigestAlgorithm" $ do
        it "knows about BLAKE2b" $
            digestName <$> getDigestAlgorithm "BLAKE2b" `shouldBe` Just "Blake2b_512"

        let daBLAKE2b = fromJust $ getDigestAlgorithm "BLAKE2b"
        it "has the correct size for BLAKE2b" $
            digestSize daBLAKE2b `shouldBe` 64

        let od = digestByteString daBLAKE2b testInput
        let hex = toHex od

        it "does BLAKE2b correctly" $
            BA.convert od `shouldBe` testDigest

        it "converts ObjectDigest to hex" $
            hex `shouldBe` testHex
 where
    testDigest :: B.ByteString
    testDigest = "\x0e\x5e\xf4\x9c\x6b\x5d\xf5\x6f\xca\x89\x9f\xef\xde\x64\x8e\xc6\xc5\x42\x95\xe4\x40\x68\x9d\xe9\xd0\x2c\xaf\xc4\x87\xa6\xdb\xac\x7c\x79\x60\x1e\x2d\xa7\xb3\x13\xc8\x52\xa7\xba\xdd\x1d\x31\x97\x22\xa9\x6b\xd0\xd9\x1c\x06\x75\x97\x4b\x07\x69\xbe\x12\x45\x94"

    testHex :: String
    testHex = "0e5ef49c6b5df56fca899fefde648ec6c54295e440689de9d02cafc487a6dbac7c79601e2da7b313c852a7badd1d319722a96bd0d91c0675974b0769be124594"

specBLAKE2b512 :: Spec
specBLAKE2b512 =
    describe "Digest.DigestAlgorithm" $ do
        it "knows about BLAKE2b512" $
            digestName <$> getDigestAlgorithm "BLAKE2b512" `shouldBe` Just "Blake2b_512"

        let daBLAKE2b512 = fromJust $ getDigestAlgorithm "BLAKE2b512"
        it "has the correct size for BLAKE2b512" $
            digestSize daBLAKE2b512 `shouldBe` 64

        let od = digestByteString daBLAKE2b512 testInput
        let hex = toHex od

        it "does BLAKE2b512 correctly" $
            BA.convert od `shouldBe` testDigest

        it "converts ObjectDigest to hex" $
            hex `shouldBe` testHex
 where
    testDigest :: B.ByteString
    testDigest = "\x0e\x5e\xf4\x9c\x6b\x5d\xf5\x6f\xca\x89\x9f\xef\xde\x64\x8e\xc6\xc5\x42\x95\xe4\x40\x68\x9d\xe9\xd0\x2c\xaf\xc4\x87\xa6\xdb\xac\x7c\x79\x60\x1e\x2d\xa7\xb3\x13\xc8\x52\xa7\xba\xdd\x1d\x31\x97\x22\xa9\x6b\xd0\xd9\x1c\x06\x75\x97\x4b\x07\x69\xbe\x12\x45\x94"

    testHex :: String
    testHex = "0e5ef49c6b5df56fca899fefde648ec6c54295e440689de9d02cafc487a6dbac7c79601e2da7b313c852a7badd1d319722a96bd0d91c0675974b0769be124594"

specBLAKE2b256 :: Spec
specBLAKE2b256 =
    describe "Digest.DigestAlgorithm" $ do
        it "knows about BLAKE2b256" $
            digestName <$> getDigestAlgorithm "BLAKE2b256" `shouldBe` Just "Blake2b_256"

        let daBLAKE2b256 = fromJust $ getDigestAlgorithm "BLAKE2b256"
        it "has the correct size for BLAKE2b256" $
            digestSize daBLAKE2b256 `shouldBe` 32

        let od = digestByteString daBLAKE2b256 testInput
        let hex = toHex od

        it "does BLAKE2b256 correctly" $
            BA.convert od `shouldBe` testDigest

        it "converts ObjectDigest to hex" $
            hex `shouldBe` testHex
 where
    testDigest :: B.ByteString
    testDigest = "\x82\xe4\x69\x8a\x1e\xbe\x82\xed\xae\xc8\xe8\xa6\xdc\xf1\x8d\x57\xbb\x5a\xc6\x71\x8b\x6b\xf2\xbb\xc3\x8a\x00\xda\x2e\x29\x34\xe6"

    testHex :: String
    testHex = "82e4698a1ebe82edaec8e8a6dcf18d57bb5ac6718b6bf2bbc38a00da2e2934e6"

specBLAKE2s :: Spec
specBLAKE2s =
    describe "Digest.DigestAlgorithm" $ do
        it "knows about BLAKE2s" $
            digestName <$> getDigestAlgorithm "BLAKE2s" `shouldBe` Just "Blake2s_256"

        let daBLAKE2s = fromJust $ getDigestAlgorithm "BLAKE2s"
        it "has the correct size for BLAKE2s" $
            digestSize daBLAKE2s `shouldBe` 32

        let od = digestByteString daBLAKE2s testInput
        let hex = toHex od

        it "does BLAKE2s correctly" $
            BA.convert od `shouldBe` testDigest

        it "converts ObjectDigest to hex" $
            hex `shouldBe` testHex
 where
    testDigest :: B.ByteString
    testDigest = "\xfe\x04\xd7\x14\x3e\x23\x1a\x36\xc7\xbd\x1f\x9b\xdb\x36\x04\x56\xdd\xe8\x1c\xb9\x22\x3a\xab\x25\x5f\x74\x9f\x80\xe9\x60\xd7\x9f"

    testHex :: String
    testHex = "fe04d7143e231a36c7bd1f9bdb360456dde81cb9223aab255f749f80e960d79f"

specBLAKE2s256 :: Spec
specBLAKE2s256 =
    describe "Digest.DigestAlgorithm" $ do
        it "knows about BLAKE2s256" $
            digestName <$> getDigestAlgorithm "BLAKE2s256" `shouldBe` Just "Blake2s_256"

        let daBLAKE2s256 = fromJust $ getDigestAlgorithm "BLAKE2s256"
        it "has the correct size for BLAKE2s256" $
            digestSize daBLAKE2s256 `shouldBe` 32

        let od = digestByteString daBLAKE2s256 testInput
        let hex = toHex od

        it "does BLAKE2s256 correctly" $
            BA.convert od `shouldBe` testDigest

        it "converts ObjectDigest to hex" $
            hex `shouldBe` testHex
 where
    testDigest :: B.ByteString
    testDigest = "\xfe\x04\xd7\x14\x3e\x23\x1a\x36\xc7\xbd\x1f\x9b\xdb\x36\x04\x56\xdd\xe8\x1c\xb9\x22\x3a\xab\x25\x5f\x74\x9f\x80\xe9\x60\xd7\x9f"

    testHex :: String
    testHex = "fe04d7143e231a36c7bd1f9bdb360456dde81cb9223aab255f749f80e960d79f"

specSHA256 :: Spec
specSHA256 = do
    describe "Digest.DigestAlgorithm" $ do
        it "knows about SHA256" $
            digestName <$> getDigestAlgorithm "SHA256" `shouldBe` Just "SHA256"

        let daSHA256 = fromJust $ getDigestAlgorithm "SHA256"
        it "has the correct size for SHA256" $
            digestSize daSHA256 `shouldBe` 32

        let od = digestByteString daSHA256 testInput
        let hex = toHex od

        it "does SHA256 correctly" $
            BA.convert od `shouldBe` testDigest

        it "converts ObjectDigest to hex" $
            hex `shouldBe` testHex

    describe "Digest.DigestContext" $ do
        let da = fromJust $ getDigestAlgorithm "SHA256"
        let ctx = digestInit da
        it "can do digests piece by piece" $ do
            let hex = toHex $ digestFinalize $ digestUpdate ctx testInput
            hex `shouldBe` testHex

    describe "fromByteString" $ do
        let da = fromJust $ getDigestAlgorithm "SHA256"
        let od = digestByteString da testInput
        it "accepts a 32-byte ByteString" $
            fromByteString da testDigest `shouldBe` Just od
        it "rejects wrong-sized ByteString" $
            fromByteString da (B.take 20 testDigest) `shouldBe` Nothing
 where
    testDigest :: B.ByteString
    testDigest = "\xcd\x9c\xf3\x08\x62\x61\x24\xa7\x81\x81\xc0\x22\xfb\x9d\x0d\x51\x1a\xf1\xc1\x5d\x32\x20\x12\xf0\xa6\x9d\xfe\x86\x40\xc3\x40\xaa"

    testHex :: String
    testHex = "cd9cf308626124a78181c022fb9d0d511af1c15d322012f0a69dfe8640c340aa"

specSHA512 :: Spec
specSHA512 = do
    describe "Digest.DigestAlgorithm" $ do
        it "knows about SHA512" $
            digestName <$> getDigestAlgorithm "SHA512" `shouldBe` Just "SHA512"

        let daSHA512 = fromJust $ getDigestAlgorithm "SHA512"
        it "has the correct size for SHA512" $
            digestSize daSHA512 `shouldBe` 64

        let od = digestByteString daSHA512 testInput
        let hex = toHex od

        it "does SHA512 correctly" $
            BA.convert od `shouldBe` testDigest

        it "converts ObjectDigest to hex" $
            hex `shouldBe` testHex

    describe "Digest.DigestContext" $ do
        let da = fromJust $ getDigestAlgorithm "SHA512"
        let ctx = digestInit da
        it "can do digests piece by piece" $ do
            let hex = toHex $ digestFinalize $ digestUpdate ctx testInput
            hex `shouldBe` testHex

    describe "fromByteString" $ do
        let da = fromJust $ getDigestAlgorithm "SHA512"
        let od = digestByteString da testInput
        it "accepts a 32-byte ByteString" $
            fromByteString da testDigest `shouldBe` Just od
        it "rejects wrong-sized ByteString" $
            fromByteString da (B.take 20 testDigest) `shouldBe` Nothing
 where
    testDigest :: B.ByteString
    testDigest = "\x05\x07\xdb\x94\x58\xc9\xfe\xce\x37\xd5\xfb\x54\xc4\xda\xf4\xe8\x21\x14\xda\xb1\x53\xdc\x0b\x0e\x15\x74\x49\x77\x54\x94\x35\xdc\x78\xc7\x0c\xef\x51\x3e\xb7\x3a\x4f\x80\x81\x2a\x6e\xd5\x73\x1e\xcf\xff\xb4\x95\x98\x56\xfa\x94\x40\x30\xec\x20\x78\x45\xae\x34"

    testHex :: String
    testHex = "0507db9458c9fece37d5fb54c4daf4e82114dab153dc0b0e15744977549435dc78c70cef513eb73a4f80812a6ed5731ecfffb4959856fa944030ec207845ae34"

spec :: Spec
spec = do
    describe "SHA256"
        specSHA256

    describe "SHA512"
        specSHA512

    describe "BLAKE2"
        specBLAKE2

    describe "BLAKE2b"
        specBLAKE2b

    describe "BLAKE2b512"
        specBLAKE2b512

    describe "BLAKE2b256"
        specBLAKE2b256

    describe "BLAKE2s"
        specBLAKE2s

    describe "BLAKE2s256"
        specBLAKE2s256