From 493aaa006a7792d3e06d2676626c84c0e7f68a33 Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Tue, 4 Jul 2023 11:55:49 +0200 Subject: [PATCH 1/4] Remove testing for JDK 11 and move to 17 as a target Airlift and Trino are using JDK 17 as a minimum required version, which makes testing on 11 no longer needed. --- .github/workflows/ci.yml | 1 - pom.xml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e48c2b..1d86223 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,6 @@ jobs: fail-fast: false matrix: java-version: - - 11 - 17 steps: - uses: actions/checkout@v1 diff --git a/pom.xml b/pom.xml index afe17db..d76c0d6 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ true true -missing - 11 + 17 From 2d43044fd963704e6f0586a7245c56f44a1f26f8 Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Tue, 27 Jun 2023 08:51:31 +0200 Subject: [PATCH 2/4] Migrate units validation to jakarta --- pom.xml | 12 +++--- src/main/java/io/airlift/units/DataSize.java | 2 + .../java/io/airlift/units/MaxDataSize.java | 4 +- .../airlift/units/MaxDataSizeValidator.java | 4 +- .../java/io/airlift/units/MaxDuration.java | 4 +- .../airlift/units/MaxDurationValidator.java | 4 +- .../java/io/airlift/units/MinDataSize.java | 4 +- .../airlift/units/MinDataSizeValidator.java | 4 +- .../java/io/airlift/units/MinDuration.java | 4 +- .../airlift/units/MinDurationValidator.java | 4 +- .../units/ConstraintValidatorAssert.java | 7 ++-- .../io/airlift/units/MockMaxDataSize.java | 2 +- .../io/airlift/units/MockMaxDuration.java | 2 +- .../io/airlift/units/MockMinDataSize.java | 2 +- .../io/airlift/units/MockMinDuration.java | 2 +- .../airlift/units/TestDataSizeValidator.java | 39 ++++++++++++------- .../airlift/units/TestDurationValidator.java | 37 +++++++++++------- 17 files changed, 80 insertions(+), 57 deletions(-) diff --git a/pom.xml b/pom.xml index d76c0d6..8493019 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.airlift airbase - 129 + 143 2016 @@ -38,8 +38,8 @@ - javax.validation - validation-api + jakarta.validation + jakarta.validation-api true @@ -78,13 +78,13 @@ io.airlift json - 218 + 233 test - org.apache.bval - bval-jsr + org.hibernate.validator + hibernate-validator test diff --git a/src/main/java/io/airlift/units/DataSize.java b/src/main/java/io/airlift/units/DataSize.java index 60f9781..b765386 100644 --- a/src/main/java/io/airlift/units/DataSize.java +++ b/src/main/java/io/airlift/units/DataSize.java @@ -79,6 +79,7 @@ public static DataSize succinctBytes(long bytes) /** * Prefer {@link DataSize#of(long, Unit)} when conversion to the most 'succinct' unit is not necessary or desirable. * Otherwise, use {@link DataSize#succinctBytes(long)} since it will not incur rounding and loss of precision. + * * @deprecated use {@link DataSize#succinctBytes(long)} instead, double values are imprecise */ @Deprecated @@ -93,6 +94,7 @@ public static DataSize succinctDataSize(double size, Unit unit) /** * Private constructor to avoid confusing usage sites with having to pass a number of bytes * alongside non-bytes unit + * * @param bytes The number of bytes, regardless of unit * @param unit The preferred display unit of this value */ diff --git a/src/main/java/io/airlift/units/MaxDataSize.java b/src/main/java/io/airlift/units/MaxDataSize.java index a39745a..b6ea6b6 100644 --- a/src/main/java/io/airlift/units/MaxDataSize.java +++ b/src/main/java/io/airlift/units/MaxDataSize.java @@ -13,8 +13,8 @@ */ package io.airlift.units; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/src/main/java/io/airlift/units/MaxDataSizeValidator.java b/src/main/java/io/airlift/units/MaxDataSizeValidator.java index e71b9a7..e396b54 100644 --- a/src/main/java/io/airlift/units/MaxDataSizeValidator.java +++ b/src/main/java/io/airlift/units/MaxDataSizeValidator.java @@ -13,8 +13,8 @@ */ package io.airlift.units; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; public class MaxDataSizeValidator implements ConstraintValidator diff --git a/src/main/java/io/airlift/units/MaxDuration.java b/src/main/java/io/airlift/units/MaxDuration.java index 223aa3d..fc21259 100644 --- a/src/main/java/io/airlift/units/MaxDuration.java +++ b/src/main/java/io/airlift/units/MaxDuration.java @@ -15,8 +15,8 @@ */ package io.airlift.units; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/src/main/java/io/airlift/units/MaxDurationValidator.java b/src/main/java/io/airlift/units/MaxDurationValidator.java index f27b964..9d10a36 100644 --- a/src/main/java/io/airlift/units/MaxDurationValidator.java +++ b/src/main/java/io/airlift/units/MaxDurationValidator.java @@ -15,8 +15,8 @@ */ package io.airlift.units; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; public class MaxDurationValidator implements ConstraintValidator diff --git a/src/main/java/io/airlift/units/MinDataSize.java b/src/main/java/io/airlift/units/MinDataSize.java index 6f9c5ca..16ce4af 100644 --- a/src/main/java/io/airlift/units/MinDataSize.java +++ b/src/main/java/io/airlift/units/MinDataSize.java @@ -13,8 +13,8 @@ */ package io.airlift.units; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/src/main/java/io/airlift/units/MinDataSizeValidator.java b/src/main/java/io/airlift/units/MinDataSizeValidator.java index 7251939..0059d56 100644 --- a/src/main/java/io/airlift/units/MinDataSizeValidator.java +++ b/src/main/java/io/airlift/units/MinDataSizeValidator.java @@ -13,8 +13,8 @@ */ package io.airlift.units; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; public class MinDataSizeValidator implements ConstraintValidator diff --git a/src/main/java/io/airlift/units/MinDuration.java b/src/main/java/io/airlift/units/MinDuration.java index a080d08..a3462dc 100644 --- a/src/main/java/io/airlift/units/MinDuration.java +++ b/src/main/java/io/airlift/units/MinDuration.java @@ -15,8 +15,8 @@ */ package io.airlift.units; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/src/main/java/io/airlift/units/MinDurationValidator.java b/src/main/java/io/airlift/units/MinDurationValidator.java index 28cb3dd..d943bd4 100644 --- a/src/main/java/io/airlift/units/MinDurationValidator.java +++ b/src/main/java/io/airlift/units/MinDurationValidator.java @@ -15,8 +15,8 @@ */ package io.airlift.units; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; public class MinDurationValidator implements ConstraintValidator diff --git a/src/test/java/io/airlift/units/ConstraintValidatorAssert.java b/src/test/java/io/airlift/units/ConstraintValidatorAssert.java index 9625a89..94ec558 100644 --- a/src/test/java/io/airlift/units/ConstraintValidatorAssert.java +++ b/src/test/java/io/airlift/units/ConstraintValidatorAssert.java @@ -13,12 +13,11 @@ */ package io.airlift.units; +import jakarta.validation.ClockProvider; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.assertj.core.api.AbstractAssert; -import javax.validation.ClockProvider; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; - import java.lang.annotation.Annotation; final class ConstraintValidatorAssert diff --git a/src/test/java/io/airlift/units/MockMaxDataSize.java b/src/test/java/io/airlift/units/MockMaxDataSize.java index 07c5651..a204729 100644 --- a/src/test/java/io/airlift/units/MockMaxDataSize.java +++ b/src/test/java/io/airlift/units/MockMaxDataSize.java @@ -13,7 +13,7 @@ */ package io.airlift.units; -import javax.validation.Payload; +import jakarta.validation.Payload; import java.lang.annotation.Annotation; diff --git a/src/test/java/io/airlift/units/MockMaxDuration.java b/src/test/java/io/airlift/units/MockMaxDuration.java index bba5dc2..dd8bea8 100644 --- a/src/test/java/io/airlift/units/MockMaxDuration.java +++ b/src/test/java/io/airlift/units/MockMaxDuration.java @@ -15,7 +15,7 @@ */ package io.airlift.units; -import javax.validation.Payload; +import jakarta.validation.Payload; import java.lang.annotation.Annotation; diff --git a/src/test/java/io/airlift/units/MockMinDataSize.java b/src/test/java/io/airlift/units/MockMinDataSize.java index 591a6c9..3d58611 100644 --- a/src/test/java/io/airlift/units/MockMinDataSize.java +++ b/src/test/java/io/airlift/units/MockMinDataSize.java @@ -13,7 +13,7 @@ */ package io.airlift.units; -import javax.validation.Payload; +import jakarta.validation.Payload; import java.lang.annotation.Annotation; diff --git a/src/test/java/io/airlift/units/MockMinDuration.java b/src/test/java/io/airlift/units/MockMinDuration.java index a20e682..2b3b470 100644 --- a/src/test/java/io/airlift/units/MockMinDuration.java +++ b/src/test/java/io/airlift/units/MockMinDuration.java @@ -15,7 +15,7 @@ */ package io.airlift.units; -import javax.validation.Payload; +import jakarta.validation.Payload; import java.lang.annotation.Annotation; diff --git a/src/test/java/io/airlift/units/TestDataSizeValidator.java b/src/test/java/io/airlift/units/TestDataSizeValidator.java index c239c56..08d2d03 100644 --- a/src/test/java/io/airlift/units/TestDataSizeValidator.java +++ b/src/test/java/io/airlift/units/TestDataSizeValidator.java @@ -13,14 +13,14 @@ */ package io.airlift.units; -import org.apache.bval.jsr.ApacheValidationProvider; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.ValidationException; +import jakarta.validation.Validator; +import org.hibernate.validator.HibernateValidator; +import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; import org.testng.annotations.Test; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.ValidationException; -import javax.validation.Validator; - import java.util.Optional; import java.util.Set; @@ -34,7 +34,14 @@ public class TestDataSizeValidator { - private static final Validator VALIDATOR = Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory().getValidator(); + private static final Validator VALIDATOR = Validation.byProvider(HibernateValidator.class) + .configure() + // Disable classpath scanning for configuration for security reasons + .ignoreXmlConfiguration() + // Disable default message interpolation which scans classpath and required runtime dependency + .messageInterpolator(new ParameterMessageInterpolator()) + .buildValidatorFactory() + .getValidator(); @Test public void testMaxDataSizeValidator() @@ -82,17 +89,19 @@ public void testDetectsBrokenMinAnnotation() { assertThatThrownBy(() -> VALIDATOR.validate(new BrokenMinAnnotation())) .isInstanceOf(ValidationException.class) + .hasMessage("HV000032: Unable to initialize io.airlift.units.MinDataSizeValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) - .hasMessage("java.lang.IllegalArgumentException: size is not a valid data size string: broken"); + .hasRootCauseMessage("size is not a valid data size string: broken"); assertThatThrownBy(() -> VALIDATOR.validate(new MinAnnotationOnOptional())) .isInstanceOf(ValidationException.class) - .hasMessage("No validator found for (composition) constraint @MinDataSize declared on \"public java.util.Optional io.airlift.units.TestDataSizeValidator$MinAnnotationOnOptional.getConstrainedByMin()\" for validated type \"java.util.Optional\""); + .hasMessageContaining("No validator could be found for constraint 'io.airlift.units.MinDataSize' validating type 'java.util.Optional'. Check configuration for 'constrainedByMin'"); assertThatThrownBy(() -> VALIDATOR.validate(new BrokenOptionalMinAnnotation())) .isInstanceOf(ValidationException.class) + .hasMessage("HV000032: Unable to initialize io.airlift.units.MinDataSizeValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) - .hasMessage("java.lang.IllegalArgumentException: size is not a valid data size string: broken"); + .hasRootCauseMessage("size is not a valid data size string: broken"); } @Test @@ -100,17 +109,19 @@ public void testDetectsBrokenMaxAnnotation() { assertThatThrownBy(() -> VALIDATOR.validate(new BrokenMaxAnnotation())) .isInstanceOf(ValidationException.class) + .hasMessage("HV000032: Unable to initialize io.airlift.units.MaxDataSizeValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) - .hasMessage("java.lang.IllegalArgumentException: size is not a valid data size string: broken"); + .hasRootCauseMessage("size is not a valid data size string: broken"); assertThatThrownBy(() -> VALIDATOR.validate(new MaxAnnotationOnOptional())) .isInstanceOf(ValidationException.class) - .hasMessage("No validator found for (composition) constraint @MaxDataSize declared on \"public java.util.Optional io.airlift.units.TestDataSizeValidator$MaxAnnotationOnOptional.getConstrainedByMin()\" for validated type \"java.util.Optional\""); + .hasMessageContaining("No validator could be found for constraint 'io.airlift.units.MaxDataSize' validating type 'java.util.Optional'. Check configuration for 'constrainedByMin'"); assertThatThrownBy(() -> VALIDATOR.validate(new BrokenOptionalMaxAnnotation())) .isInstanceOf(ValidationException.class) + .hasMessage("HV000032: Unable to initialize io.airlift.units.MaxDataSizeValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) - .hasMessage("java.lang.IllegalArgumentException: size is not a valid data size string: broken"); + .hasRootCauseMessage("size is not a valid data size string: broken"); } @Test @@ -270,7 +281,7 @@ public DataSize getConstrainedByMin() public static class BrokenMaxAnnotation { @SuppressWarnings("UnusedDeclaration") - @MinDataSize("broken") + @MaxDataSize("broken") public DataSize getConstrainedByMin() { return new DataSize(32, KILOBYTE); diff --git a/src/test/java/io/airlift/units/TestDurationValidator.java b/src/test/java/io/airlift/units/TestDurationValidator.java index f8caa27..8769af2 100644 --- a/src/test/java/io/airlift/units/TestDurationValidator.java +++ b/src/test/java/io/airlift/units/TestDurationValidator.java @@ -15,14 +15,14 @@ */ package io.airlift.units; -import org.apache.bval.jsr.ApacheValidationProvider; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.ValidationException; +import jakarta.validation.Validator; +import org.hibernate.validator.HibernateValidator; +import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; import org.testng.annotations.Test; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.ValidationException; -import javax.validation.Validator; - import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -33,7 +33,14 @@ public class TestDurationValidator { - private static final Validator VALIDATOR = Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory().getValidator(); + private static final Validator VALIDATOR = Validation.byProvider(HibernateValidator.class) + .configure() + // Disable classpath scanning for configuration for security reasons + .ignoreXmlConfiguration() + // Disable default message interpolation which scans classpath and required runtime dependency + .messageInterpolator(new ParameterMessageInterpolator()) + .buildValidatorFactory() + .getValidator(); @Test public void testMaxDurationValidator() @@ -74,17 +81,19 @@ public void testDetectsBrokenMinAnnotation() { assertThatThrownBy(() -> VALIDATOR.validate(new BrokenMinAnnotation())) .isInstanceOf(ValidationException.class) + .hasMessage("HV000032: Unable to initialize io.airlift.units.MinDurationValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) - .hasMessage("java.lang.IllegalArgumentException: duration is not a valid data duration string: broken"); + .hasRootCauseMessage("duration is not a valid data duration string: broken"); assertThatThrownBy(() -> VALIDATOR.validate(new MinAnnotationOnOptional())) .isInstanceOf(ValidationException.class) - .hasMessage("No validator found for (composition) constraint @MinDuration declared on \"public java.util.Optional io.airlift.units.TestDurationValidator$MinAnnotationOnOptional.getConstrainedByMin()\" for validated type \"java.util.Optional\""); + .hasMessageContaining("No validator could be found for constraint 'io.airlift.units.MinDuration' validating type 'java.util.Optional'. Check configuration for 'constrainedByMin'"); assertThatThrownBy(() -> VALIDATOR.validate(new BrokenOptionalMinAnnotation())) .isInstanceOf(ValidationException.class) + .hasMessage("HV000032: Unable to initialize io.airlift.units.MinDurationValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) - .hasMessage("java.lang.IllegalArgumentException: duration is not a valid data duration string: broken"); + .hasRootCauseMessage("duration is not a valid data duration string: broken"); } @Test @@ -92,17 +101,19 @@ public void testDetectsBrokenMaxAnnotation() { assertThatThrownBy(() -> VALIDATOR.validate(new BrokenMaxAnnotation())) .isInstanceOf(ValidationException.class) + .hasMessage("HV000032: Unable to initialize io.airlift.units.MinDurationValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) - .hasMessage("java.lang.IllegalArgumentException: duration is not a valid data duration string: broken"); + .hasRootCauseMessage("duration is not a valid data duration string: broken"); assertThatThrownBy(() -> VALIDATOR.validate(new MaxAnnotationOnOptional())) .isInstanceOf(ValidationException.class) - .hasMessage("No validator found for (composition) constraint @MaxDuration declared on \"public java.util.Optional io.airlift.units.TestDurationValidator$MaxAnnotationOnOptional.getConstrainedByMin()\" for validated type \"java.util.Optional\""); + .hasMessageContaining("No validator could be found for constraint 'io.airlift.units.MaxDuration' validating type 'java.util.Optional'. Check configuration for 'constrainedByMin'"); assertThatThrownBy(() -> VALIDATOR.validate(new BrokenOptionalMaxAnnotation())) .isInstanceOf(ValidationException.class) + .hasMessage("HV000032: Unable to initialize io.airlift.units.MaxDurationValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) - .hasMessage("java.lang.IllegalArgumentException: duration is not a valid data duration string: broken"); + .hasRootCauseMessage("duration is not a valid data duration string: broken"); } @Test From c062b73e72dc74d8e1cff1ad01dccc80c6c65592 Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Mon, 3 Jul 2023 11:28:21 +0200 Subject: [PATCH 3/4] Migrate tests to ValidationAssertions --- pom.xml | 4 +- .../airlift/units/TestDataSizeValidator.java | 102 +++++------------- .../airlift/units/TestDurationValidator.java | 101 +++++------------ 3 files changed, 50 insertions(+), 157 deletions(-) diff --git a/pom.xml b/pom.xml index 8493019..bce5ff5 100644 --- a/pom.xml +++ b/pom.xml @@ -71,14 +71,14 @@ io.airlift testing - 218 + 234 test io.airlift json - 233 + 234 test diff --git a/src/test/java/io/airlift/units/TestDataSizeValidator.java b/src/test/java/io/airlift/units/TestDataSizeValidator.java index 08d2d03..6729689 100644 --- a/src/test/java/io/airlift/units/TestDataSizeValidator.java +++ b/src/test/java/io/airlift/units/TestDataSizeValidator.java @@ -13,36 +13,21 @@ */ package io.airlift.units; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.Validation; import jakarta.validation.ValidationException; -import jakarta.validation.Validator; -import org.hibernate.validator.HibernateValidator; -import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; import org.testng.annotations.Test; import java.util.Optional; -import java.util.Set; +import static io.airlift.testing.ValidationAssertions.assertFailsValidation; +import static io.airlift.testing.ValidationAssertions.assertValidates; import static io.airlift.units.ConstraintValidatorAssert.assertThat; import static io.airlift.units.DataSize.Unit.GIGABYTE; import static io.airlift.units.DataSize.Unit.KILOBYTE; import static io.airlift.units.DataSize.Unit.MEGABYTE; -import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.testng.Assert.assertTrue; public class TestDataSizeValidator { - private static final Validator VALIDATOR = Validation.byProvider(HibernateValidator.class) - .configure() - // Disable classpath scanning for configuration for security reasons - .ignoreXmlConfiguration() - // Disable default message interpolation which scans classpath and required runtime dependency - .messageInterpolator(new ParameterMessageInterpolator()) - .buildValidatorFactory() - .getValidator(); - @Test public void testMaxDataSizeValidator() { @@ -75,29 +60,29 @@ public void testMinDataSizeValidator() @Test public void testAllowsNullMinAnnotation() { - VALIDATOR.validate(new NullMinAnnotation()); + assertValidates(new NullMinAnnotation()); } @Test public void testAllowsNullMaxAnnotation() { - VALIDATOR.validate(new NullMaxAnnotation()); + assertValidates(new NullMaxAnnotation()); } @Test public void testDetectsBrokenMinAnnotation() { - assertThatThrownBy(() -> VALIDATOR.validate(new BrokenMinAnnotation())) + assertThatThrownBy(() -> assertValidates(new BrokenMinAnnotation())) .isInstanceOf(ValidationException.class) .hasMessage("HV000032: Unable to initialize io.airlift.units.MinDataSizeValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) .hasRootCauseMessage("size is not a valid data size string: broken"); - assertThatThrownBy(() -> VALIDATOR.validate(new MinAnnotationOnOptional())) + assertThatThrownBy(() -> assertValidates(new MinAnnotationOnOptional())) .isInstanceOf(ValidationException.class) .hasMessageContaining("No validator could be found for constraint 'io.airlift.units.MinDataSize' validating type 'java.util.Optional'. Check configuration for 'constrainedByMin'"); - assertThatThrownBy(() -> VALIDATOR.validate(new BrokenOptionalMinAnnotation())) + assertThatThrownBy(() -> assertValidates(new BrokenOptionalMinAnnotation())) .isInstanceOf(ValidationException.class) .hasMessage("HV000032: Unable to initialize io.airlift.units.MinDataSizeValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) @@ -107,17 +92,17 @@ public void testDetectsBrokenMinAnnotation() @Test public void testDetectsBrokenMaxAnnotation() { - assertThatThrownBy(() -> VALIDATOR.validate(new BrokenMaxAnnotation())) + assertThatThrownBy(() -> assertValidates(new BrokenMaxAnnotation())) .isInstanceOf(ValidationException.class) .hasMessage("HV000032: Unable to initialize io.airlift.units.MaxDataSizeValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) .hasRootCauseMessage("size is not a valid data size string: broken"); - assertThatThrownBy(() -> VALIDATOR.validate(new MaxAnnotationOnOptional())) + assertThatThrownBy(() -> assertValidates(new MaxAnnotationOnOptional())) .isInstanceOf(ValidationException.class) .hasMessageContaining("No validator could be found for constraint 'io.airlift.units.MaxDataSize' validating type 'java.util.Optional'. Check configuration for 'constrainedByMin'"); - assertThatThrownBy(() -> VALIDATOR.validate(new BrokenOptionalMaxAnnotation())) + assertThatThrownBy(() -> assertValidates(new BrokenOptionalMaxAnnotation())) .isInstanceOf(ValidationException.class) .hasMessage("HV000032: Unable to initialize io.airlift.units.MaxDataSizeValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) @@ -127,69 +112,30 @@ public void testDetectsBrokenMaxAnnotation() @Test public void testPassesValidation() { - assertTrue(VALIDATOR.validate(new ConstrainedDataSize(new DataSize(7, MEGABYTE))).isEmpty()); - - assertThat(VALIDATOR.validate(new ConstrainedOptionalDataSize(Optional.of(new DataSize(7, MEGABYTE))))).isEmpty(); - - assertThat(VALIDATOR.validate(new ConstrainedOptionalDataSize(Optional.empty()))).isEmpty(); - - assertThat(VALIDATOR.validate(new ConstrainedOptionalDataSize(null))).isEmpty(); + assertValidates(new ConstrainedDataSize(new DataSize(7, MEGABYTE))); + assertValidates(new ConstrainedOptionalDataSize(Optional.of(new DataSize(7, MEGABYTE)))); + assertValidates(new ConstrainedOptionalDataSize(Optional.empty())); + assertValidates(new ConstrainedOptionalDataSize(null)); } @Test public void testFailsMaxDataSizeConstraint() { - Set> violations = VALIDATOR.validate(new ConstrainedDataSize(new DataSize(11, MEGABYTE))); - assertThat(violations).hasSize(2); - assertThat(violations) - .extracting(violation -> violation.getConstraintDescriptor().getAnnotation()) - .allMatch(MaxDataSize.class::isInstance); - assertThat(violations) - .extracting(violation -> violation.getPropertyPath().toString()) - .containsOnly("constrainedByMax", "constrainedByMinAndMax"); - assertThat(violations) - .extracting(ConstraintViolation::getMessage) - .containsOnly("must be less than or equal to 10000kB", "must be less than or equal to 10MB"); - - violations = VALIDATOR.validate(new ConstrainedOptionalDataSize(Optional.of(new DataSize(11, MEGABYTE)))); - assertThat(violations).hasSize(2); - assertThat(violations) - .extracting(violation -> violation.getConstraintDescriptor().getAnnotation()) - .allMatch(MaxDataSize.class::isInstance); - assertThat(violations) - .extracting(violation -> violation.getPropertyPath().toString()) - .containsOnly("constrainedByMax", "constrainedByMinAndMax"); - assertThat(violations) - .extracting(ConstraintViolation::getMessage) - .containsOnly("must be less than or equal to 10000kB", "must be less than or equal to 10MB"); + assertFailsValidation(new ConstrainedDataSize(new DataSize(11, MEGABYTE)), "constrainedByMinAndMax", "must be less than or equal to 10000kB", MaxDataSize.class); + assertFailsValidation(new ConstrainedDataSize(new DataSize(11, MEGABYTE)), "constrainedByMax", "must be less than or equal to 10MB", MaxDataSize.class); + + assertFailsValidation(new ConstrainedOptionalDataSize(Optional.of(new DataSize(11, MEGABYTE))), "constrainedByMinAndMax", "must be less than or equal to 10000kB", MaxDataSize.class); + assertFailsValidation(new ConstrainedOptionalDataSize(Optional.of(new DataSize(11, MEGABYTE))), "constrainedByMax", "must be less than or equal to 10MB", MaxDataSize.class); } @Test public void testFailsMinDataSizeConstraint() { - Set> violations = VALIDATOR.validate(new ConstrainedDataSize(new DataSize(1, MEGABYTE))); - assertThat(violations).hasSize(2); - assertThat(violations) - .extracting(violation -> violation.getConstraintDescriptor().getAnnotation()) - .allMatch(MinDataSize.class::isInstance); - assertThat(violations) - .extracting(violation -> violation.getPropertyPath().toString()) - .containsOnly("constrainedByMin", "constrainedByMinAndMax"); - assertThat(violations) - .extracting(ConstraintViolation::getMessage) - .containsOnly("must be greater than or equal to 5MB", "must be greater than or equal to 5000kB"); - - violations = VALIDATOR.validate(new ConstrainedOptionalDataSize(Optional.of(new DataSize(1, MEGABYTE)))); - assertThat(violations).hasSize(2); - assertThat(violations) - .extracting(violation -> violation.getConstraintDescriptor().getAnnotation()) - .allMatch(MinDataSize.class::isInstance); - assertThat(violations) - .extracting(violation -> violation.getPropertyPath().toString()) - .containsOnly("constrainedByMin", "constrainedByMinAndMax"); - assertThat(violations) - .extracting(ConstraintViolation::getMessage) - .containsOnly("must be greater than or equal to 5MB", "must be greater than or equal to 5000kB"); + assertFailsValidation(new ConstrainedDataSize(new DataSize(1, MEGABYTE)), "constrainedByMin", "must be greater than or equal to 5MB", MinDataSize.class); + assertFailsValidation(new ConstrainedDataSize(new DataSize(1, MEGABYTE)), "constrainedByMinAndMax", "must be greater than or equal to 5000kB", MinDataSize.class); + + assertFailsValidation(new ConstrainedOptionalDataSize(Optional.of(new DataSize(1, MEGABYTE))), "constrainedByMin", "must be greater than or equal to 5MB", MinDataSize.class); + assertFailsValidation(new ConstrainedOptionalDataSize(Optional.of(new DataSize(1, MEGABYTE))), "constrainedByMinAndMax", "must be greater than or equal to 5000kB", MinDataSize.class); } @SuppressWarnings("UnusedDeclaration") diff --git a/src/test/java/io/airlift/units/TestDurationValidator.java b/src/test/java/io/airlift/units/TestDurationValidator.java index 8769af2..c97d65a 100644 --- a/src/test/java/io/airlift/units/TestDurationValidator.java +++ b/src/test/java/io/airlift/units/TestDurationValidator.java @@ -15,33 +15,19 @@ */ package io.airlift.units; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.Validation; import jakarta.validation.ValidationException; -import jakarta.validation.Validator; -import org.hibernate.validator.HibernateValidator; -import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; import org.testng.annotations.Test; import java.util.Optional; -import java.util.Set; import java.util.concurrent.TimeUnit; +import static io.airlift.testing.ValidationAssertions.assertFailsValidation; +import static io.airlift.testing.ValidationAssertions.assertValidates; import static io.airlift.units.ConstraintValidatorAssert.assertThat; -import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; public class TestDurationValidator { - private static final Validator VALIDATOR = Validation.byProvider(HibernateValidator.class) - .configure() - // Disable classpath scanning for configuration for security reasons - .ignoreXmlConfiguration() - // Disable default message interpolation which scans classpath and required runtime dependency - .messageInterpolator(new ParameterMessageInterpolator()) - .buildValidatorFactory() - .getValidator(); - @Test public void testMaxDurationValidator() { @@ -67,29 +53,29 @@ public void testMinDurationValidator() @Test public void testAllowsNullMinAnnotation() { - VALIDATOR.validate(new NullMinAnnotation()); + assertValidates(new NullMinAnnotation()); } @Test public void testAllowsNullMaxAnnotation() { - VALIDATOR.validate(new NullMaxAnnotation()); + assertValidates(new NullMaxAnnotation()); } @Test public void testDetectsBrokenMinAnnotation() { - assertThatThrownBy(() -> VALIDATOR.validate(new BrokenMinAnnotation())) + assertThatThrownBy(() -> assertValidates(new BrokenMinAnnotation())) .isInstanceOf(ValidationException.class) .hasMessage("HV000032: Unable to initialize io.airlift.units.MinDurationValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) .hasRootCauseMessage("duration is not a valid data duration string: broken"); - assertThatThrownBy(() -> VALIDATOR.validate(new MinAnnotationOnOptional())) + assertThatThrownBy(() -> assertValidates(new MinAnnotationOnOptional())) .isInstanceOf(ValidationException.class) .hasMessageContaining("No validator could be found for constraint 'io.airlift.units.MinDuration' validating type 'java.util.Optional'. Check configuration for 'constrainedByMin'"); - assertThatThrownBy(() -> VALIDATOR.validate(new BrokenOptionalMinAnnotation())) + assertThatThrownBy(() -> assertValidates(new BrokenOptionalMinAnnotation())) .isInstanceOf(ValidationException.class) .hasMessage("HV000032: Unable to initialize io.airlift.units.MinDurationValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) @@ -99,17 +85,17 @@ public void testDetectsBrokenMinAnnotation() @Test public void testDetectsBrokenMaxAnnotation() { - assertThatThrownBy(() -> VALIDATOR.validate(new BrokenMaxAnnotation())) + assertThatThrownBy(() -> assertValidates(new BrokenMaxAnnotation())) .isInstanceOf(ValidationException.class) .hasMessage("HV000032: Unable to initialize io.airlift.units.MinDurationValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) .hasRootCauseMessage("duration is not a valid data duration string: broken"); - assertThatThrownBy(() -> VALIDATOR.validate(new MaxAnnotationOnOptional())) + assertThatThrownBy(() -> assertValidates(new MaxAnnotationOnOptional())) .isInstanceOf(ValidationException.class) .hasMessageContaining("No validator could be found for constraint 'io.airlift.units.MaxDuration' validating type 'java.util.Optional'. Check configuration for 'constrainedByMin'"); - assertThatThrownBy(() -> VALIDATOR.validate(new BrokenOptionalMaxAnnotation())) + assertThatThrownBy(() -> assertValidates(new BrokenOptionalMaxAnnotation())) .isInstanceOf(ValidationException.class) .hasMessage("HV000032: Unable to initialize io.airlift.units.MaxDurationValidator.") .hasRootCauseInstanceOf(IllegalArgumentException.class) @@ -119,69 +105,30 @@ public void testDetectsBrokenMaxAnnotation() @Test public void testPassesValidation() { - assertThat(VALIDATOR.validate(new ConstrainedDuration(new Duration(7, TimeUnit.SECONDS)))).isEmpty(); - - assertThat(VALIDATOR.validate(new ConstrainedOptionalDuration(Optional.of(new Duration(7, TimeUnit.SECONDS))))).isEmpty(); - - assertThat(VALIDATOR.validate(new ConstrainedOptionalDuration(Optional.empty()))).isEmpty(); - - assertThat(VALIDATOR.validate(new ConstrainedOptionalDuration(null))).isEmpty(); + assertValidates(new ConstrainedDuration(new Duration(7, TimeUnit.SECONDS))); + assertValidates(new ConstrainedOptionalDuration(Optional.of(new Duration(7, TimeUnit.SECONDS)))); + assertValidates(new ConstrainedOptionalDuration(Optional.empty())); + assertValidates(new ConstrainedOptionalDuration(null)); } @Test public void testFailsMaxDurationConstraint() { - Set> violations = VALIDATOR.validate(new ConstrainedDuration(new Duration(11, TimeUnit.SECONDS))); - assertThat(violations).hasSize(2); - assertThat(violations) - .extracting(violation -> violation.getConstraintDescriptor().getAnnotation()) - .allMatch(MaxDuration.class::isInstance); - assertThat(violations) - .extracting(violation -> violation.getPropertyPath().toString()) - .containsOnly("constrainedByMax", "constrainedByMinAndMax"); - assertThat(violations) - .extracting(ConstraintViolation::getMessage) - .containsOnly("must be less than or equal to 10s", "must be less than or equal to 10000ms"); - - violations = VALIDATOR.validate(new ConstrainedOptionalDuration(Optional.of(new Duration(11, TimeUnit.SECONDS)))); - assertThat(violations).hasSize(2); - assertThat(violations) - .extracting(violation -> violation.getConstraintDescriptor().getAnnotation()) - .allMatch(MaxDuration.class::isInstance); - assertThat(violations) - .extracting(violation -> violation.getPropertyPath().toString()) - .containsOnly("constrainedByMax", "constrainedByMinAndMax"); - assertThat(violations) - .extracting(ConstraintViolation::getMessage) - .containsOnly("must be less than or equal to 10s", "must be less than or equal to 10000ms"); + assertFailsValidation(new ConstrainedDuration(new Duration(11, TimeUnit.SECONDS)), "constrainedByMax", "must be less than or equal to 10s", MaxDuration.class); + assertFailsValidation(new ConstrainedDuration(new Duration(11, TimeUnit.SECONDS)), "constrainedByMinAndMax", "must be less than or equal to 10000ms", MaxDuration.class); + + assertFailsValidation(new ConstrainedOptionalDuration(Optional.of(new Duration(11, TimeUnit.SECONDS))), "constrainedByMax", "must be less than or equal to 10s", MaxDuration.class); + assertFailsValidation(new ConstrainedOptionalDuration(Optional.of(new Duration(11, TimeUnit.SECONDS))), "constrainedByMinAndMax", "must be less than or equal to 10000ms", MaxDuration.class); } @Test public void testFailsMinDurationConstraint() { - Set> violations = VALIDATOR.validate(new ConstrainedDuration(new Duration(1, TimeUnit.SECONDS))); - assertThat(violations).hasSize(2); - assertThat(violations) - .extracting(violation -> violation.getConstraintDescriptor().getAnnotation()) - .allMatch(MinDuration.class::isInstance); - assertThat(violations) - .extracting(violation -> violation.getPropertyPath().toString()) - .containsOnly("constrainedByMin", "constrainedByMinAndMax"); - assertThat(violations) - .extracting(ConstraintViolation::getMessage) - .containsOnly("must be greater than or equal to 5000ms", "must be greater than or equal to 5s"); - - violations = VALIDATOR.validate(new ConstrainedOptionalDuration(Optional.of(new Duration(1, TimeUnit.SECONDS)))); - assertThat(violations).hasSize(2); - assertThat(violations) - .extracting(violation -> violation.getConstraintDescriptor().getAnnotation()) - .allMatch(MinDuration.class::isInstance); - assertThat(violations) - .extracting(violation -> violation.getPropertyPath().toString()) - .containsOnly("constrainedByMin", "constrainedByMinAndMax"); - assertThat(violations) - .extracting(ConstraintViolation::getMessage) - .containsOnly("must be greater than or equal to 5000ms", "must be greater than or equal to 5s"); + assertFailsValidation(new ConstrainedDuration(new Duration(1, TimeUnit.SECONDS)), "constrainedByMin", "must be greater than or equal to 5s", MinDuration.class); + assertFailsValidation(new ConstrainedDuration(new Duration(1, TimeUnit.SECONDS)), "constrainedByMinAndMax", "must be greater than or equal to 5000ms", MinDuration.class); + + assertFailsValidation(new ConstrainedOptionalDuration(Optional.of(new Duration(1, TimeUnit.SECONDS))), "constrainedByMin", "must be greater than or equal to 5s", MinDuration.class); + assertFailsValidation(new ConstrainedOptionalDuration(Optional.of(new Duration(1, TimeUnit.SECONDS))), "constrainedByMinAndMax", "must be greater than or equal to 5000ms", MinDuration.class); } @SuppressWarnings("UnusedDeclaration") From 028a3bfd2f8b85b868ffb31c3eedd7270f0d12cd Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Tue, 4 Jul 2023 14:32:59 +0200 Subject: [PATCH 4/4] Add dep.airlift.version property --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index bce5ff5..6f98177 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ true -missing 17 + 234 @@ -71,14 +72,14 @@ io.airlift testing - 234 + ${dep.airlift.version} test io.airlift json - 234 + ${dep.airlift.version} test