Tham chiếu dòng lệnh
Mọi tùy chọn của cả hai lệnh, cả hai bảng mã thoát, và cách đọc những gì trả về. Bản trình bày theo mạch kể, kèm lý do, nằm ở trang CLI và CI.
Hai lệnh
chrono run khởi chạy một ứng dụng ở ngày giờ khác.
chrono calc tính một ngày và cho bạn biết điều gì khiến nó đáng chú ý.
Cả hai dùng chung một ngữ pháp bước, nên một độ dịch viết cho lệnh này có nghĩa y như ở lệnh kia.
chrono version trả lời câu hỏi thứ ba, nhỏ hơn nhiều: đây là bản dựng nào, tệp thực thi
là lõi nào trong hai lõi, và nó nói phiên bản giao thức nào. Một dòng trên stdout, để script có thể
bắt lấy.
chrono license trả lời câu hỏi thứ tư: giấy phép mà bản dựng này được phân phối
theo, tuyên bố miễn trừ bảo hành, và các thành phần của bên thứ ba được liên kết vào. Nó
cũng cho biết văn bản giấy phép đầy đủ và thông báo của bên thứ ba nằm ở đâu trên đĩa, hoặc
thừa nhận rằng bản bạn đang chạy không có chúng bên cạnh. --components liệt kê
từng thành phần đi kèm cùng phiên bản của nó thay vì bản tóm tắt.
chrono presets liệt kê danh mục kịch bản đúng như --preset đọc nó:
mọi kịch bản trong thư mục, viết bằng các từ mà ngữ pháp của máy tính ngày đọc, và mọi tệp
mà nó sẽ từ chối, kèm lý do. --json ghi chronomock.presets/1 và
--dir chỉ định một thư mục khác.
chrono run <target> [options] chrono calc [options] chrono version # chrono 0.4.0 (x64, protocol 1) chrono license # GPL-3.0-only, và những gì được đi kèm chrono presets # danh mục, đúng như --preset đọc chrono --help # cách dùng của tất cả
chrono run - các tùy chọn
| Tùy chọn | Tác dụng |
|---|---|
--at <moment> |
Thời điểm bắt đầu, trong múi giờ của phiên. Tuyệt đối
(2038-01-19T03:14:07) hoặc tương đối với dấu đứng đầu
(+1d, -2h). Đơn vị: s m h d w mo q y -
m là phút còn mo là tháng. Không có tùy chọn
này, đồng hồ phiên bắt đầu từ giờ thật hiện tại, nên một mình --mode xN chỉ
đơn giản là chạy mục tiêu nhanh hơn. |
--zone +HH:MM |
Múi giờ của phiên: múi giờ mà thời điểm được viết theo, và là múi giờ mà các lệnh gọi giờ địa phương của mục tiêu báo cáo. Một độ lệch cố định, không có giờ mùa hè. Nếu không có, dùng múi giờ của chính máy chủ. |
--mode flow|frozen|xN |
flow chạy ở tốc độ thật, frozen giữ nguyên đồng hồ,
xN chạy nhanh gấp N lần (x60 biến một giờ thành một phút,
x1440 biến một ngày thành một phút). |
--scale-duration |
Tăng tốc cả trục thời gian trôi qua: bộ đếm tick, thời gian ngắt, các lệnh ngủ và bộ hẹn giờ. Các lệnh chờ đối tượng được đếm và giữ nguyên độ dài thật. Mặc định tắt, vì đồng hồ treo tường và đồng hồ bấm giờ là hai câu hỏi khác nhau. Bộ hẹn giờ hoặc khoảng trễ đặt vào một ngày giờ cụ thể theo đồng hồ phiên dù có hay không có tùy chọn này. |
--scale-qpc |
Cũng nhân tỷ lệ bộ đếm độ phân giải cao, nơi monotonic của Python 3.13+,
Stopwatch của .NET và nanoTime của Java đọc thời gian đã trôi.
Mặc định tắt: một ứng dụng đo thời gian kết xuất bằng bộ đếm đó có thể trông bị méo. |
--ticks N |
Kết thúc phiên sau N nhịp, mỗi nhịp một giây thật, và báo cáo. Nếu không có, công cụ vẫn gắn với mục tiêu cho đến khi mục tiêu và mọi chương trình do nó khởi chạy mà chạy theo đồng hồ phiên đã thoát - một trình khởi chạy kết thúc ngay sẽ để phiên lại cho ứng dụng mà nó đã khởi chạy. |
--timeout <s> |
Bỏ cuộc sau chừng ấy giây và thoát với mã 6, dành cho pipeline không được treo. Độc lập với tùy chọn này, một lõi im lặng suốt 15 giây sẽ bị dừng và cũng thoát với mã 6 - cả hai trường hợp lần chạy bị cắt ngang, nên không có kết luận. |
--args "..." |
Đối số cho mục tiêu, dưới dạng một chuỗi, được tách theo cùng quy tắc mà Windows dùng - nhờ
vậy một đối số chứa dấu cách vẫn nguyên vẹn. Với mục tiêu Chromium,
--user-data-dir và --remote-debugging-port bị từ chối chứ không bị
ghi đè: phiên cần hồ sơ cô lập riêng của nó, và lặng lẽ chạy trên hồ sơ trình duyệt thật của
bạn là điều duy nhất không được phép xảy ra. |
--cwd <dir> |
Khởi chạy mục tiêu trong thư mục đó. Nếu không có, mục tiêu kế thừa thư mục của chúng ta,
như mọi lần chạy đã làm trước khi có tùy chọn này. Giá trị rỗng là lỗi sử dụng chứ không phải
“không có thư mục” - vắng mặt và rỗng là hai thứ khác nhau, và chỉ vắng mặt mới là thứ có thể
đưa cho Windows. Một thư mục không tồn tại sẽ dừng phiên với
target.cwd_missing trước khi bất cứ thứ gì được khởi chạy, thay vì về sau lộ ra
thành một mục tiêu không chịu khởi động. |
--preset <id> |
Lấy thời điểm và tốc độ từ presets/<id>.json. Loại trừ lẫn nhau với
--at, --mode và --scale-duration, vì khi đó kịch bản
là nguồn duy nhất của cả hai. |
--param id=value |
Điền một tham số của kịch bản. Lặp lại được, yêu cầu --preset. Chỉ ở
run, ngày bắt đầu dùng thử mặc định là ngày tạo của chính tệp thực thi mục
tiêu, nên kịch bản dùng thử đếm từ ngày ứng dụng được cài mà bạn không cần gõ. |
--set-after T:M |
Ở nhịp T, đổi tốc độ thành M. Khi đang chạy, hệ số nhân tối thiểu là 1 - đóng băng giữa phiên không được cung cấp ở đây. |
--jump-after T:moment |
Ở nhịp T, nhảy đồng hồ đến thời điểm đó, tuyệt đối hoặc tương đối, trong múi giờ của phiên. |
--force |
Giữ phiên lại ngay cả khi kết luận mở đầu cho biết việc thay thế không có hiệu lực - theo mặc định mục tiêu bị dừng, vì một phiên không chứng minh được gì còn tệ hơn không có phiên. Kết luận không đổi, mã thoát cũng vậy. Nó chỉ quyết định mục tiêu có tiếp tục chạy hay không. |
--no-embedded |
Để các trang web bên trong ứng dụng (WebView2, Qt WebEngine) chạy trên đồng hồ thật và không mở cổng gỡ lỗi. Nếu không dùng, phiên sẽ nhờ công cụ đó mở một cổng cục bộ và đưa các trang của nó sang đồng hồ của phiên qua cổng ấy - khi cổng đang mở, mọi chương trình khác trên máy tính này đều có thể dùng nó để truy cập các trang đó. |
--elevated-embedded |
Dành cho ứng dụng chạy với quyền quản trị viên, từ một Chrono Mock cũng chạy với
quyền quản trị viên. Với ứng dụng như vậy, WebView2 bỏ qua thiết lập mà phiên dùng để
tiếp cận các trang của nó, nên phiên ghi một giá trị vào registry của máy (HKLM, đặt
tên theo tệp .exe của ứng dụng) trong suốt thời gian chạy và xóa nó khi kết thúc. Khi
ứng dụng đang chạy, mọi chương trình khác trên máy tính này đều có thể tiếp cận các
trang của nó qua cổng, và ứng dụng có quyền quản trị viên. Không dùng cùng
--no-embedded. |
--keep-background-timers |
Khởi động công cụ web - trình duyệt của ứng dụng Chromium hoặc Electron, hay công cụ
bên trong một ứng dụng - với việc làm chậm bộ hẹn giờ trong cửa sổ bị ẩn được tắt, để
cửa sổ thu nhỏ vẫn giữ tốc độ của phiên. Khi đó ứng dụng cũng chạy hết tốc độ ngay cả
lúc bị ẩn. Ứng dụng được khởi chạy với quyền quản trị viên qua
--elevated-embedded không nhận được tùy chọn này. |
--dry-run |
In ra phiên sẽ như thế nào và không khởi động gì: thời điểm và múi giờ đã được giải
quyết cùng nguồn gốc của chúng, kịch bản đã điền gì vào từng tham số, các đối số sau
khi tách, và mục tiêu sẽ dùng cơ chế nào trong hai cơ chế. Không tiến trình nào được
khởi động và không tệp nào được ghi, kể cả tệp mà --report nêu tên. Thoát
với mã 0 cho một kế hoạch khả thi và 2 cho mục tiêu không tồn tại, đúng là mã mà một
lần chạy thật trả về cho cùng sự thật đó. Một kế hoạch không có kết luận và nói rõ như
vậy - chỉ phiên thật mới có. Với --json, kế hoạch là dữ liệu, gồm
session.elevated_embedded và
session.elevated_embedded_value, tức tên tệp dùng để đặt tên cho giá trị
registry khi tùy chọn áp dụng cho đích .exe, còn lại là null. Có tên ở đó
không phải lời hứa sẽ ghi: phiên chỉ ghi giá trị khi chính Chrono Mock chạy với quyền
quản trị viên. |
--report <path> |
Ghi báo cáo cho người ra tệp. Một kết luận khác hoạt động mở đầu tệp bằng biểu ngữ bằng chứng không đáng tin, vì bằng chứng che giấu sự nghi ngờ của chính nó còn tệ hơn không có. Một phiên có kết luận hoạt động cũng nhận biểu ngữ này khi ứng dụng không đọc đồng hồ nào mà phiên thay thế, hoặc khi đó là chương trình Go, có đồng hồ thực mà Chrono Mock không với tới. Tệp cũng ghi chính lần chạy: phiên bản, thời điểm bắt đầu, mục tiêu, thư mục của nó và các cờ. |
--report-args |
Khi đi cùng --report, ghi cả các đối số của mục tiêu vào tệp đó, nguyên văn. Mặc định tắt, vì một đối số có thể chứa mật khẩu - khi đó tệp chỉ cho biết có bao nhiêu đối số. |
--json |
Xuất phiên thành các bản ghi máy đọc được thay vì báo cáo - cùng luồng mà chính cửa sổ sử dụng. Đầu ra riêng của ứng dụng console đi vào standard error, nên standard output chỉ chứa các bản ghi và không gì khác. Một ứng dụng vẫn đang chạy khi phiên kết thúc sẽ tiếp tục ghi vào đó, nên bất cứ thứ gì đọc standard error đến hết sẽ phải chờ nó, và lần chạy sẽ nói điều đó. |
chrono run - mã thoát
Mã thoát là kết luận của phiên, không phải thứ ứng dụng trả về. Mã thoát riêng của ứng dụng được báo cáo riêng, trong báo cáo và trong dữ liệu phiên - vì sao lại làm vậy được giải thích ở trang CLI và CI.
| Mã | Ý nghĩa |
|---|---|
| 0 | hoạt động - mọi tiến trình đọc giờ đều thấy đồng hồ của phiên |
| 10 | hoạt động một phần - một số kênh được bao phủ, một số thì không |
| 11 | không hoạt động - việc thay thế không đến được các kênh then chốt |
| 4 | chưa xác định - không thể xác lập độ bao phủ. Một câu “không thể nói” trung thực, không bao giờ là một kết quả qua giả vờ |
| 12 | mục tiêu biến mất ngay sau khi chèn mã và không để lại gì chạy theo đồng hồ phiên, gợi ý một ứng dụng chỉ cho phép một thể hiện đang bàn giao cho bản đã chạy sẵn, hoặc bàn giao cho một chương trình mà phiên không vào được, thường là chương trình khác số bit. Một mục tiêu khởi chạy ứng dụng rồi kết thúc là trình khởi chạy, và phiên tiếp tục cho ứng dụng đó |
| 1 | lỗi sử dụng - sai tùy chọn, sai biểu thức, hoặc một kịch bản mà lệnh này không chấp nhận |
| 2 | không thể khởi chạy hoặc chèn mã vào mục tiêu |
| 3 | lỗi nội bộ - lõi không khởi động được, gặp trạng thái bất ngờ, hoặc dừng trước khi đóng phiên (bất kể mã thoát riêng của nó). Lần chạy như vậy không có kết luận |
| 5 | thao tác chưa được dựng trong bản phát hành này - ví dụ một kịch bản có thời điểm cần lịch, mà run chưa tải được. Cố ý tách khỏi lỗi sử dụng: bạn yêu cầu thứ chưa tồn tại, chứ không phải thứ sai |
| 6 | lần chạy bị cắt ngang - --timeout đã hết, hoặc lõi ngừng phản hồi trong 15 giây và bị dừng. Đây không phải kết luận: phiên bị gián đoạn, nên không chứng minh được gì về mục tiêu theo hướng nào |
| 7 | một phiên khác đang chạy - mỗi lần chỉ một phiên. Chỉ cần thử lại khi phiên đó kết thúc |
| 8 | phiên đã có kết luận, nhưng bằng chứng không nằm trong tệp mà --report chỉ định - ổ đĩa đã đầy, hoặc một chương trình khác đang giữ tệp cũ mở, và tệp đó giữ nguyên. Kết luận vẫn có trong báo cáo mà lệnh in ra |
Đọc báo cáo
Không có --json, phiên kết thúc bằng một báo cáo thuần túy. Mỗi dòng hoặc là dữ kiện
mà phiên đã quan sát, hoặc vắng mặt - không có gì được điền bằng một giá trị mặc định nghe hợp lý.
Chrono Mock - session report
target: .\build\test.exe
verdict: WORKS - time substitution took effect (processes: 1)
every process that read time saw the session clock
session: fake clock reached 2038-01-19T03:14:08
real elapsed 1.3s, fake elapsed 1.3s
exited: the target closed itself with code 3
covered channels (substituted, with call counts, 10 calls in all):
- pid 21240: GetSystemTimeAsFileTime (5 calls)
- pid 21240: GetLocalTime (5 calls)
observed channels (hooked but left real):
- pid 21240: NtCreateUserProcess (0 calls)
warnings:
- the target opened a network connection ...
- verdict - kết luận của cả nhóm tiến trình, trên tiến trình cha và mọi tiến trình con, kèm số tiến trình. Đây là con số mà mã thoát mang theo.
- exited - mã thoát riêng của ứng dụng, và chỉ khi nó tự đóng. Một lần
chạy bị giới hạn bởi
--ticksđể mục tiêu tiếp tục chạy, phiên Chromium là phiên mà công cụ tự đóng, và một phiên chưa từng bắt đầu không có mã như vậy - khi đó dòng này vắng mặt thay vì hiện một số không bịa ra. Mã sự cố đến dưới dạng một số âm lớn, nên nó cũng được kèm dạng thập lục phân. - covered - các kênh mà việc thay thế đã đến được, cùng số lần mỗi kênh thực sự được gọi, theo từng tiến trình. Số đếm không bao giờ được cộng gộp giữa các tiến trình: kiểm toán của tiến trình này không được mượn số của tiến trình khác. Một bộ đếm dừng ở 1048576 và khi đó hiển thị ít nhất con số đó.
- observed - các kênh đã được chặn nhưng cố ý để thật, như chờ đối tượng và bộ hẹn giờ đa phương tiện. Chúng có nhóm riêng, nên không bao giờ bị hiểu là đã thay thế.
- uncovered - các kênh mà ứng dụng đã yêu cầu mà phiên không bao phủ. Đây là thứ biến một kết luận thành một phần.
- not fully cleaned up - bất cứ thứ gì bước dọn dẹp không gỡ được. Vắng mặt khi kết thúc sạch, tức là trường hợp bình thường.
chrono calc - các tùy chọn
Không dùng ngôn ngữ tự nhiên: mỗi tùy chọn là một bước, và thứ tự các tùy chọn là thứ tự các bước. Kết quả sau mỗi bước được in ra, nên một bước sai sẽ lộ ra thay vì bị chôn vùi.
| Tùy chọn | Tác dụng |
|---|---|
--base today|now|<moment> |
Bắt đầu từ đâu, mặc định today. Được giải quyết trong múi giờ của phiên. Một
ngày bất khả như 2025-02-31 bị từ chối, không bao giờ lặng lẽ chuẩn hóa sang
tháng sau. |
--base-utc <moment> |
Giống --base, nhưng điểm bắt đầu là một thời điểm theo UTC, có thể kèm
Z ở cuối, thay vì số đọc đồng hồ treo tường trong múi giờ phiên. |
--shift ±N<unit> |
Lặp lại được. Bắt buộc có dấu. Đơn vị: s m h d w mo q y bd, hoặc tên đầy đủ
của chúng. m là phút, mo là tháng. Tháng, quý và
năm được gập vào ngày lịch có kẹp giới hạn, nên một tháng sau ngày 31 tháng 1 là cuối tháng
2, chứ không phải một số tick cố định. bd (ngày làm việc) cần
--calendar. |
--set-time HH:MM:SS | Đặt giờ trong ngày trên kết quả hiện tại. |
--snap <target> |
Nhảy đến một ranh giới kỳ: som eom soq eoq soy eoy (đầu hoặc cuối tháng, quý,
năm). Đầu kỳ là ngày đầu lúc 00:00:00, cuối kỳ là ngày cuối lúc 23:59:59. |
--nearest nbd|pbd |
Ngày làm việc gần nhất về phía trước hoặc phía sau, gồm cả ngày hiện tại nếu nó đã là ngày
làm việc. Cần --calendar. |
--to-zone +HH:MM |
Một bước: diễn đạt lại cùng một thời điểm trong một độ lệch cố định khác. Thời
điểm được giữ nguyên, nên giá trị epoch không đổi và chỉ các trường dân sự đổi. Đừng nhầm với
--zone. |
--zone +HH:MM |
Múi giờ của phiên, dùng để giải quyết today và now và để hiển thị
kết quả. Nếu không có, dùng múi giờ của máy chủ. |
--calendar us-banking|us-federal|pl |
Tải một lịch ngày lễ. Nó thêm ngày làm việc và ngày lễ vào siêu dữ liệu, và bật
bd cùng --nearest. Hai lịch của Mỹ khác nhau ở cách xử lý
ngày lễ rơi vào cuối tuần, đúng loại lệch một ngày mà một bài kiểm thử cần tìm ra. Mỗi
lịch chỉ trả lời cho một khoảng năm: pl từ 2002, us-federal
từ 1960 và us-banking từ 2008. Một bước theo ngày làm việc chạm tới ngày
trước khoảng đó sẽ bị từ chối với mã 1, còn ngày trước khoảng đó được hiển thị là chưa
đánh giá. Khi ngày lễ của một lịch được đối chiếu với luật lần cuối cách đây hơn một
năm, một ngày muộn hơn mà nó đã đánh giá sẽ được đánh dấu
calendar_outdated, vì có thể thiếu một ngày lễ mới hơn. |
--preset <id> --param id=value |
Một thời điểm có tên từ presets/<id>.json, với các tham số đã điền.
Loại trừ lẫn nhau với các tùy chọn bước và với --analyze, và kết hợp được với
--calendar, --zone và --format. |
--analyze <date> |
Đọc ngược một ngày được dán vào và cho biết nó là gì. Một 04/08 mơ hồ được
hiển thị theo cả hai cách đọc, kiểu Mỹ và kiểu Ba Lan, thay vì đoán - sự mơ
hồ đó là nguồn thật của các báo cáo lỗi sai. |
--format <mask> |
In kết quả cả theo mặt nạ của bạn, để khớp định dạng của ứng dụng được kiểm thử:
yyyy-MM-dd HH:mm:ss. Các token phân biệt hoa thường theo nghĩa của .NET và Java -
M là tháng, m là phút. |
--json |
Đầu ra cho máy (chronomock.calc/1) cho mọi mục ở trên, để pipeline có thể tính
một ngày và đưa thẳng ngược lại vào chrono run. |
# Ngày làm việc cuối cùng của quý, lịch ngân hàng Mỹ chrono calc --base today --snap eoq --nearest pbd --calendar us-banking
chrono calc - mã thoát
Một bảng riêng, nhỏ hơn: máy tính ngày không có kết luận về độ bao phủ để báo cáo.
| Mã | Ý nghĩa |
|---|---|
| 0 | đã tính xong |
| 1 | lỗi sử dụng - sai tùy chọn, ngày bất khả, tràn phạm vi, hoặc tệp lịch không có ngày làm việc nào |
| 5 | bước hoặc đơn vị chưa được dựng trong bản phát hành này, hoặc bước cần một lịch mà bạn không đưa vào. Cố ý tách khỏi lỗi sử dụng, để script phân biệt được “chưa” với “sai” |