quorate/services/minecraft/store-tests.fsx

53 lines
2 KiB
Text
Raw Permalink Normal View History

#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)