packages feed

http2-0.3.0: test/HuffmanSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module HuffmanSpec where

import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import Network.HPACK
import Network.HPACK.Huffman
import Test.Hspec
import Test.Hspec.QuickCheck

import HexString

testData :: [(ByteString, ByteString)]
testData = [
    ("", "")
  , ("www.example.com", "e7cf9bebe89b6fb16fa9b6ff")
  , ("no-cache", "b9b9949556bf")
  , ("custom-key", "571c5cdb737b2faf")
  , ("custom-value", "571c5cdb73724d9c57")
  , ("private", "bf06724b97")
  , ("Mon, 21 Oct 2013 20:13:21 GMT", "d6dbb29884de2a718805062098513109b56ba3")
  , ("https://www.example.com", "adcebf198e7e7cf9bebe89b6fb16fa9b6f")
  , ("Mon, 21 Oct 2013 20:13:22 GMT", "d6dbb29884de2a718805062098513111b56ba3")
  , ("gzip", "abdd97ff")
  , ("foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", "e0d6cf9f6e8f9fd3e5f6fa76fefd3c7edf9eff1f2f0f3cfe9f6fcf7f8f879f61ad4f4cc9a973a2200ec3725e18b1b74e3f")
  ]

shouldBeEncoded :: ByteString -> ByteString -> Expectation
shouldBeEncoded inp out = enc inp `shouldBe` out
  where
    enc = toHexString . encode

shouldBeDecoded :: ByteString -> Either DecodeError ByteString -> Expectation
shouldBeDecoded inp out = dec inp `shouldBe` out
  where
    dec = decode . fromHexString

spec :: Spec
spec = do
    describe "encode and decode" $ do
        prop "duality" $ \cs ->
            let bs = BS.pack cs
            in decode (encode bs) == Right bs
    describe "encode" $ do
        it "encodes" $ do
            mapM_ (\(x,y) -> x `shouldBeEncoded` y) testData
    describe "decode" $ do
        it "decodes" $ do
            "ff" `shouldBeDecoded` Left TooLongEos
            "ffffeeff" `shouldBeDecoded` Right "\1"
            "ffffeeffff" `shouldBeDecoded` Left TooLongEos
            mapM_ (\(x,y) -> y `shouldBeDecoded` Right x) testData