content-store-0.1.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
testInput :: B.ByteString
testInput = "The Dude abides."
testSHA256Digest :: B.ByteString
testSHA256Digest = "\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"
testSHA256Hex :: String
testSHA256Hex = "cd9cf308626124a78181c022fb9d0d511af1c15d322012f0a69dfe8640c340aa"
spec :: Spec
spec = 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` testSHA256Digest
it "converts ObjectDigest to hex" $
hex `shouldBe` testSHA256Hex
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` testSHA256Hex
describe "fromByteString" $ do
let da = fromJust $ getDigestAlgorithm "SHA256"
let od = digestByteString da testInput
it "accepts a 32-byte ByteString" $
fromByteString da testSHA256Digest `shouldBe` Just od
it "rejects wrong-sized ByteString" $
fromByteString da (B.take 20 testSHA256Digest) `shouldBe` Nothing