diff --git a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameDistributionReferenceTest.java b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameDistributionReferenceTest.java
new file mode 100644
index 0000000000..28b26704d9
--- /dev/null
+++ b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameDistributionReferenceTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2019 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at:
+ *
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.jkube.kit.config.image;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+
+/**
+ * Tests ported from Distribution Reference
+ */
+class ImageNameDistributionReferenceTest {
+
+ @ParameterizedTest
+ @ValueSource(strings = {
+ "test.com/foo",
+ "test:8080/foo",
+ "docker.io/library/foo",
+ "test_com",
+ "test.com:tag",
+ "test.com:5000",
+ "test.com/repo:tag",
+ "test:5000/repo",
+ "test:5000/repo:tag",
+ "lowercase:Uppercase",
+ "test:5000/repo@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "test:5000/repo:tag@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "sub-dom1.foo.com/bar/baz/quux",
+ "sub-dom1.foo.com/bar/baz/quux:some-long-tag",
+ "b.gcr.io/test.example.com/my-app:test.example.com",
+ "xn--n3h.com/myimage:xn--n3h.com",
+ //"xn--7o8h.com/myimage:xn--7o8h.com@sha512:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // Digest SHA 512
+ "foo_bar.com:8080",
+ "foo/foo_bar.com:8080",
+ "192.168.1.1",
+ "192.168.1.1:tag",
+ "192.168.1.1:5000",
+ "192.168.1.1/repo",
+ "192.168.1.1:5000/repo",
+ "192.168.1.1:5000/repo:5050",
+ "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a:tag-puts-this-over-max",
+ "docker/docker",
+ "library/debian",
+ "debian",
+ "localhost/library/debian",
+ "localhost/debian",
+ "docker.io/docker/docker",
+ "docker.io/library/debian",
+ "docker.io/debian",
+ "index.docker.io/docker/docker",
+ "index.docker.io/library/debian",
+ "index.docker.io/debian",
+ "127.0.0.1:5000/docker/docker",
+ "127.0.0.1:5000/library/debian",
+ "127.0.0.1:5000/debian",
+ "192.168.0.1",
+ "192.168.0.1:80",
+ "192.168.0.1:8/debian",
+ "192.168.0.2:25000/debian",
+ "docker.io/1a3f5e7d9c1b3a5f7e9d1c3b5a7f9e1d3c5b7a9f1e3d5d7c9b1a3f5e7d9c1b3a",
+ //"[2001:db8::1]/repo", // Ipv6
+ //"[2001:db8:1:2:3:4:5:6]/repo:tag", // Ipv6
+ //"[2001:db8::1]:5000/repo", // Ipv6
+ //"[2001:db8::1]:5000/repo:tag", // Ipv6
+ //"[2001:db8::1]:5000/repo@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // Ipv6
+ //"[2001:db8::1]:5000/repo:tag@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // Ipv6
+ //"[2001:db8::]:5000/repo", // Ipv6
+ //"[::1]:5000/repo", // Ipv6
+ })
+ void validNames(String name) {
+ // Given
+ ImageName imageName = new ImageName(name);
+
+ // When + Then
+ assertThat(imageName).isNotNull();
+ }
+
+ @ParameterizedTest
+ @ValueSource(strings = {
+ "",
+ ":justtag",
+ "@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ //"a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a:tag", // Image Name length exceeding 255
+ //"repo@sha256:ffffffffffffffffffffffffffffffffff", // Invalid digest length
+ "validname@invaliddigest:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "Uppercase:tag",
+ "test:5000/Uppercase/lowercase:tag",
+ "aa/asdf$$^/aa",
+ "[fe80::1%eth0]:5000/repo", // Invalid Ipv6 addresses - these are failing because we only support IPv4 at the moment
+ "[fe80::1%@invalidzone]:5000/repo", // Invalid Ipv6 addresses - these are failing because we only support IPv4 at the moment
+ })
+ void invalidNames(String name) {
+ assertThatIllegalArgumentException().isThrownBy(() -> new ImageName(name));
+ }
+}
diff --git a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameORASReferenceTest.java b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameORASReferenceTest.java
new file mode 100644
index 0000000000..fbe03ae42d
--- /dev/null
+++ b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameORASReferenceTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2019 Red Hat, Inc.
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at:
+ *
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ */
+package org.eclipse.jkube.kit.config.image;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+
+/**
+ * Tests ported from ORAS Reference
+ */
+class ImageNameORASReferenceTest {
+ @ParameterizedTest
+ @ValueSource(strings = {
+ "localhost/hello-world@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
+ "localhost/hello-world:v1",
+ "localhost/hello-world",
+ "registry.example.com/hello-world@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
+ "registry.example.com/hello-world:v1",
+ "registry.example.com/hello-world",
+ "localhost:5000/hello-world@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
+ "localhost:5000/hello-world:v1",
+ "localhost:5000/hello-world",
+ "127.0.0.1:5000/hello-world@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
+ "127.0.0.1:5000/hello-world:v1",
+ "127.0.0.1:5000/hello-world",
+ "localhost/hello-world:v2@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
+ "registry.example.com/hello-world:v2@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
+ "localhost:5000/hello-world:v2@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
+ "127.0.0.1:5000/hello-world:v2@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
+ //"[::1]:5000/hello-world:v1", // IPv6 IP address in registry (works with ORAS)
+ //"registry.example.com/hello-world:@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", // both tag and digest (works with ORAS, tag is dropped)
+ })
+ void validImageNamesCompatibleWithAll(String name) {
+ // Given + When
+ ImageName imageName = new ImageName(name);
+
+ // Then
+ assertThat(imageName).isNotNull();
+ }
+
+ @ParameterizedTest
+ @ValueSource(strings = {
+ "localhost/UPPERCASE/test", // Invalid repo name
+ "localhost:v1/hello-world", // Invalid port
+ "registry.example.com/hello-world:foobar:sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", // Invalid Digest prefix: colon instead of the at sign
+ "registry.example.com/hello-world@@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", // Invalid Digest prefix: double at sign
+ "registry.example.com/hello-world @sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", // Invalid Digest prefix: space
+ //"registry.example.com/foobar@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde" // Invalid Digest (Should fail, but we don't check digest)
+ })
+ void invalidImageNames(String name) {
+ assertThatIllegalArgumentException().isThrownBy(() -> new ImageName(name));
+ }
+}