파이프라인에서의 날짜 테스트
창은 탐색을 위한 것입니다. 이쪽은 나머지 절반으로, 설치할 런타임이 없는 약 2.4MB의 명령줄 빌드이며, 종료 코드는 대상의 종료 코드가 아니라 커버리지 판정입니다.
종료 코드가 곧 판정입니다
이 도구를 스크립트에서 쓸 수 있게 만드는 설계 결정입니다. 세션이 끝나면 종료 코드는 “앱이 무엇을 반환했는가”가 아니라 “시간 대체가 적용되었는가”에 답합니다. 그래서 파이프라인은 조용히 일어나지 않은 대체 때문에 실패할 수 있고, 이것이야말로 실패할 가치가 있는 실패입니다. 그 뒤에 오는 모든 것은 아무것도 증명하지 못한 테스트이기 때문입니다.
대상 자체의 종료 코드는 세션 데이터에 계속 보고됩니다.
| 코드 | 의미 |
|---|---|
| 0 | 동작함 - 시간을 읽은 모든 프로세스가 세션 시계를 보았음 |
| 10 | 일부 동작함 - 일부 채널은 커버되고 일부는 커버되지 않음 |
| 11 | 동작하지 않음 - 대체가 핵심 채널에 도달하지 못함 |
| 4 | 판단 불가 - 커버리지를 확인할 수 없음 |
| 1 | 사용 오류 - 잘못된 플래그 또는 잘못된 식 |
| 2 | 대상을 실행하거나 인젝션할 수 없었음 |
| 12 | 대상이 사라짐. 단일 인스턴스 애플리케이션임을 시사함 |
| 3 | 내부 오류 - 엔진을 시작할 수 없었거나, 예기치 않은 상태를 만났거나, 세션을 닫기 전에 멈춤(엔진 자신의 종료 코드와 무관하게). 이런 실행에는 판정이 없습니다 |
| 5 | 이 릴리스에는 해당 작업이 빌드되어 있지 않음 |
| 6 | 실행이 중간에 끊김 - --timeout이 만료되었거나, 엔진이 15초 동안 응답하지 않아 중지됨. 이것은 판정이 아닙니다. 세션이 중단되었으므로 대상에 대해 어느 쪽으로도 아무것도 증명하지 못합니다 |
| 7 | 다른 세션이 이미 실행 중임 - 세션은 한 번에 하나뿐입니다. 끝난 뒤 다시 시도하면 됩니다 |
| 8 | 세션이 판정에 도달했지만 그 증거가 --report로 지정한 파일에 없음 - 디스크가 가득 찼거나 다른 프로그램이 이전 파일을 열어 두어, 그 파일은 그대로 남습니다. 판정은 명령이 출력하는 보고서에 그대로 있습니다 |
두 명령의 모든 플래그와 계산기용 같은 표는 명령줄 레퍼런스에 있습니다.
실행 시간 제한
파이프라인은 사람이 데스크톱 앱을 닫기를 기다릴 수 없습니다. --ticks N은 N번의 하트비트(각각 실제 1초) 뒤에 세션을 끝내고, 그때까지 알아낸 내용을 보고합니다. 커버리지는 어차피 프로세스의 맨 처음 순간에 확정되므로, 대개는 짧은 제한이면 충분합니다.
# 10초 동안 실행한 뒤 멈추고 보고 chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt
기계 판독용 출력과 증거
--json은 사람이 읽는 보고서 대신 기계가 읽을 수 있는 레코드로 세션을 출력합니다. 채널별 커버리지를 포함해 담긴 사실은 같습니다.--report <path>는 사람이 읽는 보고서를 파일에 기록하며, 빌드 산출물로 쓰기에 알맞습니다. 판정이 동작함이 아닌 세션은 단서를 맨 아래에 묻어 두지 않고, 파일 맨 앞에 신뢰할 수 없는 증거라는 배너를 붙입니다.- 계산기도
--json을 지원하므로, 파이프라인이 필요한 날짜를 계산해 다시 입력으로 넘길 수 있습니다.
# 날짜를 계산한 뒤, 그 날짜로 실행 chrono calc --base today --snap eom --json chrono run ".\build\test.exe" --preset month-end --ticks 10 --json
단계 하나의 예
- name: Month-end behaviour
shell: pwsh
run: |
.\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
# 여기서 0이 아닌 종료 코드가 나오면 대체가 적용되지 않았다는 뜻이므로,
# 그 뒤의 테스트는 아무것도 증명하지 못했을 것이다
- name: Keep the evidence
uses: actions/upload-artifact@v7
with:
name: chrono-evidence
path: evidence.txt
러너에 관한 솔직한 주의 두 가지
- Windows 러너가 필요합니다. Linux나 macOS 빌드는 없으며 앞으로도 만들지 않습니다. Linux에서는 libfaketime이 이미 이 역할을 합니다.
- 호스팅된 러너의 백신이 인젝션을 막을 수 있습니다. 시간을 옮기려면 대상 프로세스에 라이브러리를 인젝션해야 하는데, 이는 문서화된 Windows 기법이지만 악성코드도 사용합니다. 이를 막는 러너는 거짓 통과 대신 그 사실을 알리는 종료 코드를 냅니다. 다만 의존하기 전에 미리 알아 두어야 할 점입니다.
같은 이유로 이 프로젝트 자체의 종단 간 테스트 모음은 호스팅된 러너가 아니라 실제 컴퓨터에서 실행됩니다. 지속적 통합은 모든 것을 빌드하고 단위 테스트하며, 대체 자체는 릴리스 전에 32비트와 64비트 빌드 모두에서 실제 애플리케이션을 대상으로 직접 시험합니다.