Refine layer customization for Maven and Gradle
Simplify layer customization logic for both Maven and Gradle and refactor some internals of the Gradle plugin. Both Maven and Gradle now use a simpler customization format that consists of `application`, `dependencies` and `layer order` sections. The `application`, `dependencies` configurations support one or more `into` blocks that are used to select content for a specific layer. Closes gh-20526
This commit is contained in:
@@ -34,6 +34,7 @@ import java.util.Set;
|
||||
import java.util.jar.Attributes;
|
||||
import java.util.jar.Manifest;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.zip.Deflater;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
@@ -650,6 +651,11 @@ abstract class AbstractPackagerTests<P extends Packager> {
|
||||
return this.layers.iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<Layer> stream() {
|
||||
return this.layers.stream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Layer getLayer(String name) {
|
||||
return DEFAULT_LAYER;
|
||||
|
||||
@@ -19,56 +19,42 @@ package org.springframework.boot.loader.tools;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* Tests for {@link LibraryCoordinates}.
|
||||
*
|
||||
* @author Scott Frederick
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
class LibraryCoordinatesTests {
|
||||
|
||||
@Test
|
||||
void parseCoordinatesWithAllElements() {
|
||||
LibraryCoordinates coordinates = new LibraryCoordinates("com.acme:my-library:1.0.0");
|
||||
assertThat(coordinates.getGroupId()).isEqualTo("com.acme");
|
||||
assertThat(coordinates.getArtifactId()).isEqualTo("my-library");
|
||||
assertThat(coordinates.getVersion()).isEqualTo("1.0.0");
|
||||
void ofCreateLibraryCoordinates() {
|
||||
LibraryCoordinates coordinates = LibraryCoordinates.of("g", "a", "v");
|
||||
assertThat(coordinates.getGroupId()).isEqualTo("g");
|
||||
assertThat(coordinates.getArtifactId()).isEqualTo("a");
|
||||
assertThat(coordinates.getVersion()).isEqualTo("v");
|
||||
assertThat(coordinates.toString()).isEqualTo("g:a:v");
|
||||
}
|
||||
|
||||
@Test
|
||||
void parseCoordinatesWithoutVersion() {
|
||||
LibraryCoordinates coordinates = new LibraryCoordinates("com.acme:my-library");
|
||||
assertThat(coordinates.getGroupId()).isEqualTo("com.acme");
|
||||
assertThat(coordinates.getArtifactId()).isEqualTo("my-library");
|
||||
assertThat(coordinates.getVersion()).isNull();
|
||||
void toStandardNotationStringWhenCoordinatesAreNull() {
|
||||
assertThat(LibraryCoordinates.toStandardNotationString(null)).isEqualTo("::");
|
||||
}
|
||||
|
||||
@Test
|
||||
void parseCoordinatesWithEmptyElements() {
|
||||
LibraryCoordinates coordinates = new LibraryCoordinates(":my-library:");
|
||||
assertThat(coordinates.getGroupId()).isEqualTo("");
|
||||
assertThat(coordinates.getArtifactId()).isEqualTo("my-library");
|
||||
assertThat(coordinates.getVersion()).isNull();
|
||||
void toStandardNotationStringWhenCoordinatesElementsNull() {
|
||||
assertThat(LibraryCoordinates.toStandardNotationString(mock(LibraryCoordinates.class))).isEqualTo("::");
|
||||
}
|
||||
|
||||
@Test
|
||||
void parseCoordinatesWithExtraElements() {
|
||||
LibraryCoordinates coordinates = new LibraryCoordinates("com.acme:my-library:1.0.0.BUILD-SNAPSHOT:11111");
|
||||
assertThat(coordinates.getGroupId()).isEqualTo("com.acme");
|
||||
assertThat(coordinates.getArtifactId()).isEqualTo("my-library");
|
||||
assertThat(coordinates.getVersion()).isEqualTo("1.0.0.BUILD-SNAPSHOT");
|
||||
}
|
||||
|
||||
@Test
|
||||
void parseCoordinatesWithoutMinimumElements() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> new LibraryCoordinates("com.acme"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void toStringReturnsString() {
|
||||
assertThat(new LibraryCoordinates("com.acme:my-library:1.0.0")).hasToString("com.acme:my-library:1.0.0");
|
||||
assertThat(new LibraryCoordinates("com.acme:my-library")).hasToString("com.acme:my-library:");
|
||||
void toStandardNotationString() {
|
||||
LibraryCoordinates coordinates = mock(LibraryCoordinates.class);
|
||||
given(coordinates.getGroupId()).willReturn("a");
|
||||
given(coordinates.getArtifactId()).willReturn("b");
|
||||
given(coordinates.getVersion()).willReturn("c");
|
||||
assertThat(LibraryCoordinates.toStandardNotationString(coordinates)).isEqualTo("a:b:c");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.loader.tools.layer;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||
|
||||
/**
|
||||
* Tests for {@link ApplicationContentFilter}.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
* @author Stephane Nicoll
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
class ApplicationContentFilterTests {
|
||||
|
||||
@Test
|
||||
void createWhenPatternIsNullThrowsException() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> new ApplicationContentFilter(null))
|
||||
.withMessage("Pattern must not be empty");
|
||||
}
|
||||
|
||||
@Test
|
||||
void createWhenPatternIsEmptyThrowsException() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> new ApplicationContentFilter(""))
|
||||
.withMessage("Pattern must not be empty");
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenWildcardPatternMatchesReturnsTrue() {
|
||||
ApplicationContentFilter filter = new ApplicationContentFilter("META-INF/**");
|
||||
assertThat(filter.matches("META-INF/resources/application.yml")).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenWildcardPatternDoesNotMatchReturnsFalse() {
|
||||
ApplicationContentFilter filter = new ApplicationContentFilter("META-INF/**");
|
||||
assertThat(filter.matches("src/main/resources/application.yml")).isFalse();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,126 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.loader.tools.layer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.loader.tools.Layer;
|
||||
import org.springframework.boot.loader.tools.Library;
|
||||
import org.springframework.boot.loader.tools.LibraryCoordinates;
|
||||
import org.springframework.boot.loader.tools.layer.application.FilteredResourceStrategy;
|
||||
import org.springframework.boot.loader.tools.layer.application.LocationFilter;
|
||||
import org.springframework.boot.loader.tools.layer.library.CoordinateFilter;
|
||||
import org.springframework.boot.loader.tools.layer.library.FilteredLibraryStrategy;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* Tests for {@link CustomLayers}.
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
*/
|
||||
class CustomLayersTests {
|
||||
|
||||
@Test
|
||||
void customLayersAreAvailable() {
|
||||
Layer first = new Layer("first");
|
||||
Layer second = new Layer("second");
|
||||
CustomLayers customLayers = new CustomLayers(Arrays.asList(first, second), Collections.emptyList(),
|
||||
Collections.emptyList());
|
||||
List<Layer> actualLayers = new ArrayList<>();
|
||||
customLayers.iterator().forEachRemaining(actualLayers::add);
|
||||
assertThat(actualLayers).containsExactly(first, second);
|
||||
}
|
||||
|
||||
@Test
|
||||
void layerForResourceIsFound() {
|
||||
FilteredResourceStrategy resourceStrategy = new FilteredResourceStrategy("test", Collections
|
||||
.singletonList(new LocationFilter(Collections.singletonList("META-INF/**"), Collections.emptyList())));
|
||||
Layer targetLayer = new Layer("test");
|
||||
CustomLayers customLayers = new CustomLayers(Collections.singletonList(targetLayer),
|
||||
Collections.singletonList(resourceStrategy), Collections.emptyList());
|
||||
assertThat(customLayers.getLayer("META-INF/manifest.mf")).isNotNull().isEqualTo(targetLayer);
|
||||
}
|
||||
|
||||
@Test
|
||||
void layerForResourceIsNotFound() {
|
||||
FilteredResourceStrategy resourceStrategy = new FilteredResourceStrategy("test", Collections
|
||||
.singletonList(new LocationFilter(Collections.singletonList("META-INF/**"), Collections.emptyList())));
|
||||
CustomLayers customLayers = new CustomLayers(Collections.singletonList(new Layer("test")),
|
||||
Collections.singletonList(resourceStrategy), Collections.emptyList());
|
||||
assertThatIllegalStateException().isThrownBy(() -> customLayers.getLayer("com/acme"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void layerForResourceIsNotInListedLayers() {
|
||||
FilteredResourceStrategy resourceStrategy = new FilteredResourceStrategy("test-not-listed", Collections
|
||||
.singletonList(new LocationFilter(Collections.singletonList("META-INF/**"), Collections.emptyList())));
|
||||
Layer targetLayer = new Layer("test");
|
||||
CustomLayers customLayers = new CustomLayers(Collections.singletonList(targetLayer),
|
||||
Collections.singletonList(resourceStrategy), Collections.emptyList());
|
||||
assertThatIllegalStateException().isThrownBy(() -> customLayers.getLayer("META-INF/manifest.mf"))
|
||||
.withMessageContaining("META-INF/manifest.mf").withMessageContaining("test-not-listed")
|
||||
.withMessageContaining("[test]");
|
||||
}
|
||||
|
||||
@Test
|
||||
void layerForLibraryIsFound() {
|
||||
FilteredLibraryStrategy libraryStrategy = new FilteredLibraryStrategy("test", Collections
|
||||
.singletonList(new CoordinateFilter(Collections.singletonList("com.acme:*"), Collections.emptyList())));
|
||||
Layer targetLayer = new Layer("test");
|
||||
CustomLayers customLayers = new CustomLayers(Collections.singletonList(targetLayer), Collections.emptyList(),
|
||||
Collections.singletonList(libraryStrategy));
|
||||
assertThat(customLayers.getLayer(mockLibrary("com.acme:test"))).isNotNull().isEqualTo(targetLayer);
|
||||
}
|
||||
|
||||
@Test
|
||||
void layerForLibraryIsNotFound() {
|
||||
FilteredLibraryStrategy libraryStrategy = new FilteredLibraryStrategy("test", Collections
|
||||
.singletonList(new CoordinateFilter(Collections.singletonList("com.acme:*"), Collections.emptyList())));
|
||||
CustomLayers customLayers = new CustomLayers(Collections.singletonList(new Layer("test")),
|
||||
Collections.emptyList(), Collections.singletonList(libraryStrategy));
|
||||
assertThatIllegalStateException().isThrownBy(() -> customLayers.getLayer(mockLibrary("org.another:test")));
|
||||
}
|
||||
|
||||
@Test
|
||||
void layerForLibraryIsNotInListedLayers() {
|
||||
FilteredLibraryStrategy libraryStrategy = new FilteredLibraryStrategy("test-not-listed", Collections
|
||||
.singletonList(new CoordinateFilter(Collections.singletonList("com.acme:*"), Collections.emptyList())));
|
||||
Layer targetLayer = new Layer("test");
|
||||
CustomLayers customLayers = new CustomLayers(Collections.singletonList(targetLayer), Collections.emptyList(),
|
||||
Collections.singletonList(libraryStrategy));
|
||||
assertThatIllegalStateException().isThrownBy(() -> customLayers.getLayer(mockLibrary("com.acme:test")))
|
||||
.withMessageContaining("com.acme:test").withMessageContaining("test-not-listed")
|
||||
.withMessageContaining("[test]");
|
||||
}
|
||||
|
||||
private Library mockLibrary(String coordinates) {
|
||||
Library library = mock(Library.class);
|
||||
given(library.getCoordinates()).willReturn(new LibraryCoordinates(coordinates));
|
||||
given(library.getName()).willReturn(coordinates);
|
||||
return library;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.loader.tools.layer;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.loader.tools.Layer;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||
|
||||
/**
|
||||
* Tests for {@link IncludeExcludeContentSelector}.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
class IncludeExcludeContentSelectorTests {
|
||||
|
||||
private static final Layer LAYER = new Layer("test");
|
||||
|
||||
@Test
|
||||
void createWhenLayerIsNullThrowsException() {
|
||||
assertThatIllegalArgumentException().isThrownBy(
|
||||
() -> new IncludeExcludeContentSelector<>(null, Collections.emptyList(), Collections.emptyList()))
|
||||
.withMessage("Layer must not be null");
|
||||
}
|
||||
|
||||
@Test
|
||||
void createWhenFactoryIsNullThrowsException() {
|
||||
assertThatIllegalArgumentException()
|
||||
.isThrownBy(() -> new IncludeExcludeContentSelector<>(LAYER, null, null, null))
|
||||
.withMessage("FilterFactory must not be null");
|
||||
}
|
||||
|
||||
@Test
|
||||
void getLayerReturnsLayer() {
|
||||
IncludeExcludeContentSelector<?> selector = new IncludeExcludeContentSelector<>(LAYER, null, null);
|
||||
assertThat(selector.getLayer()).isEqualTo(LAYER);
|
||||
}
|
||||
|
||||
@Test
|
||||
void containsWhenEmptyIncludesAndEmptyExcludesReturnsTrue() {
|
||||
List<String> includes = Arrays.asList();
|
||||
List<String> excludes = Arrays.asList();
|
||||
IncludeExcludeContentSelector<String> selector = new IncludeExcludeContentSelector<>(LAYER, includes, excludes,
|
||||
TestContentsFilter::new);
|
||||
assertThat(selector.contains("A")).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void containsWhenNullIncludesAndEmptyExcludesReturnsTrue() {
|
||||
List<String> includes = null;
|
||||
List<String> excludes = null;
|
||||
IncludeExcludeContentSelector<String> selector = new IncludeExcludeContentSelector<>(LAYER, includes, excludes,
|
||||
TestContentsFilter::new);
|
||||
assertThat(selector.contains("A")).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void containsWhenEmptyIncludesAndNotExcludedReturnsTrue() {
|
||||
List<String> includes = Arrays.asList();
|
||||
List<String> excludes = Arrays.asList("B");
|
||||
IncludeExcludeContentSelector<String> selector = new IncludeExcludeContentSelector<>(LAYER, includes, excludes,
|
||||
TestContentsFilter::new);
|
||||
assertThat(selector.contains("A")).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void containsWhenEmptyIncludesAndExcludedReturnsFalse() {
|
||||
List<String> includes = Arrays.asList();
|
||||
List<String> excludes = Arrays.asList("A");
|
||||
IncludeExcludeContentSelector<String> selector = new IncludeExcludeContentSelector<>(LAYER, includes, excludes,
|
||||
TestContentsFilter::new);
|
||||
assertThat(selector.contains("A")).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void containsWhenIncludedAndEmptyExcludesReturnsTrue() {
|
||||
List<String> includes = Arrays.asList("A", "B");
|
||||
List<String> excludes = Arrays.asList();
|
||||
IncludeExcludeContentSelector<String> selector = new IncludeExcludeContentSelector<>(LAYER, includes, excludes,
|
||||
TestContentsFilter::new);
|
||||
assertThat(selector.contains("B")).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void containsWhenIncludedAndNotExcludedReturnsTrue() {
|
||||
List<String> includes = Arrays.asList("A", "B");
|
||||
List<String> excludes = Arrays.asList("C", "D");
|
||||
IncludeExcludeContentSelector<String> selector = new IncludeExcludeContentSelector<>(LAYER, includes, excludes,
|
||||
TestContentsFilter::new);
|
||||
assertThat(selector.contains("B")).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void containsWhenIncludedAndExcludedReturnsFalse() {
|
||||
List<String> includes = Arrays.asList("A", "B");
|
||||
List<String> excludes = Arrays.asList("C", "D");
|
||||
IncludeExcludeContentSelector<String> selector = new IncludeExcludeContentSelector<>(LAYER, includes, excludes,
|
||||
TestContentsFilter::new);
|
||||
assertThat(selector.contains("C")).isFalse();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link ContentFilter} used for testing.
|
||||
*/
|
||||
static class TestContentsFilter implements ContentFilter<String> {
|
||||
|
||||
private final String match;
|
||||
|
||||
TestContentsFilter(String match) {
|
||||
this.match = match;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(String item) {
|
||||
return this.match.equals(item);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.loader.tools.layer;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.loader.tools.Library;
|
||||
import org.springframework.boot.loader.tools.LibraryCoordinates;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* Tests for {@link LibraryContentFilter}.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
* @author Scott Frederick
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
class LibraryContentFilterTests {
|
||||
|
||||
@Test
|
||||
void createWhenCoordinatesPatternIsNullThrowsException() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> new LibraryContentFilter(null))
|
||||
.withMessage("CoordinatesPattern must not be empty");
|
||||
}
|
||||
|
||||
@Test
|
||||
void createWhenCoordinatesPatternIsEmptyThrowsException() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> new LibraryContentFilter(""))
|
||||
.withMessage("CoordinatesPattern must not be empty");
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenGroupIdIsNullAndToMatchHasWildcardReturnsTrue() {
|
||||
LibraryContentFilter filter = new LibraryContentFilter("*:*");
|
||||
assertThat(filter.matches(mockLibrary(null, null, null))).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenArtifactIdIsNullAndToMatchHasWildcardReturnsTrue() {
|
||||
LibraryContentFilter filter = new LibraryContentFilter("org.acme:*");
|
||||
assertThat(filter.matches(mockLibrary("org.acme", null, null))).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenVersionIsNullAndToMatchHasWildcardReturnsTrue() {
|
||||
LibraryContentFilter filter = new LibraryContentFilter("org.acme:something:*");
|
||||
assertThat(filter.matches(mockLibrary("org.acme", "something", null))).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenGroupIdDoesNotMatchReturnsFalse() {
|
||||
LibraryContentFilter filter = new LibraryContentFilter("org.acme:*");
|
||||
assertThat(filter.matches(mockLibrary("other.foo", null, null))).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenWhenArtifactIdDoesNotMatchReturnsFalse() {
|
||||
LibraryContentFilter filter = new LibraryContentFilter("org.acme:test:*");
|
||||
assertThat(filter.matches(mockLibrary("org.acme", "other", null))).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenArtifactIdMatchesReturnsTrue() {
|
||||
LibraryContentFilter filter = new LibraryContentFilter("org.acme:test:*");
|
||||
assertThat(filter.matches(mockLibrary("org.acme", "test", null))).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenVersionDoesNotMatchReturnsFalse() {
|
||||
LibraryContentFilter filter = new LibraryContentFilter("org.acme:test:*SNAPSHOT");
|
||||
assertThat(filter.matches(mockLibrary("org.acme", "test", "1.0.0"))).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenVersionMatchesReturnsTrue() {
|
||||
LibraryContentFilter filter = new LibraryContentFilter("org.acme:test:*SNAPSHOT");
|
||||
assertThat(filter.matches(mockLibrary("org.acme", "test", "1.0.0-SNAPSHOT"))).isTrue();
|
||||
}
|
||||
|
||||
private Library mockLibrary(String groupId, String artifactId, String version) {
|
||||
return mockLibrary(LibraryCoordinates.of(groupId, artifactId, version));
|
||||
}
|
||||
|
||||
private Library mockLibrary(LibraryCoordinates coordinates) {
|
||||
Library library = mock(Library.class);
|
||||
given(library.getCoordinates()).willReturn(coordinates);
|
||||
return library;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.loader.tools.layer.application;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||
|
||||
/**
|
||||
* Tests for {@link FilteredResourceStrategy}.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
*/
|
||||
class FilteredResourceStrategyTests {
|
||||
|
||||
@Test
|
||||
void createWhenFiltersNullShouldThrowException() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> new FilteredResourceStrategy("custom", null));
|
||||
}
|
||||
|
||||
@Test
|
||||
void createWhenFiltersEmptyShouldThrowException() {
|
||||
assertThatIllegalArgumentException()
|
||||
.isThrownBy(() -> new FilteredResourceStrategy("custom", Collections.emptyList()));
|
||||
}
|
||||
|
||||
@Test
|
||||
void getLayerShouldReturnLayerName() {
|
||||
FilteredResourceStrategy strategy = new FilteredResourceStrategy("custom",
|
||||
Collections.singletonList(new TestFilter1()));
|
||||
assertThat(strategy.getLayer().toString()).isEqualTo("custom");
|
||||
}
|
||||
|
||||
@Test
|
||||
void getMatchingLayerWhenFilterMatchesIncludes() {
|
||||
FilteredResourceStrategy strategy = new FilteredResourceStrategy("custom",
|
||||
Collections.singletonList(new TestFilter1()));
|
||||
assertThat(strategy.getMatchingLayer("ABCD").toString()).isEqualTo("custom");
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenFilterMatchesIncludesAndExcludesFromSameFilter() {
|
||||
FilteredResourceStrategy strategy = new FilteredResourceStrategy("custom",
|
||||
Collections.singletonList(new TestFilter1()));
|
||||
assertThat(strategy.getMatchingLayer("AZ")).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenFilterMatchesIncludesAndExcludesFromAnotherFilter() {
|
||||
List<ResourceFilter> filters = new ArrayList<>();
|
||||
filters.add(new TestFilter1());
|
||||
filters.add(new TestFilter2());
|
||||
FilteredResourceStrategy strategy = new FilteredResourceStrategy("custom", filters);
|
||||
assertThat(strategy.getMatchingLayer("AY")).isNull();
|
||||
}
|
||||
|
||||
private static class TestFilter1 implements ResourceFilter {
|
||||
|
||||
@Override
|
||||
public boolean isResourceIncluded(String resourceName) {
|
||||
return resourceName.startsWith("A");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isResourceExcluded(String resourceName) {
|
||||
return resourceName.endsWith("Z");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class TestFilter2 implements ResourceFilter {
|
||||
|
||||
@Override
|
||||
public boolean isResourceIncluded(String resourceName) {
|
||||
return resourceName.startsWith("B");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isResourceExcluded(String resourceName) {
|
||||
return resourceName.endsWith("Y");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.loader.tools.layer.application;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link LocationFilter}.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
* @author Stephane Nicoll
|
||||
*/
|
||||
class LocationFilterTests {
|
||||
|
||||
@Test
|
||||
void isResourceIncludedWhenPatternMatchesWithWildcard() {
|
||||
LocationFilter filter = new LocationFilter(Collections.singletonList("META-INF/**"), Collections.emptyList());
|
||||
assertThat(filter.isResourceIncluded("META-INF/resources/application.yml")).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void isResourceIncludedWhenPatternDoesNotMatch() {
|
||||
LocationFilter filter = new LocationFilter(Collections.singletonList("META-INF/**"), Collections.emptyList());
|
||||
assertThat(filter.isResourceIncluded("src/main/resources/application.yml")).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void isResourceExcludedWhenPatternMatchesWithWildcard() {
|
||||
LocationFilter filter = new LocationFilter(Collections.emptyList(), Collections.singletonList("META-INF/**"));
|
||||
assertThat(filter.isResourceExcluded("META-INF/resources/application.yml")).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void isResourceExcludedWhenPatternDoesNotMatch() {
|
||||
LocationFilter filter = new LocationFilter(Collections.emptyList(), Collections.singletonList("META-INF/**"));
|
||||
assertThat(filter.isResourceExcluded("src/main/resources/application.yml")).isFalse();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,111 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.loader.tools.layer.library;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.loader.tools.Library;
|
||||
import org.springframework.boot.loader.tools.LibraryCoordinates;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* Tests for {@link CoordinateFilter}.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
* @author Scott Frederick
|
||||
*/
|
||||
class CoordinateFilterTests {
|
||||
|
||||
@Test
|
||||
void isLibraryIncludedWhenGroupIdIsNullAndToMatchHasWildcard() {
|
||||
List<String> includes = Collections.singletonList("*:*");
|
||||
CoordinateFilter filter = new CoordinateFilter(includes, Collections.emptyList());
|
||||
Library library = mock(Library.class);
|
||||
given(library.getCoordinates()).willReturn(new LibraryCoordinates(null, null, null));
|
||||
assertThat(filter.isLibraryIncluded(library)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void isLibraryIncludedWhenArtifactIdIsNullAndToMatchHasWildcard() {
|
||||
List<String> includes = Collections.singletonList("org.acme:*");
|
||||
CoordinateFilter filter = new CoordinateFilter(includes, Collections.emptyList());
|
||||
Library library = mock(Library.class);
|
||||
given(library.getCoordinates()).willReturn(new LibraryCoordinates("org.acme", null, null));
|
||||
assertThat(filter.isLibraryIncluded(library)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void isLibraryIncludedWhenVersionIsNullAndToMatchHasWildcard() {
|
||||
List<String> includes = Collections.singletonList("org.acme:something:*");
|
||||
CoordinateFilter filter = new CoordinateFilter(includes, Collections.emptyList());
|
||||
Library library = mock(Library.class);
|
||||
given(library.getCoordinates()).willReturn(new LibraryCoordinates("org.acme", "something", null));
|
||||
assertThat(filter.isLibraryIncluded(library)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void isLibraryIncludedWhenGroupIdDoesNotMatch() {
|
||||
List<String> includes = Collections.singletonList("org.acme:*");
|
||||
CoordinateFilter filter = new CoordinateFilter(includes, Collections.emptyList());
|
||||
Library library = mock(Library.class);
|
||||
given(library.getCoordinates()).willReturn(new LibraryCoordinates("other.foo", null, null));
|
||||
assertThat(filter.isLibraryIncluded(library)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void isLibraryIncludedWhenArtifactIdDoesNotMatch() {
|
||||
List<String> includes = Collections.singletonList("org.acme:test:*");
|
||||
CoordinateFilter filter = new CoordinateFilter(includes, Collections.emptyList());
|
||||
Library library = mock(Library.class);
|
||||
given(library.getCoordinates()).willReturn(new LibraryCoordinates("org.acme", "other", null));
|
||||
assertThat(filter.isLibraryIncluded(library)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void isLibraryIncludedWhenArtifactIdMatches() {
|
||||
List<String> includes = Collections.singletonList("org.acme:test:*");
|
||||
CoordinateFilter filter = new CoordinateFilter(includes, Collections.emptyList());
|
||||
Library library = mock(Library.class);
|
||||
given(library.getCoordinates()).willReturn(new LibraryCoordinates("org.acme", "test", null));
|
||||
assertThat(filter.isLibraryIncluded(library)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void isLibraryIncludedWhenVersionDoesNotMatch() {
|
||||
List<String> includes = Collections.singletonList("org.acme:test:*SNAPSHOT");
|
||||
CoordinateFilter filter = new CoordinateFilter(includes, Collections.emptyList());
|
||||
Library library = mock(Library.class);
|
||||
given(library.getCoordinates()).willReturn(new LibraryCoordinates("org.acme", "test", "1.0.0"));
|
||||
assertThat(filter.isLibraryIncluded(library)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
void isLibraryIncludedWhenVersionMatches() {
|
||||
List<String> includes = Collections.singletonList("org.acme:test:*SNAPSHOT");
|
||||
CoordinateFilter filter = new CoordinateFilter(includes, Collections.emptyList());
|
||||
Library library = mock(Library.class);
|
||||
given(library.getCoordinates()).willReturn(new LibraryCoordinates("org.acme", "test", "1.0.0-SNAPSHOT"));
|
||||
assertThat(filter.isLibraryIncluded(library)).isTrue();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,119 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.loader.tools.layer.library;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.loader.tools.Library;
|
||||
import org.springframework.boot.loader.tools.LibraryScope;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* Tests for {@link FilteredLibraryStrategy}.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
*/
|
||||
class FilteredLibraryStrategyTests {
|
||||
|
||||
@Test
|
||||
void createWhenFiltersNullShouldThrowException() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> new FilteredLibraryStrategy("custom", null));
|
||||
}
|
||||
|
||||
@Test
|
||||
void createWhenFiltersEmptyShouldThrowException() {
|
||||
assertThatIllegalArgumentException()
|
||||
.isThrownBy(() -> new FilteredLibraryStrategy("custom", Collections.emptyList()));
|
||||
}
|
||||
|
||||
@Test
|
||||
void getLayerShouldReturnLayerName() {
|
||||
FilteredLibraryStrategy strategy = new FilteredLibraryStrategy("custom",
|
||||
Collections.singletonList(new TestFilter1Library()));
|
||||
assertThat(strategy.getLayer().toString()).isEqualTo("custom");
|
||||
}
|
||||
|
||||
@Test
|
||||
void getMatchingLayerWhenFilterMatchesIncludes() {
|
||||
FilteredLibraryStrategy strategy = new FilteredLibraryStrategy("custom",
|
||||
Collections.singletonList(new TestFilter1Library()));
|
||||
Library library = mockLibrary("A-Compile", LibraryScope.COMPILE);
|
||||
assertThat(strategy.getMatchingLayer(library).toString()).isEqualTo("custom");
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenFilterMatchesIncludesAndExcludesFromSameFilter() {
|
||||
FilteredLibraryStrategy strategy = new FilteredLibraryStrategy("custom",
|
||||
Collections.singletonList(new TestFilter1Library()));
|
||||
Library library = mockLibrary("A-Runtime", LibraryScope.RUNTIME);
|
||||
assertThat(strategy.getMatchingLayer(library)).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void matchesWhenFilterMatchesIncludesAndExcludesFromAnotherFilter() {
|
||||
List<LibraryFilter> filters = new ArrayList<>();
|
||||
filters.add(new TestFilter1Library());
|
||||
filters.add(new TestFilter2Library());
|
||||
FilteredLibraryStrategy strategy = new FilteredLibraryStrategy("custom", filters);
|
||||
Library library = mockLibrary("A-Provided", LibraryScope.PROVIDED);
|
||||
assertThat(strategy.getMatchingLayer(library)).isNull();
|
||||
}
|
||||
|
||||
private Library mockLibrary(String name, LibraryScope runtime) {
|
||||
Library library = mock(Library.class);
|
||||
given(library.getName()).willReturn(name);
|
||||
given(library.getScope()).willReturn(runtime);
|
||||
return library;
|
||||
}
|
||||
|
||||
private static class TestFilter1Library implements LibraryFilter {
|
||||
|
||||
@Override
|
||||
public boolean isLibraryIncluded(Library library) {
|
||||
return library.getName().contains("A");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLibraryExcluded(Library library) {
|
||||
return library.getScope().equals(LibraryScope.RUNTIME);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class TestFilter2Library implements LibraryFilter {
|
||||
|
||||
@Override
|
||||
public boolean isLibraryIncluded(Library library) {
|
||||
return library.getName().contains("B");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLibraryExcluded(Library library) {
|
||||
return library.getScope().equals(LibraryScope.PROVIDED);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user