From 49e2632d034113333f57fdab2a7b8344d3bbb20e Mon Sep 17 00:00:00 2001 From: Eugene Date: Sat, 2 Jan 2021 15:31:17 -0500 Subject: [PATCH 1/2] first commit --- .../client/apimachinery/GroupVersion.java | 24 ++++------ .../kubernetes/client/util/Preconditions.java | 45 ++++++++++++++++++ .../io/kubernetes/client/util/Strings.java | 8 +++- .../client/apimachinery/GroupVersionTest.java | 46 ++++++++++++++----- .../client/util/PreconditionsTest.java | 36 +++++++++++++++ 5 files changed, 130 insertions(+), 29 deletions(-) create mode 100644 util/src/main/java/io/kubernetes/client/util/Preconditions.java create mode 100644 util/src/test/java/io/kubernetes/client/util/PreconditionsTest.java diff --git a/util/src/main/java/io/kubernetes/client/apimachinery/GroupVersion.java b/util/src/main/java/io/kubernetes/client/apimachinery/GroupVersion.java index 7f1ba9ff90..bf32bf366f 100644 --- a/util/src/main/java/io/kubernetes/client/apimachinery/GroupVersion.java +++ b/util/src/main/java/io/kubernetes/client/apimachinery/GroupVersion.java @@ -12,24 +12,24 @@ */ package io.kubernetes.client.apimachinery; +import static io.kubernetes.client.util.Preconditions.precondition; + import io.kubernetes.client.common.KubernetesObject; import io.kubernetes.client.util.Strings; import java.util.Objects; public class GroupVersion { + private static final GroupVersion GROUP_VERSION_V1 = new GroupVersion("", "v1"); + public static GroupVersion parse(String apiVersion) { - if (Strings.isNullOrEmpty(apiVersion)) { - throw new IllegalArgumentException("No apiVersion found on object"); - } if ("v1".equals(apiVersion)) { // legacy api group - return new GroupVersion("", "v1"); + return GROUP_VERSION_V1; } + precondition(apiVersion, Strings::isNullOrEmpty, () -> "apiVersion can not be null"); String[] parts = apiVersion.split("/"); - if (parts.length != 2) { - throw new IllegalArgumentException("Invalid apiVersion found on object: " + apiVersion); - } + precondition(parts, x -> x.length != 2, () -> "Invalid apiVersion: " + apiVersion); return new GroupVersion(parts[0], parts[1]); } @@ -38,14 +38,8 @@ public static GroupVersion parse(KubernetesObject obj) { } public GroupVersion(String group, String version) { - if (group == null) { - throw new IllegalArgumentException("group must not be null"); - } - if (version == null) { - throw new IllegalArgumentException("version must not be null"); - } - this.group = group; - this.version = version; + this.group = precondition(group, Objects::isNull, () -> "group must not be null"); + this.version = precondition(version, Objects::isNull, () -> "version must not be null"); } private final String group; diff --git a/util/src/main/java/io/kubernetes/client/util/Preconditions.java b/util/src/main/java/io/kubernetes/client/util/Preconditions.java new file mode 100644 index 0000000000..6a6b61c60f --- /dev/null +++ b/util/src/main/java/io/kubernetes/client/util/Preconditions.java @@ -0,0 +1,45 @@ +/* +Copyright 2021 The Kubernetes Authors. +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. +*/ +package io.kubernetes.client.util; + +import java.util.function.Predicate; +import java.util.function.Supplier; + +/** + * support for different invariant checks, like for a example a non-null argument being passed to a + * method that does not support nulls. + * + * @author wind57 + */ +public final class Preconditions { + + private Preconditions() { + throw new AssertionError("not supported"); + } + + /** + * @param validate argument to be validated + * @param predicate to check against + * @param errorSupplier the error message generator + * @param + * @return T if Predicate does not match + * @throws IllegalArgumentException if predicate returns true + */ + public static T precondition( + T validate, Predicate predicate, Supplier errorSupplier) { + if (predicate.test(validate)) { + throw new IllegalArgumentException(errorSupplier.get()); + } + return validate; + } +} diff --git a/util/src/main/java/io/kubernetes/client/util/Strings.java b/util/src/main/java/io/kubernetes/client/util/Strings.java index d55bb558bc..18b3343cbd 100644 --- a/util/src/main/java/io/kubernetes/client/util/Strings.java +++ b/util/src/main/java/io/kubernetes/client/util/Strings.java @@ -14,10 +14,14 @@ import javax.annotation.Nullable; -public class Strings { +public final class Strings { + + private Strings() { + throw new AssertionError("not supported"); + } public static boolean isNullOrEmpty(String value) { - return value == null || value.length() == 0; + return value == null || value.isEmpty(); } public static String nullToEmpty(@Nullable String string) { diff --git a/util/src/test/java/io/kubernetes/client/apimachinery/GroupVersionTest.java b/util/src/test/java/io/kubernetes/client/apimachinery/GroupVersionTest.java index ec26216a26..61a9d0861e 100644 --- a/util/src/test/java/io/kubernetes/client/apimachinery/GroupVersionTest.java +++ b/util/src/test/java/io/kubernetes/client/apimachinery/GroupVersionTest.java @@ -12,6 +12,8 @@ */ package io.kubernetes.client.apimachinery; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.*; import io.kubernetes.client.openapi.models.V1Deployment; @@ -21,17 +23,37 @@ public class GroupVersionTest { @Test - public void parse() { - assertEquals(new GroupVersion("", "v1"), GroupVersion.parse(new V1Pod().apiVersion("v1"))); - assertEquals( - new GroupVersion("apps", "v1"), - GroupVersion.parse(new V1Deployment().apiVersion("apps/v1"))); - assertThrows( - IllegalArgumentException.class, - () -> { - GroupVersion.parse(new V1Pod()); - GroupVersion.parse(new V1Pod().apiVersion(null)); - GroupVersion.parse(new V1Pod().apiVersion("foo/bar/f")); - }); + public void parseV1() { + GroupVersion left = new GroupVersion("", "v1"); + GroupVersion right = GroupVersion.parse(new V1Pod().apiVersion("v1")); + assertThat(left).isEqualTo(right); + } + + @Test + public void parseAppsV1() { + GroupVersion left = new GroupVersion("apps", "v1"); + GroupVersion right = GroupVersion.parse(new V1Deployment().apiVersion("apps/v1")); + assertThat(left).isEqualTo(right); + } + + @Test + public void parseInvalid1() { + assertThatThrownBy(() -> GroupVersion.parse(new V1Pod())) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("apiVersion can not be null"); + } + + @Test + public void parseInvalid2() { + assertThatThrownBy(() -> GroupVersion.parse(new V1Pod().apiVersion(null))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("apiVersion can not be null"); + } + + @Test + public void parseInvalid3() { + assertThatThrownBy(() -> GroupVersion.parse(new V1Pod().apiVersion("foo/bar/f"))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Invalid apiVersion: foo/bar/f"); } } diff --git a/util/src/test/java/io/kubernetes/client/util/PreconditionsTest.java b/util/src/test/java/io/kubernetes/client/util/PreconditionsTest.java new file mode 100644 index 0000000000..3a415e6772 --- /dev/null +++ b/util/src/test/java/io/kubernetes/client/util/PreconditionsTest.java @@ -0,0 +1,36 @@ +/* +Copyright 2021 The Kubernetes Authors. +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. +*/ +package io.kubernetes.client.util; + +import static io.kubernetes.client.util.Preconditions.precondition; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.assertj.core.api.Assertions; +import org.junit.Test; + +public class PreconditionsTest { + + @Test + public void testEmptyString() { + assertThatThrownBy( + () -> precondition("", Strings::isNullOrEmpty, () -> "string can not be empty")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("string can not be empty"); + } + + @Test + public void testNonEmptyString() { + String abc = precondition("abc", Strings::isNullOrEmpty, () -> "string can not be empty"); + Assertions.assertThat(abc).isEqualTo("abc"); + } +} From fa4c16d7bef6a6224fe508b682e291a5b93725f0 Mon Sep 17 00:00:00 2001 From: Eugene Date: Sat, 2 Jan 2021 20:45:09 -0500 Subject: [PATCH 2/2] PECS in place --- util/src/main/java/io/kubernetes/client/util/Preconditions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/src/main/java/io/kubernetes/client/util/Preconditions.java b/util/src/main/java/io/kubernetes/client/util/Preconditions.java index 6a6b61c60f..51b19c4ca2 100644 --- a/util/src/main/java/io/kubernetes/client/util/Preconditions.java +++ b/util/src/main/java/io/kubernetes/client/util/Preconditions.java @@ -36,7 +36,7 @@ private Preconditions() { * @throws IllegalArgumentException if predicate returns true */ public static T precondition( - T validate, Predicate predicate, Supplier errorSupplier) { + T validate, Predicate predicate, Supplier errorSupplier) { if (predicate.test(validate)) { throw new IllegalArgumentException(errorSupplier.get()); }