Skip to content

Conversation

lucamolteni
Copy link
Contributor

@lucamolteni lucamolteni commented Oct 9, 2025

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.

  • 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 #48130 (comment)

Release notes

Added property quarkus.debug.fail-on-missing-properties to make application fail when an unknown property is being set

Copy link

quarkus-bot bot commented Oct 9, 2025

Thanks for your pull request!

Your pull request does not follow our editorial rules. Could you have a look?

  • title should preferably start with an uppercase character (if it makes sense!)

This message is automatically generated by a bot.

dmlloyd
dmlloyd previously requested changes Oct 9, 2025

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
@lucamolteni lucamolteni force-pushed the check-unused-properties branch from a130a5d to 1aa0323 Compare October 10, 2025 13:04
@quarkus-bot quarkus-bot bot added area/devtools Issues/PR related to maven, gradle, platform and cli tooling/plugins area/maven area/narayana Transactions / Narayana labels Oct 10, 2025
* If set to true, the application will fail when an unknown configuration property is detected.
*/
@WithDefault("false")
boolean failOnMissingProperties();
Copy link
Member

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?

Copy link
Member

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.

Copy link
Member

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();

Copy link
Contributor Author

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);
Copy link
Member

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?

Copy link

quarkus-bot bot commented Oct 10, 2025

Status for workflow Quarkus CI

This is the status report for running Quarkus CI on commit d75ed60.

Failing Jobs

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)

@dmlloyd dmlloyd dismissed their stale review October 10, 2025 16:26

Concern was addressed

Copy link
Member

@radcortez radcortez left a 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.

Comment on lines +364 to +365
String configValue = BootstrapDebug.failOnMissingProperties();
boolean failOnMissingProperties = Boolean.parseBoolean(configValue);
Copy link
Member

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";
Copy link
Member

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.

Copy link
Member

@gsmet gsmet left a 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/config area/core area/devtools Issues/PR related to maven, gradle, platform and cli tooling/plugins area/maven area/narayana Transactions / Narayana area/testing triage/flaky-test

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants