mirror of https://github.com/cirruslabs/tart.git
90 lines
3.1 KiB
Swift
90 lines
3.1 KiB
Swift
import XCTest
|
|
@testable import tart
|
|
|
|
final class RegistryTests: XCTestCase {
|
|
var registryRunner: RegistryRunner?
|
|
|
|
override func setUp() async throws {
|
|
try await super.setUp()
|
|
|
|
do {
|
|
registryRunner = try await RegistryRunner()
|
|
} catch {
|
|
try XCTSkipIf(ProcessInfo.processInfo.environment["CI"] == nil)
|
|
}
|
|
}
|
|
|
|
override func tearDown() async throws {
|
|
try await super.tearDown()
|
|
|
|
registryRunner = nil
|
|
}
|
|
|
|
var registry: Registry {
|
|
registryRunner!.registry
|
|
}
|
|
|
|
func testPushPullBlobSmall() async throws {
|
|
// Generate a simple blob
|
|
let pushedBlob = Data("The quick brown fox jumps over the lazy dog".utf8)
|
|
|
|
// Push it
|
|
let pushedBlobDigest = try await registry.pushBlob(fromData: pushedBlob)
|
|
XCTAssertEqual("sha256:d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592", pushedBlobDigest)
|
|
|
|
// Pull it
|
|
var pulledBlob = Data()
|
|
try await registry.pullBlob(pushedBlobDigest) { buffer in
|
|
pulledBlob.append(Data(buffer: buffer))
|
|
}
|
|
|
|
// Ensure that both blobs are identical
|
|
XCTAssertEqual(pushedBlob, pulledBlob)
|
|
}
|
|
|
|
func testPushPullBlobHugeInChunks() async throws {
|
|
// Generate a large enough blob
|
|
let fh = FileHandle(forReadingAtPath: "/dev/urandom")!
|
|
let largeBlobToPush = try fh.read(upToCount: 768 * 1024 * 1024)!
|
|
|
|
// Push it
|
|
let largeBlobDigest = try await registry.pushBlob(fromData: largeBlobToPush, chunkSizeMb: 10)
|
|
|
|
// Pull it
|
|
var pulledLargeBlob = Data()
|
|
try await registry.pullBlob(largeBlobDigest) { buffer in
|
|
pulledLargeBlob.append(Data(buffer: buffer))
|
|
}
|
|
|
|
// Ensure that both blobs are identical
|
|
XCTAssertEqual(largeBlobToPush, pulledLargeBlob)
|
|
}
|
|
|
|
func testPushPullManifest() async throws {
|
|
// Craft a basic config
|
|
let configData = try OCIConfig().toJSON()
|
|
let configDigest = try await registry.pushBlob(fromData: configData)
|
|
|
|
// Craft a basic layer
|
|
let layerData = Data("doesn't matter".utf8)
|
|
let layerDigest = try await registry.pushBlob(fromData: layerData)
|
|
|
|
// Craft a basic manifest and push it
|
|
let manifest = OCIManifest(
|
|
config: OCIManifestConfig(size: configData.count, digest: configDigest),
|
|
layers: [
|
|
OCIManifestLayer(mediaType: "application/octet-stream", size: layerData.count, digest: layerDigest)
|
|
]
|
|
)
|
|
let pushedManifestDigest = try await registry.pushManifest(reference: "latest", manifest: manifest)
|
|
|
|
// Ensure that the manifest pulled by tag matches with the one pushed above
|
|
let (pulledByTagManifest, _) = try await registry.pullManifest(reference: "latest")
|
|
XCTAssertEqual(manifest, pulledByTagManifest)
|
|
|
|
// Ensure that the manifest pulled by digest matches with the one pushed above
|
|
let (pulledByDigestManifest, _) = try await registry.pullManifest(reference: "\(pushedManifestDigest)")
|
|
XCTAssertEqual(manifest, pulledByDigestManifest)
|
|
}
|
|
}
|