---
name: add-library-test
description: Add or update a Robolectric JVM unit test for the FireCrasher library. Use when changing recovery logic, crash handling, back-stack counting, exit-info reporting, or the recovery-state codec, and a test should cover it.
---

# Add a library unit test

The library's tests run on the JVM under **Robolectric** — no device or
emulator needed. They live in
`firecrasher/src/test/java/com/osama/firecrasher/` and use JUnit 4. Every
behavior change to the library should come with a test.

## Where behavior is tested today

| Concern | Test |
|---------|------|
| Recovery level selection (`evaluate`) | `RecoveryLevelEvaluationTest` (pure, no Robolectric) |
| Activity counting / back-stack depth | `BackStackCountTest` |
| Crash delivered to the `onCrash` hook on the main thread | `CrashHandlerTest` |
| Install DSL: scope population, auto-recover default, forced-level recover | `FireCrasherDslTest` |
| GO_BACK back dispatch (dispatcher vs. legacy `onBackPressed`) | `GoBackDispatchTest` |
| `ApplicationExitInfo` querying (API 30+) | `ExitInfoTest` (`@Config(sdk = [30, 36])`) |
| Recovery-state encode/decode + 128-byte limit | `RecoveryStateCodecTest` |

Extend the matching suite when your change fits one; add a new
`*Test.kt` in the same package otherwise.

## Conventions to follow

- **Runner:** annotate device-dependent tests with
  `@RunWith(RobolectricTestRunner::class)`. Pure-logic tests (like
  `RecoveryLevelEvaluationTest`) need no runner — prefer that when possible.
- **Build activities** with `Robolectric.buildActivity(...)`; drive lifecycle
  through `CrashHandler`'s `lifecycleCallbacks` rather than reaching into
  internals.
- **SDK-gated behavior:** pin the API levels under test with
  `@Config(sdk = [30, 36])` (see `ExitInfoTest`) so both the guarded and
  unguarded paths are exercised.
- **Reset global state:** `FireCrasher` is an `object` with process-wide state
  (`retryCount`). Tests that call into it must clean up in `@After` via
  `FireCrasher.resetForTest()` (see `GoBackDispatchTest`) so tests don't leak
  into each other.
- Name tests with backtick sentences describing the behavior, matching the
  existing style (e.g. `` `first crash restarts the activity` ``).

## Run

```bash
./gradlew :firecrasher:test
```

Test reports land in `firecrasher/build/reports/tests/`. Before finishing, run
the `run-checks` skill so lint and the ABI baseline are covered too.
