You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "paulk-asert (via GitHub)" <gi...@apache.org> on 2026/09/05 23:03:56 UTC
[PR] GROOVY-12361: CachedMethod DirectInvoker: decline hidden declaring cl… [groovy]
paulk-asert opened a new pull request, #2882:
URL: https://github.com/apache/groovy/pull/2882
…asses
The generated trampoline names the declaring class, the return type and the parameter types in its bytecode (CHECKCAST, INVOKE*, or the classData invokeExact descriptor). A hidden class cannot be resolved by name, so the trampoline for e.g. a ProxyGeneratorAdapter proxy defined and initialised fine but threw NoClassDefFoundError on first invoke once the method passed the generation threshold. tryCreate now sticky-declines when any of those types is hidden, keeping the reflective path.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@groovy.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GROOVY-12361: CachedMethod DirectInvoker: decline hidden declaring cl… [groovy]
Posted by "codecov-commenter (via GitHub)" <gi...@apache.org>.
codecov-commenter commented on PR #2882:
URL: https://github.com/apache/groovy/pull/2882#issuecomment-5555531678
## [Codecov](https://app.codecov.io/gh/apache/groovy/pull/2882?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) Report
:x: Patch coverage is `72.72727%` with `3 lines` in your changes missing coverage. Please review.
:white_check_mark: Project coverage is 71.0971%. Comparing base ([`d4a2eb9`](https://app.codecov.io/gh/apache/groovy/commit/d4a2eb9440a18a8ae9758a462c840433ab8df6bf?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)) to head ([`14df823`](https://app.codecov.io/gh/apache/groovy/commit/14df8237a520f1a8a377a6b529ae9f55cacc8f2a?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)).
| [Files with missing lines](https://app.codecov.io/gh/apache/groovy/pull/2882?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Patch % | Lines |
|---|---|---|
| [...groovy/internal/runtime/invoke/InvokerFactory.java](https://app.codecov.io/gh/apache/groovy/pull/2882?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fapache%2Fgroovy%2Finternal%2Fruntime%2Finvoke%2FInvokerFactory.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2dyb292eS9pbnRlcm5hbC9ydW50aW1lL2ludm9rZS9JbnZva2VyRmFjdG9yeS5qYXZh) | 72.7273% | [1 Missing and 2 partials :warning: ](https://app.codecov.io/gh/apache/groovy/pull/2882?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
<details><summary>Additional details and impacted files</summary>
[](https://app.codecov.io/gh/apache/groovy/pull/2882?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
```diff
@@ Coverage Diff @@
## master #2882 +/- ##
==================================================
+ Coverage 71.0969% 71.0971% +0.0001%
- Complexity 37347 37352 +5
==================================================
Files 1579 1579
Lines 135477 135488 +11
Branches 25104 25108 +4
==================================================
+ Hits 96320 96328 +8
- Misses 30480 30481 +1
- Partials 8677 8679 +2
```
| [Files with missing lines](https://app.codecov.io/gh/apache/groovy/pull/2882?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Coverage Δ | |
|---|---|---|
| [...groovy/internal/runtime/invoke/InvokerFactory.java](https://app.codecov.io/gh/apache/groovy/pull/2882?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Forg%2Fapache%2Fgroovy%2Finternal%2Fruntime%2Finvoke%2FInvokerFactory.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2dyb292eS9pbnRlcm5hbC9ydW50aW1lL2ludm9rZS9JbnZva2VyRmFjdG9yeS5qYXZh) | `92.3077% <72.7273%> (-3.4906%)` | :arrow_down: |
... and [8 files with indirect coverage changes](https://app.codecov.io/gh/apache/groovy/pull/2882/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
</details>
<details><summary> :rocket: New features to boost your workflow: </summary>
- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
- :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@groovy.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GROOVY-12361: CachedMethod DirectInvoker: decline hidden declaring cl… [groovy]
Posted by "daniellansun (via GitHub)" <gi...@apache.org>.
daniellansun merged PR #2882:
URL: https://github.com/apache/groovy/pull/2882
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@groovy.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GROOVY-12361: CachedMethod DirectInvoker: decline hidden declaring cl… [groovy]
Posted by "daniellansun (via GitHub)" <gi...@apache.org>.
daniellansun commented on PR #2882:
URL: https://github.com/apache/groovy/pull/2882#issuecomment-5555679838
This is a set of notes on the commit, offered with respect — the overall direction looks right to me.
## Overall impression
The diagnosis and the production-side structure both seem sound to me.
The trampoline encodings name the declaring class, return type, and parameter types in the constant pool (`CHECKCAST` / `INVOKE*` / `invokeExact`). A hidden class is still identity-visible to the defining loader, so `canResolveInvokeTypes` / Step 1 can succeed, the hidden class defines, and the first invoke throws `NoClassDefFoundError`. That reading of GROOVY-12361 matches the bytecode in `InvokerBytecode`.
A single sticky decline in `tryCreate` also feels like the right place to hold the invariant. Patching Step 1 alone would not be enough: Step 2 already refuses a hidden nest host via `HiddenClassDefiner.canAttemptPrivateLookup`, but Step 3 (classData) and Step 4 (visible artifact) could still emit uninvokable bytecode. Folding `isHidden()` into `loaderCanResolve` would similarly miss Step 2/4, which do not walk the method’s types.
So the “code judo” here — four failure modes collapsed into one policy decline, with the reflective path remaining the fallback — is, in my view, the correct layer. I would not try to “fix” hidden types by asType-erasing classData so they can trampoline; that would add a third encoding for a case that has always been reflective.
The comments in `tryCreate` / `allTypesNameable` are also very helpful: they explain *why* define succeeds and invoke fails, which is the non-obvious part.
What I would be grateful to see tightened is mainly the tests (and one small layering point in `tryCreate`). I would not want to hold up the production idea; I would only suggest we lock the invariant a bit more firmly before landing.
## Suggestions
### 1. Consider treating the hidden-type check as a policy decline, next to the existing ones
```99:121:src/main/java/org/apache/groovy/internal/runtime/invoke/InvokerFactory.java
public static DirectInvoker tryCreate(final CachedMethod method) {
if (method == null || !generationAllowed()) {
return null;
}
if (method.isCallerSensitive() || Modifier.isAbstract(method.getModifiers())) {
return null;
}
try {
if (!allTypesNameable(method.getCachedMethod())) {
// ...
return null;
}
return defineSteps(method);
} catch (Exception | LinkageError ignored) {
```
Caller-sensitive and abstract are already sticky policy declines *before* the `try`. Hidden types seem to be the same kind of decision — “please do not generate” — rather than a define/link failure. Sitting inside `catch (Exception | LinkageError)` slightly blurs that boundary, and `getCachedMethod()` (which may `setAccessible`) becomes a side effect of the predicate.
Would it be reasonable to lift the check next to the other declines, and take `CachedMethod` the way `isPubliclyInvocableFromInvokerFactory` already does (`getDeclaringClass().getTheClass()`, `getReturnType()`, `getNativeParameterTypes()`)? That would also match the types `InvokerBytecode` actually writes, without calling `getCachedMethod()` only to inspect names.
A small related thought: the class javadoc’s define-path list does not yet mention this precondition. A reader of `tryStep1` still sees “loader can resolve these types” and could reasonably think a public hidden nestmate is legal. A sentence next to the four steps might save the next reader a trip through GROOVY-12361.
I would *not* suggest sprinkling `isHidden()` into `tryStep1` / `tryStep3` / `canResolveInvokeTypes` in addition to `tryCreate`. That would be the scattered version of this fix; the single gate is the cleaner model.
### 2. `testHiddenProxyStaysInvocablePastThreshold` may pass without exercising the bug
```502:518:src/test/groovy/org/apache/groovy/internal/runtime/invoke/InvokerFactoryTest.groovy
@Test
void testHiddenProxyStaysInvocablePastThreshold() {
String old = System.getProperty(InvokerFactory.PROPERTY_THRESHOLD)
System.setProperty(InvokerFactory.PROPERTY_THRESHOLD, '0')
try {
Object proxy = [name: { 'circle' }] as HiddenProxyBase
// ...
3.times { assertEquals('circle', name.invoke(proxy, new Object[0])) }
} finally {
if (old == null) System.clearProperty(InvokerFactory.PROPERTY_THRESHOLD)
else System.setProperty(InvokerFactory.PROPERTY_THRESHOLD, old)
}
}
```
This looks like the only test that walks the production hook (`CachedMethod.invoke` after the threshold), which is exactly the coverage we want. A few details made me slightly uneasy that it might stay green without generation ever running:
- Every other property-mutating test in this file, and in `CachedMethodDirectInvokerTest`, uses `@ResourceLock(Resources.SYSTEM_PROPERTIES)`. This one does not. Under parallel execution, a sibling could restore the default threshold while this test is running. Then `hits > 1000` is never true, generation never runs, and three reflective invokes would still pass.
- It never asserts `invokerAttempted` / `invoker == null`. The sticky-fail tests in this same file already do that (`testCachedMethodStickyFailsWhenAllDefineStepsFail`). Without those fields, “invoke still works” is not quite proof that the trampoline was refused.
- Save/restore is inlined; `restoreProperty` is already the local helper.
`testTryCreateDeclinesPublicHiddenHost` also splits `cm(ping)` across two instances, so the `invoke` after `tryCreate` is a fresh `CachedMethod` that never reaches threshold. That test still proves the factory returns null, which is valuable; it just does not prove the hook sticky-fails. The e2e test is the one that has to carry that load.
If you agree, matching `CachedMethodDirectInvokerTest`’s `withThreshold(0L, …)` shape would make this much harder to go green accidentally: lock, one `CachedMethod`, invoke past threshold, assert sticky-fail, then invoke again.
### 3. The old Step 3 fall-through test may now be slightly misleading
`testDefineStepsFallsThroughToClassDataForHiddenNonPublicHost` no longer tests fall-through. `tryCreate` returning null is a good assertion — it is the regression guard that a Step 1-only patch would miss. The second half then drives `tryCreateClassData` and asserts that an uninvokable trampoline still defines.
I may be missing a reason to keep that second half; from the outside it looks like a dead production path. `testClassDataEncodingInvokesPublicMethod` already covers classData on types that can actually run. A “definition succeeds; do not invoke” fixture might document a landmine rather than remove it.
Would you consider renaming to something like `testTryCreateDeclinesNonPublicHiddenHost`, keeping `assertNull(tryCreate(…))`, and dropping the `tryCreateClassData` success assertion?
I realise that once hidden hosts cannot be the Step 3 fixture, the production `tryCreate → defineSteps → tryStep3` orchestration is only hit via the reflective `tryStep3` probe. That seems acceptable — I would only suggest that the test name and comments not claim to cover `defineSteps` fall-through any more.
## Things I would not chase in this commit
- A shared “nameable type” helper. `CallSiteGenerator` has a similar constant-pool shape, but it is out of this commit and on the deprecated classic call-site path. If a second call site appears later, `HiddenClassDefiner` would be a more natural home than growing `InvokerFactory`.
- Extra tests for hidden parameter/return types without a hidden declaring class. That shape is almost unreachable from Groovy source. Declaring-class coverage (public + non-public + map-coerced proxy) is the production case, and the three-type walk in `allTypesNameable` is still the right defensive check.
## Summary
I think the production structure is the right one: one sticky decline at `tryCreate`, not a hidden-class special case in each define step. The notes above are about making that decline sit with the other policy gates, and about making the e2e test force generation under a property lock and assert sticky-fail, plus renaming the old Step 3 test so it no longer claims to cover `defineSteps` fall-through.
Thank you for the careful comments in the factory — they made the failure mode much easier to follow.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@groovy.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GROOVY-12361: CachedMethod DirectInvoker: decline hidden declaring cl… [groovy]
Posted by "Copilot (via GitHub)" <gi...@apache.org>.
Copilot commented on code in PR #2882:
URL: https://github.com/apache/groovy/pull/2882#discussion_r3942850502
##########
src/test/groovy/org/apache/groovy/internal/runtime/invoke/InvokerFactoryTest.groovy:
##########
@@ -474,9 +474,54 @@ final class InvokerFactoryTest {
}
// -------------------------------------------------------------------------
- // Forced Step 3 through defineSteps (hidden non-public nestmate)
+ // Hidden hosts (GROOVY-12361): no step may bind a hidden declaring class
// -------------------------------------------------------------------------
+ @Test
+ void testTryCreateDeclinesPublicHiddenHost() {
+ // The ProxyGeneratorAdapter shape: a public hidden nestmate whose public
+ // method is a Step 1 candidate. Its trampoline would CHECKCAST the
+ // receiver to the hidden class name, which no loader can resolve, so it
+ // defines fine but throws NoClassDefFoundError on first invoke.
+ byte[] bytes = emitStringPingClass(
+ 'org/apache/groovy/internal/runtime/invoke/PublicHiddenHost',
+ 'ping', 'hidden-pong', true)
+ Class<?> hiddenHost = HiddenClassDefiner.tryDefineNestmate(InvokerFactory.LOOKUP, bytes, true)
+ assertNotNull(hiddenHost)
+ assertTrue((Boolean) Class.getMethod('isHidden').invoke(hiddenHost))
+ Method ping = javaGetMethod(hiddenHost, 'ping')
+ assertTrue(InvokerFactory.isPubliclyInvocableFromInvokerFactory(cm(ping)))
+ assertFalse(InvokerFactory.allTypesNameable(ping))
+
+ assertNull(InvokerFactory.tryCreate(cm(ping)), 'hidden declaring class must not get a trampoline')
+ // the reflective path keeps working
+ Object host = ((Class) hiddenHost).getConstructor().newInstance()
+ assertEquals('hidden-pong', cm(ping).invoke(host, new Object[0]))
+ }
+
+ @Test
+ void testHiddenProxyStaysInvocablePastThreshold() {
Review Comment:
This test changes a JVM-global system property without taking the system-properties resource lock. Other tests in this class that mutate `PROPERTY_THRESHOLD` or related switches use `@ResourceLock(Resources.SYSTEM_PROPERTIES)` (for example, lines 608–615); without it, parallel JUnit execution can observe the temporary zero threshold or overwrite the value being restored, making the suite flaky.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@groovy.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GROOVY-12361: CachedMethod DirectInvoker: decline hidden declaring cl… [groovy]
Posted by "daniellansun (via GitHub)" <gi...@apache.org>.
daniellansun commented on PR #2882:
URL: https://github.com/apache/groovy/pull/2882#issuecomment-5558277081
Merged. Thanks.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@groovy.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GROOVY-12361: CachedMethod DirectInvoker: decline hidden declaring cl… [groovy]
Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #2882:
URL: https://github.com/apache/groovy/pull/2882#issuecomment-5555460146
## 🚨 TestLens detected 1 failed test 🚨
Here is what you can do:
1) Inspect the test failures carefully.
2) If you are convinced that some of the tests are flaky, you can mute them below.
3) Finally, trigger a rerun by checking the rerun checkbox.
### Test Summary
#### [Build and test / lts \(17, macos-latest\)](https://github.com/apache/groovy/actions/runs/33997644903/job/101390851666?pr=2882) > :test
| Test | Runs | Flakiness |
|---|---|--:|
| ChannelSelectTest > testDataBeatsTheTimerAndTheTimerStillFires\(\) | ❌ | 8% 🟠 |
🏷️ Commit: 14df8237a520f1a8a377a6b529ae9f55cacc8f2a
▶️ Tests: 37552 executed
🟡 Checks: 6/29 completed
### Test Failures
<details><summary><strong>ChannelSelectTest > testDataBeatsTheTimerAndTheTimerStillFires()</strong> (:test in <a href="https://github.com/apache/groovy/actions/runs/33997644903/job/101390851666?pr=2882">Build and test / lts (17, macos-latest)</a>)</summary>
```
Assertion failed:
assert result.index == 0 && result.value == 'done'
| | | |
| 1 | false
| false
SelectResult[channel=1, value=2026-09-05T23:18:46.872487Z]
at org.codehaus.groovy.runtime.InvokerHelper.createAssertError(InvokerHelper.java:409)
at TestScript67.run(TestScript67.groovy:12)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:552)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:587)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:571)
at groovy.test.GroovyAssert.assertScript(GroovyAssert.java:106)
at groovy.test.GroovyAssert.assertScript(GroovyAssert.java:96)
at groovy.concurrent.ChannelSelectTest.testDataBeatsTheTimerAndTheTimerStillFires(ChannelSelectTest.groovy:1135)
```
</details>
### Rerun Controls
> [!NOTE]
> Checks are currently running using the configuration below.
Select tests to mute in this pull request:
🔲 ChannelSelectTest > testDataBeatsTheTimerAndTheTimerStillFires\(\) <!-- uniqueId=[engine:junit-jupiter]/[class:groovy.concurrent.ChannelSelectTest]/[method:testDataBeatsTheTimerAndTheTimerStillFires()] -->
Reuse successful test results:
🔲 ♻️ Only rerun the tests that failed or were muted before
Click the checkbox to trigger a rerun:
🔲 **Rerun jobs**
---
_Learn more about TestLens at [testlens.app/docs](https://testlens.app/docs/features/pr-comment/)._
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@groovy.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GROOVY-12361: CachedMethod DirectInvoker: decline hidden declaring cl… [groovy]
Posted by "paulk-asert (via GitHub)" <gi...@apache.org>.
paulk-asert commented on PR #2882:
URL: https://github.com/apache/groovy/pull/2882#issuecomment-5557104316
Thanks @daniellansun for the careful notes — all three suggestions taken in the follow-up commit (1a575020a4), plus Copilot's lock point which was the same as your first bullet under (2).
**Production**
- The hidden-type check now sits above the `try` beside the caller-sensitive / abstract declines, so it reads as a policy decline rather than a define failure.
- `allTypesNameable` takes the `CachedMethod` and reads the declaring class, return type and native parameter types the same way `isPubliclyInvocableFromInvokerFactory` does, so it no longer forces accessibility on the underlying `Method`. (Either form yields the same classes as `InvokerBytecode` writes; this one just avoids the side effect.)
- The class javadoc gains a paragraph after the four define-path steps stating the hidden-type precondition, so a reader of `tryStep1` no longer has to go via GROOVY-12361.
**Tests**
- `testHiddenProxyStaysInvocablePastThreshold` now takes `@ResourceLock(Resources.SYSTEM_PROPERTIES)`, uses `restoreProperty`, drives a fresh `CachedMethod` past the threshold and asserts `invokerAttempted == true` / `invoker == null` before re-invoking, mirroring `testCachedMethodStickyFailsWhenAllDefineStepsFail`. For the record I also confirmed it is not vacuous: with the gate removed it fails with the original `NoClassDefFoundError` on the `_groovyProxy` hidden class, and the two factory-level tests fail on the null assertion.
- The old Step 3 fall-through test is renamed `testTryCreateDeclinesNonPublicHiddenHost`, keeps `assertNull(tryCreate(...))`, adds an `allTypesNameable` check, and drops the direct `tryCreateClassData` definition of an uninvokable trampoline. You were right that the "remaining classData tests rely on it" comment was inaccurate — they all use ordinary subjects.
One small note on the lock: JUnit parallel execution is not enabled in this build, so the race was theoretical, but consistency with the rest of the file is reason enough.
Not chased, as you suggested: a shared nameable-type helper with `CallSiteGenerator`, and extra coverage for hidden return/parameter types without a hidden declaring class (the three uncovered lines Codecov flags). The TestLens failure is the known-flaky `ChannelSelectTest` timer test, unrelated to this change.
`InvokerFactoryTest` (62) and `CachedMethodDirectInvokerTest` (33) are green locally.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@groovy.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GROOVY-12361: CachedMethod DirectInvoker: decline hidden declaring cl… [groovy]
Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #2882:
URL: https://github.com/apache/groovy/pull/2882#issuecomment-5557153481
## 🚨 TestLens detected 1 failed test 🚨
Here is what you can do:
1) Inspect the test failures carefully.
2) If you are convinced that some of the tests are flaky, you can mute them below.
3) Finally, trigger a rerun by checking the rerun checkbox.
### Test Summary
#### [Build and test / lts \(21, ubuntu-latest\)](https://github.com/apache/groovy/actions/runs/34013068522/job/101432097783?pr=2882) > :groovy-logging-test:test
| Test | Runs | Flakiness |
|---|---|--:|
| LogTest > testDefaultCategory\(\) | ❌ | 1% 🟡 |
🏷️ Commit: e8ad077ce777f50d5b8e43e3c79d848441ebf91e
▶️ Tests: 35870 executed
🟡 Checks: 6/30 completed
### Test Failures
<details><summary><strong>LogTest > testDefaultCategory()</strong> (:groovy-logging-test:test in <a href="https://github.com/apache/groovy/actions/runs/34013068522/job/101432097783?pr=2882">Build and test / lts (21, ubuntu-latest)</a>)</summary>
```
Assertion failed:
assert logFormatterSpy.messageReceived
| |
| false
groovy.util.logging.LogFormatterSpy@7a0ab480
at org.codehaus.groovy.runtime.InvokerHelper.createAssertError(InvokerHelper.java:409)
at groovy.util.logging.LogTest.testDefaultCategory(LogTest.groovy:381)
```
</details>
### Rerun Controls
> [!NOTE]
> Checks are currently running using the configuration below.
Select tests to mute in this pull request:
🔲 LogTest > testDefaultCategory\(\) <!-- uniqueId=[engine:junit-jupiter]/[class:groovy.util.logging.LogTest]/[method:testDefaultCategory()] -->
Reuse successful test results:
🔲 ♻️ Only rerun the tests that failed or were muted before
Click the checkbox to trigger a rerun:
🔲 **Rerun jobs**
---
_Learn more about TestLens at [testlens.app/docs](https://testlens.app/docs/features/pr-comment/)._
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@groovy.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org