1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
module Stack.LockSpec
( toBlobKey
, decodeSHA
, decodeLocked
, spec
) where
import Data.Aeson.WarningParser ( WithJSONWarnings (..) )
import qualified Data.Yaml as Yaml
import Distribution.Types.PackageName ( mkPackageName )
import Distribution.Types.Version ( mkVersion )
import Pantry
( BlobKey (..), FileSize (..), PackageIdentifier (..)
, PackageLocationImmutable (..), PackageMetadata (..)
, RawPackageLocationImmutable (..), RawPackageMetadata (..)
, Repo (..), RepoType (..), SHA256, TreeKey (..)
, resolvePaths
)
import qualified Pantry.SHA256 as SHA256
import RIO ( ByteString, displayException, throwIO, unless )
import Stack.Lock ( Locked (..), LockedLocation (..) )
import Test.Hspec ( Spec, it, shouldBe )
import Text.RawString.QQ ( r )
toBlobKey :: ByteString -> Word -> BlobKey
toBlobKey string size = BlobKey (decodeSHA string) (FileSize size)
decodeSHA :: ByteString -> SHA256
decodeSHA string =
case SHA256.fromHexBytes string of
Right csha -> csha
Left err -> error $ "Failed decoding. Error: " <> displayException err
decodeLocked :: ByteString -> IO Locked
decodeLocked bs = do
val <- Yaml.decodeThrow bs
case Yaml.parseEither Yaml.parseJSON val of
Left err -> throwIO $ Yaml.AesonException err
Right (WithJSONWarnings res warnings) -> do
unless (null warnings) $
throwIO $ Yaml.AesonException $ "Unexpected warnings: " ++ show warnings
-- we just assume no file references
resolvePaths Nothing res
spec :: Spec
spec = do
it "parses lock file (empty with GHC snapshot)" $ do
let lockFile :: ByteString
lockFile =
[r|#some
snapshots:
- completed:
compiler: ghc-8.6.5
original:
compiler: ghc-8.6.5
packages: []
|]
pkgImm <- (.pkgImmutableLocations) <$> decodeLocked lockFile
pkgImm `shouldBe` []
it "parses lock file (empty with LTS snapshot)" $ do
let lockFile :: ByteString
lockFile =
[r|#some
snapshots:
- completed:
size: 527801
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/11/22.yaml
sha256: 7c8b1853da784bd7beb8728168bf4e879d8a2f6daf408ca0fa7933451864a96a
original: lts-14.27
- completed:
compiler: ghc-8.6.5
original:
compiler: ghc-8.6.5
packages: []
|]
pkgImm <- (.pkgImmutableLocations) <$> decodeLocked lockFile
pkgImm `shouldBe` []
it "parses lock file (LTS, wai + warp)" $ do
let lockFile :: ByteString
lockFile =
[r|#some
snapshots:
- completed:
size: 527801
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/11/22.yaml
sha256: 7c8b1853da784bd7beb8728168bf4e879d8a2f6daf408ca0fa7933451864a96a
original: lts-14.27
- completed:
compiler: ghc-8.6.5
original:
compiler: ghc-8.6.5
packages:
- original:
subdir: wai
git: https://github.com/yesodweb/wai.git
commit: d11d63f1a6a92db8c637a8d33e7953ce6194a3e0
completed:
subdir: wai
name: wai
version: 3.2.1.2
git: https://github.com/yesodweb/wai.git
pantry-tree:
size: 714
sha256: ecfd0b4b75f435a3f362394807b35e5ef0647b1a25005d44a3632c49db4833d2
commit: d11d63f1a6a92db8c637a8d33e7953ce6194a3e0
- original:
subdir: warp
git: https://github.com/yesodweb/wai.git
commit: d11d63f1a6a92db8c637a8d33e7953ce6194a3e0
completed:
subdir: warp
name: warp
version: 3.2.25
git: https://github.com/yesodweb/wai.git
pantry-tree:
size: 5103
sha256: f808e075811b002563d24c393ce115be826bb66a317d38da22c513ee42b7443a
commit: d11d63f1a6a92db8c637a8d33e7953ce6194a3e0
|]
pkgImm <- (.pkgImmutableLocations) <$> decodeLocked lockFile
let waiSubdirRepo subdir =
Repo { repoType = RepoGit
, repoUrl = "https://github.com/yesodweb/wai.git"
, repoCommit =
"d11d63f1a6a92db8c637a8d33e7953ce6194a3e0"
, repoSubdir = subdir
}
emptyRPM = RawPackageMetadata { rpmName = Nothing
, rpmVersion = Nothing
, rpmTreeKey = Nothing
}
pkgImm `shouldBe`
[ LockedLocation
(RPLIRepo (waiSubdirRepo "wai") emptyRPM)
(PLIRepo (waiSubdirRepo "wai")
(PackageMetadata { pmIdent =
PackageIdentifier
{ pkgName = mkPackageName "wai"
, pkgVersion = mkVersion [3, 2, 1, 2]
}
, pmTreeKey =
TreeKey
(BlobKey
(decodeSHA
"ecfd0b4b75f435a3f362394807b35e5ef0647b1a25005d44a3632c49db4833d2")
(FileSize 714))
}))
, LockedLocation
(RPLIRepo (waiSubdirRepo "warp") emptyRPM)
(PLIRepo (waiSubdirRepo "warp")
(PackageMetadata { pmIdent =
PackageIdentifier
{ pkgName = mkPackageName "warp"
, pkgVersion = mkVersion [3, 2, 25]
}
, pmTreeKey =
TreeKey
(BlobKey
(decodeSHA
"f808e075811b002563d24c393ce115be826bb66a317d38da22c513ee42b7443a")
(FileSize 5103))
}))
]
|