53 lines
2 KiB
Text
53 lines
2 KiB
Text
|
|
#load "store.fsx"
|
||
|
|
|
||
|
|
open System
|
||
|
|
open System.IO
|
||
|
|
open System.Net
|
||
|
|
open System.Text
|
||
|
|
open System.Threading.Tasks
|
||
|
|
open Amazon.Runtime
|
||
|
|
open Amazon.S3
|
||
|
|
open Amazon.S3.Model
|
||
|
|
open Bootstrap
|
||
|
|
|
||
|
|
let check condition message = if not condition then failwith message
|
||
|
|
|
||
|
|
type MemoryStore() =
|
||
|
|
inherit AmazonS3Client(BasicAWSCredentials("fixture", "synthetic-secret"), AmazonS3Config(ServiceURL = "http://127.0.0.1", AuthenticationRegion = "us-east-1"))
|
||
|
|
let mutable reads = 0
|
||
|
|
let mutable key = ""
|
||
|
|
member _.Reads = reads
|
||
|
|
member _.Key = key
|
||
|
|
override _.GetObjectAsync(request: GetObjectRequest, _) =
|
||
|
|
reads <- reads + 1
|
||
|
|
key <- request.Key
|
||
|
|
let bytes = Encoding.UTF8.GetBytes(if request.Key.EndsWith ".sha256" then "inventory" else "synthetic artifact")
|
||
|
|
Task.FromResult(new GetObjectResponse(HttpStatusCode = HttpStatusCode.OK, ResponseStream = new MemoryStream(bytes)))
|
||
|
|
|
||
|
|
let root = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"))
|
||
|
|
Directory.CreateDirectory root |> ignore
|
||
|
|
|
||
|
|
try
|
||
|
|
use client = new MemoryStore()
|
||
|
|
check (Store.manifest client "mods.sha256" = "inventory") "inventory"
|
||
|
|
let sample = Path.Combine(root, "sample")
|
||
|
|
File.WriteAllText(sample, "synthetic artifact")
|
||
|
|
let expected = digest sample
|
||
|
|
let path = Path.Combine(root, "object")
|
||
|
|
Store.fetch client "mods/a.jar" expected path
|
||
|
|
check (digest path = expected) "download"
|
||
|
|
check (client.Key = "minecraft/mods/a.jar") "pack key"
|
||
|
|
Store.fetch client "mods/a.jar" expected path
|
||
|
|
check (client.Reads = 2) "cache hit"
|
||
|
|
let rejected =
|
||
|
|
try
|
||
|
|
Store.fetch client "mods/a.jar" (String.replicate 64 "0") path
|
||
|
|
false
|
||
|
|
with :? InvalidOperationException -> true
|
||
|
|
check rejected "wrong checksum accepted"
|
||
|
|
check (digest path = expected) "failed download replaced cache"
|
||
|
|
Store.saltatory client expected (Path.Combine(root, "saltatory.jar"))
|
||
|
|
check (client.Key = "saltatory/" + expected + ".jar") "saltatory key"
|
||
|
|
printfn "store tests passed"
|
||
|
|
finally
|
||
|
|
Directory.Delete(root, true)
|