commit
2d395355ee
@ -0,0 +1,304 @@
|
||||
/*
|
||||
* Copyright 2023 the original author or 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
|
||||
*
|
||||
* https://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 org.springframework.boot.build.bom.bomr.version;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Repeatable;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.junit.jupiter.api.extension.ExtensionContext;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
import org.junit.jupiter.params.provider.ArgumentsProvider;
|
||||
import org.junit.jupiter.params.provider.ArgumentsSource;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link DependencyVersion#isUpgrade} of {@link DependencyVersion}
|
||||
* implementations.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class DependencyVersionUpgradeTests {
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3", candidate = "1.2.3")
|
||||
@ArtifactVersion(current = "1.2.3.RELEASE", candidate = "1.2.3.RELEASE")
|
||||
@CalendarVersion(current = "2023.0.0", candidate = "2023.0.0")
|
||||
@ReleaseTrain(current = "Kay-RELEASE", candidate = "Kay-RELEASE")
|
||||
void isUpgradeWhenSameVersionShouldReturnFalse(DependencyVersion current, DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, false)).isFalse();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3-SNAPSHOT", candidate = "1.2.3-SNAPSHOT")
|
||||
@ArtifactVersion(current = "1.2.3.BUILD-SNAPSHOT", candidate = "1.2.3.BUILD-SNAPSHOT")
|
||||
@CalendarVersion(current = "2023.0.0-SNAPSHOT", candidate = "2023.0.0-SNAPSHOT")
|
||||
@ReleaseTrain(current = "Kay-BUILD-SNAPSHOT", candidate = "Kay-BUILD-SNAPSHOT")
|
||||
void isUpgradeWhenSameSnapshotVersionShouldReturnFalse(DependencyVersion current, DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, false)).isFalse();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3-SNAPSHOT", candidate = "1.2.3-SNAPSHOT")
|
||||
@ArtifactVersion(current = "1.2.3.BUILD-SNAPSHOT", candidate = "1.2.3.BUILD-SNAPSHOT")
|
||||
@CalendarVersion(current = "2023.0.0-SNAPSHOT", candidate = "2023.0.0-SNAPSHOT")
|
||||
@ReleaseTrain(current = "Kay-BUILD-SNAPSHOT", candidate = "Kay-BUILD-SNAPSHOT")
|
||||
void isUpgradeWhenSameSnapshotVersionAndMovingToSnapshotsShouldReturnFalse(DependencyVersion current,
|
||||
DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, true)).isFalse();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3", candidate = "1.2.4")
|
||||
@ArtifactVersion(current = "1.2.3.RELEASE", candidate = "1.2.4.RELEASE")
|
||||
@CalendarVersion(current = "2023.0.0", candidate = "2023.0.1")
|
||||
@ReleaseTrain(current = "Kay-RELEASE", candidate = "Kay-SR1")
|
||||
void isUpgradeWhenLaterPatchReleaseShouldReturnTrue(DependencyVersion current, DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, false)).isTrue();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3", candidate = "1.2.4-SNAPSHOT")
|
||||
@ArtifactVersion(current = "1.2.3.RELEASE", candidate = "1.2.4.BUILD-SNAPSHOT")
|
||||
@CalendarVersion(current = "2023.0.0", candidate = "2023.0.1-SNAPSHOT")
|
||||
void isUpgradeWhenSnapshotOfLaterPatchReleaseShouldReturnTrue(DependencyVersion current,
|
||||
DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, false)).isTrue();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3", candidate = "1.2.4-SNAPSHOT")
|
||||
@ArtifactVersion(current = "1.2.3.RELEASE", candidate = "1.2.4.BUILD-SNAPSHOT")
|
||||
@CalendarVersion(current = "2023.0.0", candidate = "2023.0.1-SNAPSHOT")
|
||||
@ReleaseTrain(current = "Kay-RELEASE", candidate = "Kay-BUILD-SNAPSHOT")
|
||||
void isUpgradeWhenSnapshotOfLaterPatchReleaseAndMovingToSnapshotsShouldReturnTrue(DependencyVersion current,
|
||||
DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, true)).isTrue();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3", candidate = "1.2.3-SNAPSHOT")
|
||||
@ArtifactVersion(current = "1.2.3.RELEASE", candidate = "1.2.3.BUILD-SNAPSHOT")
|
||||
@CalendarVersion(current = "2023.0.0", candidate = "2023.0.0-SNAPSHOT")
|
||||
@ReleaseTrain(current = "Kay-RELEASE", candidate = "Kay-BUILD-SNAPSHOT")
|
||||
void isUpgradeWhenSnapshotOfSameVersionShouldReturnFalse(DependencyVersion current, DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, false)).isFalse();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3-SNAPSHOT", candidate = "1.2.3-M2")
|
||||
@ArtifactVersion(current = "1.2.3.BUILD-SNAPSHOT", candidate = "1.2.3.M2")
|
||||
@CalendarVersion(current = "2023.0.0-SNAPSHOT", candidate = "2023.0.0-M2")
|
||||
@ReleaseTrain(current = "Kay-BUILD-SNAPSHOT", candidate = "Kay-M2")
|
||||
void isUpgradeWhenSnapshotToMilestoneShouldReturnTrue(DependencyVersion current, DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, false)).isTrue();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3-SNAPSHOT", candidate = "1.2.3-RC1")
|
||||
@ArtifactVersion(current = "1.2.3.BUILD-SNAPSHOT", candidate = "1.2.3.RC1")
|
||||
@CalendarVersion(current = "2023.0.0-SNAPSHOT", candidate = "2023.0.0-RC1")
|
||||
@ReleaseTrain(current = "Kay-BUILD-SNAPSHOT", candidate = "Kay-RC1")
|
||||
void isUpgradeWhenSnapshotToReleaseCandidateShouldReturnTrue(DependencyVersion current,
|
||||
DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, false)).isTrue();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3-SNAPSHOT", candidate = "1.2.3")
|
||||
@ArtifactVersion(current = "1.2.3.BUILD-SNAPSHOT", candidate = "1.2.3.RELEASE")
|
||||
@CalendarVersion(current = "2023.0.0-SNAPSHOT", candidate = "2023.0.0")
|
||||
@ReleaseTrain(current = "Kay-BUILD-SNAPSHOT", candidate = "Kay-RELEASE")
|
||||
void isUpgradeWhenSnapshotToReleaseShouldReturnTrue(DependencyVersion current, DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, false)).isTrue();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3-M1", candidate = "1.2.3-SNAPSHOT")
|
||||
@ArtifactVersion(current = "1.2.3.M1", candidate = "1.2.3.BUILD-SNAPSHOT")
|
||||
@CalendarVersion(current = "2023.0.0-M1", candidate = "2023.0.0-SNAPSHOT")
|
||||
@ReleaseTrain(current = "Kay-M1", candidate = "Kay-BUILD-SNAPSHOT")
|
||||
void isUpgradeWhenMilestoneToSnapshotShouldReturnFalse(DependencyVersion current, DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, false)).isFalse();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3-RC1", candidate = "1.2.3-SNAPSHOT")
|
||||
@ArtifactVersion(current = "1.2.3.RC1", candidate = "1.2.3.BUILD-SNAPSHOT")
|
||||
@CalendarVersion(current = "2023.0.0-RC1", candidate = "2023.0.0-SNAPSHOT")
|
||||
@ReleaseTrain(current = "Kay-RC1", candidate = "Kay-BUILD-SNAPSHOT")
|
||||
void isUpgradeWhenReleaseCandidateToSnapshotShouldReturnFalse(DependencyVersion current,
|
||||
DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, false)).isFalse();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3", candidate = "1.2.3-SNAPSHOT")
|
||||
@ArtifactVersion(current = "1.2.3.RELEASE", candidate = "1.2.3.BUILD-SNAPSHOT")
|
||||
@CalendarVersion(current = "2023.0.0", candidate = "2023.0.0-SNAPSHOT")
|
||||
@ReleaseTrain(current = "Kay-RELEASE", candidate = "Kay-BUILD-SNAPSHOT")
|
||||
void isUpgradeWhenReleaseToSnapshotShouldReturnFalse(DependencyVersion current, DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, false)).isFalse();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3-M1", candidate = "1.2.3-SNAPSHOT")
|
||||
@ArtifactVersion(current = "1.2.3.M1", candidate = "1.2.3.BUILD-SNAPSHOT")
|
||||
@CalendarVersion(current = "2023.0.0-M1", candidate = "2023.0.0-SNAPSHOT")
|
||||
@ReleaseTrain(current = "Kay-M1", candidate = "Kay-BUILD-SNAPSHOT")
|
||||
void isUpgradeWhenMilestoneToSnapshotAndMovingToSnapshotsShouldReturnTrue(DependencyVersion current,
|
||||
DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, true)).isTrue();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3-RC1", candidate = "1.2.3-SNAPSHOT")
|
||||
@ArtifactVersion(current = "1.2.3.RC1", candidate = "1.2.3.BUILD-SNAPSHOT")
|
||||
@CalendarVersion(current = "2023.0.0-RC1", candidate = "2023.0.0-SNAPSHOT")
|
||||
@ReleaseTrain(current = "Kay-RC1", candidate = "Kay-BUILD-SNAPSHOT")
|
||||
void isUpgradeWhenReleaseCandidateToSnapshotAndMovingToSnapshotsShouldReturnTrue(DependencyVersion current,
|
||||
DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, true)).isTrue();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ArtifactVersion(current = "1.2.3", candidate = "1.2.3-SNAPSHOT")
|
||||
@ArtifactVersion(current = "1.2.3.RELEASE", candidate = "1.2.3.BUILD-SNAPSHOT")
|
||||
@CalendarVersion(current = "2023.0.0", candidate = "2023.0.0-SNAPSHOT")
|
||||
void isUpgradeWhenReleaseToSnapshotAndMovingToSnapshotsShouldReturnFalse(DependencyVersion current,
|
||||
DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, true)).isFalse();
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ReleaseTrain(current = "Kay-RELEASE", candidate = "Kay-BUILD-SNAPSHOT")
|
||||
void isUpgradeWhenReleaseTrainToSnapshotAndMovingToSnapshotsShouldReturnTrue(DependencyVersion current,
|
||||
DependencyVersion candidate) {
|
||||
assertThat(current.isUpgrade(candidate, true)).isTrue();
|
||||
}
|
||||
|
||||
@Repeatable(ArtifactVersions.class)
|
||||
@Target(ElementType.METHOD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@ArgumentsSource(InputProvider.class)
|
||||
@interface ArtifactVersion {
|
||||
|
||||
String current();
|
||||
|
||||
String candidate();
|
||||
|
||||
}
|
||||
|
||||
@Target(ElementType.METHOD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@interface ArtifactVersions {
|
||||
|
||||
ArtifactVersion[] value();
|
||||
|
||||
}
|
||||
|
||||
@Target(ElementType.METHOD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@ArgumentsSource(InputProvider.class)
|
||||
@interface ReleaseTrain {
|
||||
|
||||
String current();
|
||||
|
||||
String candidate();
|
||||
|
||||
}
|
||||
|
||||
@Target(ElementType.METHOD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@ArgumentsSource(InputProvider.class)
|
||||
@interface CalendarVersion {
|
||||
|
||||
String current();
|
||||
|
||||
String candidate();
|
||||
|
||||
}
|
||||
|
||||
static class InputProvider implements ArgumentsProvider {
|
||||
|
||||
@Override
|
||||
public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
|
||||
Method testMethod = context.getRequiredTestMethod();
|
||||
Stream<Arguments> artifactVersions = artifactVersions(testMethod)
|
||||
.map((artifactVersion) -> Arguments.of(VersionType.ARTIFACT_VERSION.parse(artifactVersion.current()),
|
||||
VersionType.ARTIFACT_VERSION.parse(artifactVersion.candidate())));
|
||||
Stream<Arguments> releaseTrains = releaseTrains(testMethod)
|
||||
.map((releaseTrain) -> Arguments.of(VersionType.RELEASE_TRAIN.parse(releaseTrain.current()),
|
||||
VersionType.RELEASE_TRAIN.parse(releaseTrain.candidate())));
|
||||
Stream<Arguments> calendarVersions = calendarVersions(testMethod)
|
||||
.map((calendarVersion) -> Arguments.of(VersionType.CALENDAR_VERSION.parse(calendarVersion.current()),
|
||||
VersionType.CALENDAR_VERSION.parse(calendarVersion.candidate())));
|
||||
return Stream.concat(Stream.concat(artifactVersions, releaseTrains), calendarVersions);
|
||||
}
|
||||
|
||||
private Stream<ArtifactVersion> artifactVersions(Method testMethod) {
|
||||
ArtifactVersions artifactVersions = testMethod.getAnnotation(ArtifactVersions.class);
|
||||
if (artifactVersions != null) {
|
||||
return Stream.of(artifactVersions.value());
|
||||
}
|
||||
return versions(testMethod, ArtifactVersion.class);
|
||||
}
|
||||
|
||||
private Stream<ReleaseTrain> releaseTrains(Method testMethod) {
|
||||
return versions(testMethod, ReleaseTrain.class);
|
||||
}
|
||||
|
||||
private Stream<CalendarVersion> calendarVersions(Method testMethod) {
|
||||
return versions(testMethod, CalendarVersion.class);
|
||||
}
|
||||
|
||||
private <T extends Annotation> Stream<T> versions(Method testMethod, Class<T> type) {
|
||||
T annotation = testMethod.getAnnotation(type);
|
||||
return (annotation != null) ? Stream.of(annotation) : Stream.empty();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
enum VersionType {
|
||||
|
||||
ARTIFACT_VERSION(ArtifactVersionDependencyVersion::parse),
|
||||
|
||||
CALENDAR_VERSION(CalendarVersionDependencyVersion::parse),
|
||||
|
||||
RELEASE_TRAIN(ReleaseTrainDependencyVersion::parse);
|
||||
|
||||
private final Function<String, DependencyVersion> parser;
|
||||
|
||||
VersionType(Function<String, DependencyVersion> parser) {
|
||||
this.parser = parser;
|
||||
}
|
||||
|
||||
DependencyVersion parse(String version) {
|
||||
return this.parser.apply(version);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue