- Add m-client-validation task directory - Update apps/flutter-test/README.md - Update packages/messaging_flutter/README.md - Update packages/messaging_flutter/docs/android-test-environment.md
11 KiB
Plan - ANDROID
이 파일을 읽는 구현 에이전트에게
CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션 작성은 필수다. 구현 후 검증을 실행하고 실제 변경 내용, 명령 출력, 계획 대비 변경 사항을 채운 뒤 active 파일을 그대로 둔 채 리뷰 준비 상태로 보고한다. 최종 판정, 로그 rename, complete.log, archive 이동은 code-review 스킬 전용이다. 사용자만 결정할 수 있는 사항, 외부 환경 준비, 범위 충돌로 막히면 review stub의 사용자 리뷰 요청 섹션에 정확한 결정 필요 사항과 근거를 채우고 멈춘다.
배경
Milestone은 Android native unit test와 remote Android verification path를 기준선으로 요구한다. 현재 local 환경은 Android SDK가 없어 ./gradlew testDebugUnitTest가 SDK location not found로 실패하고, integration test도 Android device/emulator가 없어 실패한다. 이 subtask는 native test 내용을 템플릿성 확인에서 실제 plugin contract로 키우고, local/remote verification을 정직하게 기록한다.
사용자 리뷰 요청 흐름
구현 중 blocker는 active CODE_REVIEW-*-G??.md의 사용자 리뷰 요청 섹션에 기록한다. 섹션 형식은 agent-ops/skills/common/_templates/implementation-user-review-request-section.md와 같으며, code-review가 검증 후 실제 USER_REVIEW.md 작성 여부를 결정한다.
분석 결과
읽은 파일
apps/flutter-test/android/local.propertiesapps/flutter-test/android/settings.gradle.ktsapps/flutter-test/android/build.gradle.ktsapps/flutter-test/android/app/build.gradle.ktsapps/flutter-test/android/app/src/main/AndroidManifest.xmlpackages/messaging_flutter/android/build.gradle.ktspackages/messaging_flutter/android/src/main/AndroidManifest.xmlpackages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPlugin.ktpackages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/PushNotificationEvents.ktpackages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/LaunchIntentHelper.ktpackages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/NexoFirebaseMessagingService.ktpackages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.ktpackages/messaging_flutter/docs/android-test-environment.mdapps/flutter-test/README.mdpackages/messaging_flutter/README.md
테스트 커버리지 공백
NexoMessagingPlugin.onMethodCall: current native test only checksgetPlatformVersion; invalid argument paths and debug event method are not covered.intentPayload: no native unit test currently verifies extras -> opened/userInteraction payload mapping.- Local Android verification: blocked because local
apps/flutter-test/android/local.propertieshasflutter.sdk=/sdk/flutterbut nosdk.dir, andANDROID_HOMEis unavailable. - Remote Android verification: documented but not executed in this local session.
심볼 참조
- 변경/삭제할 심볼 없음.
- Relevant references checked with
rg --sort path -n "debugSendNativeEvent|intentPayload|testDebugUnitTest|ANDROID_HOME|sdk.dir" apps/flutter-test packages/messaging_flutter.
분할 판단
- split decision policy를 plan 파일 선택 전에 평가했다.
- shared task group:
agent-task/m-client-validation. - predecessor dependencies from directory name:
01_docs_boundaryand02+01_flutter_contract_tests. - this subtask:
03+01,02_android_native_validation, waits for both because it relies on finalized doc language and Flutter contract tests.
범위 결정 근거
- No remote credentials or host-specific tokens are added to tracked docs.
- No Android SDK is installed into the repository.
- No public package rename, manifest identifier rename, or generated Flutter platform file regeneration is allowed.
- FCM real delivery remains manual smoke; this subtask may document/run it only when external infrastructure is already prepared.
빌드 등급
- build=
cloud-G07, review=cloud-G07. Success depends on terminal/Gradle workflow, environment diagnosis, Android SDK/device availability, and possibly remote execution.
의존 관계 및 구현 순서
- Wait for
agent-task/m-client-validation/01_docs_boundary/complete.log. - Wait for
agent-task/m-client-validation/02+01_flutter_contract_tests/complete.log. - Do not add dependencies beyond the
03+01,02_...directory name.
구현 체크리스트
- [ANDROID-1]
packages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.kt를 plugin method-call/intent payload 계약 중심으로 보강한다. - [ANDROID-2] local Android preflight를 실행하고
./gradlew testDebugUnitTest의 실제 통과 또는 SDK blocker 출력을 기록한다. - [ANDROID-3] remote Android guide를 사용 가능한 경우 integration/native checks를 실행하고, 불가능하면 review stub의 사용자 리뷰 요청에 필요한 외부 준비 사항을 정확히 남긴다.
flutter doctor -v와command -v adb/command -v emulator/command -v sdkmanager결과를 기록한다../gradlew testDebugUnitTest를apps/flutter-test/android에서 실행하고 실제 stdout/stderr를 기록한다.- CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.
[ANDROID-1] Native unit test 계약 보강
문제
packages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.kt는 template comment와 getPlatformVersion 단일 테스트만 갖고 있다. packages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPlugin.kt의 debugSendNativeEvent invalid argument path와 packages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPlugin.kt의 intentPayload mapping은 native test로 고정되어 있지 않다.
Before:
16 internal class NexoMessagingPluginTest {
17 @Test
18 fun onMethodCall_getPlatformVersion_returnsExpectedValue() {
해결 방법
기존 template comment를 제거하고, 최소한 다음 native tests를 추가한다.
onMethodCall_debugSendNativeEvent_withInvalidPayload_returnsInvalidArgonMethodCall_saveDeviceToken_withoutToken_returnsInvalidArg- 가능하면 Android SDK/Robolectric 없이 가능한 범위에서
intentPayloadmapping test. 필요하면 implementation blocker로 남기고 문서화한다.
새 dependency는 추가하지 않는 것을 기본으로 한다. Robolectric이 꼭 필요하면 packages/messaging_flutter/android/build.gradle.kts의 testImplementation 추가 여부와 이유를 review stub에 기록한다.
수정 파일 및 체크리스트
packages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.kt- 필요 시
packages/messaging_flutter/android/build.gradle.kts
테스트 작성
Native unit test를 직접 추가한다.
중간 검증
cd apps/flutter-test/android && ./gradlew testDebugUnitTest
[ANDROID-2] Local Android preflight 기록
문제
현재 local ./gradlew testDebugUnitTest는 Android SDK path가 없어 실패했다. apps/flutter-test/android/local.properties는 flutter.sdk만 갖고 있고 sdk.dir이 없다.
Observed:
SDK location not found. Define a valid SDK location with an ANDROID_HOME environment variable or by setting the sdk.dir path in your project's local properties file
해결 방법
구현자는 local 환경을 repo에 설치하지 않는다. command -v adb, command -v emulator, command -v sdkmanager, flutter doctor -v, ./gradlew testDebugUnitTest를 실행하고 실제 출력을 review stub에 기록한다. ANDROID_HOME이 준비되어 있으면 Gradle test를 통과시킨다.
수정 파일 및 체크리스트
- 소스 파일 변경 없음. 검증 결과 기록만 수행한다.
테스트 작성
테스트 작성 없음. 환경 preflight다.
중간 검증
command -v adb
command -v emulator
command -v sdkmanager
flutter doctor -v
cd apps/flutter-test/android && ./gradlew testDebugUnitTest
[ANDROID-3] Remote/device verification handoff
문제
packages/messaging_flutter/docs/android-test-environment.md는 remote check path를 제공하지만 실제 실행은 외부 SSH/device 조건이 필요하다.
Before:
73 ## Run The Checks
77 cd "$HOME/tmp/nexo-codex-test/packages/messaging_flutter"
해결 방법
remote host 접근이 가능하면 guide의 sync/emulator/check commands를 그대로 실행한다. 접근이 불가능하면 사용자 리뷰 요청에 필요한 준비 사항을 남긴다: Android SDK 또는 remote SSH availability, emulator/device, Firebase config 여부.
수정 파일 및 체크리스트
- 필요 시
packages/messaging_flutter/docs/android-test-environment.md의 command drift만 수정한다.
테스트 작성
새 테스트 없음. 외부 환경 검증이다.
중간 검증
cd apps/flutter-test && flutter test integration_test -d emulator-5554
cd apps/flutter-test/android && ./gradlew testDebugUnitTest
수정 파일 요약
| 파일 | 항목 |
|---|---|
packages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.kt |
ANDROID-1 |
packages/messaging_flutter/android/build.gradle.kts |
ANDROID-1, only if a test dependency is justified |
packages/messaging_flutter/docs/android-test-environment.md |
ANDROID-3, only if command drift is found |
최종 검증
command -v adb
command -v emulator
command -v sdkmanager
flutter doctor -v
cd apps/flutter-test/android && ./gradlew testDebugUnitTest
cd apps/flutter-test && flutter test integration_test -d emulator-5554
git diff --check -- packages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.kt packages/messaging_flutter/android/build.gradle.kts packages/messaging_flutter/docs/android-test-environment.md
Local Android SDK/device 부재는 PASS가 아니라 environment blocker다. blocker가 남으면 사용자 리뷰 요청을 채우고 code-review가 stop 여부를 판단하게 한다.
모든 코드 변경 완료 후 반드시 CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.