Skip to content

Commit 58db82b

Browse files
mkoubagsmet
authored andcommitted
Config: detect injected config value mismatch for missing values
- resolves quarkusio#37444 - follow-up of quarkusio#36281 (cherry picked from commit bd98d02)
1 parent 0469ec8 commit 58db82b

File tree

3 files changed

+63
-3
lines changed

3 files changed

+63
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package io.quarkus.arc.test.config.staticinit;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.junit.jupiter.api.Assertions.fail;
5+
6+
import java.util.Optional;
7+
8+
import jakarta.enterprise.context.ApplicationScoped;
9+
import jakarta.enterprise.context.Initialized;
10+
import jakarta.enterprise.event.Observes;
11+
import jakarta.inject.Singleton;
12+
13+
import org.eclipse.microprofile.config.inject.ConfigProperty;
14+
import org.junit.jupiter.api.AfterAll;
15+
import org.junit.jupiter.api.Test;
16+
import org.junit.jupiter.api.extension.RegisterExtension;
17+
18+
import io.quarkus.test.QuarkusUnitTest;
19+
20+
public class StaticInitConfigInjectionMissingValueFailureTest {
21+
22+
static final String PROPERTY_NAME = "static.init.missing.apfelstrudel";
23+
24+
@RegisterExtension
25+
static final QuarkusUnitTest config = new QuarkusUnitTest()
26+
.withApplicationRoot(root -> root
27+
.addClasses(StaticInitBean.class))
28+
.assertException(t -> {
29+
assertThat(t).isInstanceOf(IllegalStateException.class)
30+
.hasMessageContainingAll(
31+
"A runtime config property value differs from the value that was injected during the static intialization phase",
32+
"the runtime value of '" + PROPERTY_NAME
33+
+ "' is [gizmo] but the value [null] was injected into io.quarkus.arc.test.config.staticinit.StaticInitConfigInjectionMissingValueFailureTest$StaticInitBean#value");
34+
});
35+
36+
@Test
37+
public void test() {
38+
fail();
39+
}
40+
41+
@Singleton
42+
public static class StaticInitBean {
43+
44+
@ConfigProperty(name = PROPERTY_NAME)
45+
Optional<String> value;
46+
47+
// bean is instantiated during STATIC_INIT
48+
void onInit(@Observes @Initialized(ApplicationScoped.class) Object event) {
49+
System.setProperty(PROPERTY_NAME, "gizmo");
50+
}
51+
52+
}
53+
54+
@AfterAll
55+
static void afterAll() {
56+
System.clearProperty(PROPERTY_NAME);
57+
}
58+
}

extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/ConfigStaticInitCheckInterceptor.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ static void recordConfigValue(InjectionPoint injectionPoint, ConfigStaticInitVal
6969
value = getDefaultValue(injectionPoint, configProperty);
7070
}
7171
if (value == null) {
72-
LOG.debugf("No config value found for %s", propertyName);
73-
return;
72+
LOG.debugf("No config value found for %s - recording <null> value", propertyName);
7473
}
7574
if (configValues == null) {
7675
configValues = Arc.container().instance(ConfigStaticInitValues.class).get();

extensions/arc/runtime/src/main/java/io/quarkus/arc/runtime/ConfigStaticInitValues.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.ArrayList;
44
import java.util.Collections;
55
import java.util.List;
6+
import java.util.Objects;
67

78
import jakarta.annotation.Priority;
89
import jakarta.enterprise.event.Observes;
@@ -43,7 +44,9 @@ void onStart(@Observes @Priority(Integer.MIN_VALUE) StartupEvent event) {
4344
List<String> mismatches = new ArrayList<>();
4445
for (InjectedValue injectedValue : injectedValues) {
4546
ConfigValue currentValue = config.getConfigValue(injectedValue.name);
46-
if (currentValue.getValue() != null && !injectedValue.value.equals(currentValue.getValue())) {
47+
if (currentValue.getValue() != null
48+
&& !Objects.equals(currentValue.getValue(), injectedValue.value)) {
49+
// Config property is set at runtime and the value differs from the value injected during STATIC_INIT bootstrap phase
4750
mismatches.add(
4851
" - the runtime value of '" + injectedValue.name + "' is [" + currentValue.getValue()
4952
+ "] but the value [" + injectedValue.value

0 commit comments

Comments
 (0)