{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Data.String (IsString (..))
import Prelude hiding (pi)
import System.IO (IOMode (ReadMode), withFile)
import Test.Tasty (defaultMain, testGroup)
import Test.Tasty.HUnit (assertBool, assertEqual, assertFailure, testCase, testCaseSteps)
import qualified Codec.Archive.Tar.Entry as Tar
import qualified Codec.Archive.Tar.Index as Tar
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base16 as Base16
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Map.Strict as Map
import qualified Distribution.Package as C
import qualified Distribution.Version as C
import Cabal.Config
import Cabal.Index
main :: IO ()
main = defaultMain $ testGroup "Cabal.Index"
[ testGroup "SHA256"
[ testCase "Base16.encode . getSHA256 . unsafeMkSHA256 rountrip" $ do
let s :: IsString s => s
s = "a6f5eddcff9526c786a1b77bdfade54b42f67c066b379bbc4b55ffb291e6c7d6"
let expected :: BS.ByteString
expected = s
assertEqual "hash"
expected
(Base16.encode . getSHA256 . unsafeMkSHA256 $ s)
]
, testCaseSteps "low-level approach" $ \step -> do
step "Read ~/.cabal/config"
cfg <- readConfig
step "Find hackage 01-index.tar"
indexPath <- maybe
(assertFailure "Cannot find hackage 01.indexTar")
return
(cfgRepoIndex cfg hackageHaskellOrg)
step "Read metadata"
meta <- indexMetadata indexPath Nothing
step "Check aeson-1.4.4.0 metadata"
case Map.lookup (C.mkPackageName "aeson") meta of
Nothing -> assertFailure "Cannot find aeson on Hackage"
Just pi -> case Map.lookup (C.mkVersion [1,4,4,0]) (piVersions pi) of
Nothing -> assertFailure "Cannot find aeson-1.4.4.0 on Hackage"
Just ri -> do
-- Note: if someone makes revision to aeson-1.4.4.0
-- revision and cabal hash check will start failing
-- tarball hash shouldn't ever change.
assertEqual "revision" 1 (riRevision ri)
assertEqual "cabal hash"
(unsafeMkSHA256 "a6f5eddcff9526c786a1b77bdfade54b42f67c066b379bbc4b55ffb291e6c7d6")
(riCabal ri)
assertEqual "tarball hash"
(unsafeMkSHA256 "17c67cdaca651e18f310b21b2b12bac6bcec5188c3ac0e4b64cc60c94d7e4d2e")
(riTarball ri)
-- check contents
withFile indexPath ReadMode $ \hdl -> do
entry <- Tar.hReadEntry hdl (riTarOffset ri)
case Tar.entryContent entry of
Tar.NormalFile bs fs -> do
assertEqual "entry content size"
7251
fs
assertEqual "entry content (prefix)"
"name: aeson\r\nversion: 1.4.4.0\r\nx-revision: 1\r\nlicense: "
(LBS.take 80 bs)
_ -> assertFailure "invalid entry content"
step "binary (deprecated versions)"
case Map.lookup (C.mkPackageName "binary") meta of
Nothing -> assertFailure "Cannot find binary on Hackage"
Just pi -> do
assertBool "binary-0.9.0.0 should be in piVersions" $
Map.member (C.mkVersion [0,9,0,0]) (piVersions pi)
assertBool "binary-0.9.0.0 should NOT be in piPreferredVersions" $
Map.notMember (C.mkVersion [0,9,0,0]) (piPreferredVersions pi)
, testCaseSteps "cachedHackageMetadata" $ \step -> do
step "First read"
meta1 <- cachedHackageMetadata
step "Second read"
meta2 <- cachedHackageMetadata
assertEqual "cached value should be the same" meta1 meta2
]