Browse Source

Merge pull request #43214 from quaff

* pr/43214:
  Prohibit unnecessary value on `@EnumSource`

Closes gh-43214
pull/43217/head
Phillip Webb 1 year ago
parent
commit
246c4a21d6
  1. 32
      buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureCheck.java
  2. 4
      spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggagePropagationIntegrationTests.java
  3. 4
      spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/wavefront/WavefrontPropertiesTests.java
  4. 4
      spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/AcknowledgeModeTests.java
  5. 10
      spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mustache/MustacheAutoConfigurationTests.java
  6. 4
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java

32
buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureCheck.java

@ -94,7 +94,8 @@ public abstract class ArchitectureCheck extends DefaultTask {
noClassesShouldCallURLEncoderWithStringEncoding(), noClassesShouldCallURLDecoderWithStringEncoding(), noClassesShouldCallURLEncoderWithStringEncoding(), noClassesShouldCallURLDecoderWithStringEncoding(),
noClassesShouldLoadResourcesUsingResourceUtils(), noClassesShouldCallStringToUpperCaseWithoutLocale(), noClassesShouldLoadResourcesUsingResourceUtils(), noClassesShouldCallStringToUpperCaseWithoutLocale(),
noClassesShouldCallStringToLowerCaseWithoutLocale(), noClassesShouldCallStringToLowerCaseWithoutLocale(),
conditionalOnMissingBeanShouldNotSpecifyOnlyATypeThatIsTheSameAsMethodReturnType()); conditionalOnMissingBeanShouldNotSpecifyOnlyATypeThatIsTheSameAsMethodReturnType(),
enumSourceShouldNotSpecifyOnlyATypeThatIsTheSameAsMethodParameterType());
getRules().addAll(getProhibitObjectsRequireNonNull() getRules().addAll(getProhibitObjectsRequireNonNull()
.map((prohibit) -> prohibit ? noClassesShouldCallObjectsRequireNonNull() : Collections.emptyList())); .map((prohibit) -> prohibit ? noClassesShouldCallObjectsRequireNonNull() : Collections.emptyList()));
getRuleDescriptions().set(getRules().map((rules) -> rules.stream().map(ArchRule::getDescription).toList())); getRuleDescriptions().set(getRules().map((rules) -> rules.stream().map(ArchRule::getDescription).toList()));
@ -299,6 +300,35 @@ public abstract class ArchitectureCheck extends DefaultTask {
}; };
} }
private ArchRule enumSourceShouldNotSpecifyOnlyATypeThatIsTheSameAsMethodParameterType() {
return ArchRuleDefinition.methods()
.that()
.areAnnotatedWith("org.junit.jupiter.params.provider.EnumSource")
.should(notSpecifyOnlyATypeThatIsTheSameAsTheMethodParameterType())
.allowEmptyShould(true);
}
private ArchCondition<? super JavaMethod> notSpecifyOnlyATypeThatIsTheSameAsTheMethodParameterType() {
return new ArchCondition<>("not specify only a type that is the same as the method's parameter type") {
@Override
public void check(JavaMethod item, ConditionEvents events) {
JavaAnnotation<JavaMethod> conditional = item
.getAnnotationOfType("org.junit.jupiter.params.provider.EnumSource");
Map<String, Object> properties = conditional.getProperties();
if (properties.size() == 1 && item.getParameterTypes().size() == 1) {
conditional.get("value").ifPresent((value) -> {
if (value.equals(item.getParameterTypes().get(0))) {
events.add(SimpleConditionEvent.violated(item, conditional.getDescription()
+ " should not specify only a value that is the same as the method's parameter type"));
}
});
}
}
};
}
public void setClasses(FileCollection classes) { public void setClasses(FileCollection classes) {
this.classes = classes; this.classes = classes;
} }

4
spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggagePropagationIntegrationTests.java

@ -61,7 +61,7 @@ class BaggagePropagationIntegrationTests {
} }
@ParameterizedTest @ParameterizedTest
@EnumSource(AutoConfig.class) @EnumSource
void shouldSetEntriesToMdcFromSpanWithBaggage(AutoConfig autoConfig) { void shouldSetEntriesToMdcFromSpanWithBaggage(AutoConfig autoConfig) {
autoConfig.get().run((context) -> { autoConfig.get().run((context) -> {
Tracer tracer = tracer(context); Tracer tracer = tracer(context);
@ -87,7 +87,7 @@ class BaggagePropagationIntegrationTests {
} }
@ParameterizedTest @ParameterizedTest
@EnumSource(AutoConfig.class) @EnumSource
void shouldRemoveEntriesFromMdcForNullSpan(AutoConfig autoConfig) { void shouldRemoveEntriesFromMdcForNullSpan(AutoConfig autoConfig) {
autoConfig.get().run((context) -> { autoConfig.get().run((context) -> {
Tracer tracer = tracer(context); Tracer tracer = tracer(context);

4
spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/wavefront/WavefrontPropertiesTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2023 the original author or authors. * Copyright 2012-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -80,7 +80,7 @@ class WavefrontPropertiesTests {
} }
@ParameterizedTest @ParameterizedTest
@EnumSource(TokenType.class) @EnumSource
void wavefrontApiTokenMapping(TokenType from) { void wavefrontApiTokenMapping(TokenType from) {
WavefrontProperties properties = new WavefrontProperties(); WavefrontProperties properties = new WavefrontProperties();
properties.setApiTokenType(from); properties.setApiTokenType(from);

4
spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/AcknowledgeModeTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2023 the original author or authors. * Copyright 2012-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -32,7 +32,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
class AcknowledgeModeTests { class AcknowledgeModeTests {
@ParameterizedTest @ParameterizedTest
@EnumSource(Mapping.class) @EnumSource
void stringIsMappedToInt(Mapping mapping) { void stringIsMappedToInt(Mapping mapping) {
assertThat(AcknowledgeMode.of(mapping.actual)).extracting(AcknowledgeMode::getMode).isEqualTo(mapping.expected); assertThat(AcknowledgeMode.of(mapping.actual)).extracting(AcknowledgeMode::getMode).isEqualTo(mapping.expected);
} }

10
spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mustache/MustacheAutoConfigurationTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2023 the original author or authors. * Copyright 2012-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -158,7 +158,7 @@ class MustacheAutoConfigurationTests {
} }
@ParameterizedTest @ParameterizedTest
@EnumSource(ViewResolverKind.class) @EnumSource
void charsetCanBeCustomizedOnViewResolver(ViewResolverKind kind) { void charsetCanBeCustomizedOnViewResolver(ViewResolverKind kind) {
assertViewResolverProperty(kind, "spring.mustache.charset=UTF-16", "charset", "UTF-16"); assertViewResolverProperty(kind, "spring.mustache.charset=UTF-16", "charset", "UTF-16");
} }
@ -182,21 +182,21 @@ class MustacheAutoConfigurationTests {
} }
@ParameterizedTest @ParameterizedTest
@EnumSource(ViewResolverKind.class) @EnumSource
void prefixCanBeCustomizedOnViewResolver(ViewResolverKind kind) { void prefixCanBeCustomizedOnViewResolver(ViewResolverKind kind) {
assertViewResolverProperty(kind, "spring.mustache.prefix=classpath:/mustache-templates/", "prefix", assertViewResolverProperty(kind, "spring.mustache.prefix=classpath:/mustache-templates/", "prefix",
"classpath:/mustache-templates/"); "classpath:/mustache-templates/");
} }
@ParameterizedTest @ParameterizedTest
@EnumSource(ViewResolverKind.class) @EnumSource
void requestContextAttributeCanBeCustomizedOnViewResolver(ViewResolverKind kind) { void requestContextAttributeCanBeCustomizedOnViewResolver(ViewResolverKind kind) {
assertViewResolverProperty(kind, "spring.mustache.request-context-attribute=test", "requestContextAttribute", assertViewResolverProperty(kind, "spring.mustache.request-context-attribute=test", "requestContextAttribute",
"test"); "test");
} }
@ParameterizedTest @ParameterizedTest
@EnumSource(ViewResolverKind.class) @EnumSource
void suffixCanBeCustomizedOnViewResolver(ViewResolverKind kind) { void suffixCanBeCustomizedOnViewResolver(ViewResolverKind kind) {
assertViewResolverProperty(kind, "spring.mustache.suffix=.tache", "suffix", ".tache"); assertViewResolverProperty(kind, "spring.mustache.suffix=.tache", "suffix", ".tache");
} }

4
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java

@ -871,7 +871,7 @@ public abstract class AbstractServletWebServerFactoryTests {
} }
@ParameterizedTest @ParameterizedTest
@EnumSource(SameSite.class) @EnumSource
void sessionCookieSameSiteAttributeCanBeConfiguredAndOnlyAffectsSessionCookies(SameSite sameSite) throws Exception { void sessionCookieSameSiteAttributeCanBeConfiguredAndOnlyAffectsSessionCookies(SameSite sameSite) throws Exception {
AbstractServletWebServerFactory factory = getFactory(); AbstractServletWebServerFactory factory = getFactory();
factory.getSession().getCookie().setSameSite(sameSite); factory.getSession().getCookie().setSameSite(sameSite);
@ -886,7 +886,7 @@ public abstract class AbstractServletWebServerFactoryTests {
} }
@ParameterizedTest @ParameterizedTest
@EnumSource(SameSite.class) @EnumSource
void sessionCookieSameSiteAttributeCanBeConfiguredAndOnlyAffectsSessionCookiesWhenUsingCustomName(SameSite sameSite) void sessionCookieSameSiteAttributeCanBeConfiguredAndOnlyAffectsSessionCookiesWhenUsingCustomName(SameSite sameSite)
throws Exception { throws Exception {
AbstractServletWebServerFactory factory = getFactory(); AbstractServletWebServerFactory factory = getFactory();

Loading…
Cancel
Save