packages feed

hascar-0.1.0.0: test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}

import Control.Monad
import Crypto.Hash.SHA256
import Data.Conduit
import Data.Hex
import Path
import System.IO

import qualified Data.ByteString as S

import SAPCAR

bufSink :: Sink S.ByteString IO S.ByteString
bufSink = S.concat . reverse <$> bufSink' []
    where
        bufSink' :: [S.ByteString] -> Sink S.ByteString IO [S.ByteString]
        bufSink' acc = do
            chunk <- await
            case chunk of
                Just chunk' -> bufSink' (chunk':acc)
                Nothing     -> return acc

main :: IO ()
main = do
    path <- parseRelFile "test/test6.sar"
    res <- withSapCarPath path $ do
        entries <- getEntries
        unless (length entries == 1) $ error "test6.sar should contain exactly one entry!"
        let entry = entries !! 0
        unless (cfFileName entry == "pg244.txt") $ error "Entry in test6.sar should be called 'pg244.txt'!"
        unless (cfFileType entry == CarFile) $ error "Entry in test6.sar should be of type 'file'!"
        sourceEntry entry bufSink

    let correctDigest = "B9A995A6C7A9E75326CE524CA14D4DC7959F012A9E81BF0A5CD0E709767EDB63"
    unless (correctDigest == hex (hash res)) $ error "Wrong sha256 hash for pg244.txt"