Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[JENKINS-51594] Test behavior of snapshots vs. RCs, JEP-229 #6

Merged
merged 9 commits into from
Apr 14, 2021
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@
<artifactId>test-annotations</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>3.5.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-annotations</artifactId>
Expand Down
4 changes: 0 additions & 4 deletions src/main/java/hudson/util/VersionNumber.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,6 @@
* <p>
* 'SNAPSHOT' is also allowed as a component, and "N.SNAPSHOT" is interpreted as "N-1.*"
*
* <pre>
* 2.0.* &lt; 2.0.1 &lt; 2.0.1-SNAPSHOT &lt; 2.0.0.99 &lt; 2.0.0 &lt; 2.0.ea &lt; 2.0
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was just so far off that I did not see how to rescue it. 2.0.1 < 2.0??

* </pre>
*
* This class is re-implemented in 1.415. The class was originally introduced in 1.139
*
* @since 1.139
Expand Down
68 changes: 58 additions & 10 deletions src/test/java/hudson/util/VersionNumberTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,25 @@
*/
package hudson.util;

import junit.framework.TestCase;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.maven.artifact.versioning.ComparableVersion;
import org.hamcrest.CoreMatchers;
import static org.junit.Assert.*;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
import org.jvnet.hudson.test.Issue;

/**
* @author Xavier Le Vourch
*/
public class VersionNumberTest extends TestCase {
public class VersionNumberTest {

@Rule
public ErrorCollector errors = new ErrorCollector();

public void testIsNewerThan() {
@Test
public void isNewerThan() {
assertTrue(new VersionNumber("2.0.*").isNewerThan(new VersionNumber("2.0")));
assertTrue(new VersionNumber("2.1-SNAPSHOT").isNewerThan(new VersionNumber("2.0.*")));
assertTrue(new VersionNumber("2.1").isNewerThan(new VersionNumber("2.1-SNAPSHOT")));
Expand All @@ -44,23 +55,36 @@ public void testIsNewerThan() {
// which makes more sense than before
assertTrue(new VersionNumber("2.0.0").equals(new VersionNumber("2.0")));
}

@Issue("https://gitter.im/jenkinsci/configuration-as-code-plugin?at=5b4f2fc455a7e23c014da2af")
@Test
public void alpha() {
assertTrue(new VersionNumber("2.0").isNewerThan(new VersionNumber("2.0-alpha-1")));
assertTrue(new VersionNumber("2.0-alpha-1").isNewerThan(new VersionNumber("2.0-alpha-1-rc9999.abc123def456")));
}

public void testEarlyAccess() {
@Test
public void earlyAccess() {
assertTrue(new VersionNumber("2.0.ea2").isNewerThan(new VersionNumber("2.0.ea1")));
assertTrue(new VersionNumber("2.0.ea1").isNewerThan(new VersionNumber("2.0.ea")));
assertEquals(new VersionNumber("2.0.ea"), new VersionNumber("2.0.ea0"));
}

public void testSnapshots() {
@Test
public void snapshots() {
assertTrue(new VersionNumber("1.12").isNewerThan(new VersionNumber("1.12-SNAPSHOT (private-08/24/2008 12:13-hudson)")));
assertTrue(new VersionNumber("1.12-SNAPSHOT (private-08/24/2008 12:13-hudson)").isNewerThan(new VersionNumber("1.11")));
assertTrue(new VersionNumber("1.12-SNAPSHOT (private-08/24/2008 12:13-hudson)").equals(new VersionNumber("1.12-SNAPSHOT")));
// This is changed from the old impl because snapshots are no longer a "magic" number
assertFalse(new VersionNumber("1.12-SNAPSHOT").equals(new VersionNumber("1.11.*")));
assertTrue(new VersionNumber("1.11.*").isNewerThan(new VersionNumber("1.11.9")));
/* TODO the reverse:
assertTrue(new VersionNumber("1.12-SNAPSHOT").isNewerThan(new VersionNumber("1.12-rc9999.abc123def456")));
*/
}

public void testTimestamps() {
@Test
public void timestamps() {
assertTrue(new VersionNumber("2.0.3-20170207.105042-1").isNewerThan(new VersionNumber("2.0.2")));
assertTrue(new VersionNumber("2.0.3").isNewerThan(new VersionNumber("2.0.3-20170207.105042-1")));
assertTrue(new VersionNumber("2.0.3-20170207.105042-1").equals(new VersionNumber("2.0.3-SNAPSHOT")));
Expand All @@ -72,7 +96,8 @@ public void testTimestamps() {
assertFalse(new VersionNumber("2.0.3-20170207.105042-1").isOlderThan(new VersionNumber("2.0.3-SNAPSHOT")));
}

public void testDigit() {
@Test
public void digit() {
assertEquals(32, new VersionNumber("2.32.3.1-SNAPSHOT").getDigitAt(1));
assertEquals(3, new VersionNumber("2.32.3.1-SNAPSHOT").getDigitAt(2));
assertEquals(1, new VersionNumber("2.32.3.1-SNAPSHOT").getDigitAt(3));
Expand All @@ -88,6 +113,28 @@ public void testDigit() {
assertEquals(-1, new VersionNumber("").getDigitAt(0));
}

private void assertOrderAlsoInMaven(String... versions) {
errors.checkThat("Maven order is correct", Stream.of(versions).map(ComparableVersion::new).sorted().map(ComparableVersion::toString).collect(Collectors.toList()), CoreMatchers.is(Arrays.asList(versions)));
errors.checkThat("Jenkins order is correct", Stream.of(versions).map(VersionNumber::new).sorted().map(VersionNumber::toString).collect(Collectors.toList()), CoreMatchers.is(Arrays.asList(versions)));
}

@Ignore("TODO still pretty divergent: …was <[2.0.ea, 2.0.0, 2.0, 2.0.1-alpha-1, 2.0.1-SNAPSHOT, 2.0.*, 2.0.0.99, 2.0.1-alpha-1-rc9999.abc123def456, 2.0.1-rc9999.abc123def456, 2.0.1]>")
@Issue("JENKINS-51594")
@Test
public void mavenComparison() {
assertOrderAlsoInMaven("2.0.0", "2.0", "2.0.*", "2.0.ea", "2.0.0.99", "2.0.1-alpha-1-rc9999.abc123def456", "2.0.1-alpha-1", "2.0.1-rc9999.abc123def456", "2.0.1-SNAPSHOT", "2.0.1");
}

@Issue("JEP-229")
@Test
public void backportJep229() {
// Maven considers 99.1.abcd1234abcd to sort before 99.1234deadbeef so we cannot simply use 99. as the branch prefix.
// Nor can we use 99.1234deadbeef. as the prefix because Maven would compare 5 and 10 lexicographically.
// 100._. seems to work but is not intuitive.
// Using changelist.format=%d.v%s behaves better, apparently because then the hash is never treated like a number.
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assertOrderAlsoInMaven("99.v1234deadbeef", "99.5.vabcd1234abcd", "99.10.vabcd1234abcd", "100.vdead9876beef");
}

public void testOrEqualTo() {
assertTrue(new VersionNumber("1.8").isNewerThanOrEqualTo(new VersionNumber("1.8")));
assertTrue(new VersionNumber("1.9").isNewerThanOrEqualTo(new VersionNumber("1.8")));
Expand All @@ -97,4 +144,5 @@ public void testOrEqualTo() {
assertTrue(new VersionNumber("1.7").isOlderThanOrEqualTo(new VersionNumber("1.8")));
assertTrue(new VersionNumber("1").isOlderThanOrEqualTo(new VersionNumber("1.8")));
}

}