/*
* Copyright 2012-2017 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
*
* http://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.context;
import java.util.LinkedHashSet;
import java.util.Set;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer.ComponentScanPackageCheck;
import org.springframework.boot.context.configwarnings.dflt.InDefaultPackageConfiguration;
import org.springframework.boot.context.configwarnings.dflt.InDefaultPackageWithBasePackageClassesConfiguration;
import org.springframework.boot.context.configwarnings.dflt.InDefaultPackageWithBasePackagesConfiguration;
import org.springframework.boot.context.configwarnings.dflt.InDefaultPackageWithMetaAnnotationConfiguration;
import org.springframework.boot.context.configwarnings.dflt.InDefaultPackageWithValueConfiguration;
import org.springframework.boot.context.configwarnings.dflt.InDefaultPackageWithoutScanConfiguration;
import org.springframework.boot.context.configwarnings.orgspring.InOrgSpringPackageConfiguration;
import org.springframework.boot.context.configwarnings.real.InRealButScanningProblemPackages;
import org.springframework.boot.context.configwarnings.real.InRealPackageConfiguration;
import org.springframework.boot.testutil.InternalOutputCapture;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link ConfigurationWarningsApplicationContextInitializer}.
*
* @author Phillip Webb
*/
public class ConfigurationWarningsApplicationContextInitializerTests {
private static final String DEFAULT_SCAN_WARNING = "Your ApplicationContext is unlikely to "
+ "start due to a @ComponentScan of the default package.";
private static final String ORGSPRING_SCAN_WARNING = "Your ApplicationContext is unlikely to "
+ "start due to a @ComponentScan of 'org.springframework'.";
@Rule
public InternalOutputCapture output = new InternalOutputCapture();
@Test
public void logWarningInDefaultPackage() {
load(InDefaultPackageConfiguration.class);
assertThat(this.output.toString()).contains(DEFAULT_SCAN_WARNING);
}
@Test
public void logWarningInDefaultPackageAndMetaAnnotation() {
load(InDefaultPackageWithMetaAnnotationConfiguration.class);
assertThat(this.output.toString()).contains(DEFAULT_SCAN_WARNING);
}
@Test
public void noLogIfInRealPackage() throws Exception {
load(InRealPackageConfiguration.class);
assertThat(this.output.toString()).doesNotContain(DEFAULT_SCAN_WARNING);
}
@Test
public void noLogWithoutComponentScanAnnotation() throws Exception {
load(InDefaultPackageWithoutScanConfiguration.class);
assertThat(this.output.toString()).doesNotContain(DEFAULT_SCAN_WARNING);
}
@Test
public void noLogIfHasValue() throws Exception {
load(InDefaultPackageWithValueConfiguration.class);
assertThat(this.output.toString()).doesNotContain(DEFAULT_SCAN_WARNING);
}
@Test
public void noLogIfHasBasePackages() throws Exception {
load(InDefaultPackageWithBasePackagesConfiguration.class);
assertThat(this.output.toString()).doesNotContain(DEFAULT_SCAN_WARNING);
}
@Test
public void noLogIfHasBasePackageClasses() throws Exception {
load(InDefaultPackageWithBasePackageClassesConfiguration.class);
assertThat(this.output.toString()).doesNotContain(DEFAULT_SCAN_WARNING);
}
@Test
public void logWarningInOrgSpringPackage() {
load(InOrgSpringPackageConfiguration.class);
assertThat(this.output.toString()).contains(ORGSPRING_SCAN_WARNING);
}
@Test
public void logWarningIfScanningProblemPackages() throws Exception {
load(InRealButScanningProblemPackages.class);
assertThat(this.output.toString())
.contains("Your ApplicationContext is unlikely to start due to a "
+ "@ComponentScan of the default package, 'org.springframework'.");
}
private void load(Class<?> configClass) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
new TestConfigurationWarningsApplicationContextInitializer().initialize(context);
context.register(configClass);
try {
context.refresh();
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
context.close();
}
}
/**
* Testable version of {@link ConfigurationWarningsApplicationContextInitializer}.
*/
public static class TestConfigurationWarningsApplicationContextInitializer
extends ConfigurationWarningsApplicationContextInitializer {
@Override
protected Check[] getChecks() {
return new Check[] { new TestComponentScanPackageCheck() };
}
}
/**
* Testable ComponentScanPackageCheck that doesn't need to use the default or
* {@code org.springframework} package.
*/
static class TestComponentScanPackageCheck extends ComponentScanPackageCheck {
@Override
protected Set<String> getComponentScanningPackages(
BeanDefinitionRegistry registry) {
Set<String> scannedPackages = super.getComponentScanningPackages(registry);
Set<String> result = new LinkedHashSet<>();
for (String scannedPackage : scannedPackages) {
if (scannedPackage.endsWith("dflt")) {
result.add("");
}
else if (scannedPackage.endsWith("orgspring")) {
result.add("org.springframework");
}
else {
result.add(scannedPackage);
}
}
return result;
}
}
}