From 5f17b0f91c4d4f78a8501f1d28f5a88d948ae58a Mon Sep 17 00:00:00 2001 From: Bertrand Lorentz Date: Fri, 2 Jun 2023 17:53:55 +0200 Subject: [PATCH 1/2] Add unit tests for SdkVersion Some failing tests are commented out, this will be fixed in the next commit. --- .../europa/ted/eforms/sdk/SdkVersionTest.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/test/java/eu/europa/ted/eforms/sdk/SdkVersionTest.java diff --git a/src/test/java/eu/europa/ted/eforms/sdk/SdkVersionTest.java b/src/test/java/eu/europa/ted/eforms/sdk/SdkVersionTest.java new file mode 100644 index 0000000..ff23fb4 --- /dev/null +++ b/src/test/java/eu/europa/ted/eforms/sdk/SdkVersionTest.java @@ -0,0 +1,67 @@ +package eu.europa.ted.eforms.sdk; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class SdkVersionTest { + @Test + void testGetMajor() { + assertEquals("1", new SdkVersion("1.2.3").getMajor()); + } + + @Test + void testGetMinor() { + assertEquals("2", new SdkVersion("1.2.3").getMinor()); + } + + @Test + void testGetPatch() { + assertEquals("3", new SdkVersion("1.2.3").getPatch()); + } + + @Test + void testGetNextMajor() { + assertEquals("2.2.3", new SdkVersion("1.2.3").getNextMajor()); + } + + @Test + void testGetNextMinor() { + assertEquals("1.3.3", new SdkVersion("1.2.3").getNextMinor()); + } + + @Test + void testIsPatch() { + assertEquals(false, new SdkVersion("1.2").isPatch()); + + assertEquals(true, new SdkVersion("1.2.3").isPatch()); + // FIXME + //assertEquals(true, new SdkVersion("1.2.3-rc.4").isPatch()); + } + + @Test + void testToNormalisedStringWithPatch() { + assertEquals("1.2.3", new SdkVersion("1.2.3").toNormalisedString(true)); + // FIXME + //assertEquals("1.2.3", new SdkVersion("1.2.3-SNAPSHOT").toNormalisedString(true)); + //assertEquals("1.2.3", new SdkVersion("1.2.3-rc.4").toNormalisedString(true)); + } + + @Test + void testToStringWithoutPatch() { + assertEquals("1.2", new SdkVersion("1.2.3").toStringWithoutPatch()); + assertEquals("1.2", new SdkVersion("1.2.3-SNAPSHOT").toStringWithoutPatch()); + // FIXME + //assertEquals("1.2", new SdkVersion("1.2.3-rc.4").toStringWithoutPatch()); + } + + @Test + void testCompare() { + assert(new SdkVersion("1.2.3").compareTo(new SdkVersion("1.2.2")) > 0); + assert(new SdkVersion("1.2.3").compareTo(new SdkVersion("1.2")) > 0); + assert(new SdkVersion("1.2.3").compareTo(new SdkVersion("1.2.3-SNAPSHOT")) > 0); + // FIXME + //assert(new SdkVersion("1.2.3").compareTo(new SdkVersion("1.2.3-rc.3")) > 0); + //assert(new SdkVersion("2.0.0").compareTo(new SdkVersion("2.0.0-alpha.1")) > 0); + } +} From b53e213adbefa0e66ecf4e11b3f1d3855b075b59 Mon Sep 17 00:00:00 2001 From: Bertrand Lorentz Date: Fri, 2 Jun 2023 15:27:22 +0200 Subject: [PATCH 2/2] SdkVersion: Fix handling of suffix in version string (TEDEFO-2299) Use the Semver4j library to parse and manipulate the version. This allows to properly handle versions with a suffix like "1.2.3-rc.1" and "2.0.0-alpha.1" This also fixes equals() and compareTo() for versions with a suffix. Enable the unit tests that were failing before this fix. --- pom.xml | 10 +++ .../eu/europa/ted/eforms/sdk/SdkVersion.java | 74 ++++++------------- .../europa/ted/eforms/sdk/SdkVersionTest.java | 16 ++-- 3 files changed, 37 insertions(+), 63 deletions(-) diff --git a/pom.xml b/pom.xml index 11d9713..ab2e992 100644 --- a/pom.xml +++ b/pom.xml @@ -68,6 +68,7 @@ 6.2.0 0.10.2 1.8.2 + 3.1.0 2.0.3 @@ -220,6 +221,11 @@ junit-jupiter-api ${version.junit} + + com.vdurmont + semver4j + ${version.semver4j} + @@ -341,6 +347,10 @@ junit-jupiter-api test + + com.vdurmont + semver4j + diff --git a/src/main/java/eu/europa/ted/eforms/sdk/SdkVersion.java b/src/main/java/eu/europa/ted/eforms/sdk/SdkVersion.java index 40befdb..b7af329 100644 --- a/src/main/java/eu/europa/ted/eforms/sdk/SdkVersion.java +++ b/src/main/java/eu/europa/ted/eforms/sdk/SdkVersion.java @@ -1,79 +1,60 @@ package eu.europa.ted.eforms.sdk; -import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; -public class SdkVersion implements Comparable { - private static final String FORMAT_PATTERN = "{0}.{1}.{2}"; - - private String major = "0"; - - private String minor = "0"; +import com.vdurmont.semver4j.Semver; +import com.vdurmont.semver4j.Semver.SemverType; - private String patch = "0"; - - private boolean isPatch = false; +public class SdkVersion implements Comparable { - @SuppressWarnings("unused") - private SdkVersion() {} + private final Semver version; public SdkVersion(final String version) { Validate.notBlank(version, "Undefined version"); - Validate.matchesPattern(version, "[0-9]+(\\.[0-9]+)*(-SNAPSHOT)?", "Invalid version format"); - - String[] versionParts = version.split("\\."); - this.major = versionParts[0]; + // LOOSE because we need to accept MAJOR.MINOR + this.version = new Semver(version, SemverType.LOOSE); - if (versionParts.length > 1) { - this.minor = versionParts[1]; - } - - if (versionParts.length > 2) { - this.isPatch = true; - this.patch = versionParts[2]; - } + // Check that we did get a MINOR part + Validate.notNull(this.version.getMinor()); } public String getMajor() { - return major; + return version.getMajor().toString(); } public String getMinor() { - return minor; + return version.getMinor().toString(); } public String getPatch() { - return patch; + return version.getPatch() == null ? "0" : version.getPatch().toString(); } public String getNextMajor() { - return new SdkVersion(MessageFormat.format(FORMAT_PATTERN, getAsInt(major) + 1, minor, patch)) - .toString(); + return version.withIncMajor().toString(); } public String getNextMinor() { - return new SdkVersion(MessageFormat.format(FORMAT_PATTERN, major, getAsInt(minor) + 1, patch)) - .toString(); + return version.withIncMinor().toString(); } public boolean isPatch() { - return isPatch; + return version.getPatch() != null; } public String toNormalisedString(boolean withPatch) { List parts = new ArrayList<>(); - parts.add(major); - parts.add(minor); + parts.add(getMajor()); + parts.add(getMinor()); if (withPatch) { - parts.add(patch); + parts.add(getPatch()); } return StringUtils.join(parts, "."); @@ -85,7 +66,7 @@ public String toStringWithoutPatch() { @Override public String toString() { - return toNormalisedString(true); + return version.toString(); } @Override @@ -98,24 +79,12 @@ public int compareTo(SdkVersion that) { return 0; } - if (getAsInt(this.getMajor()) == getAsInt(that.getMajor())) { - if (getAsInt(this.getMinor()) == getAsInt(that.getMinor())) { - return getAsInt(this.getPatch()) < getAsInt(that.getPatch()) ? -1 : 1; - } else { - return getAsInt(this.getMinor()) < getAsInt(that.getMinor()) ? -1 : 1; - } - } else { - return getAsInt(this.getMajor()) < getAsInt(that.getMajor()) ? -1 : 1; - } - } - - private int getAsInt(String versionPart) { - return Integer.parseInt(Optional.ofNullable(versionPart).orElse("0").replace("-SNAPSHOT", "")); + return version.compareTo(that.version); } @Override public int hashCode() { - return Objects.hash(major, minor, patch); + return Objects.hash(version); } @Override @@ -127,7 +96,6 @@ public boolean equals(Object obj) { if (getClass() != obj.getClass()) return false; SdkVersion other = (SdkVersion) obj; - return Objects.equals(major, other.major) && Objects.equals(minor, other.minor) - && Objects.equals(patch, other.patch); + return Objects.equals(version, other.version); } } diff --git a/src/test/java/eu/europa/ted/eforms/sdk/SdkVersionTest.java b/src/test/java/eu/europa/ted/eforms/sdk/SdkVersionTest.java index ff23fb4..e707893 100644 --- a/src/test/java/eu/europa/ted/eforms/sdk/SdkVersionTest.java +++ b/src/test/java/eu/europa/ted/eforms/sdk/SdkVersionTest.java @@ -35,24 +35,21 @@ void testIsPatch() { assertEquals(false, new SdkVersion("1.2").isPatch()); assertEquals(true, new SdkVersion("1.2.3").isPatch()); - // FIXME - //assertEquals(true, new SdkVersion("1.2.3-rc.4").isPatch()); + assertEquals(true, new SdkVersion("1.2.3-rc.4").isPatch()); } @Test void testToNormalisedStringWithPatch() { assertEquals("1.2.3", new SdkVersion("1.2.3").toNormalisedString(true)); - // FIXME - //assertEquals("1.2.3", new SdkVersion("1.2.3-SNAPSHOT").toNormalisedString(true)); - //assertEquals("1.2.3", new SdkVersion("1.2.3-rc.4").toNormalisedString(true)); + assertEquals("1.2.3", new SdkVersion("1.2.3-SNAPSHOT").toNormalisedString(true)); + assertEquals("1.2.3", new SdkVersion("1.2.3-rc.4").toNormalisedString(true)); } @Test void testToStringWithoutPatch() { assertEquals("1.2", new SdkVersion("1.2.3").toStringWithoutPatch()); assertEquals("1.2", new SdkVersion("1.2.3-SNAPSHOT").toStringWithoutPatch()); - // FIXME - //assertEquals("1.2", new SdkVersion("1.2.3-rc.4").toStringWithoutPatch()); + assertEquals("1.2", new SdkVersion("1.2.3-rc.4").toStringWithoutPatch()); } @Test @@ -60,8 +57,7 @@ void testCompare() { assert(new SdkVersion("1.2.3").compareTo(new SdkVersion("1.2.2")) > 0); assert(new SdkVersion("1.2.3").compareTo(new SdkVersion("1.2")) > 0); assert(new SdkVersion("1.2.3").compareTo(new SdkVersion("1.2.3-SNAPSHOT")) > 0); - // FIXME - //assert(new SdkVersion("1.2.3").compareTo(new SdkVersion("1.2.3-rc.3")) > 0); - //assert(new SdkVersion("2.0.0").compareTo(new SdkVersion("2.0.0-alpha.1")) > 0); + assert(new SdkVersion("1.2.3").compareTo(new SdkVersion("1.2.3-rc.3")) > 0); + assert(new SdkVersion("2.0.0").compareTo(new SdkVersion("2.0.0-alpha.1")) > 0); } }