public InitializrMetadataTestBuilder addBom(String id, String groupId, String artifactId, String version) { BillOfMaterials bom = BillOfMaterials.create(groupId, artifactId, version); return addBom(id, bom); }
/** * Create a {@link BillOfMaterials} for the spring boot BOM. * @param bootVersion the Spring Boot version * @param versionProperty the property that contains the version * @return a new {@link BillOfMaterials} instance */ public BillOfMaterials createSpringBootBom(String bootVersion, String versionProperty) { BillOfMaterials bom = BillOfMaterials.create("org.springframework.boot", "spring-boot-dependencies", bootVersion); bom.setVersionProperty(VersionProperty.of(versionProperty)); bom.setOrder(100); return bom; }
@Test void resolveSimpleRange() { BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "1.0.0"); bom.setVersionProperty("bom.version"); bom.getRepositories().add("repo-main"); bom.getAdditionalBoms().add("bom-main"); bom.getMappings().add(Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", "1.1.0")); bom.validate(); BillOfMaterials resolved = bom.resolve(Version.parse("1.2.3.RELEASE")); assertThat(resolved.getGroupId()).isEqualTo("com.example"); assertThat(resolved.getArtifactId()).isEqualTo("bom"); assertThat(resolved.getVersion()).isEqualTo("1.1.0"); assertThat(resolved.getVersionProperty().toStandardFormat()) .isEqualTo("bom.version"); assertThat(resolved.getRepositories()).hasSize(1); assertThat(resolved.getRepositories().get(0)).isEqualTo("repo-main"); assertThat(resolved.getAdditionalBoms()).hasSize(1); assertThat(resolved.getAdditionalBoms().get(0)).isEqualTo("bom-main"); }
@Test void resolveRangeOverrideAndMapping() { BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "1.0.0"); bom.setVersionProperty("example.version"); bom.getMappings().add(Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", "1.1.0")); bom.validate(); BillOfMaterials resolved = bom.resolve(Version.parse("1.2.3.RELEASE")); assertThat(resolved.getGroupId()).isEqualTo("com.example"); assertThat(resolved.getArtifactId()).isEqualTo("bom"); assertThat(resolved.getVersion()).isEqualTo("1.1.0"); assertThat(resolved.getVersionProperty().toStandardFormat()) .isEqualTo("example.version"); }
@Test void resolveRangeOverride() { BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "1.0.0"); bom.getRepositories().add("repo-main"); bom.getAdditionalBoms().add("bom-main"); Mapping mapping = Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", "1.1.0", "repo-foo"); mapping.getAdditionalBoms().add("bom-foo"); bom.getMappings().add(mapping); bom.validate(); BillOfMaterials resolved = bom.resolve(Version.parse("1.2.3.RELEASE")); assertThat(resolved.getGroupId()).isEqualTo("com.example"); assertThat(resolved.getArtifactId()).isEqualTo("bom"); assertThat(resolved.getVersion()).isEqualTo("1.1.0"); assertThat(resolved.getVersionProperty()).isNull(); assertThat(resolved.getRepositories()).hasSize(1); assertThat(resolved.getRepositories().get(0)).isEqualTo("repo-foo"); assertThat(resolved.getAdditionalBoms()).hasSize(1); assertThat(resolved.getAdditionalBoms().get(0)).isEqualTo("bom-foo"); }
@Test void resolveSimpleBom() { BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "1.0.0"); bom.validate(); BillOfMaterials resolved = bom.resolve(Version.parse("1.2.3.RELEASE")); assertThat(bom).isSameAs(resolved); }
@Test void resolveAdditionalBoms() { Dependency dependency = Dependency.withId("foo"); dependency.setBom("foo-bom"); BillOfMaterials bom = BillOfMaterials.create("com.example", "foo-bom", "1.0.0"); bom.getAdditionalBoms().add("bar-bom"); BillOfMaterials additionalBom = BillOfMaterials.create("com.example", "bar-bom", "1.1.0"); this.metadata = InitializrMetadataTestBuilder.withDefaults() .addBom("foo-bom", bom).addBom("bar-bom", additionalBom) .addDependencyGroup("test", dependency).build(); ProjectRequest request = initProjectRequest(); request.getStyle().add("foo"); request.resolve(this.metadata); assertThat(request.getResolvedDependencies()).hasSize(1); assertThat(request.getBoms()).hasSize(2); assertThat(request.getBoms().get("foo-bom")).isEqualTo(bom); assertThat(request.getBoms().get("bar-bom")).isEqualTo(additionalBom); }
@Test void resolveAdditionalBomsDuplicates() { Dependency dependency = Dependency.withId("foo"); dependency.setBom("foo-bom"); Dependency anotherDependency = Dependency.withId("bar"); anotherDependency.setBom("bar-bom"); BillOfMaterials bom = BillOfMaterials.create("com.example", "foo-bom", "1.0.0"); bom.getAdditionalBoms().add("bar-bom"); BillOfMaterials additionalBom = BillOfMaterials.create("com.example", "bar-bom", "1.1.0"); this.metadata = InitializrMetadataTestBuilder.withDefaults() .addBom("foo-bom", bom).addBom("bar-bom", additionalBom) .addDependencyGroup("test", dependency, anotherDependency).build(); ProjectRequest request = initProjectRequest(); request.getStyle().addAll(Arrays.asList("foo", "bar")); request.resolve(this.metadata); assertThat(request.getResolvedDependencies()).hasSize(2); assertThat(request.getBoms()).hasSize(2); assertThat(request.getBoms().get("foo-bom")).isEqualTo(bom); assertThat(request.getBoms().get("bar-bom")).isEqualTo(additionalBom); }
@Test void invalidBomUnknownAdditionalBom() { InitializrMetadata metadata = initializeMetadata(); BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom", "1.0.0.RELEASE"); bom.getAdditionalBoms().addAll(Arrays.asList("bar-bom", "biz-bom")); BillOfMaterials barBom = BillOfMaterials.create("org.acme", "bar-bom", "1.0.0.RELEASE"); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); metadata.getConfiguration().getEnv().getBoms().put("bar-bom", barBom); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate) .withMessageContaining("invalid additional bom") .withMessageContaining("biz-bom"); }
@Test void invalidBomUnknownRepository() { InitializrMetadata metadata = initializeMetadata(); BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom", "1.0.0.RELEASE"); bom.getRepositories().add("foo-repo"); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate) .withMessageContaining("invalid repository id foo-repo") .withMessageContaining("foo-bom"); }
@Test void resolveAdditionalRepositories() { Dependency dependency = Dependency.withId("foo"); dependency.setBom("foo-bom"); dependency.setRepository("foo-repo"); BillOfMaterials bom = BillOfMaterials.create("com.example", "foo-bom", "1.0.0"); bom.getRepositories().add("bar-repo"); this.metadata = InitializrMetadataTestBuilder.withDefaults() .addBom("foo-bom", bom) .addRepository("foo-repo", "foo-repo", "http://example.com/foo", false) .addRepository("bar-repo", "bar-repo", "http://example.com/bar", false) .addDependencyGroup("test", dependency).build(); ProjectRequest request = initProjectRequest(); request.getStyle().add("foo"); request.resolve(this.metadata); assertThat(request.getResolvedDependencies()).hasSize(1); assertThat(request.getBoms()).hasSize(1); assertThat(request.getRepositories()).hasSize(2); assertThat(request.getRepositories().get("foo-repo")).isEqualTo(this.metadata .getConfiguration().getEnv().getRepositories().get("foo-repo")); assertThat(request.getRepositories().get("bar-repo")).isEqualTo(this.metadata .getConfiguration().getEnv().getRepositories().get("bar-repo")); }
@Test void invalidBomVersionRangeMappingUnknownAdditionalBom() { InitializrMetadata metadata = initializeMetadata(); BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom"); bom.getMappings().add(Mapping.create("[1.0.0.RELEASE,1.3.0.M1)", "1.0.0")); Mapping mapping = Mapping.create("1.3.0.M2", "1.2.0"); mapping.getAdditionalBoms().add("bar-bom"); bom.getMappings().add(mapping); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate) .withMessageContaining("invalid additional bom") .withMessageContaining("1.3.0.M2").withMessageContaining("bar-bom"); }
@Test void invalidBomVersionRangeMappingUnknownRepo() { InitializrMetadata metadata = initializeMetadata(); BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom"); bom.getMappings().add(Mapping.create("[1.0.0.RELEASE,1.3.0.M1)", "1.0.0")); Mapping mapping = Mapping.create("1.3.0.M2", "1.2.0"); mapping.getRepositories().add("foo-repo"); bom.getMappings().add(mapping); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate) .withMessageContaining("invalid repository id foo-repo") .withMessageContaining("1.3.0.M2").withMessageContaining("foo-bom"); }
@Test void invalidBomVersionRangeMapping() { InitializrMetadata metadata = initializeMetadata(); BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom"); bom.getMappings().add(Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", "1.0.0")); bom.getMappings().add(Mapping.create("FOO_BAR", "1.2.0")); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate).withMessageContaining("FOO_BAR") .withMessageContaining("foo-bom"); }
@Test void resolveRangeWithVariablePatch() { BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "1.0.0"); bom.getMappings().add(Mapping.create("[1.3.0.RELEASE,1.3.x.RELEASE]", "1.1.0")); bom.getMappings().add(BillOfMaterials.Mapping .create("[1.3.x.BUILD-SNAPSHOT,1.4.0.RELEASE)", "1.1.1-SNAPSHOT")); bom.validate(); bom.updateVersionRange(new VersionParser(Arrays.asList( Version.parse("1.3.8.RELEASE"), Version.parse("1.3.9.BUILD-SNAPSHOT")))); assertThat(bom.resolve(Version.parse("1.3.8.RELEASE")).getVersion()) .isEqualTo("1.1.0"); assertThat(bom.resolve(Version.parse("1.3.9.RELEASE")).getVersion()) .isEqualTo("1.1.1-SNAPSHOT"); bom.updateVersionRange(new VersionParser(Arrays.asList( Version.parse("1.3.9.RELEASE"), Version.parse("1.3.10.BUILD-SNAPSHOT")))); assertThat(bom.resolve(Version.parse("1.3.8.RELEASE")).getVersion()) .isEqualTo("1.1.0"); assertThat(bom.resolve(Version.parse("1.3.9.RELEASE")).getVersion()) .isEqualTo("1.1.0"); }
@Test void noRangeAvailable() { BillOfMaterials bom = BillOfMaterials.create("com.example", "bom"); bom.getMappings().add(Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", "1.1.0")); bom.getMappings().add(Mapping.create("[1.3.0.M1, 1.4.0.M1)", "1.2.0")); bom.validate(); assertThatIllegalStateException() .isThrownBy(() -> bom.resolve(Version.parse("1.4.1.RELEASE"))) .withMessageContaining("1.4.1.RELEASE"); }
@Test void invalidBomNoVersion() { InitializrMetadata metadata = initializeMetadata(); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", BillOfMaterials.create("org.acme", "foo-bom")); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate).withMessageContaining("No version") .withMessageContaining("foo-bom"); }
@Test void invalidBom() { InitializrMetadata metadata = initializeMetadata(); Dependency foo = Dependency.withId("foo", "org.acme", "foo"); foo.setBom("foo-bom"); addTestDependencyGroup(metadata, foo); metadata.getConfiguration().getEnv().getBoms().put("my-bom", BillOfMaterials.create("org.acme", "foo", "1.2.3")); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate).withMessageContaining("foo-bom") .withMessageContaining("my-bom"); }
@ParameterizedTest @MethodSource("parameters") public void bomWithVersionProperty(String build, String fileName) { Dependency foo = Dependency.withId("foo", "org.acme", "foo"); foo.setBom("the-bom"); BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom", "1.3.3"); bom.setVersionProperty("foo.version"); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() .addDependencyGroup("foo", foo).addBom("the-bom", bom).build(); applyMetadata(metadata); ProjectRequest request = createProjectRequestForType(build, "foo"); ProjectAssert project = generateProject(request); project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource( "project/" + build + "/bom-property-" + getAssertFileName(fileName))); }
private DependencyMetadata testRepoFromBomAccordingToVersion(String bootVersion) { Dependency first = Dependency.withId("first", "org.foo", "first"); first.setRepository("repo-foo"); Dependency second = Dependency.withId("second", "org.foo", "second"); Dependency third = Dependency.withId("third", "org.foo", "third"); third.setBom("bom-foo"); BillOfMaterials bom = BillOfMaterials.create("org.foo", "bom"); bom.getMappings() .add(BillOfMaterials.Mapping.create("[1.0.0.RELEASE, 1.1.0.RELEASE)", "2.0.0.RELEASE", "repo-foo", "repo-bar")); bom.getMappings().add(BillOfMaterials.Mapping.create("1.1.0.RELEASE", "3.0.0.RELEASE", "repo-biz")); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() .addBom("bom-foo", bom) .addRepository("repo-foo", "foo", "http://localhost", false) .addRepository("repo-bar", "bar", "http://localhost", false) .addRepository("repo-biz", "biz", "http://localhost", false) .addDependencyGroup("test", first, second, third).build(); return this.provider.get(metadata, Version.parse(bootVersion)); }