Closed Bug 1802638 Opened 2 years ago Closed 2 years ago

Cannot run automated test on compose lazy list: java.lang.IllegalArgumentException: Failed requirement. at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:190

Categories

(Focus :: General, defect)

All
Android
defect

Tracking

(Not tracked)

RESOLVED WORKSFORME

People

(Reporter: cpeterson, Unassigned)

Details

From github: https://github.com/mozilla-mobile/focus-android/issues/7282.

Steps to reproduce

Note:This is for documenting my findings in testing Compose lazy lists. Not manually reproducible, this is affecting UI tests only (as far as I know), but needs an engineer's attention

While trying to refactor englishSystemLocaleTest() to test with Compose test rule, I hit this error trying to scroll the language list:

java.lang.IllegalArgumentException: Failed requirement.
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:190)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:662)
at androidx.compose.ui.node.Owner$DefaultImpls.measureAndLayout$default(Owner.kt:182)
at androidx.compose.ui.node.LayoutNode.forceRemeasure(LayoutNode.kt:1339)
at androidx.compose.foundation.lazy.layout.LazyLayoutState.remeasure(LazyLayoutState.kt:54)
at androidx.compose.foundation.lazy.LazyListState.snapToItemIndexInternal$foundation_release(LazyListState.kt:202)
at androidx.compose.foundation.lazy.LazyListState$scrollToItem$2.invokeSuspend(LazyListState.kt:194)
at androidx.compose.foundation.lazy.LazyListState$scrollToItem$2.invoke(Unknown Source:8)
at androidx.compose.foundation.lazy.LazyListState$scrollToItem$2.invoke(Unknown Source:4)

While investigating I've tried a solution found here https://dmytroshuba.com/blog/jetpack-compose-ui-testing/#h-lateinit-property-remeasurement-has-not-been-initialized-in-lazylist* to replace scrollToItem(index) with animateScrollToItem(index) which should work the same way.
The test passed now until I hit another crash which didn't seem so straightforward to fix:
java.lang.IllegalStateException: measure() may not be called multiple times on the same Measurable. Current state InMeasureBlock. Parent state Measuring.
Test log: https://console.firebase.google.com/u/1/project/moz-focus-android/testlab/histories/bh.2189b040bbce6d5a/matrices/5356848690213833442/executions/bs.c8e057ae5d7d1fc4/testcases/1/test-cases

Meanwhile, the UI tests are now written using UiAutomator and not scrolling the list (it will scroll only partially, not all the way down), but it would be nice to have a working scrollable language list in case we need to expand our testing. Also good to know in case other lists are refactored to Compose LazyList.

Device information

  • Android device: Pixel 3 (android 11)
  • Focus version: debug

Change performed by the Move to Bugzilla add-on.

not reproducible anymore.

Status: NEW → RESOLVED
Closed: 2 years ago
Resolution: --- → WORKSFORME
You need to log in before you can comment on or make changes to this bug.