forked from commercialhaskell/stack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLockSpec.hs
More file actions
166 lines (160 loc) · 6.13 KB
/
Copy pathLockSpec.hs
File metadata and controls
166 lines (160 loc) · 6.13 KB
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
{-# LANGUAGE QuasiQuotes #-}
{-# 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 resolver)" $ do
let lockFile :: ByteString
lockFile =
[r|#some
snapshots:
- completed:
compiler: ghc-8.6.5
original:
compiler: ghc-8.6.5
packages: []
|]
pkgImm <- lckPkgImmutableLocations <$> decodeLocked lockFile
pkgImm `shouldBe` []
it "parses lock file (empty with LTS resolver)" $ 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 <- lckPkgImmutableLocations <$> 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 <- lckPkgImmutableLocations <$> 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))
}))
]