시스템 시계를 건드리지 않고 Windows 앱을 원하는 날짜로 실행하세요
앱 하나의 시계만 내년으로 돌리거나, 멈추거나, 커피를 내리는 동안 30일 체험 기간이 끝나도록 빠르게 돌릴 수 있습니다. 나머지 컴퓨터는 진짜 시간 그대로입니다. 도메인 로그온, 인증서, 다른 모든 프로그램이 평소처럼 계속 동작합니다.
그리고 시간 대체가 정말로 적용되었는지 알려 줍니다.
무료 오픈 소스, GPL-3.0 휴대용 또는 설치형 실행에 관리자 권한 불필요 인터넷에 절대 연결하지 않음
세션은 이렇게 보입니다
23:59:50
18:12:33
이 도구가 필요한 이유
날짜에 의존하는 모든 것을 테스트하려면 시간을 움직여야 합니다. 흔한 두 가지 방법은 모두 좋지 않습니다.
라이선스 만료, 체험 기간, 구독 갱신, 인증서 유효 기간, 토큰 수명, 월말·연말 보고서, 이자 계산, 알림.
방법 1 - 시스템 시계를 바꾼다
도메인 로그온과 Kerberos가 깨지고, TLS 인증서가 무효가 되어 브라우저가 동작하지 않으며, Windows Update가 혼란에 빠지고, 컴퓨터의 다른 모든 애플리케이션이 잘못된 타임스탬프를 기록합니다. 도메인에 가입된 컴퓨터에서는 그룹 정책이 변경을 막거나 몇 분 뒤에 되돌리는 경우가 많아서, 테스트를 반복할 수조차 없습니다.
방법 2 - 기다린다
결국 테스트하지 않는다는 뜻입니다. 날짜에 의존하는 경우는 건너뛰게 되고, “라이선스가 절대 만료되지 않는다”는 버그가 그대로 고객에게 전달됩니다.
할 수 있는 일
시간 여행을 하는 것은 프로세스 하나뿐입니다. 컴퓨터의 다른 것은 움직이지 않습니다.
원하는 어느 시점이든
구체적인 날짜와 시간, 또는 +30 days, -1 year 같은 상대적인 시점을 지정할 수 있습니다.
흐르게, 멈추게, 빠르게
보통 속도, 멈춘 시계, 또는 정수 배율입니다. x1440이면 하루가 1분이 됩니다.
자체 시간대
해당 프로세스에만 적용되는 고정 오프셋을 지정하며, 시스템 시간대는 그대로 유지됩니다.
자식 프로세스도 함께
설치 프로그램과 런처는 자식 프로세스를 만듭니다. 이 기능이 없으면 테스트는 실행된 것의 절반만 다루게 됩니다.
세션 도중 점프
앞으로도 뒤로도 가능합니다. 노트북이 시간 서버와 다시 동기화한 뒤에 일어나는 뒤로 가는 점프도 포함됩니다.
Electron과 Chromium도
다른 방식으로 처리합니다. 이들의 시계는 인젝션이 닿지 않는 샌드박스 렌더러 안에 있기 때문입니다.
다른 도구는 하지 않는 부분
적용되었는지 어떻게 알 수 있을까요?
다른 도구에서는 알 수 없습니다. 앱이 시작되고 어떤 날짜를 보여 주면, 우리는 그저 되었으리라 짐작합니다. 하지만 앱은 도구가 한 번도 가로채지 못한 경로, 즉 서버, 데이터베이스, 런타임 계층 등을 통해 시계를 읽을 수 있고, 그러면 “테스트 통과”는 아무 의미가 없습니다.
- →실제 테스트가 시작되기 전의 판정: 동작함 / 일부 동작함 / 동작하지 않음
- →44개 시간 채널 중 어느 것이 커버되었고, 앱이 각 채널을 몇 번 조회했는지
- →어느 채널이 커버되지 않았는지를 숨기지 않고 분명히 밝힙니다
- →결과가 함께 적힌 경고: “이 앱은 네트워크에서 시간을 읽습니다 - 로컬 대체만으로는 충분하지 않을 수 있습니다”
2분이면 시작할 수 있습니다
탐색에는 창, CI에는 명령줄을 쓰세요. 둘 다 같은 엔진으로 동작합니다.
# 앱을 2027년의 마지막 1초인 것처럼 실행 chrono run "C:\apps\test.exe" --at 2027-12-31T23:59:59 # 커피를 내리는 동안 30일 체험 기간이 끝나는 것을 보기: x1440은 1분에 하루 chrono run "C:\apps\test.exe" --mode x1440 # 날짜 대신 이름이 붙은 시나리오를 쓰고 증거를 파일에 기록 chrono run "C:\apps\test.exe" --preset year-rollover --report session.txt
계산기는 날짜 테스트의 나머지 절반, 즉 어떤 날짜를 쓸지에 답합니다.
$ chrono calc --preset year-2038 --zone +00:00 Chrono Mock - date calculator preset: year-2038 - 2038 boundary explains: Does the app survive the 32-bit Unix time boundary (2038-01-19T03:14:07Z)? base: 2038-01-19T03:14:07 result: 2038-01-19T03:14:07 formats: ISO date 2038-01-19 ISO datetime 2038-01-19T03:14:07+00:00 US 01/19/2038 PL 19.01.2038 epoch (s) 2147483647 epoch (ms) 2147483647000 FILETIME 137919572470000000 RFC 1123 Tue, 19 Jan 2038 03:14:07 GMT ... what this date lands on: at or past the 2038-01-19T03:14:07Z 32-bit time_t limit (Y2038)
지금 쓰고 있는 도구와 비교
RunAsDate와 비슷하지만, 부족했던 부분을 채웠습니다
RunAsDate는 벽시계 함수 다섯 개를 가로채며 그 일을 잘 해냅니다. 둘이 어디서 다른지는 아래와 같고, 전체 페이지에서는 RunAsDate가 여전히 더 나은 선택인 경우도 설명합니다.
| RunAsDate | Chrono Mock | |
|---|---|---|
| 앱 하나를 가짜 날짜로 실행 | 예 | 예 |
| 가로채는 시간 채널 | 5 | 44개 (이동 30개, 집계만 14개) |
| 시계 가속 | 아니요 | 예 |
| 독립된 시간대 | 문서화되어 있지 않음 | 예 |
| 자식 프로세스 추적 | 문서화되어 있지 않음 | 예 |
| 적용 여부를 알려 줌 | 아니요 | 예, 채널별로 |
| 소스 코드 공개 | 프리웨어, 비공개 | GPL-3.0 |
받기
아무 곳에나 압축을 풀어 실행하거나, 이 컴퓨터의 모든 계정용으로 서명된 .msi를 설치하세요. 실행에는 관리자 권한이 필요 없고, zip 버전은 레지스트리에 아무것도 기록하지 않습니다.