-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
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
Remove Arrays.asList from critical stubbing path in GenericMetadataSu… #3610
Conversation
…pport On Android, the implementation of java.util.Arrays.ArrayList.toArray has a non-trivial implementation that ends up calling into android.os.Process.myUid(). Consequently, attempting to stub static methods in android.os.Process with doReturn will end up calling into myUid() before the stubbing completes, triggering an infinite recursion. To work around that, replace the addAll(asList(...)) call with Collections.addAll. As an added benefit this avoids an array copy. This upstreams https://r.android.com/3500336.
Please add a regression test to https://github.com/mockito/mockito/tree/main/mockito-integration-tests/android-tests/src/ so we can ensure this remains fixed. Thanks for upstreaming this effort 👍 |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #3610 +/- ##
=========================================
Coverage 85.56% 85.56%
Complexity 2957 2957
=========================================
Files 341 341
Lines 9028 9028
Branches 1119 1119
=========================================
Hits 7725 7725
Misses 1013 1013
Partials 290 290 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Thank you for the review! I considered adding a test for this, but reproducing the issue requires both static mocking and running on the Android runtime; the Android platform tests use ExtendedMockito to achieve that, but the latest version of that doesn't work with Mockito 5. |
| Package | Type | Package file | Manager | Update | Change | |---|---|---|---|---|---| | [org.mockito:mockito-core](https://github.com/mockito/mockito) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `5.16.0` -> `5.16.1` | | [org.junit.jupiter:junit-jupiter-params](https://junit.org/junit5/) ([source](https://github.com/junit-team/junit5)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `5.12.0` -> `5.12.1` | | [org.junit.jupiter:junit-jupiter-engine](https://junit.org/junit5/) ([source](https://github.com/junit-team/junit5)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `5.12.0` -> `5.12.1` | | [org.junit.jupiter:junit-jupiter-api](https://junit.org/junit5/) ([source](https://github.com/junit-team/junit5)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `5.12.0` -> `5.12.1` | | [software.amazon.awssdk:sdk-core](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `2.31.0` -> `2.31.1` | | [software.amazon.awssdk:sqs](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `2.31.0` -> `2.31.1` | | [software.amazon.awssdk:dynamodb-enhanced](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `2.31.0` -> `2.31.1` | | [software.amazon.awssdk:dynamodb](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `2.31.0` -> `2.31.1` | | [software.amazon.awssdk:aws-core](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `2.31.0` -> `2.31.1` | | [software.amazon.awssdk:bom](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `2.31.0` -> `2.31.1` | | [software.amazon.awssdk:auth](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `2.31.0` -> `2.31.1` | --- ### Release Notes <details> <summary>mockito/mockito (org.mockito:mockito-core)</summary> ### [`v5.16.1`](https://github.com/mockito/mockito/releases/tag/v5.16.1) <sup><sup>*Changelog generated by [Shipkit Changelog Gradle Plugin](https://github.com/shipkit/shipkit-changelog)*</sup></sup> ##### 5.16.1 - 2025-03-15 - [3 commit(s)](mockito/mockito@v5.16.0...v5.16.1) by Adrian Roos, Jérôme Prinet, Rafael Winterhalter - Remove Arrays.asList from critical stubbing path in GenericMetadataSu… [(#​3610)](mockito/mockito#3610) - Rework of injection strategy in the context of modules [(#​3608)](mockito/mockito#3608) - Adjust inline mocking snippet to allow task relocatability [(#​3606)](mockito/mockito#3606) - Inline mocking configuration snippet for Gradle should allow task relocatability [(#​3605)](mockito/mockito#3605) </details> --- ### Configuration 📅 **Schedule**: Branch creation - "after 6pm every weekday,before 2am every weekday" in timezone Australia/Melbourne, Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Never, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). GitOrigin-RevId: 1939516a6a445b5c4812a6d4f27f483cdb66b66e
…pport
On Android, the implementation of java.util.Arrays.ArrayList.toArray has a non-trivial implementation that ends up calling into android.os.Process.myUid().
Consequently, attempting to stub static methods in android.os.Process with doReturn will end up calling into myUid() before the stubbing completes, triggering an infinite recursion.
To work around that, replace the addAll(asList(...)) call with Collections.addAll. As an added benefit this avoids an array copy.
This upstreams https://r.android.com/3500336.
The infinitely recursing stack trace was triggered by
ExtendedMockito.doReturn(true).when(() -> Process.isSdkSandbox());
:Checklist
including project members to get a better picture of the change
commit is meaningful and help the people that will explore a change in 2 years
Fixes #<issue number>
in the description if relevantFixes #<issue number>
if relevant