swift run AwakeTestsAwakeTests는 XCTest에 의존하지 않는 경량 실행형 테스트 러너다. 전체 Xcode 설치 없이 Command Line Tools만 있는 환경에서도 실제로 실행되며, 실패가 있으면 종료 코드가 0이 아니다(CI에서 그대로 게이트로 사용 가능). 이를 위해 순수 도메인 로직은 AwakeCore 라이브러리 타깃에 두고, Awake 실행 타깃은 얇은 런처로 분리한다.
이전에는
.testTarget안의 톱레벨precondition블록을 사용했는데, 테스트 러너가 이를 호출하지 않아 사실상 실행되지 않았다. 현재 구조는 모든 검증이 실제로 실행됨을 보장한다.
SettingsStore: 기본값과 설정 저장/복원 라운드트립SafetyEvaluator: lid-closed 시간 제한 / 배터리 컷오프 판정 (AC/배터리, 경계값 포함)ProcessMonitor: PID 생존 판정과 PID 재사용(bundle id 불일치) 오탐 방지, 종료 감지LidHelperScript: 데몬 스크립트의 heartbeat 자가 복구 로직(파일 mtime 기반 staleness)과 plist 구성
SessionController상태 전환은 의존성을 프로토콜로 추출한 뒤 같은 러너에서 검증한다.- Xcode 기반 CI를 추가하면 동일 로직을 XCTest 또는 Swift Testing으로도 노출할 수 있다(코어가 라이브러리이므로 그대로 import 가능).
- assertion 생성/해제 wrapper
- target monitor와 session controller 연결
- 앱 목록 provider snapshot 생성
- 세션 시작 후
pmset -g assertions확인 - 세션 종료 후 assertion 제거 확인
- 선택한 앱 종료 시 자동 해제 확인
- Awake 앱 종료 시 assertion 해제 확인
- 디스플레이 꺼짐 상태에서 작업 유지 확인
- 배터리/전원 연결 상태별 동작 확인
제품 검증 중 다음 환경을 분리해 기록한다.
- MacBook 단독, 배터리
- MacBook 단독, 전원 연결
- 외부 디스플레이 연결
- 외부 전원과 외부 입력 장치 연결
- 회사 관리 장비 또는 MDM 적용 장비
결과는 제품 보장 문구가 아니라 환경별 참고 정보로만 사용한다.
- active 세션이 남아 있는데 assertion이 없는 상태
- assertion은 남아 있는데 UI는 idle인 상태
- 선택 대상이 종료되었는데 세션이 유지되는 상태
- 권한이 없을 때 선택 화면이 비어 보이는 상태
- 앱 종료 후 assertion이 남는 상태