Output:
Chunk ID: 2437bf
Wall time: 30.0006 seconds
Process running with session ID 84930
Original token count: 163
Output:

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended


#139’s JVM tests are still in progress with standard JVM warnings.


Output:
Chunk ID: 6f2b2c
Wall time: 30.0012 seconds
Process running with session ID 84930
Original token count: 80
Output:
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

> Task :app:testDebugUnitTest

ReportBugViewModelTest > submit should call sentryWrapper captureFeedback when enabled FAILED
    java.lang.AssertionError at ReportBugViewModelTest.kt:129


A unit test failed after the compileSdk/Core update: `ReportBugViewModelTest > submit should call sentryWrapper captureFeedback when enabled`. I’m waiting for the full test output, then I’ll inspect the test and implementation rather than guessing.


Output:
Chunk ID: cef950
Wall time: 16.0340 seconds
Process exited with code 1
Original token count: 263
Output:

463 tests completed, 1 failed

> Task :app:testDebugUnitTest FAILED
> Task :app:finalizeTestRoborazziDebug SKIPPED

[Incubating] Problems report is available at: file:///home/Messier82/projects/service-book/build/reports/problems/problems-report.html

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:testDebugUnitTest'.
> There were failing tests. See the results at: file:///home/Messier82/projects/service-book/app/build/test-results/testDebugUnitTest/

* Try:
> Run with --scan to get full insights from a Build Scan (powered by Develocity).

Deprecated Gradle features were used in this build, making it incompatible with Gradle 10.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/9.5.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD FAILED in 3m 15s
31 actionable tasks: 15 executed, 16 up-to-date


Only one of 463 tests failed. I’m reading the failure details and the surrounding test code before deciding whether this is a real compatibility issue or a test synchronization flake.


sed -n '1,220p' app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt


sed -n '1,220p' app/src/main/java/com/yorvana/ui/reportbug/ReportBugViewModel.kt


sed -n '1,180p' app/build/test-results/testDebugUnitTest/TEST-com.yorvana.ui.reportbug.ReportBugViewModelTest.xml


Output:
Chunk ID: 1f3cf1
Wall time: 0.1927 seconds
Process exited with code 0
Original token count: 2191
Output:
package com.yorvana.ui.reportbug

import androidx.test.core.app.ApplicationProvider
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
import com.yorvana.BuildConfig
import com.yorvana.R
import com.yorvana.YorvanaApplication
import com.yorvana.data.preferences.AppPreferences
import com.yorvana.data.preferences.AppPreferencesStore
import com.yorvana.domain.AppGate
import com.yorvana.ui.util.ViewModelDependencies
import com.yorvana.ui.util.testInstance
import com.yorvana.util.SentryWrapper
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.setMain
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config

@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [34])
class ReportBugViewModelTest {
    private lateinit var preferences: AppPreferencesStore
    private lateinit var app: YorvanaApplication
    private lateinit var sentryWrapper: SentryWrapper
    private lateinit var viewModel: ReportBugViewModel
    private val testDispatcher = UnconfinedTestDispatcher()

    private val testSubmitEvent = ReportBugEvent.Submit

    @Before
    fun setUp() {
        Dispatchers.setMain(testDispatcher)
        preferences = mockk(relaxed = true)
        app = ApplicationProvider.getApplicationContext()
        sentryWrapper = mockk(relaxed = true)

        every { preferences.preferences } returns MutableStateFlow(AppPreferences(vaultUriString = "content://vault"))
    }

    @After
    fun tearDown() {
        Dispatchers.resetMain()
    }

    private fun createViewModel(): ReportBugViewModel {
        val appGate = mockk<AppGate>(relaxed = true)
        every { appGate.isReadOnly } returns MutableStateFlow(false)
        every { appGate.isPremium } returns MutableStateFlow(false)
        every { appGate.hasPendingPurchase } returns MutableStateFlow(false)

        return ReportBugViewModel(
            dependencies =
                ViewModelDependencies.testInstance(
                    app = app,
                    appGate = appGate,
                    preferences = preferences,
                    sentryWrapper = sentryWrapper,
                ),
        )
    }

    @Test
    fun `initial state should load version and vault info`() =
        runTest {
            viewModel = createViewModel()
            viewModel.state.test {
                // Wait for the update from init block
                var state = awaitItem()
                while (state.appVersion.isEmpty()) {
                    state = awaitItem()
                }
                assertThat(state.appVersion).isEqualTo(BuildConfig.VERSION_NAME)
                assertThat(state.vaultConfigured).isTrue()
            }
        }

    @Test
    fun `canSubmit reflects email validity`() =
        runTest {
            viewModel = createViewModel()
            viewModel.onEvent(ReportBugEvent.SummaryChanged("Problem"))
            viewModel.onEvent(ReportBugEvent.DescriptionChanged("It crashes"))
            assertThat(viewModel.state.value.canSubmit).isTrue()

            viewModel.onEvent(ReportBugEvent.ContactEmailChanged("invalid-email"))
            assertThat(viewModel.state.value.canSubmit).isFalse()
            assertThat(viewModel.state.value.isEmailInvalid).isTrue()

            viewModel.onEvent(ReportBugEvent.ContactEmailChanged("a@b"))
            assertThat(viewModel.state.value.isEmailInvalid).isTrue()

            viewModel.onEvent(ReportBugEvent.ContactEmailChanged("test@example.com"))
            assertThat(viewModel.state.value.canSubmit).isTrue()
            assertThat(viewModel.state.value.isEmailInvalid).isFalse()
        }

    @Test
    fun `submit should navigate back on success without showing snackbar`() =
        runTest {
            every { sentryWrapper.isEnabled() } returns true
            viewModel = createViewModel()
            viewModel.onEvent(ReportBugEvent.SummaryChanged("Summary"))
            viewModel.onEvent(ReportBugEvent.DescriptionChanged("Description"))

            viewModel.effects.test {
                viewModel.onEvent(testSubmitEvent)
                val effect = awaitItem()
                assertThat(effect).isInstanceOf(ReportBugEffect.NavigateBack::class.java)
                expectNoEvents()
            }
        }

    @Test
    fun `submit should call sentryWrapper captureFeedback when enabled`() =
        runTest {
            every { sentryWrapper.isEnabled() } returns true
            viewModel = createViewModel()
            viewModel.onEvent(ReportBugEvent.SummaryChanged("Summary"))
            viewModel.onEvent(ReportBugEvent.DescriptionChanged("Description"))

            viewModel.onEvent(testSubmitEvent)

            verify { sentryWrapper.captureFeedback("Summary\n\nDescription", null, any()) }
        }

    @Test
    fun `submit should call sentryWrapper lazyInitAndSendFeedback when not enabled`() =
        runTest {
            every { sentryWrapper.isEnabled() } returns false
            viewModel = createViewModel()
            viewModel.onEvent(ReportBugEvent.SummaryChanged("Summary"))
            viewModel.onEvent(ReportBugEvent.DescriptionChanged("Description"))
            viewModel.onEvent(ReportBugEvent.ContactEmailChanged("test@example.com"))

            viewModel.onEvent(testSubmitEvent)

            verify {
                sentryWrapper.lazyInitAndSendFeedback(
                    any(),
                    match { it.contains("Summary") && it.contains("Description") },
                    eq("test@example.com"),
                    any(),
                )
            }
        }

    @Test
    fun `submit should retry and then fallback to email on failure`() =
        runTest {
            every { sentryWrapper.isEnabled() } returns true
            every { sentryWrapper.captureFeedback(any(), any(), any()) } throws RuntimeException("Network error")

            viewModel = createViewModel()
            viewModel.onEvent(ReportBugEvent.SummaryChanged("Summary"))
            viewModel.onEvent(ReportBugEvent.DescriptionChanged("Description"))

            viewModel.effects.test {
                viewModel.onEvent(testSubmitEvent)

                // Only final failure snackbar
                assertThat(awaitItem()).isInstanceOf(ReportBugEffect.ShowSnackbar::class.java)

                val effect = awaitItem()
                assertThat(effect).isInstanceOf(ReportBugEffect.FallbackToEmail::class.java)
                val fallback = effect as ReportBugEffect.FallbackToEmail
                assertThat(fallback.recipient).isEqualTo("yorvana.app@gmail.com")
                assertThat(fallback.subject).contains("Summary")
                cancelAndIgnoreRemainingEvents()
            }

            verify(exactly = 3) { sentryWrapper.captureFeedback(any(), any(), any()) }
        }

    @Test
    fun `retryCount should reset on each Submit`() =
        runTest {
            every { sentryWrapper.isEnabled() } returns true
            // First call fails
            every { sentryWrapper.captureFeedback(any(), any(), any()) } throws RuntimeException("Error")

            viewModel = createViewModel()
            viewModel.onEvent(ReportBugEvent.SummaryChanged("Summary"))
            viewModel.onEvent(ReportBugEvent.DescriptionChanged("Description"))

            viewModel.effects.test {
                viewModel.onEvent(testSubmitEvent)
                // Consume 1 failure snackbar + 1 fallback
                repeat(2) { awaitItem() }

                // Second call: succeed immediately
                every { sentryWrapper.captureFeedback(any(), any(), any()) } returns Unit
                viewModel.onEvent(testSubmitEvent)

                // Should succeed in 1 call if retryCount was reset, total 3 (first) + 1 (second) = 4
                verify(exactly = 4) { sentryWrapper.captureFeedback(any(), any(), any()) }
                cancelAndIgnoreRemainingEvents()
            }
        }

    @Test
    fun `fallbackToEmail body should contain device info when enabled`() =
        runTest {
            viewModel = createViewModel()
            viewModel.onEvent(ReportBugEvent.SummaryChanged("Summary"))
            viewModel.onEvent(ReportBugEvent.DescriptionChanged("Description"))
            viewModel.onEvent(ReportBugEvent.IncludeDeviceInfoChanged(true))


Output:
Chunk ID: 3513da
Wall time: 0.1870 seconds
Process exited with code 0
Original token count: 1991
Output:
package com.yorvana.ui.reportbug

import android.os.Build
import android.util.Log
import android.util.Patterns
import androidx.lifecycle.viewModelScope
import com.yorvana.BuildConfig
import com.yorvana.R
import com.yorvana.ui.util.GatedViewModel
import com.yorvana.ui.util.ViewModelDependencies
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.Locale

enum class ReportType { BUG, SUGGESTION }

data class ReportBugState(
    val type: ReportType = ReportType.BUG,
    val summary: String = "",
    val description: String = "",
    val contactEmail: String = "",
    val includeDeviceInfo: Boolean = true,
    val isSubmitting: Boolean = false,
    val appVersion: String = "",
    val androidVersion: String = "",
    val locale: String = "",
    val deviceModel: String = "",
    val vaultConfigured: Boolean = false,
    val crashReportingEnabled: Boolean = true,
) {
    /**
     * NOTE: We use Patterns.EMAIL_ADDRESS but add a requirement for a dot in the domain
     * to be robust to Patterns.EMAIL_ADDRESS behavior across API levels.
     */
    val isEmailInvalid: Boolean get() =
        contactEmail.trim().let { trimmed ->
            trimmed.isNotBlank() &&
                (
                    !Patterns.EMAIL_ADDRESS.matcher(trimmed).matches() ||
                        !trimmed.substringAfter('@', "").contains('.')
                )
        }
    val canSubmit: Boolean get() = summary.isNotBlank() && description.isNotBlank() && !isSubmitting && !isEmailInvalid
}

sealed class ReportBugEvent {
    data class TypeChanged(
        val type: ReportType,
    ) : ReportBugEvent()

    data class SummaryChanged(
        val summary: String,
    ) : ReportBugEvent()

    data class DescriptionChanged(
        val description: String,
    ) : ReportBugEvent()

    data class ContactEmailChanged(
        val email: String,
    ) : ReportBugEvent()

    data class IncludeDeviceInfoChanged(
        val include: Boolean,
    ) : ReportBugEvent()

    data object Submit : ReportBugEvent()
}

sealed class ReportBugEffect {
    data class ShowSnackbar(
        val message: String,
    ) : ReportBugEffect()

    data object NavigateBack : ReportBugEffect()

    data class FallbackToEmail(
        val recipient: String,
        val subject: String,
        val body: String,
    ) : ReportBugEffect()
}

class ReportBugViewModel(
    dependencies: ViewModelDependencies,
) : GatedViewModel(dependencies) {
    private val sentryWrapper = dependencies.sentryWrapper
    private val _state = MutableStateFlow(ReportBugState())
    val state: StateFlow<ReportBugState> = _state.asStateFlow()

    private val _effects = Channel<ReportBugEffect>(Channel.BUFFERED)
    val effects = _effects.receiveAsFlow()

    private var retryCount = 0

    init {
        _state.update {
            it.copy(
                appVersion = BuildConfig.VERSION_NAME,
                androidVersion = Build.VERSION.RELEASE,
                locale = Locale.getDefault().toString(),
                deviceModel = Build.MODEL,
            )
        }
        viewModelScope.launch {
            dependencies.preferences.preferences.collect { prefs ->
                _state.update {
                    it.copy(
                        vaultConfigured = !prefs.vaultUriString.isNullOrEmpty(),
                        crashReportingEnabled = prefs.crashReportingEnabled,
                    )
                }
            }
        }
    }

    fun onEvent(event: ReportBugEvent) {
        when (event) {
            is ReportBugEvent.TypeChanged -> _state.update { it.copy(type = event.type) }
            is ReportBugEvent.SummaryChanged -> _state.update { it.copy(summary = event.summary.take(MAX_SUMMARY_LENGTH)) }
            is ReportBugEvent.DescriptionChanged -> _state.update { it.copy(description = event.description.take(MAX_DESCRIPTION_LENGTH)) }
            is ReportBugEvent.ContactEmailChanged -> _state.update { it.copy(contactEmail = event.email) }
            is ReportBugEvent.IncludeDeviceInfoChanged -> _state.update { it.copy(includeDeviceInfo = event.include) }
            ReportBugEvent.Submit -> {
                retryCount = 0
                submitReport()
            }
        }
    }

    private fun submitReport() {
        if (!state.value.canSubmit) return

        _state.update { it.copy(isSubmitting = true) }
        viewModelScope.launch {
            performSubmission()
        }
    }

    private suspend fun performSubmission() {
        try {
            val s = _state.value
            val comments = "${s.summary}\n\n${s.description}"
            val email = s.contactEmail.trim().ifBlank { null }

            val tags =
                mapOf(
                    "type" to s.type.name.lowercase(),
                    "app_version" to s.appVersion,
                    "android_version" to s.androidVersion,
                    "locale" to s.locale,
                    "device_model" to s.deviceModel,
                    "vault_configured" to s.vaultConfigured.toString(),
                )

            val submissionTags = if (s.includeDeviceInfo) tags else emptyMap()

            withContext(Dispatchers.IO) {
                if (sentryWrapper.isEnabled()) {
                    sentryWrapper.captureFeedback(comments, email, submissionTags)
                } else {
                    // NOTE: bypasses crash-reporting opt-out; user-initiated feedback submission.
                    sentryWrapper.lazyInitAndSendFeedback(
                        app,
                        comments,
                        email,
                        submissionTags,
                    )
                }
            }

            _state.update { it.copy(isSubmitting = false) }
            _effects.send(ReportBugEffect.NavigateBack)
        } catch (
            @Suppress("TooGenericExceptionCaught") e: Exception,
        ) {
            Log.e("ReportBugViewModel", "Failed to submit report", e)
            if (retryCount < MAX_RETRY_COUNT) {
                retryCount++
                delay(RETRY_DELAY_MS)
                performSubmission()
            } else {
                _state.update { it.copy(isSubmitting = false) }
                _effects.send(ReportBugEffect.ShowSnackbar(app.getString(R.string.report_bug_error_failed)))
                fallbackToEmail()
            }
        }
    }

    private suspend fun fallbackToEmail() {
        val s = _state.value
        val reportType =
            when (s.type) {
                ReportType.BUG -> app.getString(R.string.report_bug_type_bug)
                ReportType.SUGGESTION -> app.getString(R.string.report_bug_type_suggestion)
            }

        val subject = "[Yorvana] $reportType: ${s.summary}"
        val body =
            buildString {
                appendLine(s.description)
                if (s.contactEmail.isNotBlank()) {
                    appendLine()
                    appendLine("${app.getString(R.string.report_bug_email_contact_label)}: ${s.contactEmail}")
                }
                if (s.includeDeviceInfo) {
                    appendLine()
                    appendLine(app.getString(R.string.report_bug_email_device_info))
                    appendLine("${app.getString(R.string.report_bug_app_version)}: ${s.appVersion}")
                    appendLine("${app.getString(R.string.report_bug_android_version)}: ${s.androidVersion}")
                    appendLine("${app.getString(R.string.report_bug_locale)}: ${s.locale}")
                    appendLine("${app.getString(R.string.report_bug_device_model)}: ${s.deviceModel}")


Output:
Chunk ID: 1dfaed
Wall time: 0.1548 seconds
Process exited with code 0
Original token count: 1925
Output:
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="com.yorvana.ui.reportbug.ReportBugViewModelTest" tests="11" skipped="0" failures="1" errors="0" timestamp="2026-06-16T07:37:25.630Z" hostname="home-pc" time="0.608">
  <properties/>
  <testcase name="retryCount should reset on each Submit" classname="com.yorvana.ui.reportbug.ReportBugViewModelTest" time="0.068"/>
  <testcase name="submit should call sentryWrapper lazyInitAndSendFeedback when not enabled" classname="com.yorvana.ui.reportbug.ReportBugViewModelTest" time="0.04"/>
  <testcase name="submit should retry and then fallback to email on failure" classname="com.yorvana.ui.reportbug.ReportBugViewModelTest" time="0.049"/>
  <testcase name="canSubmit reflects email validity" classname="com.yorvana.ui.reportbug.ReportBugViewModelTest" time="0.036"/>
  <testcase name="submit should call sentryWrapper captureFeedback when enabled" classname="com.yorvana.ui.reportbug.ReportBugViewModelTest" time="0.06">
    <failure message="java.lang.AssertionError: Verification failed: call 1 of 1: SentryWrapper(#639).captureFeedback(eq(Summary

Description), null(), any<Map>())) was not called" type="java.lang.AssertionError">java.lang.AssertionError: Verification failed: call 1 of 1: SentryWrapper(#639).captureFeedback(eq(Summary

Description), null(), any<Map>())) was not called
	at io.mockk.impl.recording.states.VerifyingState.failIfNotPassed(VerifyingState.kt:65)
	at io.mockk.impl.recording.states.VerifyingState.recordingDone(VerifyingState.kt:39)
	at io.mockk.impl.recording.CommonCallRecorder.done(CommonCallRecorder.kt:50)
	at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:63)
	at io.mockk.impl.eval.VerifyBlockEvaluator.verify(VerifyBlockEvaluator.kt:32)
	at io.mockk.MockKDsl.internalVerify(API.kt:128)
	at io.mockk.MockKKt.verify(MockK.kt:240)
	at io.mockk.MockKKt.verify$default(MockK.kt:230)
	at com.yorvana.ui.reportbug.ReportBugViewModelTest$submit should call sentryWrapper captureFeedback when enabled$1.invokeSuspend(ReportBugViewModelTest.kt:137)
	at com.yorvana.ui.reportbug.ReportBugViewModelTest$submit should call sentryWrapper captureFeedback when enabled$1.invoke(ReportBugViewModelTest.kt)
	at com.yorvana.ui.reportbug.ReportBugViewModelTest$submit should call sentryWrapper captureFeedback when enabled$1.invoke(ReportBugViewModelTest.kt)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$2$1$1.invokeSuspend(TestBuilders.kt:317)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.test.TestDispatcher.processEvent$kotlinx_coroutines_test(TestDispatcher.kt:24)
	at kotlinx.coroutines.test.TestCoroutineScheduler.tryRunNextTaskUnless$kotlinx_coroutines_test(TestCoroutineScheduler.kt:98)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$2$1$workRunner$1.invokeSuspend(TestBuilders.kt:326)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:256)
	at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:54)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlockingImpl(Builders.kt:30)
	at kotlinx.coroutines.BuildersKt.runBlockingImpl(Unknown Source)
	at kotlinx.coroutines.BuildersKt__Builders_concurrentKt.runBlockingK(Builders.concurrent.kt:172)
	at kotlinx.coroutines.BuildersKt.runBlockingK(Unknown Source)
	at kotlinx.coroutines.BuildersKt__Builders_concurrentKt.runBlockingK$default(Builders.concurrent.kt:157)
	at kotlinx.coroutines.BuildersKt.runBlockingK$default(Unknown Source)
	at kotlinx.coroutines.test.TestBuildersJvmKt.createTestResult(TestBuildersJvm.kt:10)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt.runTest-8Mi8wO0(TestBuilders.kt:309)
	at kotlinx.coroutines.test.TestBuildersKt.runTest-8Mi8wO0(TestBuilders.kt:1)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt.runTest-8Mi8wO0(TestBuilders.kt:167)
	at kotlinx.coroutines.test.TestBuildersKt.runTest-8Mi8wO0(TestBuilders.kt:1)
	at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt.runTest-8Mi8wO0$default(TestBuilders.kt:159)
	at kotlinx.coroutines.test.TestBuildersKt.runTest-8Mi8wO0$default(TestBuilders.kt:1)
	at com.yorvana.ui.reportbug.ReportBugViewModelTest.submit should call sentryWrapper captureFeedback when enabled(ReportBugViewModelTest.kt:129)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:524)
	at org.robolectric.internal.SandboxTestRunner.executeInSandbox(SandboxTestRunner.java:494)
	at org.robolectric.internal.SandboxTestRunner.access$900(SandboxTestRunner.java:67)
	at org.robolectric.internal.SandboxTestRunner$7.evaluate(SandboxTestRunner.java:442)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.robolectric.internal.SandboxTestRunner.access$600(SandboxTestRunner.java:67)
	at org.robolectric.internal.SandboxTestRunner$6.evaluate(SandboxTestRunner.java:333)
	at org.robolectric.internal.SandboxTestRunner$3.evaluate(SandboxTestRunner.java:233)
	at org.robolectric.internal.SandboxTestRunner$5.lambda$evaluate$0(SandboxTestRunner.java:317)
	at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:101)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.lang.Thread.run(Thread.java:1583)
</failure>
  </testcase>
  <testcase name="fallbackToEmail body should contain device info when enabled" classname="com.yorvana.ui.reportbug.ReportBugViewModelTest" time="0.062"/>
  <testcase name="fallbackToEmail body should NOT contain device info when disabled" classname="com.yorvana.ui.reportbug.ReportBugViewModelTest" time="0.071"/>
  <testcase name="fallbackToEmail body should contain contact email when provided" classname="com.yorvana.ui.reportbug.ReportBugViewModelTest" time="0.063"/>
  <testcase name="initial state should load version and vault info" classname="com.yorvana.ui.reportbug.ReportBugViewModelTest" time="0.048"/>
  <testcase name="state should update reactively when preferences change" classname="com.yorvana.ui.reportbug.ReportBugViewModelTest" time="0.06"/>
  <testcase name="submit should navigate back on success without showing snackbar" classname="com.yorvana.ui.reportbug.ReportBugViewModelTest" time="0.045"/>
  <system-out><![CDATA[]]></system-out>
  <system-err><![CDATA[]]></system-err>
</testsuite>


The failing test verifies immediately after `Submit`, while production dispatches submission through `viewModelScope.launch` and `Dispatchers.IO`. Other tests synchronize by awaiting the navigation effect. I’m making this test use the same synchronization point, then I’ll rerun the focused test.


Input:
*** Begin Patch
*** Update File: /home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt
@@
-        viewModel.onEvent(testSubmitEvent)
+        viewModel.effects.test {
+            viewModel.onEvent(testSubmitEvent)
+            assertThat(awaitItem()).isInstanceOf(ReportBugEffect.NavigateBack::class.java)
+            cancelAndIgnoreRemainingEvents()
+        }

         verify { sentryWrapper.captureFeedback("Summary\n\nDescription", null, any()) }
     }
*** End Patch


Success. Updated the following files:
M /home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt

@@ -134,6 +134,10 @@

+        viewModel.effects.test {
             viewModel.onEvent(testSubmitEvent)
+            assertThat(awaitItem()).isInstanceOf(ReportBugEffect.NavigateBack::class.java)
+            cancelAndIgnoreRemainingEvents()
+        }

-            verify { sentryWrapper.captureFeedback("Summary\n\nDescription", null, any()) }
-        }
+        verify { sentryWrapper.captureFeedback("Summary\n\nDescription", null, any()) }
+    }


Output:
Exit code: 0
Wall time: 0.7 seconds
Output:
Success. Updated the following files:
M /home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt


I updated the test to wait for `NavigateBack` before verification. I’m rerunning just `ReportBugViewModelTest` first to confirm the fix.


./gradlew :app:testDebugUnitTest --tests com.yorvana.ui.reportbug.ReportBugViewModelTest


Output:
Chunk ID: d18684
Wall time: 11.4228 seconds
Process exited with code 0
Original token count: 846
Output:
Picked up JAVA_TOOL_OPTIONS: -Xlog:os+container=off

> Configure project :app
WARNING: The option setting 'android.testoptions.manageddevices.emulator.gpu=host' is experimental.

> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:packageDebugResources UP-TO-DATE
> Task :app:processDebugNavigationResources UP-TO-DATE
> Task :app:parseDebugLocalResources UP-TO-DATE
> Task :app:generateDebugRFile UP-TO-DATE
> Task :app:compileDebugKotlin UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:checkDebugAarMetadata UP-TO-DATE
> Task :app:mapDebugSourceSetPaths UP-TO-DATE
> Task :app:compileDebugNavigationResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugMainManifest UP-TO-DATE
> Task :app:processDebugManifest UP-TO-DATE
> Task :app:processDebugManifestForPackage UP-TO-DATE
> Task :app:processDebugResources UP-TO-DATE
> Task :app:bundleDebugClassesToRuntimeJar UP-TO-DATE
> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE
> Task :app:preDebugUnitTestBuild UP-TO-DATE
> Task :app:javaPreCompileDebugUnitTest UP-TO-DATE
> Task :app:generateDebugAssets UP-TO-DATE
> Task :app:mergeDebugAssets UP-TO-DATE
> Task :app:packageDebugUnitTestForUnitTest UP-TO-DATE
> Task :app:processDebugUnitTestManifest UP-TO-DATE
> Task :app:generateDebugUnitTestConfig UP-TO-DATE
> Task :app:processDebugJavaRes UP-TO-DATE
> Task :app:restoreOutputDirRoborazzi SKIPPED

> Task :app:testPythonAggregator
....
----------------------------------------------------------------------
Ran 4 tests in 0.038s

OK

> Task :app:compileDebugUnitTestKotlin
w: file:///home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt:236:39 No cast needed.
w: file:///home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt:265:39 No cast needed.
w: file:///home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt:311:39 No cast needed.

> Task :app:compileDebugUnitTestJavaWithJavac NO-SOURCE
> Task :app:processDebugUnitTestJavaRes UP-TO-DATE

> Task :app:testDebugUnitTest
Picked up JAVA_TOOL_OPTIONS: -Xlog:os+container=off

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

> Task :app:finalizeTestRoborazziDebug SKIPPED

[Incubating] Problems report is available at: file:///home/Messier82/projects/service-book/build/reports/problems/problems-report.html

Deprecated Gradle features were used in this build, making it incompatible with Gradle 10.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/9.5.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD SUCCESSFUL in 11s
31 actionable tasks: 3 executed, 28 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.5.1/userguide/configuration_cache_enabling.html


The focused `ReportBugViewModelTest` passes now. Because #139 required manual fixes, I still need to run the full validation suite, commit, push the branch, and then stop for review per the Dependabot workflow.


Output:
Chunk ID: 6f299a
Wall time: 30.0010 seconds
Process running with session ID 93424
Original token count: 669
Output:
Picked up JAVA_TOOL_OPTIONS: -Xlog:os+container=off

> Configure project :app
WARNING: The option setting 'android.testoptions.manageddevices.emulator.gpu=host' is experimental.

> Task :app:preBuild UP-TO-DATE
> Task :macrobenchmark:test UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:packageDebugResources UP-TO-DATE
> Task :app:processDebugNavigationResources UP-TO-DATE
> Task :app:parseDebugLocalResources UP-TO-DATE
> Task :app:generateDebugRFile UP-TO-DATE
> Task :app:compileDebugKotlin UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:checkDebugAarMetadata UP-TO-DATE
> Task :app:mapDebugSourceSetPaths UP-TO-DATE
> Task :app:compileDebugNavigationResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugMainManifest UP-TO-DATE
> Task :app:processDebugManifest UP-TO-DATE
> Task :app:processDebugManifestForPackage UP-TO-DATE
> Task :app:processDebugResources UP-TO-DATE
> Task :app:bundleDebugClassesToRuntimeJar UP-TO-DATE
> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE
> Task :app:preDebugUnitTestBuild UP-TO-DATE
> Task :app:compileDebugUnitTestKotlin UP-TO-DATE
> Task :app:javaPreCompileDebugUnitTest UP-TO-DATE
> Task :app:compileDebugUnitTestJavaWithJavac NO-SOURCE
> Task :app:generateDebugAssets UP-TO-DATE
> Task :app:mergeDebugAssets UP-TO-DATE
> Task :app:packageDebugUnitTestForUnitTest UP-TO-DATE
> Task :app:processDebugUnitTestManifest UP-TO-DATE
> Task :app:generateDebugUnitTestConfig UP-TO-DATE
> Task :app:processDebugJavaRes UP-TO-DATE
> Task :app:processDebugUnitTestJavaRes UP-TO-DATE
> Task :app:restoreOutputDirRoborazzi SKIPPED

> Task :app:testPythonAggregator
....
----------------------------------------------------------------------
Ran 4 tests in 0.005s

OK

Picked up JAVA_TOOL_OPTIONS: -Xlog:os+container=off
Picked up JAVA_TOOL_OPTIONS: -Xlog:os+container=off
> Task :app:testDebugUnitTest

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended


The full JVM suite for #139 is running again after the test fix.


Output:
Chunk ID: 8ff627
Wall time: 30.0009 seconds
Process running with session ID 93424
Original token count: 65
Output:
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended


No failures so far in the rerun; `:app:testDebugUnitTest` is still active.


Output:
Chunk ID: 7eb394
Wall time: 25.1580 seconds
Process exited with code 0
Original token count: 201
Output:

> Task :app:finalizeTestRoborazziDebug SKIPPED
> Task :app:test

[Incubating] Problems report is available at: file:///home/Messier82/projects/service-book/build/reports/problems/problems-report.html

Deprecated Gradle features were used in this build, making it incompatible with Gradle 10.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/9.5.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD SUCCESSFUL in 1m 37s
31 actionable tasks: 2 executed, 29 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.5.1/userguide/configuration_cache_enabling.html


`./gradlew test` now passes for #139. I’m running the GPU managed-device smoke suite next.


Output:
Chunk ID: 696063
Wall time: 30.0006 seconds
Process running with session ID 23034
Original token count: 3119
Output:
Picked up JAVA_TOOL_OPTIONS: -Xlog:os+container=off

> Configure project :app
WARNING: The option setting 'android.testoptions.manageddevices.emulator.gpu=host' is experimental.

> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:packageDebugResources UP-TO-DATE
> Task :app:processDebugNavigationResources UP-TO-DATE
> Task :app:parseDebugLocalResources UP-TO-DATE
> Task :app:generateDebugRFile UP-TO-DATE
> Task :app:compileDebugKotlin UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:checkDebugAarMetadata UP-TO-DATE
> Task :app:mapDebugSourceSetPaths UP-TO-DATE
> Task :app:compileDebugNavigationResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugMainManifest UP-TO-DATE
> Task :app:processDebugManifest UP-TO-DATE
> Task :app:processDebugManifestForPackage UP-TO-DATE
> Task :app:processDebugResources UP-TO-DATE
> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE
> Task :app:preDebugAndroidTestBuild SKIPPED
> Task :app:processDebugAndroidTestManifest
> Task :app:generateDebugAndroidTestBuildConfig UP-TO-DATE
> Task :app:generateDebugAndroidTestResources UP-TO-DATE
> Task :app:packageDebugAndroidTestResources UP-TO-DATE
> Task :app:processDebugAndroidTestNavigationResources UP-TO-DATE
> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE
> Task :app:generateDebugAssets UP-TO-DATE
> Task :app:mergeDebugAssets UP-TO-DATE
> Task :app:parseDebugAndroidTestLocalResources
> Task :app:compressDebugAssets UP-TO-DATE
> Task :app:generateDebugAndroidTestRFile
> Task :app:generateDebugGlobalSynthetics
> Task :app:processDebugJavaRes UP-TO-DATE
> Task :app:desugarDebugFileDependencies UP-TO-DATE
> Task :app:checkDebugDuplicateClasses
> Task :app:mergeDebugJavaResource
> Task :app:dexBuilderDebug

> Task :app:compileDebugAndroidTestKotlin
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/SmokeTest.kt:52:27 'fun <reified A : ComponentActivity> createAndroidComposeRule(effectContext: CoroutineContext = ...): AndroidComposeTestRule<ActivityScenarioRule<A>, A>' is deprecated. Use `androidx.compose.ui.test.junit4.v2.createAndroidComposeRule` instead. The v2 APIs use StandardTestDispatcher instead of UnconfinedTestDispatcher, which aligns with standard coroutine behavior by queuing tasks rather than executing them immediately. Tests relying on immediate execution may require explicit synchronization. Please refer to the migration guide for more details.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/regression/attachments/AttachmentRealOsRegressionTest.kt:54:23 'fun <reified A : ComponentActivity> createAndroidComposeRule(effectContext: CoroutineContext = ...): AndroidComposeTestRule<ActivityScenarioRule<A>, A>' is deprecated. Use `androidx.compose.ui.test.junit4.v2.createAndroidComposeRule` instead. The v2 APIs use StandardTestDispatcher instead of UnconfinedTestDispatcher, which aligns with standard coroutine behavior by queuing tasks rather than executing them immediately. Tests relying on immediate execution may require explicit synchronization. Please refer to the migration guide for more details.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/regression/attachments/ImageViewerGestureRegressionTest.kt:39:23 'fun <reified A : ComponentActivity> createAndroidComposeRule(effectContext: CoroutineContext = ...): AndroidComposeTestRule<ActivityScenarioRule<A>, A>' is deprecated. Use `androidx.compose.ui.test.junit4.v2.createAndroidComposeRule` instead. The v2 APIs use StandardTestDispatcher instead of UnconfinedTestDispatcher, which aligns with standard coroutine behavior by queuing tasks rather than executing them immediately. Tests relying on immediate execution may require explicit synchronization. Please refer to the migration guide for more details.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/regression/billing/BillingSandboxRegressionTest.kt:39:23 'fun <reified A : ComponentActivity> createAndroidComposeRule(effectContext: CoroutineContext = ...): AndroidComposeTestRule<ActivityScenarioRule<A>, A>' is deprecated. Use `androidx.compose.ui.test.junit4.v2.createAndroidComposeRule` instead. The v2 APIs use StandardTestDispatcher instead of UnconfinedTestDispatcher, which aligns with standard coroutine behavior by queuing tasks rather than executing them immediately. Tests relying on immediate execution may require explicit synchronization. Please refer to the migration guide for more details.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/regression/lifecycle/LifecycleRobustnessRegressionTest.kt:42:23 'fun <reified A : ComponentActivity> createAndroidComposeRule(effectContext: CoroutineContext = ...): AndroidComposeTestRule<ActivityScenarioRule<A>, A>' is deprecated. Use `androidx.compose.ui.test.junit4.v2.createAndroidComposeRule` instead. The v2 APIs use StandardTestDispatcher instead of UnconfinedTestDispatcher, which aligns with standard coroutine behavior by queuing tasks rather than executing them immediately. Tests relying on immediate execution may require explicit synchronization. Please refer to the migration guide for more details.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/regression/records/RecordRegressionTest.kt:43:23 'fun <reified A : ComponentActivity> createAndroidComposeRule(effectContext: CoroutineContext = ...): AndroidComposeTestRule<ActivityScenarioRule<A>, A>' is deprecated. Use `androidx.compose.ui.test.junit4.v2.createAndroidComposeRule` instead. The v2 APIs use StandardTestDispatcher instead of UnconfinedTestDispatcher, which aligns with standard coroutine behavior by queuing tasks rather than executing them immediately. Tests relying on immediate execution may require explicit synchronization. Please refer to the migration guide for more details.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/regression/settings/SettingsCategoriesPaywallRegressionTest.kt:49:23 'fun <reified A : ComponentActivity> createAndroidComposeRule(effectContext: CoroutineContext = ...): AndroidComposeTestRule<ActivityScenarioRule<A>, A>' is deprecated. Use `androidx.compose.ui.test.junit4.v2.createAndroidComposeRule` instead. The v2 APIs use StandardTestDispatcher instead of UnconfinedTestDispatcher, which aligns with standard coroutine behavior by queuing tasks rather than executing them immediately. Tests relying on immediate execution may require explicit synchronization. Please refer to the migration guide for more details.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/regression/setup/SetupRegressionTest.kt:27:31 'fun <reified A : ComponentActivity> createAndroidComposeRule(effectContext: CoroutineContext = ...): AndroidComposeTestRule<ActivityScenarioRule<A>, A>' is deprecated. Use `androidx.compose.ui.test.junit4.v2.createAndroidComposeRule` instead. The v2 APIs use StandardTestDispatcher instead of UnconfinedTestDispatcher, which aligns with standard coroutine behavior by queuing tasks rather than executing them immediately. Tests relying on immediate execution may require explicit synchronization. Please refer to the migration guide for more details.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/regression/vault/StorageRobustnessRegressionTest.kt:55:22 Redundant creation of Json format. Creating instances for each usage can be slow.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/regression/vault/StorageRobustnessRegressionTest.kt:80:22 Redundant creation of Json format. Creating instances for each usage can be slow.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/regression/vault/VaultRealOsRegressionTest.kt:36:23 'fun <reified A : ComponentActivity> createAndroidComposeRule(effectContext: CoroutineContext = ...): AndroidComposeTestRule<ActivityScenarioRule<A>, A>' is deprecated. Use `androidx.compose.ui.test.junit4.v2.createAndroidComposeRule` instead. The v2 APIs use StandardTestDispatcher instead of UnconfinedTestDispatcher, which aligns with standard coroutine behavior by queuing tasks rather than executing them immediately. Tests relying on immediate execution may require explicit synchronization. Please refer to the migration guide for more details.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/regression/vehicles/VehicleRegressionTest.kt:53:23 'fun <reified A : ComponentActivity> createAndroidComposeRule(effectContext: CoroutineContext = ...): AndroidComposeTestRule<ActivityScenarioRule<A>, A>' is deprecated. Use `androidx.compose.ui.test.junit4.v2.createAndroidComposeRule` instead. The v2 APIs use StandardTestDispatcher instead of UnconfinedTestDispatcher, which aligns with standard coroutine behavior by queuing tasks rather than executing them immediately. Tests relying on immediate execution may require explicit synchronization. Please refer to the migration guide for more details.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/screenshots/StoreScreenshotBase.kt:18:27 'fun <reified A : ComponentActivity> createAndroidComposeRule(effectContext: CoroutineContext = ...): AndroidComposeTestRule<ActivityScenarioRule<A>, A>' is deprecated. Use `androidx.compose.ui.test.junit4.v2.createAndroidComposeRule` instead. The v2 APIs use StandardTestDispatcher instead of UnconfinedTestDispatcher, which aligns with standard coroutine behavior by queuing tasks rather than executing them immediately. Tests relying on immediate execution may require explicit synchronization. Please refer to the migration guide for more details.
w: file:///home/Messier82/projects/service-book/app/src/androidTest/java/com/yorvana/testsupport/RegressionHelpers.kt:205:5 Redundant creation of Json format. Creating instances for each usage can be slow.

> Task :app:compileDebugAndroidTestJavaWithJavac
> Task :app:mergeLibDexDebug UP-TO-DATE
> Task :app:mergeDebugJniLibFolders UP-TO-DATE
> Task :app:mergeDebugNativeLibs UP-TO-DATE
> Task :app:stripDebugDebugSymbols UP-TO-DATE
> Task :app:validateSigningDebug UP-TO-DATE
> Task :app:writeDebugAppMetadata UP-TO-DATE
> Task :app:writeDebugSigningConfigVersions UP-TO-DATE
> Task :app:generateDebugAndroidTestAssets UP-TO-DATE
> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE
> Task :app:compressDebugAndroidTestAssets UP-TO-DATE
> Task :app:generateDebugAndroidTestGlobalSynthetics FROM-CACHE
> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE
> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE
> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE
> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE
> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE
> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE
> Task :app:checkDebugAndroidTestAarMetadata
> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE
> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE
> Task :app:mergeDebugAndroidTestResources UP-TO-DATE
> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE
> Task :app:mergeDebugAndroidTestNativeLibs UP-TO-DATE
> Task :app:stripDebugAndroidTestDebugSymbols UP-TO-DATE
> Task :app:validateSigningDebugAndroidTest UP-TO-DATE
> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE
> Task :app:processDebugAndroidTestResources
> Task :app:dexBuilderDebugAndroidTest UP-TO-DATE
> Task :app:mergeProjectDexDebugAndroidTest UP-TO-DATE
> Task :app:mergeProjectDexDebug
> Task :app:packageDebugAndroidTest
> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE

> Task :app:pixel2api33Setup
The device "pixel2api33" does not specify a "testedAbi".
This currently defaults to "x86_64", but will change to "arm64-v8a" in AGP 10.0.

The system image configured for "pixel2api33" does not support NDK translation,
so it will be unable to run tests built for "arm64-v8a".

To keep the current behavior and prevent test failures in AGP 10.0,
explicitly set the ABI: testedAbi = "x86_64"


The smoke suite rebuilt against compileSdk 37/Core 1.19.0 and is at managed-device setup. Only warnings so far.


Output:
Chunk ID: 6df8cc
Wall time: 30.0014 seconds
Process running with session ID 23034
Original token count: 28
Output:

> Task :app:mergeExtDexDebug
> Task :app:packageDebug
> Task :app:createDebugApkListingFileRedirect UP-TO-DATE


The device run is still preparing/installing artifacts; no test failures emitted.


Output:
Chunk ID: 79301e
Wall time: 30.0510 seconds
Process running with session ID 23034
Original token count: 10
Output:
> Task :app:pixel2api33DebugAndroidTest


`:app:pixel2api33DebugAndroidTest` has started on #139.


Output:
Chunk ID: 4066ce
Wall time: 34.9421 seconds
Process running with session ID 23034
Original token count: 23
Output:

Starting 14 tests on pixel2api33
pixel2api33 Tests 1/14 completed. (0 skipped) (0 failed)


The #139 smoke suite is running on the managed device: 1 of 14 completed, none failed.


Output:
Chunk ID: 9e9694
Wall time: 18.8959 seconds
Process exited with code 1
Original token count: 2912
Output:

com.yorvana.SmokeTest > s13_editVehicle_updatesList[pixel2api33] FAILED

Failed to retrieve additional test outputs from device.
com.android.ddmlib.AdbCommandRejectedException: device offline
	at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:967)
	at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:986)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$18(DeviceImpl.java:785)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:755)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$15(DeviceImpl.java:618)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:615)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeShellCommand$14(DeviceImpl.java:573)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeShellCommand(DeviceImpl.java:570)
	at com.android.tools.utp.plugins.deviceprovider.ddmlib.DdmlibAndroidDevice.executeShellCommand(DdmlibAndroidDevice.kt)
	at com.android.tools.utp.plugins.deviceprovider.ddmlib.DdmlibAndroidDeviceController$executeAsync$deferred$1.invokeSuspend(DdmlibAndroidDeviceController.kt:165)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
	at java.base@21.0.10/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base@21.0.10/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base@21.0.10/java.lang.Thread.run(Thread.java:1583)
Failed to retrieve test storage service outputs from device.
com.android.ddmlib.AdbCommandRejectedException: device offline
	at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:967)
	at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:986)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$18(DeviceImpl.java:785)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:755)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$15(DeviceImpl.java:618)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:615)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeShellCommand$14(DeviceImpl.java:573)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeShellCommand(DeviceImpl.java:570)
	at com.android.tools.utp.plugins.deviceprovider.ddmlib.DdmlibAndroidDevice.executeShellCommand(DdmlibAndroidDevice.kt)
	at com.android.tools.utp.plugins.deviceprovider.ddmlib.DdmlibAndroidDeviceController$executeAsync$deferred$1.invokeSuspend(DdmlibAndroidDeviceController.kt:165)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
	at java.base@21.0.10/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base@21.0.10/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base@21.0.10/java.lang.Thread.run(Thread.java:1583)
pixel2api33 Tests 2/14 completed. (0 skipped) (1 failed)
Failed to retrieve logcat for some test cases. We retrieved logcat for 1 test cases out of 2 tests.
Plugin com.android.tools.utp.plugins.host.apkinstaller.AndroidTestApkInstallerPlugin.afterAll failure: com.google.testing.platform.api.plugin.PluginException: ErrorName: PLUGIN_ERROR
NameSpace: com.google.testing.platform
ErrorCode: 2002
ErrorType: TEST
Message: Exception thrown during onAfterAll invocation of plugin AndroidTestApkInstallerPlugin: device 'emulator-5556' not found
	at com.google.testing.platform.plugin.PluginLifecycleKt.invokeOrThrow(PluginLifecycle.kt:561)
	at com.google.testing.platform.plugin.PluginLifecycleKt.invokeOrThrow$default(PluginLifecycle.kt:519)
	at com.google.testing.platform.plugin.PluginLifecycle$onAfterAll$1$1$1.invoke(PluginLifecycle.kt:388)
	at com.google.testing.platform.plugin.PluginLifecycle$onAfterAll$1$1$1.invoke(PluginLifecycle.kt:385)
	at com.google.testing.platform.lib.cancellation.ProcessCancellationContext.runWithTimeoutDuringCancellation(ProcessCancellationContext.kt:182)
	at com.google.testing.platform.plugin.PluginLifecycle$onAfterAll$1$1.invoke(PluginLifecycle.kt:385)
	at com.google.testing.platform.plugin.PluginLifecycle$onAfterAll$1$1.invoke(PluginLifecycle.kt:381)
	at com.google.testing.platform.core.telemetry.common.noop.NoopDiagnosticsScope.recordEvent(NoopDiagnosticsScope.kt:35)
	at com.google.testing.platform.core.telemetry.SequentialEventRecordRequest.record$java_com_google_testing_platform_core_telemetry_telemetry_api(EventRecordRequest.kt:71)
	at com.google.testing.platform.core.telemetry.DiagnosticsExtKt.record(DiagnosticsExt.kt:27)
	at com.google.testing.platform.core.telemetry.TelemetryKt.createEvent(Telemetry.kt:60)
	at com.google.testing.platform.plugin.PluginLifecycle.onAfterAll(PluginLifecycle.kt:378)
	at com.google.testing.platform.executor.SingleDeviceExecutor.execute(SingleDeviceExecutor.kt:190)
	at com.google.testing.platform.RunnerImpl.run(RunnerImpl.kt:132)
	at com.google.testing.platform.server.strategy.NonInteractiveServerStrategy$run$exitCode$1$2.invoke(NonInteractiveServerStrategy.kt:126)
	at com.google.testing.platform.server.strategy.NonInteractiveServerStrategy$run$exitCode$1$2.invoke(NonInteractiveServerStrategy.kt:126)
	at com.google.testing.platform.core.telemetry.common.noop.NoopDiagnosticsScope.recordEvent(NoopDiagnosticsScope.kt:35)
	at com.google.testing.platform.core.telemetry.SequentialEventRecordRequest.record$java_com_google_testing_platform_core_telemetry_telemetry_api(EventRecordRequest.kt:71)
	at com.google.testing.platform.core.telemetry.DiagnosticsExtKt.record(DiagnosticsExt.kt:27)
	at com.google.testing.platform.core.telemetry.TelemetryKt.createEvent(Telemetry.kt:60)
	at com.google.testing.platform.server.strategy.NonInteractiveServerStrategy.run(NonInteractiveServerStrategy.kt:123)
	at com.google.testing.platform.main.MainKt$main$3$1.invokeSuspend(Main.kt:80)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: com.android.ddmlib.AdbCommandRejectedException: device 'emulator-5556' not found
	at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:967)
	at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:986)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$18(DeviceImpl.java:785)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:755)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$15(DeviceImpl.java:618)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:615)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeShellCommand$14(DeviceImpl.java:573)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeShellCommand(DeviceImpl.java:570)
	at com.android.tools.utp.plugins.deviceprovider.ddmlib.DdmlibAndroidDevice.executeShellCommand(DdmlibAndroidDevice.kt)
	at com.android.tools.utp.plugins.deviceprovider.ddmlib.DdmlibAndroidDeviceController$executeAsync$deferred$1.invokeSuspend(DdmlibAndroidDeviceController.kt:165)
	... 5 more

Tests on pixel2api33 failed: There was 1 failure(s).
Finished 2 tests on pixel2api33
Execute com.yorvana.SmokeTest.s13_editVehicle_updatesList: FAILED

> Task :app:pixel2api33DebugAndroidTest
Exception thrown during onAfterAll invocation of plugin AndroidTestApkInstallerPlugin: device 'emulator-5556' not found
device 'emulator-5556' not found
com.android.ddmlib.AdbCommandRejectedException: device 'emulator-5556' not found
	at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:967)
	at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:986)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$18(DeviceImpl.java:785)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:755)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeRemoteCommand$15(DeviceImpl.java:618)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeRemoteCommand(DeviceImpl.java:615)
	at com.android.ddmlib.internal.DeviceImpl.lambda$executeShellCommand$14(DeviceImpl.java:573)
	at com.android.ddmlib.internal.DeviceImpl.logRun1(DeviceImpl.java:1801)
	at com.android.ddmlib.internal.DeviceImpl.executeShellCommand(DeviceImpl.java:570)
	at com.android.tools.utp.plugins.deviceprovider.ddmlib.DdmlibAndroidDevice.executeShellCommand(DdmlibAndroidDevice.kt)
	at com.android.tools.utp.plugins.deviceprovider.ddmlib.DdmlibAndroidDeviceController$executeAsync$deferred$1.invokeSuspend(DdmlibAndroidDeviceController.kt:165)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.lang.Thread.run(Thread.java:1583)

Test run failed to complete. Expected 14 tests, received 1

> Task :app:pixel2api33DebugAndroidTest FAILED

> Task :app:mergeDebugAndroidTestTestResultProtos
Test execution completed. See the report at: file:///home/Messier82/projects/service-book/app/build/reports/androidTests/managedDevice/debug/allDevices/index.html

[Incubating] Problems report is available at: file:///home/Messier82/projects/service-book/build/reports/problems/problems-report.html

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:pixel2api33DebugAndroidTest' (registered by plugin 'com.android.internal.application').
> There were failing tests. See the report at: file:///home/Messier82/projects/service-book/app/build/reports/androidTests/managedDevice/debug/pixel2api33/index.html

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights from a Build Scan (powered by Develocity).
> Get more help at https://help.gradle.org.

Deprecated Gradle features were used in this build, making it incompatible with Gradle 10.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/9.5.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD FAILED in 6m 4s
75 actionable tasks: 18 executed, 1 from cache, 56 up-to-date


The smoke run did not complete because the managed emulator went offline/disappeared (`device offline`, then `emulator-5556 not found`) after 2 tests. That is infrastructure, not a normal assertion failure. I’m checking ADB state and then I’ll rerun the smoke suite once.


find app/build/reports/androidTests/managedDevice/debug -maxdepth 3 -type f | sort | rg "index.html|SmokeTest|xml|html"


Output:
Chunk ID: a6ca4b
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 7
Output:
List of devices attached


Output:
Chunk ID: 140933
Wall time: 0.0992 seconds
Process exited with code 0
Original token count: 122
Output:
app/build/reports/androidTests/managedDevice/debug/allDevices/com.yorvana.SmokeTest.html
app/build/reports/androidTests/managedDevice/debug/allDevices/com.yorvana.html
app/build/reports/androidTests/managedDevice/debug/allDevices/index.html
app/build/reports/androidTests/managedDevice/debug/pixel2api33/com.yorvana.SmokeTest.html
app/build/reports/androidTests/managedDevice/debug/pixel2api33/com.yorvana.html
app/build/reports/androidTests/managedDevice/debug/pixel2api33/index.html


ADB shows no device left attached, consistent with the emulator crash/offline failure. I’m rerunning the app-scoped managed-device smoke suite.


Output:
Chunk ID: cb876a
Wall time: 30.0009 seconds
Process running with session ID 24625
Original token count: 1128
Output:
Picked up JAVA_TOOL_OPTIONS: -Xlog:os+container=off

> Configure project :app
WARNING: The option setting 'android.testoptions.manageddevices.emulator.gpu=host' is experimental.

> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:packageDebugResources UP-TO-DATE
> Task :app:processDebugNavigationResources UP-TO-DATE
> Task :app:parseDebugLocalResources UP-TO-DATE
> Task :app:generateDebugRFile UP-TO-DATE
> Task :app:compileDebugKotlin UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:checkDebugAarMetadata UP-TO-DATE
> Task :app:mapDebugSourceSetPaths UP-TO-DATE
> Task :app:compileDebugNavigationResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugMainManifest UP-TO-DATE
> Task :app:processDebugManifest UP-TO-DATE
> Task :app:processDebugManifestForPackage UP-TO-DATE
> Task :app:processDebugResources UP-TO-DATE
> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE
> Task :app:preDebugAndroidTestBuild SKIPPED
> Task :app:processDebugAndroidTestManifest UP-TO-DATE
> Task :app:generateDebugAndroidTestBuildConfig UP-TO-DATE
> Task :app:generateDebugAndroidTestResources UP-TO-DATE
> Task :app:packageDebugAndroidTestResources UP-TO-DATE
> Task :app:processDebugAndroidTestNavigationResources UP-TO-DATE
> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE
> Task :app:generateDebugAndroidTestRFile UP-TO-DATE
> Task :app:compileDebugAndroidTestKotlin UP-TO-DATE
> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE
> Task :app:compileDebugAndroidTestJavaWithJavac UP-TO-DATE
> Task :app:generateDebugAssets UP-TO-DATE
> Task :app:mergeDebugAssets UP-TO-DATE
> Task :app:compressDebugAssets UP-TO-DATE
> Task :app:generateDebugGlobalSynthetics UP-TO-DATE
> Task :app:processDebugJavaRes UP-TO-DATE
> Task :app:mergeDebugJavaResource UP-TO-DATE
> Task :app:checkDebugDuplicateClasses UP-TO-DATE
> Task :app:desugarDebugFileDependencies UP-TO-DATE
> Task :app:mergeExtDexDebug UP-TO-DATE
> Task :app:mergeLibDexDebug UP-TO-DATE
> Task :app:dexBuilderDebug UP-TO-DATE
> Task :app:mergeProjectDexDebug UP-TO-DATE
> Task :app:mergeDebugJniLibFolders UP-TO-DATE
> Task :app:mergeDebugNativeLibs UP-TO-DATE
> Task :app:stripDebugDebugSymbols UP-TO-DATE
> Task :app:validateSigningDebug UP-TO-DATE
> Task :app:writeDebugAppMetadata UP-TO-DATE
> Task :app:writeDebugSigningConfigVersions UP-TO-DATE
> Task :app:packageDebug UP-TO-DATE
> Task :app:createDebugApkListingFileRedirect UP-TO-DATE
> Task :app:generateDebugAndroidTestAssets UP-TO-DATE
> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE
> Task :app:compressDebugAndroidTestAssets UP-TO-DATE
> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE
> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE
> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE
> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE
> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE
> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE
> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE
> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE
> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE
> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE
> Task :app:mergeDebugAndroidTestResources UP-TO-DATE
> Task :app:processDebugAndroidTestResources UP-TO-DATE
> Task :app:dexBuilderDebugAndroidTest UP-TO-DATE
> Task :app:mergeProjectDexDebugAndroidTest UP-TO-DATE
> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE
> Task :app:mergeDebugAndroidTestNativeLibs UP-TO-DATE
> Task :app:stripDebugAndroidTestDebugSymbols UP-TO-DATE
> Task :app:validateSigningDebugAndroidTest UP-TO-DATE
> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE
> Task :app:packageDebugAndroidTest UP-TO-DATE
> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE

> Task :app:pixel2api33Setup
The device "pixel2api33" does not specify a "testedAbi".
This currently defaults to "x86_64", but will change to "arm64-v8a" in AGP 10.0.

The system image configured for "pixel2api33" does not support NDK translation,
so it will be unable to run tests built for "arm64-v8a".

To keep the current behavior and prevent test failures in AGP 10.0,
explicitly set the ABI: testedAbi = "x86_64"


The rerun is at managed-device setup with no attached stale emulator beforehand.


Output:
Chunk ID: faf43a
Wall time: 29.2387 seconds
Process exited with code 0
Original token count: 308
Output:
Starting 14 tests on pixel2api33

> Task :app:pixel2api33DebugAndroidTest

pixel2api33 Tests 3/14 completed. (0 skipped) (0 failed)
pixel2api33 Tests 5/14 completed. (0 skipped) (0 failed)
pixel2api33 Tests 10/14 completed. (0 skipped) (0 failed)
Finished 14 tests on pixel2api33

> Task :app:mergeDebugAndroidTestTestResultProtos
Test execution completed. See the report at: file:///home/Messier82/projects/service-book/app/build/reports/androidTests/managedDevice/debug/allDevices/index.html

[Incubating] Problems report is available at: file:///home/Messier82/projects/service-book/build/reports/problems/problems-report.html

Deprecated Gradle features were used in this build, making it incompatible with Gradle 10.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/9.5.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD SUCCESSFUL in 1m 6s
75 actionable tasks: 3 executed, 72 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.5.1/userguide/configuration_cache_enabling.html


The smoke rerun passed all 14 tests. I’m running `lintDebug ktlintCheck detekt` for #139 now.


Output:
Chunk ID: a8adc0
Wall time: 30.0009 seconds
Process running with session ID 93949
Original token count: 1389
Output:
Picked up JAVA_TOOL_OPTIONS: -Xlog:os+container=off

> Configure project :app
WARNING: The option setting 'android.testoptions.manageddevices.emulator.gpu=host' is experimental.

> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:packageDebugResources UP-TO-DATE
> Task :macrobenchmark:loadKtlintReporters UP-TO-DATE
> Task :macrobenchmark:runKtlintCheckOverBenchmarkSourceSet NO-SOURCE
> Task :macrobenchmark:ktlintBenchmarkSourceSetCheck SKIPPED
> Task :macrobenchmark:runKtlintCheckOverDebugSourceSet NO-SOURCE
> Task :macrobenchmark:ktlintDebugSourceSetCheck SKIPPED
> Task :macrobenchmark:runKtlintCheckOverKotlinScripts UP-TO-DATE
> Task :macrobenchmark:ktlintKotlinScriptCheck UP-TO-DATE
> Task :macrobenchmark:runKtlintCheckOverMainSourceSet UP-TO-DATE
> Task :macrobenchmark:ktlintMainSourceSetCheck UP-TO-DATE
> Task :macrobenchmark:ktlintCheck UP-TO-DATE
> Task :macrobenchmark:detekt UP-TO-DATE
> Task :app:processDebugNavigationResources UP-TO-DATE
> Task :app:parseDebugLocalResources UP-TO-DATE
> Task :app:generateDebugRFile UP-TO-DATE
> Task :app:compileDebugKotlin UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:checkDebugAarMetadata UP-TO-DATE
> Task :app:mapDebugSourceSetPaths UP-TO-DATE
> Task :app:compileDebugNavigationResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugMainManifest UP-TO-DATE
> Task :app:processDebugManifest UP-TO-DATE
> Task :app:processDebugManifestForPackage UP-TO-DATE
> Task :app:processDebugResources UP-TO-DATE
> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE
> Task :app:preDebugAndroidTestBuild SKIPPED
> Task :app:generateDebugAndroidTestLintModel
> Task :app:extractProguardFiles UP-TO-DATE
> Task :app:generateDebugLintReportModel
> Task :app:preDebugUnitTestBuild UP-TO-DATE
> Task :app:generateDebugUnitTestLintModel
> Task :app:loadKtlintReporters UP-TO-DATE
> Task :app:runKtlintCheckOverAndroidTestBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestBenchmarkSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverAndroidTestDebugSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestDebugSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverAndroidTestReleaseSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestReleaseSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverAndroidTestSourceSet UP-TO-DATE
> Task :app:ktlintAndroidTestSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverAndroidTestStagingSourceSet UP-TO-DATE
> Task :app:ktlintAndroidTestStagingSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverBenchmarkSourceSet UP-TO-DATE
> Task :app:ktlintBenchmarkSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverDebugSourceSet UP-TO-DATE
> Task :app:ktlintDebugSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverKotlinScripts
> Task :app:ktlintKotlinScriptCheck UP-TO-DATE
> Task :app:runKtlintCheckOverMainSourceSet UP-TO-DATE
> Task :app:ktlintMainSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverReleaseSourceSet NO-SOURCE
> Task :app:ktlintReleaseSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverStagingSourceSet NO-SOURCE
> Task :app:ktlintStagingSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintTestBenchmarkSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestDebugSourceSet NO-SOURCE
> Task :app:ktlintTestDebugSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesBenchmarkSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesDebugSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesDebugSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesReleaseSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesReleaseSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesStagingSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesStagingSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestReleaseSourceSet NO-SOURCE
> Task :app:ktlintTestReleaseSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestSourceSet

> Task :app:ktlintTestSourceSetCheck FAILED
/home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt:135:1 Unexpected indentation (8) (should be 12)
/home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt:136:1 Unexpected indentation (12) (should be 16)
/home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt:137:1 Unexpected indentation (12) (should be 16)
/home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt:138:1 Unexpected indentation (12) (should be 16)
/home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt:139:1 Unexpected indentation (8) (should be 12)
/home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt:141:1 Unexpected indentation (8) (should be 12)
/home/Messier82/projects/service-book/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt:142:1 Unexpected indentation (4) (should be 8)


Ktlint found indentation in the test block I edited. This is a mechanical format issue, so I’m applying the formatter and then rerunning the quality command.


Output:
Chunk ID: 68635e
Wall time: 30.0015 seconds
Process running with session ID 68161
Original token count: 91
Output:
Picked up JAVA_TOOL_OPTIONS: -Xlog:os+container=off
Starting a Gradle Daemon, 7 busy Daemons could not be reused, use --status for details

> Configure project :app
WARNING: The option setting 'android.testoptions.manageddevices.emulator.gpu=host' is experimental.

> Task :macrobenchmark:loadKtlintReporters UP-TO-DATE
> Task :app:loadKtlintReporters UP-TO-DATE


Output:
Chunk ID: 4bccef
Wall time: 17.7166 seconds
Process exited with code 0
Original token count: 900
Output:
> Task :macrobenchmark:runKtlintFormatOverKotlinScripts
> Task :macrobenchmark:runKtlintFormatOverBenchmarkSourceSet NO-SOURCE
> Task :macrobenchmark:ktlintBenchmarkSourceSetFormat SKIPPED
> Task :macrobenchmark:runKtlintFormatOverDebugSourceSet NO-SOURCE
> Task :macrobenchmark:ktlintDebugSourceSetFormat SKIPPED
> Task :macrobenchmark:ktlintKotlinScriptFormat
> Task :macrobenchmark:runKtlintFormatOverMainSourceSet
> Task :macrobenchmark:ktlintMainSourceSetFormat
> Task :macrobenchmark:ktlintFormat
> Task :app:runKtlintFormatOverKotlinScripts
> Task :app:runKtlintFormatOverAndroidTestBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestBenchmarkSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverAndroidTestDebugSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestDebugSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverAndroidTestReleaseSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestReleaseSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverAndroidTestStagingSourceSet
> Task :app:ktlintAndroidTestStagingSourceSetFormat
> Task :app:ktlintKotlinScriptFormat
> Task :app:runKtlintFormatOverAndroidTestSourceSet
> Task :app:ktlintAndroidTestSourceSetFormat
> Task :app:runKtlintFormatOverReleaseSourceSet NO-SOURCE
> Task :app:ktlintReleaseSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverStagingSourceSet NO-SOURCE
> Task :app:ktlintStagingSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverTestBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintTestBenchmarkSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverTestDebugSourceSet NO-SOURCE
> Task :app:ktlintTestDebugSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverTestFixturesBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesBenchmarkSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverTestFixturesDebugSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesDebugSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverTestFixturesReleaseSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesReleaseSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverTestFixturesSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverTestFixturesStagingSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesStagingSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverTestReleaseSourceSet NO-SOURCE
> Task :app:ktlintTestReleaseSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverDebugSourceSet
> Task :app:ktlintDebugSourceSetFormat
> Task :app:runKtlintFormatOverTestStagingSourceSet NO-SOURCE
> Task :app:ktlintTestStagingSourceSetFormat SKIPPED
> Task :app:runKtlintFormatOverBenchmarkSourceSet
> Task :app:ktlintBenchmarkSourceSetFormat
> Task :app:runKtlintFormatOverMainSourceSet
> Task :app:ktlintMainSourceSetFormat
> Task :app:runKtlintFormatOverTestSourceSet
> Task :app:ktlintTestSourceSetFormat
> Task :app:ktlintFormat

[Incubating] Problems report is available at: file:///home/Messier82/projects/service-book/build/reports/problems/problems-report.html

Deprecated Gradle features were used in this build, making it incompatible with Gradle 10.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/9.5.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD SUCCESSFUL in 57s
20 actionable tasks: 18 executed, 2 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.5.1/userguide/configuration_cache_enabling.html


Formatter completed. I’m checking the diff so only intended formatting/build changes are included before rerunning lint.


git diff -- app/build.gradle.kts app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt gradle/libs.versions.toml


Output:
Chunk ID: 39becc
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 29
Output:
 M app/build.gradle.kts
 M app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt
?? extracted-icons/


Output:
Chunk ID: b68cad
Wall time: 0.1068 seconds
Process exited with code 0
Original token count: 356
Output:
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index c36cf32..5e08631 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -64,7 +64,7 @@ val macrobenchmarkTaskPath = ":macrobenchmark:pixel2api33BenchmarkAndroidTest"
 android {
     // NOTE: Keep in sync with BenchmarkFixtures.PACKAGE_NAME in the :macrobenchmark module.
     namespace = "com.yorvana"
-    compileSdk = 36
+    compileSdk = 37

     defaultConfig {
         applicationId = "com.yorvana"
diff --git a/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt b/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt
index 65e3d32..e4dc4bb 100644
--- a/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt
+++ b/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt
@@ -132,7 +132,11 @@ class ReportBugViewModelTest {
             viewModel.onEvent(ReportBugEvent.SummaryChanged("Summary"))
             viewModel.onEvent(ReportBugEvent.DescriptionChanged("Description"))

-            viewModel.onEvent(testSubmitEvent)
+            viewModel.effects.test {
+                viewModel.onEvent(testSubmitEvent)
+                assertThat(awaitItem()).isInstanceOf(ReportBugEffect.NavigateBack::class.java)
+                cancelAndIgnoreRemainingEvents()
+            }

             verify { sentryWrapper.captureFeedback("Summary\n\nDescription", null, any()) }
         }


The diff is scoped to the compileSdk bump and the synchronized unit test. I’m rerunning the quality command.


Output:
Chunk ID: e1f985
Wall time: 30.0008 seconds
Process running with session ID 24218
Original token count: 1155
Output:
Picked up JAVA_TOOL_OPTIONS: -Xlog:os+container=off

> Configure project :app
WARNING: The option setting 'android.testoptions.manageddevices.emulator.gpu=host' is experimental.

> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:packageDebugResources UP-TO-DATE
> Task :macrobenchmark:loadKtlintReporters UP-TO-DATE
> Task :macrobenchmark:runKtlintCheckOverBenchmarkSourceSet NO-SOURCE
> Task :macrobenchmark:ktlintBenchmarkSourceSetCheck SKIPPED
> Task :macrobenchmark:runKtlintCheckOverDebugSourceSet NO-SOURCE
> Task :macrobenchmark:ktlintDebugSourceSetCheck SKIPPED
> Task :macrobenchmark:runKtlintCheckOverKotlinScripts UP-TO-DATE
> Task :macrobenchmark:ktlintKotlinScriptCheck UP-TO-DATE
> Task :macrobenchmark:runKtlintCheckOverMainSourceSet UP-TO-DATE
> Task :macrobenchmark:ktlintMainSourceSetCheck UP-TO-DATE
> Task :macrobenchmark:ktlintCheck UP-TO-DATE
> Task :macrobenchmark:detekt UP-TO-DATE
> Task :app:processDebugNavigationResources UP-TO-DATE
> Task :app:parseDebugLocalResources UP-TO-DATE
> Task :app:generateDebugRFile UP-TO-DATE
> Task :app:compileDebugKotlin UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:checkDebugAarMetadata UP-TO-DATE
> Task :app:mapDebugSourceSetPaths UP-TO-DATE
> Task :app:compileDebugNavigationResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugMainManifest UP-TO-DATE
> Task :app:processDebugManifest UP-TO-DATE
> Task :app:processDebugManifestForPackage UP-TO-DATE
> Task :app:processDebugResources UP-TO-DATE
> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE
> Task :app:preDebugAndroidTestBuild SKIPPED
> Task :app:generateDebugAndroidTestLintModel UP-TO-DATE
> Task :app:extractProguardFiles UP-TO-DATE
> Task :app:generateDebugLintReportModel UP-TO-DATE
> Task :app:preDebugUnitTestBuild UP-TO-DATE
> Task :app:generateDebugUnitTestLintModel
> Task :app:lintAnalyzeDebugAndroidTest UP-TO-DATE
> Task :app:loadKtlintReporters UP-TO-DATE
> Task :app:runKtlintCheckOverAndroidTestBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestBenchmarkSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverAndroidTestDebugSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestDebugSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverAndroidTestReleaseSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestReleaseSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverAndroidTestSourceSet UP-TO-DATE
> Task :app:ktlintAndroidTestSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverAndroidTestStagingSourceSet UP-TO-DATE
> Task :app:ktlintAndroidTestStagingSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverBenchmarkSourceSet UP-TO-DATE
> Task :app:ktlintBenchmarkSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverDebugSourceSet UP-TO-DATE
> Task :app:ktlintDebugSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverKotlinScripts UP-TO-DATE
> Task :app:ktlintKotlinScriptCheck UP-TO-DATE
> Task :app:runKtlintCheckOverMainSourceSet UP-TO-DATE
> Task :app:ktlintMainSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverReleaseSourceSet NO-SOURCE
> Task :app:ktlintReleaseSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverStagingSourceSet NO-SOURCE
> Task :app:ktlintStagingSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintTestBenchmarkSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestDebugSourceSet NO-SOURCE
> Task :app:ktlintTestDebugSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesBenchmarkSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesDebugSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesDebugSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesReleaseSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesReleaseSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesStagingSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesStagingSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestReleaseSourceSet NO-SOURCE
> Task :app:ktlintTestReleaseSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestStagingSourceSet NO-SOURCE
> Task :app:ktlintTestStagingSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestSourceSet


The quality command is past ktlint’s edited test source and still running Android lint/detekt.


Output:
Chunk ID: d17793
Wall time: 30.0012 seconds
Process running with session ID 24218
Original token count: 37
Output:
> Task :app:detekt
> Task :app:ktlintTestSourceSetCheck
> Task :app:ktlintCheck
> Task :app:lintAnalyzeDebug
> Task :app:lintAnalyzeDebugUnitTest


Ktlint and detekt are clean; Android lint is finishing.


Output:
Chunk ID: a8a718
Wall time: 30.0006 seconds
Process running with session ID 24218
Original token count: 0
Output:


No new output in the last interval; lint is still active.


Output:
Chunk ID: 96bedb
Wall time: 12.8000 seconds
Process exited with code 0
Original token count: 290
Output:

> Task :app:lintReportDebug
Wrote HTML report to file:///home/Messier82/projects/service-book/app/build/reports/lint-results-debug.html
Lint found 17 warnings, 1 hint (and 19 warnings filtered by baseline lint-baseline.xml)

56 errors/warnings were listed in the baseline file (/home/Messier82/projects/service-book/app/lint-baseline.xml) but not found in the project; perhaps they have been fixed?

> Task :app:lintDebug

[Incubating] Problems report is available at: file:///home/Messier82/projects/service-book/build/reports/problems/problems-report.html

Deprecated Gradle features were used in this build, making it incompatible with Gradle 10.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/9.5.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD SUCCESSFUL in 1m 59s
51 actionable tasks: 8 executed, 43 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.5.1/userguide/configuration_cache_enabling.html


#139 now passes full JVM tests, app-scoped GPU smoke, and lint/ktlint/detekt after the manual fixes. I’m committing and pushing the fix branch, then I’ll stop here as the workflow requires manual review before continuing to the remaining Dependabot PRs.


git diff -- app/build.gradle.kts app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt


Output:
Chunk ID: 6f9aa0
Wall time: 0.0746 seconds
Process exited with code 0
Original token count: 356
Output:
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index c36cf32..5e08631 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -64,7 +64,7 @@ val macrobenchmarkTaskPath = ":macrobenchmark:pixel2api33BenchmarkAndroidTest"
 android {
     // NOTE: Keep in sync with BenchmarkFixtures.PACKAGE_NAME in the :macrobenchmark module.
     namespace = "com.yorvana"
-    compileSdk = 36
+    compileSdk = 37

     defaultConfig {
         applicationId = "com.yorvana"
diff --git a/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt b/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt
index 65e3d32..e4dc4bb 100644
--- a/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt
+++ b/app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt
@@ -132,7 +132,11 @@ class ReportBugViewModelTest {
             viewModel.onEvent(ReportBugEvent.SummaryChanged("Summary"))
             viewModel.onEvent(ReportBugEvent.DescriptionChanged("Description"))

-            viewModel.onEvent(testSubmitEvent)
+            viewModel.effects.test {
+                viewModel.onEvent(testSubmitEvent)
+                assertThat(awaitItem()).isInstanceOf(ReportBugEffect.NavigateBack::class.java)
+                cancelAndIgnoreRemainingEvents()
+            }

             verify { sentryWrapper.captureFeedback("Summary\n\nDescription", null, any()) }
         }


Output:
Chunk ID: 66a318
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 59
Output:
## dependabot/gradle/androidx.core-core-ktx-1.19.0...origin/dependabot/gradle/androidx.core-core-ktx-1.19.0 [ahead 8]
 M app/build.gradle.kts
 M app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt
?? extracted-icons/


The pending diff is just the compileSdk bump and the test synchronization fix. I’m staging those two files only, leaving `extracted-icons/` untouched.


git add app/build.gradle.kts app/src/test/java/com/yorvana/ui/reportbug/ReportBugViewModelTest.kt


Output:
Chunk ID: 15a878
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 0
Output:


The intended files are staged. I’m committing the #139 compatibility fixes.


git commit -m "build: support core-ktx 1.19"


Output:
Chunk ID: 7ff342
Wall time: 2.9571 seconds
Process exited with code 0
Original token count: 1443
Output:
Picked up JAVA_TOOL_OPTIONS: -Xlog:os+container=off

> Configure project :app
WARNING: The option setting 'android.testoptions.manageddevices.emulator.gpu=host' is experimental.

> Task :app:loadKtlintReporters UP-TO-DATE
> Task :macrobenchmark:loadKtlintReporters UP-TO-DATE
> Task :app:runKtlintCheckOverAndroidTestBenchmarkSourceSet NO-SOURCE
> Task :macrobenchmark:runKtlintCheckOverBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestBenchmarkSourceSetCheck SKIPPED
> Task :macrobenchmark:ktlintBenchmarkSourceSetCheck SKIPPED
> Task :macrobenchmark:runKtlintCheckOverDebugSourceSet NO-SOURCE
> Task :app:runKtlintCheckOverAndroidTestDebugSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestDebugSourceSetCheck SKIPPED
> Task :macrobenchmark:ktlintDebugSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverAndroidTestReleaseSourceSet NO-SOURCE
> Task :app:ktlintAndroidTestReleaseSourceSetCheck SKIPPED
> Task :macrobenchmark:runKtlintCheckOverKotlinScripts UP-TO-DATE
> Task :macrobenchmark:ktlintKotlinScriptCheck UP-TO-DATE
> Task :app:runKtlintCheckOverAndroidTestSourceSet UP-TO-DATE
> Task :macrobenchmark:runKtlintCheckOverMainSourceSet UP-TO-DATE
> Task :app:ktlintAndroidTestSourceSetCheck UP-TO-DATE
> Task :macrobenchmark:ktlintMainSourceSetCheck UP-TO-DATE
> Task :macrobenchmark:ktlintCheck UP-TO-DATE
> Task :app:runKtlintCheckOverAndroidTestStagingSourceSet UP-TO-DATE
> Task :app:ktlintAndroidTestStagingSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverBenchmarkSourceSet UP-TO-DATE
> Task :app:ktlintBenchmarkSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverDebugSourceSet UP-TO-DATE
> Task :app:ktlintDebugSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverKotlinScripts UP-TO-DATE
> Task :macrobenchmark:detekt UP-TO-DATE
> Task :app:ktlintKotlinScriptCheck UP-TO-DATE
> Task :app:runKtlintCheckOverMainSourceSet UP-TO-DATE
> Task :app:ktlintMainSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverReleaseSourceSet NO-SOURCE
> Task :app:ktlintReleaseSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverStagingSourceSet NO-SOURCE
> Task :app:ktlintStagingSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintTestBenchmarkSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestDebugSourceSet NO-SOURCE
> Task :app:ktlintTestDebugSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesBenchmarkSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesBenchmarkSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesDebugSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesDebugSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesReleaseSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesReleaseSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestFixturesStagingSourceSet NO-SOURCE
> Task :app:ktlintTestFixturesStagingSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestReleaseSourceSet NO-SOURCE
> Task :app:ktlintTestReleaseSourceSetCheck SKIPPED
> Task :app:runKtlintCheckOverTestSourceSet UP-TO-DATE
> Task :app:ktlintTestSourceSetCheck UP-TO-DATE
> Task :app:runKtlintCheckOverTestStagingSourceSet NO-SOURCE
> Task :app:ktlintTestStagingSourceSetCheck SKIPPED
> Task :app:ktlintCheck UP-TO-DATE
> Task :app:detekt UP-TO-DATE
> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:packageDebugResources UP-TO-DATE
> Task :app:processDebugNavigationResources UP-TO-DATE
> Task :app:parseDebugLocalResources UP-TO-DATE
> Task :app:generateDebugRFile UP-TO-DATE
> Task :app:compileDebugKotlin UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:checkDebugAarMetadata UP-TO-DATE
> Task :app:mapDebugSourceSetPaths UP-TO-DATE
> Task :app:compileDebugNavigationResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugMainManifest UP-TO-DATE
> Task :app:processDebugManifest UP-TO-DATE
> Task :app:processDebugManifestForPackage UP-TO-DATE
> Task :app:processDebugResources UP-TO-DATE
> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE
> Task :app:preDebugAndroidTestBuild SKIPPED
> Task :app:generateDebugAndroidTestLintModel UP-TO-DATE
> Task :app:extractProguardFiles UP-TO-DATE
> Task :app:generateDebugLintReportModel UP-TO-DATE
> Task :app:preDebugUnitTestBuild UP-TO-DATE
> Task :app:generateDebugUnitTestLintModel UP-TO-DATE
> Task :app:lintAnalyzeDebug UP-TO-DATE
> Task :app:lintAnalyzeDebugAndroidTest UP-TO-DATE
> Task :app:lintAnalyzeDebugUnitTest UP-TO-DATE
> Task :app:lintReportDebug UP-TO-DATE
> Task :app:lintDebug

[Incubating] Problems report is available at: file:///home/Messier82/projects/service-book/build/reports/problems/problems-report.html

Deprecated Gradle features were used in this build, making it incompatible with Gradle 10.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/9.5.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD SUCCESSFUL in 2s
51 actionable tasks: 1 executed, 50 up-to-date
Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.5.1/userguide/configuration_cache_enabling.html
[dependabot/gradle/androidx.core-core-ktx-1.19.0 dde5dd1] build: support core-ktx 1.19
 2 files changed, 6 insertions(+), 2 deletions(-)


The fix commit was created on #139. I’m pushing it to the Dependabot branch.


Output:
Chunk ID: eab351
Wall time: 2.7742 seconds
Process exited with code 0
Original token count: 39
Output:
To github.com:yorvana/android.git
   184fd20..dde5dd1  dependabot/gradle/androidx.core-core-ktx-1.19.0 -> dependabot/gradle/androidx.core-core-ktx-1.19.0


#139’s fix branch is pushed. I’m doing a final status check and then I’ll stop here, because the repo workflow says not to proceed to the next Dependabot PR after manual fixes until review/merge completes.


gh pr view 139 --json number,title,url,headRefName,mergeStateStatus,commits,files


gh pr list --author app/dependabot --state open --json number,title,headRefName,mergeStateStatus


Output:
Chunk ID: 39a07a
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 32
Output:
## dependabot/gradle/androidx.core-core-ktx-1.19.0...origin/dependabot/gradle/androidx.core-core-ktx-1.19.0
?? extracted-icons/