From 69f073ed99788d6d724690136eb66593783714e8 Mon Sep 17 00:00:00 2001 From: Valentin Delaye Date: Sat, 21 Feb 2026 09:20:30 +0100 Subject: [PATCH] More tests Signed-off-by: Valentin Delaye --- src/main/java/land/oras/utils/Const.java | 5 ++ src/test/java/land/oras/FluxCDITCase.java | 4 - src/test/java/land/oras/HarborS3ITCase.java | 78 +++++++++++++++++++ src/test/java/land/oras/HelmITCase.java | 84 +++++++++++++++++++++ 4 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 src/test/java/land/oras/HelmITCase.java diff --git a/src/main/java/land/oras/utils/Const.java b/src/main/java/land/oras/utils/Const.java index 9b580f7a..dfbe266b 100644 --- a/src/main/java/land/oras/utils/Const.java +++ b/src/main/java/land/oras/utils/Const.java @@ -199,6 +199,11 @@ private Const() { */ public static final String ANNOTATION_TITLE = "org.opencontainers.image.title"; + /** + * Annotation for the description + */ + public static final String ANNOTATION_DESCRIPTION = "org.opencontainers.image.description"; + /** * Annotation for the crated date */ diff --git a/src/test/java/land/oras/FluxCDITCase.java b/src/test/java/land/oras/FluxCDITCase.java index 842c9729..1c31fe39 100644 --- a/src/test/java/land/oras/FluxCDITCase.java +++ b/src/test/java/land/oras/FluxCDITCase.java @@ -29,7 +29,6 @@ import land.oras.utils.Const; import land.oras.utils.ZotUnsecureContainer; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; import org.testcontainers.junit.jupiter.Container; @@ -39,9 +38,6 @@ @Execution(ExecutionMode.CONCURRENT) class FluxCDITCase { - @TempDir - Path tempDir; - @Container private final ZotUnsecureContainer unsecureRegistry = new ZotUnsecureContainer().withStartupAttempts(3); diff --git a/src/test/java/land/oras/HarborS3ITCase.java b/src/test/java/land/oras/HarborS3ITCase.java index 31d5f5ca..c7b347bb 100644 --- a/src/test/java/land/oras/HarborS3ITCase.java +++ b/src/test/java/land/oras/HarborS3ITCase.java @@ -23,6 +23,10 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Map; +import land.oras.utils.Const; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -40,6 +44,80 @@ class HarborS3ITCase { @TempDir Path tempDir; + /** + * This test demonstrate how to assemble a Flux CD OCI Artifact + */ + @Test + void shouldPushHelmArtifact() { + + // The compressed manifests + Path archive = Paths.get("src/test/resources/archives").resolve("jenkins-chart.tgz"); + String configMediaType = "application/vnd.cncf.helm.config.v1+json"; + String contentMediaType = "application/vnd.cncf.helm.chart.content.v1.tar+gzip"; + + Map annotations = Map.of( + Const.ANNOTATION_DESCRIPTION, "Test helm chart", + Const.ANNOTATION_SOURCE, "git@github.com:jonesbusy/oras-java.git", + Const.ANNOTATION_CREATED, Const.currentTimestamp()); + + // Create objects + Config config = Config.empty().withMediaType(configMediaType); + Layer layer = Layer.fromFile(archive).withMediaType(contentMediaType); + Manifest manifest = + Manifest.empty().withConfig(config).withLayers(List.of(layer)).withAnnotations(annotations); + + // Push config, layers and manifest to registry + Registry registry = Registry.builder().defaults().build(); + ContainerRef containerRef = ContainerRef.parse("demo.goharbor.io/oras/chart:0.1.0"); + + registry.pushConfig(containerRef, config); + registry.pushBlob(containerRef, archive); + registry.pushManifest(containerRef, manifest); + + // Ensure we can pull + Manifest createdManifest = registry.getManifest(containerRef); + assertNotNull(createdManifest); + + // We can test pull with helm pull oci://demo.goharbor.io/oras/chart --version 0.1.0 + + } + + @Test + @Disabled + void shouldPushFluxArtifact() { + + // The compressed manifests + Path archive = Paths.get("src/test/resources/archives").resolve("flux-manifests.tgz"); + String configMediaType = "application/vnd.cncf.flux.config.v1+json"; + String contentMediaType = "application/vnd.cncf.flux.content.v1.tar+gzip"; + + Map annotations = Map.of( + Const.ANNOTATION_REVISION, "@sha1:6d63912ed9a9443dd01fbfd2991173a246050079", + Const.ANNOTATION_SOURCE, "git@github.com:jonesbusy/oras-java.git", + Const.ANNOTATION_CREATED, Const.currentTimestamp()); + + // Create objects + Config config = Config.empty().withMediaType(configMediaType); + Layer layer = Layer.fromFile(archive).withMediaType(contentMediaType); + Manifest manifest = + Manifest.empty().withConfig(config).withLayers(List.of(layer)).withAnnotations(annotations); + + // Push config, layers and manifest to registry + Registry registry = Registry.builder().defaults().build(); + ContainerRef containerRef = ContainerRef.parse("demo.goharbor.io/oras/flux:latest"); + + registry.pushConfig(containerRef, config); + registry.pushBlob(containerRef, archive); + registry.pushManifest(containerRef, manifest); + + // Ensure we can pull + Manifest createdManifest = registry.getManifest(containerRef); + assertNotNull(createdManifest); + + // We can test pull with flux pull artifact oci://demo.goharbor.io/oras/flux:latest --output . + + } + @Test @Disabled("Only to test with demo Harbor demo instance") void shouldGetManifest() { diff --git a/src/test/java/land/oras/HelmITCase.java b/src/test/java/land/oras/HelmITCase.java new file mode 100644 index 00000000..631fda11 --- /dev/null +++ b/src/test/java/land/oras/HelmITCase.java @@ -0,0 +1,84 @@ +/*- + * =LICENSE= + * ORAS Java SDK + * === + * Copyright (C) 2024 - 2026 ORAS + * === + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * =LICENSEEND= + */ + +package land.oras; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Map; +import land.oras.utils.Const; +import land.oras.utils.ZotUnsecureContainer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +@Testcontainers +@Execution(ExecutionMode.CONCURRENT) +class HelmITCase { + + @Container + private final ZotUnsecureContainer unsecureRegistry = new ZotUnsecureContainer().withStartupAttempts(3); + + /** + * This test demonstrate how to assemble a Flux CD OCI Artifact + */ + @Test + void shouldAssembleArtifact() { + + // The compressed manifests + Path archive = Paths.get("src/test/resources/archives").resolve("jenkins-chart.tgz"); + String configMediaType = "application/vnd.cncf.helm.config.v1+json"; + String contentMediaType = "application/vnd.cncf.helm.chart.content.v1.tar+gzip"; + + Map annotations = Map.of( + Const.ANNOTATION_DESCRIPTION, "Test helm chart", + Const.ANNOTATION_SOURCE, "git@github.com:jonesbusy/oras-java.git", + Const.ANNOTATION_CREATED, Const.currentTimestamp()); + + // Create objects + Config config = Config.empty().withMediaType(configMediaType); + Layer layer = Layer.fromFile(archive).withMediaType(contentMediaType); + Manifest manifest = + Manifest.empty().withConfig(config).withLayers(List.of(layer)).withAnnotations(annotations); + + // Push config, layers and manifest to registry + Registry registry = Registry.builder() + .insecure() + .withRegistry(unsecureRegistry.getRegistry()) + .build(); + ContainerRef containerRef = ContainerRef.parse("chart:0.1.0"); + + registry.pushConfig(containerRef, config); + registry.pushBlob(containerRef, archive); + registry.pushManifest(containerRef, manifest); + + // Ensure we can pull + Manifest createdManifest = registry.getManifest(containerRef); + assertNotNull(createdManifest); + + // We can test pull with helm pull oci://localhost:/chart --plain-http --version 0.1.0 + + } +}