-
Notifications
You must be signed in to change notification settings - Fork 3k
Add strict property validation for QuarkusUnitTest #50488
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Thanks for your pull request! Your pull request does not follow our editorial rules. Could you have a look?
This message is automatically generated by a bot. |
This comment has been minimized.
This comment has been minimized.
Enable automatic failure on unrecognized configuration properties in test mode by default. Tests now fail fast when configuration typos are detected, eliminating the need for manual log assertions. Users can opt-out with .failOnUnknownProperties(false) when needed. - Use System property `quarkus.debug.fail-on-missing-properties` for feature flag - Enhance ConfigDiagnostic.unknown() to throw IllegalArgumentException when strict mode enabled - Add failOnUnknownProperties() method to QuarkusUnitTest for opt-out capability - Maintain backward compatibility: production mode unchanged, warnings only See quarkusio#48130 (comment) # Release notes Added property `quarkus.debug.fail-on-missing-properties` to make application fail when an unknown property is being set
a130a5d
to
1aa0323
Compare
* If set to true, the application will fail when an unknown configuration property is detected. | ||
*/ | ||
@WithDefault("false") | ||
boolean failOnMissingProperties(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm always here for bikeshedding :)
"Missing" properties could mean "properties the user didn't set but should have set". So I don't think that's quite the right wording.
"Unknown" would definitely be better, but maybe just align on the wording of (pre-existing) warnings? What do those warnings call these properties?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
By the way, shouldn't it be under quarkus.config.
?
@radcortez will surely have an opinion on that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Possibly related (or not):
/** | |
* Validates that a <code>@ConfigMapping</code> maps every available configuration name contained in the mapping | |
* prefix. | |
*/ | |
@WithName("config.mapping.validate-unknown") | |
Optional<Boolean> mappingValidateUnknown(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes I think the original "missing" came from "property missing from Quarkus" but the interpretation you gave "properties the user didn't set but should have set" is more plausible, so I'll change the wording
ConfigValue configValue = config.getConfigValue(property); | ||
if (property.equals(configValue.getName())) { | ||
unknown(property); | ||
unknown(property, failOnMissingProperties); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If there are multiple unknown properties, you will fail and report only the first one.
It would probably be better to report them all in a single exception?
Status for workflow
|
Status | Name | Step | Failures | Logs | Raw logs | Build scan |
---|---|---|---|---|---|---|
❌ | JVM Tests - JDK 17 | Build |
Failures | Logs | Raw logs | 🚧 |
❌ | JVM Tests - JDK 21 | Build |
Failures | Logs | Raw logs | 🔍 |
❌ | JVM Tests - JDK 25 | Build |
Failures | Logs | Raw logs | 🔍 |
❌ | JVM Tests - JDK 17 Windows | Build |
Failures | Logs | Raw logs | 🚧 |
❌ | JVM Integration Tests - JDK 17 | Build |
Failures | Logs | Raw logs | 🚧 |
❌ | JVM Integration Tests - JDK 17 Windows | Build |
Failures | Logs | Raw logs | 🚧 |
❌ | JVM Integration Tests - JDK 21 | Build |
Failures | Logs | Raw logs | 🚧 |
❌ | JVM Integration Tests - JDK 25 | Build |
Failures | Logs | Raw logs | 🚧 |
Full information is available in the Build summary check run.
You can consult the Develocity build scans.
Failures
⚙️ JVM Tests - JDK 17 #
- Failing: extensions/vertx-http/deployment
! Skipped: devtools/cli extensions/agroal/deployment extensions/amazon-lambda-http/deployment and 147 more
📦 extensions/vertx-http/deployment
❌ io.quarkus.vertx.http.certReload.MainHttpServerMtlsPKCS12CertificateReloadTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.client-auth=required
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
❌ io.quarkus.vertx.http.certReload.MainHttpServerTlsCertificateReloadTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.insecure-requests
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
❌ io.quarkus.vertx.http.certReload.MainHttpServerTlsCertificateReloadWithTlsRegistryAndUpdateEventTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.insecure-requests
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
❌ io.quarkus.vertx.http.certReload.MainHttpServerTlsCertificateReloadWithTlsRegistryTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.insecure-requests
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
⚙️ JVM Tests - JDK 21 #
- Failing: extensions/vertx-http/deployment
! Skipped: devtools/cli extensions/agroal/deployment extensions/amazon-lambda-http/deployment and 147 more
📦 extensions/vertx-http/deployment
❌ io.quarkus.vertx.http.certReload.MainHttpServerMtlsPKCS12CertificateReloadTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.client-auth=required
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:733)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
❌ io.quarkus.vertx.http.certReload.MainHttpServerTlsCertificateReloadTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.insecure-requests
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:733)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
❌ io.quarkus.vertx.http.certReload.MainHttpServerTlsCertificateReloadWithTlsRegistryAndUpdateEventTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.insecure-requests
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:733)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
❌ io.quarkus.vertx.http.certReload.MainHttpServerTlsCertificateReloadWithTlsRegistryTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.insecure-requests
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:733)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
⚙️ JVM Tests - JDK 25 #
- Failing: extensions/vertx-http/deployment
! Skipped: devtools/cli extensions/agroal/deployment extensions/amazon-lambda-http/deployment and 147 more
📦 extensions/vertx-http/deployment
❌ io.quarkus.vertx.http.certReload.MainHttpServerMtlsPKCS12CertificateReloadTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.client-auth=required
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:735)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
❌ io.quarkus.vertx.http.certReload.MainHttpServerTlsCertificateReloadTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.insecure-requests
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:735)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
❌ io.quarkus.vertx.http.certReload.MainHttpServerTlsCertificateReloadWithTlsRegistryAndUpdateEventTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.insecure-requests
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:735)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
❌ io.quarkus.vertx.http.certReload.MainHttpServerTlsCertificateReloadWithTlsRegistryTest.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.http.ssl.insecure-requests
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:735)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
⚙️ JVM Tests - JDK 17 Windows #
- Failing: extensions/config-yaml/deployment extensions/elytron-security-properties-file/deployment independent-projects/tools/analytics-common
! Skipped: devtools/cli devtools/gradle/gradle-application-plugin devtools/maven and 97 more
📦 extensions/config-yaml/deployment
❌ io.quarkus.config.yaml.deployment.UnknownQuarkusConfigPropertyTest.
line 24
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: "quarkus.log.level"
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
📦 extensions/elytron-security-properties-file/deployment
❌ io.quarkus.security.test.CustomAuthEmbeddedEncryptedTestCase.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.security.users.embedded.auth-mechanism
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
❌ io.quarkus.security.test.CustomAuthEmbeddedTestCase.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.security.users.embedded.auth-mechanism
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
❌ io.quarkus.security.test.NoConfiguredRealmsTestCase.
- History - More details - Source on GitHub
java.lang.RuntimeException:
io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass threw an exception: java.lang.IllegalArgumentException: Build failed due to unrecognized configuration properties: quarkus.security.file.enabled
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknown(ConfigDiagnostic.java:90)
at io.quarkus.runtime.configuration.ConfigDiagnostic.unknownProperties(ConfigDiagnostic.java:161)
at io.quarkus.deployment.steps.ConfigGenerationBuildStep.generateConfigClass(ConfigGenerationBuildStep.java:367)
at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:872)
📦 independent-projects/tools/analytics-common
❌ io.quarkus.analytics.rest.RestClientTest.postIdentity
line 102
- History - More details - Source on GitHub
java.util.concurrent.TimeoutException
at java.base/java.util.concurrent.CompletableFuture.timedGet(CompletableFuture.java:1960)
at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2095)
at io.quarkus.analytics.rest.RestClientTest.postIdentity(RestClientTest.java:102)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
⚙️ JVM Integration Tests - JDK 17 #
- Failing: integration-tests/test-extension/extension/deployment
! Skipped: integration-tests/test-extension/tests
📦 integration-tests/test-extension/extension/deployment
❌ io.quarkus.extest.UnknownConfigTest.
line 36
- History - More details - Source on GitHub
org.opentest4j.AssertionFailedError: expected: <false> but was: <true>
at io.quarkus.extest.UnknownConfigTest.lambda$static$3(UnknownConfigTest.java:36)
at io.quarkus.test.QuarkusUnitTest.afterAll(QuarkusUnitTest.java:865)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
⚙️ JVM Integration Tests - JDK 17 Windows #
- Failing: integration-tests/test-extension/extension/deployment
! Skipped: integration-tests/test-extension/tests
📦 integration-tests/test-extension/extension/deployment
❌ io.quarkus.extest.UnknownConfigTest.
line 36
- History - More details - Source on GitHub
org.opentest4j.AssertionFailedError: expected: <false> but was: <true>
at io.quarkus.extest.UnknownConfigTest.lambda$static$3(UnknownConfigTest.java:36)
at io.quarkus.test.QuarkusUnitTest.afterAll(QuarkusUnitTest.java:865)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
⚙️ JVM Integration Tests - JDK 21 #
- Failing: integration-tests/test-extension/extension/deployment integration-tests/virtual-threads/grpc-virtual-threads
! Skipped: integration-tests/test-extension/tests
📦 integration-tests/test-extension/extension/deployment
❌ io.quarkus.extest.UnknownConfigTest.
line 36
- History - More details - Source on GitHub
org.opentest4j.AssertionFailedError: expected: <false> but was: <true>
at io.quarkus.extest.UnknownConfigTest.lambda$static$3(UnknownConfigTest.java:36)
at io.quarkus.test.QuarkusUnitTest.afterAll(QuarkusUnitTest.java:865)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
📦 integration-tests/virtual-threads/grpc-virtual-threads
❌ io.quarkus.grpc.example.streaming.VirtualThreadTest.
- History - More details - Source on GitHub
org.junit.jupiter.engine.execution.ConditionEvaluationException: Failed to evaluate condition [io.quarkus.test.junit.QuarkusTestExtension]: Internal error: Test class was loaded with an unexpected classloader or the thread context classloader was incorrect.
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1685)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
❌ io.quarkus.grpc.example.streaming.VirtualThreadTest.testGrpcClient
- History - More details - Source on GitHub
java.lang.AssertionError:
1 expectation failed.
Expected status code <200> but was <500>.
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:73)
at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:108)
⚙️ JVM Integration Tests - JDK 25 #
- Failing: integration-tests/test-extension/extension/deployment integration-tests/virtual-threads/grpc-virtual-threads
! Skipped: integration-tests/test-extension/tests
📦 integration-tests/test-extension/extension/deployment
❌ io.quarkus.extest.UnknownConfigTest.
line 36
- History - More details - Source on GitHub
org.opentest4j.AssertionFailedError: expected: <false> but was: <true>
at io.quarkus.extest.UnknownConfigTest.lambda$static$2(UnknownConfigTest.java:36)
at io.quarkus.test.QuarkusUnitTest.afterAll(QuarkusUnitTest.java:865)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1604)
📦 integration-tests/virtual-threads/grpc-virtual-threads
❌ io.quarkus.grpc.example.streaming.VertxVirtualThreadTest.
- History - More details - Source on GitHub
org.junit.jupiter.engine.execution.ConditionEvaluationException: Failed to evaluate condition [io.quarkus.test.junit.QuarkusTestExtension]: Internal error: Test class was loaded with an unexpected classloader or the thread context classloader was incorrect.
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:214)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:197)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:214)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:197)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:214)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1693)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:147)
❌ io.quarkus.grpc.example.streaming.VertxVirtualThreadTest.testUnary
- History - More details - Source on GitHub
io.grpc.StatusRuntimeException: INTERNAL: Half-closed without a request
at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:368)
at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:349)
at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:174)
at io.grpc.testing.integration.TestServiceGrpc$TestServiceBlockingStub.unaryCall(TestServiceGrpc.java:277)
at io.quarkus.grpc.example.streaming.VirtualThreadTestBase.testUnary(VirtualThreadTestBase.java:33)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at io.quarkus.test.junit.QuarkusTestExtension.runExtensionMethod(QuarkusTestExtension.java:998)
Flaky tests - Develocity
⚙️ JVM Tests - JDK 25
📦 test-framework/jacoco/runtime
❌ io.quarkus.jacoco.runtime.DataFileWatchTest.waitForDataFileThatNeverAppears
- History
Expecting value to be false but was true
-org.opentest4j.AssertionFailedError
org.opentest4j.AssertionFailedError:
Expecting value to be false but was true
at io.quarkus.jacoco.runtime.DataFileWatchTest.waitForDataFileThatNeverAppears(DataFileWatchTest.java:208)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1604)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1604)
⚙️ JVM Tests - JDK 17 Windows
📦 independent-projects/tools/analytics-common
❌ io.quarkus.analytics.AnalyticsServiceTest.sendAnalyticsTest
- History
Assertion condition defined as a Lambda expression in io.quarkus.analytics.AnalyticsServiceTest Expected at least one request matching: { "url" : "/v1/track", "method" : "POST" } Requests received: [ ] within 5 seconds.
-org.awaitility.core.ConditionTimeoutException
org.awaitility.core.ConditionTimeoutException:
Assertion condition defined as a Lambda expression in io.quarkus.analytics.AnalyticsServiceTest Expected at least one request matching: {
"url" : "/v1/track",
"method" : "POST"
}
Requests received: [ ] within 5 seconds.
at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:119)
❌ io.quarkus.analytics.rest.RestClientFailTest.postIdentityServerTTLExceeded
- History
Assertion condition defined as a Lambda expression in io.quarkus.analytics.rest.RestClientFailTest Expected at least one request matching: { "url" : "/v1/identify", "method" : "POST" } Requests received: [ ] within 5 seconds.
-org.awaitility.core.ConditionTimeoutException
org.awaitility.core.ConditionTimeoutException:
Assertion condition defined as a Lambda expression in io.quarkus.analytics.rest.RestClientFailTest Expected at least one request matching: {
"url" : "/v1/identify",
"method" : "POST"
}
Requests received: [ ] within 5 seconds.
at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
at org.awaitility.core.AssertionCondition.await(AssertionCondition.java:119)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for the PR!
I think it is confusing to have a flag that behaves differently depending on what type of test is executed (true
for QuarkusUnitTest
and false
for everything else). We are not able to model this properly in our configuration system (other than using documentation), so it is preferred for the default to be consistent across the system.
Also, this could potentially cause breaking changes to the ecosystem, since by default, we are now applying strict validation, and that can be observed by the number of tests in the repo that had to be fixed. Usually, when we do this kind of thing, we first introduce the flag, keep the same behaviour, and give some notice to users that we are going to flip it at some point to give time for adjustment. On the other hand, I don't think we want to introduce a default to fail a prod app due to unknown configuration. The configuration might be in a source that cannot be easily changed.
My recommendation is to have the flag set with the same default, and then QuarkusUnitTest
offer failOnUnknownConfiguration()
, which will enable the feature.
We could then consider setting a global flag in the Quarkus repo to enable the feature without affecting the rest of the ecosystem.
String configValue = BootstrapDebug.failOnMissingProperties(); | ||
boolean failOnMissingProperties = Boolean.parseBoolean(configValue); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This must use the config system and DebugConfig
to retrieve the actual value.
return System.getProperty("quarkus.debug.generated-sources-dir"); | ||
} | ||
|
||
public static final String FAIL_ON_MISSING_PROPERTY_KEY = "quarkus.debug.fail-on-missing-properties"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We must not hardcode the configuration name when we already have the config available in a @ConfigMapping
, and we must use the config system and DebugConfig
to retrieve the actual value.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FWIW, I will let others chime in for reviewing (and they already did!) but I think it's a move in the right direction and definitely worth pursuing.
Add strict property validation for QuarkusUnitTest
Enable automatic failure on unrecognized configuration properties in test mode by default.
Tests now fail fast when configuration typos are detected, eliminating the need for manual
log assertions. Users can opt-out with .failOnUnknownProperties(false) when needed.
quarkus.debug.fail-on-missing-properties
for feature flagConfigDiagnostic.unknown()
to throwIllegalArgumentException
when strict mode enabledfailOnUnknownProperties()
method to QuarkusUnitTest for opt-out capabilitySee #48130 (comment)
Release notes
Added property
quarkus.debug.fail-on-missing-properties
to make application fail when an unknown property is being set