Chrono Mock
DilTürkçe

Komut satırı başvurusu

İki komutun tüm bayrakları, her iki çıkış kodu tablosu ve dönen çıktının nasıl okunacağı. Gerekçeleriyle birlikte anlatım sürümü CLI ve CI sayfasında.

İki komut

chrono run bir uygulamayı farklı bir tarih ve saatte başlatır. chrono calc bir tarihi hesaplar ve onu neyin ilginç kıldığını söyler. İkisi tek bir adım dilbilgisini paylaşır; bu yüzden biri için yazılmış bir kaydırma diğerinde de aynı anlama gelir.

chrono version üçüncü, çok daha küçük bir soruyu yanıtlar: bunun hangi derleme olduğu, çalıştırılabilir dosyanın iki çekirdekten hangisi olduğu ve konuştuğu protokol sürümü. stdout’a tek bir satır yazar; böylece bir betik bunu yakalayabilir.

chrono license dördüncüsünü yanıtlar: bu derlemenin hangi lisansla dağıtıldığı, garanti reddi ve içine bağlanan üçüncü taraf bileşenler. Ayrıca tam lisans metninin ve üçüncü taraf bildirimlerinin diskte nerede olduğunu söyler; çalıştırdığınız kopyanın yanında bunlar yoksa bunu da kabul eder. --components, özet yerine paketlenen her bileşeni sürümüyle birlikte listeler.

chrono presets, senaryo kataloğunu --preset'in okuduğu biçimde listeler: klasördeki her senaryoyu hesaplayıcının dil bilgisinin okuduğu sözcüklerle ve reddedeceği her dosyayı nedeniyle birlikte gösterir. --json chronomock.presets/1 yazar, --dir başka bir klasörü belirtir.

chrono run <target> [options]
chrono calc [options]
chrono version        # chrono 0.4.0 (x64, protocol 1)
chrono license        # GPL-3.0-only ve pakete dahil olanlar
chrono presets        # katalog, --preset'in okuduğu biçimde
chrono --help          # hepsinin kullanımı

chrono run - seçenekler

BayrakNe yapar
--at <moment> Başlanacak an, oturum diliminde. Mutlak (2038-01-19T03:14:07) ya da başında işaret olan göreli (+1d, -2h). Birimler: s m h d w mo q y - m dakika, mo aydır. Bu bayrak olmadan oturum saati gerçek geçerli zamandan başlar; yani tek başına --mode xN hedefi yalnızca daha hızlı çalıştırır.
--zone +HH:MM Oturum dilimi: anın yazıldığı dilim ve hedefin yerel saat çağrılarının bildirdiği dilim. Yaz saati uygulaması olmayan sabit bir kayma. Verilmezse ana makinenin kendi dilimi.
--mode flow|frozen|xN flow gerçek hızda çalışır, frozen saati yerinde tutar, xN N kat hızlı çalıştırır (x60 bir saati bir dakikaya, x1440 bir günü bir dakikaya çevirir).
--scale-duration Geçen süre eksenini de hızlandırır: tik sayaçları, kesme zamanı, uyumalar ve zamanlayıcılar. Nesne beklemeleri sayılır ve gerçek sürelerini korur. Varsayılan olarak kapalıdır, çünkü duvar saati ve kronometre farklı sorulardır. Belirli bir tarih ve saate kurulan bir zamanlayıcı veya gecikme bu seçenekle de onsuz da oturum saatini izler.
--scale-qpc Yüksek çözünürlüklü sayacı da ölçekler; Python 3.13+ monotonic, .NET Stopwatch ve Java nanoTime geçen zamanı buradan okur. Varsayılan olarak kapalıdır: render süresini bu sayaca göre ölçen bir uygulama bozuk görünebilir.
--ticks N Oturumu N kalp atışından sonra, her biri bir gerçek saniye, sonlandırır ve bildirir. Bu olmadan araç, hedef ve onun başlattığı, oturum saatinde çalışan her program çıkana kadar bağlı kalır - hemen biten bir başlatıcı oturumu başlattığı uygulamaya bırakır.
--timeout <s> Bu kadar saniye sonra vazgeçer ve 6 ile çıkar; takılmaması gereken bir pipeline için. Bu bayraktan bağımsız olarak, 15 saniye boyunca hiçbir şey söylemeyen bir çekirdek durdurulur ve o da 6 ile çıkar - iki durumda da çalıştırma yarıda kesilmiştir, bu yüzden kararı yoktur.
--args "..." Hedefe verilecek bağımsız değişkenler, tek bir dize olarak, Windows’un kullandığı aynı kurala göre bölünür - böylece boşluk içeren bir bağımsız değişken korunur. Bir Chromium hedefi için --user-data-dir ve --remote-debugging-port geçersiz kılınmak yerine reddedilir: oturumun kendi yalıtılmış profili gerekir ve sessizce gerçek tarayıcı profilinizde çalışmak, olmaması gereken tek şeydir.
--cwd <dir> Hedefi o dizinde başlatır. Verilmezse hedef bizimkini devralır; bu bayrak var olmadan önce her çalıştırma böyleydi. Boş bir değer “dizin yok” değil, kullanım hatasıdır - olmayan ile boş farklı şeylerdir ve Windows’a yalnızca olmayan verilebilir. Var olmayan bir dizin, herhangi bir şey başlatılmadan önce oturumu target.cwd_missing ile durdurur; yoksa bu, sonradan başlamayan bir hedef olarak ortaya çıkardı.
--preset <id> Anı ve hızı presets/<id>.json dosyasından alır. --at, --mode ve --scale-duration ile birlikte kullanılamaz; çünkü senaryo artık ikisinin de tek kaynağıdır.
--param id=value Bir senaryo parametresini doldurur. Tekrarlanabilir, --preset gerektirir. Yalnızca run içinde, bir deneme başlangıç tarihi varsayılan olarak hedef çalıştırılabilir dosyanın kendi oluşturulma tarihidir; böylece bir deneme senaryosu, siz yazmadan, uygulamanın kurulduğu günden saymaya başlar.
--set-after T:M T. kalp atışında hızı M yapar. Çalışırken çarpan en az 1’dir - oturum ortasında dondurma burada sunulmaz.
--jump-after T:moment T. kalp atışında saati o ana, mutlak ya da göreli, oturum diliminde atlatır.
--force Açılış kararı değişikliğin etkili olmadığını söylese bile oturumu korur - varsayılan olarak hedef bunun yerine durdurulur, çünkü hiçbir şey kanıtlamayan bir oturum, hiç oturum olmamasından kötüdür. Karar değişmez, çıkış kodu da. Bu yalnızca hedefin çalışmaya devam edip etmeyeceğini belirler.
--no-embedded Uygulamanın içindeki web sayfalarını (WebView2, Qt WebEngine) gerçek saatte bırakır ve hata ayıklama bağlantı noktası açmaz. Bu bayrak olmadan oturum, böyle bir motordan yerel bir bağlantı noktası açmasını ister ve sayfalarını onun üzerinden oturum saatine alır - bağlantı noktası açık olduğu sürece bu bilgisayardaki başka herhangi bir program onu kullanarak bu sayfalara ulaşabilir.
--elevated-embedded Yönetici olarak çalışan bir uygulama için, o da yönetici olarak çalışan bir Chrono Mock'tan. WebView2, böyle bir uygulamada oturumun sayfalarına ulaştığı ayarı yok sayar; bu yüzden oturum, süresi boyunca makinenin kayıt defterine (HKLM, uygulamanın .exe dosyasının adıyla) bir değer yazar ve sonunda siler. Uygulama çalışırken bu bilgisayardaki başka herhangi bir program bağlantı noktası üzerinden sayfalarına ulaşabilir ve uygulamanın yönetici hakları vardır. --no-embedded ile birlikte kullanılmaz.
--keep-background-timers Web motorunu - bir Chromium ya da Electron uygulamasının tarayıcısını veya bir uygulamanın içindeki motoru - gizli pencerelerdeki zamanlayıcı yavaşlatması kapalı olarak başlatır; böylece simge durumuna küçültülmüş bir pencere de oturum hızını korur. Uygulama o zaman gizliyken de tam hızla çalışır. --elevated-embedded ile yönetici olarak başlatılan bir uygulama bunu almaz.
--dry-run Oturumun ne olacağını yazdırır ve hiçbir şey başlatmaz: çözümlenen an ve dilim ile nereden geldikleri, bir senaryonun her parametreyi neyle doldurduğu, bölünmüş bağımsız değişkenler ve hedefin iki mekanizmadan hangisini kullanacağı. Hiçbir süreç başlatılmaz ve --report’un adını verdiği dosya dahil hiçbir dosya yazılmaz. Uygulanabilir bir plan için 0, var olmayan bir hedef için 2 ile çıkar; gerçek bir çalıştırma aynı durum için bu kodu verir. Bir planın kararı yoktur ve bunu söyler - yalnızca gerçek bir oturumun kararı vardır. --json ile plan veri olarak verilir; buna session.elevated_embedded ve session.elevated_embedded_value da dahildir. İkincisi, seçenek bir .exe hedefine uygulandığında kayıt defteri değerine ad verecek dosya adıdır, aksi halde null olur. Orada bir ad bulunması yazılacağının sözü değildir: oturum değeri yalnızca Chrono Mock'un kendisi yönetici olarak çalışıyorsa yazar.
--report <path> İnsan raporunu bir dosyaya yazar. Çalışıyor dışındaki bir karar, dosyayı güvenilmez-kanıt başlığıyla başlatır; çünkü kendi şüphesini saklayan kanıt, hiç kanıt olmamasından kötüdür. Kararı çalışıyor olan bir oturum da, uygulama oturumun değiştirdiği saatlerin hiçbirini okumadıysa ya da duvar saatine Chrono Mock'un ulaşamadığı bir Go programıysa bu başlığı alır. Dosya çalıştırmanın kendisini de adlandırır: sürüm, başlama zamanı, hedef, klasörü ve seçenekler.
--report-args --report ile birlikte, hedefin argümanlarını da o dosyaya kelimesi kelimesine yazar. Varsayılan olarak kapalıdır, çünkü bir argüman parola taşıyabilir - dosya o zaman yalnızca kaç tane olduklarını söyler.
--json Oturumu rapor yerine makinece okunabilir kayıtlar olarak verir - pencerenin kendisinin tükettiği akışın aynısı. Bir konsol uygulamasının kendi çıktısı standart hataya gider; yani standart çıktı kayıtlardan başka bir şey içermez. Oturum bittiğinde hâlâ çalışan bir uygulama oraya yazmaya devam eder; bu yüzden standart hatayı sonuna kadar okuyan her şey onu bekler ve çalıştırma bunu söyler.

chrono run - çıkış kodları

Çıkış kodu, uygulamanın döndürdüğü değil, oturum kararıdır. Uygulamanın kendi çıkış kodu raporda ve oturum verisinde ayrıca bildirilir - bunun neden böyle yapıldığını CLI ve CI sayfası açıklar.

KodAnlamı
0çalışıyor - zamanı okuyan her süreç oturum saatini gördü
10kısmen çalışıyor - bazı kanallar kapsandı, bazıları kapsanmadı
11çalışmıyor - değişiklik kilit kanallara ulaşmadı
4belirsiz - kapsama belirlenemedi. Dürüst bir “söyleyemem”, asla numara yapılmış bir başarı değil
12hedef enjeksiyondan hemen sonra ortadan kayboldu ve oturum saatinde çalışan hiçbir şey bırakmadı; bu, tek örnekli bir uygulamanın zaten çalışan bir kopyaya devrettiğini ya da oturumun giremediği, genellikle diğer bit genişliğindeki bir programa devir yapıldığını düşündürür. Uygulamayı başlatıp biten bir hedef bir başlatıcıdır ve oturum uygulama için devam eder
1kullanım hatası - hatalı bir bayrak, hatalı bir ifade ya da bu komutun kabul etmediği bir senaryo
2hedef başlatılamadı ya da içine enjekte edilemedi
3iç hata - motor başlatılamadı, beklenmedik bir durumla karşılaştı ya da oturumu kapatmadan önce durdu (kendi çıkış kodu ne olursa olsun). Böyle bir çalıştırmanın kararı yoktur
5işlem bu sürümde derlenmemiş - örneğin anı bir takvim gerektiren ve run’ın henüz yükleyemediği bir senaryo. Bilerek kullanım hatasından ayrı tutulmuştur: yanlış bir şey istemediniz, henüz var olmayan bir şey istediniz
6çalıştırma yarıda kesildi - --timeout doldu ya da motor 15 saniye boyunca yanıt vermeyi bıraktı ve durduruldu. Bu bir karar değildir: oturum kesintiye uğradığı için hedef hakkında ne bir yönde ne de diğerinde bir şey kanıtlar
7başka bir oturum zaten çalışıyor - aynı anda tek oturum. O bittikten sonra yeniden denemek yeterli
8oturum bir karara vardı, ancak kanıtı --report ile verilen dosyada değil - disk doluydu ya da başka bir program eski dosyayı açık tutuyordu, o dosya da olduğu gibi kalır. Karar, komutun yazdırdığı raporda yine yer alır

Raporu okumak

--json olmadan oturum düz bir raporla biter. Her satır ya oturumun gözlemlediği bir gerçektir ya da hiç yoktur - hiçbir şey makul bir varsayılanla doldurulmaz.

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 - ana süreç ve tüm alt süreçler üzerinden aile kararı, süreç sayısıyla birlikte. Çıkış kodunun taşıdığı sayı budur.
  • exited - uygulamanın kendi çıkış kodu, ve yalnızca kendi kendini kapattıysa. --ticks ile sınırlanan bir çalıştırma hedefi çalışır bırakır, bir Chromium oturumunu araç kendisi kapatır ve hiç başlamamış bir oturumun böyle bir kodu yoktur - satır o zaman uydurma bir sıfır göstermek yerine yoktur. Çökme kodu büyük bir negatif sayı olarak gelir; bu yüzden onaltılık biçimi de verilir.
  • covered - değişikliğin ulaştığı kanallar, her birinin gerçekte kaç kez çağrıldığıyla, süreç başına. Sayılar süreçler arasında asla toplanmaz: bir sürecin denetimi başka birinin sayılarını ödünç almamalıdır. Bir sayaç 1048576’da durur ve o andan sonra en az bu kadar gösterir.
  • observed - yakalanmış ama bilerek gerçek bırakılmış kanallar; nesne beklemeleri ve çok ortamlı zamanlayıcılar gibi. Kendi kovaları vardır, böylece asla değiştirilmiş olarak okunmazlar.
  • uncovered - uygulamanın istediği ve oturumun kapsamadığı kanallar. Bir kararı kısmen yapan budur.
  • not fully cleaned up - sonlandırmanın kaldıramadığı her şey. Temiz bir bitişte, yani normal durumda, yoktur.

chrono calc - seçenekler

Doğal dil yok: her bayrak bir adımdır ve bayrakların sırası adımların sırasıdır. Her adımdan sonraki sonuç yazdırılır; böylece yanlış bir adım gömülü kalmaz, görünür olur.

BayrakNe yapar
--base today|now|<moment> Nereden başlanacağı, varsayılan today. Oturum diliminde çözümlenir. 2025-02-31 gibi imkânsız bir gün reddedilir, asla sessizce sonraki aya çevrilmez.
--base-utc <moment> --base gibi, ancak başlangıç oturum diliminde bir duvar saati okuması değil, sonunda isteğe bağlı Z olan UTC'de bir andır.
--shift ±N<unit> Tekrarlanabilir. İşaret zorunludur. Birimler: s m h d w mo q y bd ya da tam adları. m dakika, mo aydır. Aylar, çeyrekler ve yıllar takvim tarihine sınırlandırılarak uygulanır; yani 31 Ocak’tan bir ay sonrası, sabit bir tick sayısı değil, Şubat sonudur. bd (iş günü) --calendar gerektirir.
--set-time HH:MM:SSGeçerli sonucun günün saatini ayarlar.
--snap <target> Bir dönem sınırına atlar: som eom soq eoq soy eoy (ayın, çeyreğin, yılın başı ya da sonu). Bir başlangıç ilk gün 00:00:00, bir son ise son gün 23:59:59’dur.
--nearest nbd|pbd İleri ya da geri en yakın iş günü; geçerli gün zaten iş günüyse o da dahil. --calendar gerektirir.
--to-zone +HH:MM Bir adım: aynı anı başka bir sabit kaymada yeniden ifade eder. An korunur, yani epoch değeri değişmez, yalnızca sivil alanlar değişir. --zone ile karıştırılmamalıdır.
--zone +HH:MM Oturum dilimi; today ve now’u çözümlemek ve sonucu göstermek için kullanılır. Verilmezse ana makinenin dilimi.
--calendar us-banking|us-federal|pl Bir tatil takvimi yükler. Meta verilere iş günü ve tatil ekler ve bd ile --nearest’i etkinleştirir. İki Amerikan takvimi, hafta sonuna denk gelen bir tatili nasıl gözlemlediklerinde ayrılır; bu da bir testin bulması gereken tam olarak bir gün kayma türü hatadır. Her takvim belirli bir yıl aralığı için yanıt verir: pl 2002'den, us-federal 1960'tan ve us-banking 2008'den başlar. Bu aralıktan önceki bir güne ulaşan iş günü adımı 1 koduyla reddedilir, aralıktan önceki bir tarih de değerlendirilmemiş olarak gösterilir. Bir takvimin tatilleri en son bir yıldan uzun süre önce yasayla karşılaştırılmışsa, değerlendirdiği daha sonraki gün calendar_outdated ile işaretlenir, çünkü daha yeni bir tatil eksik olabilir.
--preset <id> --param id=value presets/<id>.json dosyasından, parametreleri doldurulmuş adlandırılmış bir an. Adım bayrakları ve --analyze ile birlikte kullanılamaz; --calendar, --zone ve --format ile birleşir.
--analyze <date> Yapıştırılmış bir tarihi geri okur ve ne olduğunu söyler. Belirsiz bir 04/08 tahmin edilmek yerine her iki okumasıyla, Amerikan ve Polonya, gösterilir - bu belirsizlik yanlış hata raporlarının gerçek bir kaynağıdır.
--format <mask> Sonucu ayrıca kendi maskenizle yazdırır; böylece test edilen uygulamanın biçimiyle eşleşir: yyyy-MM-dd HH:mm:ss. Belirteçler .NET ve Java anlamında büyük/küçük harfe duyarlıdır - M ay, m dakikadır.
--json Yukarıdakilerden herhangi biri için makine çıktısı (chronomock.calc/1); böylece bir pipeline bir tarihi hesaplayıp doğrudan chrono run’a geri besleyebilir.
# Çeyreğin son iş günü, Amerikan bankacılık takvimi
chrono calc --base today --snap eoq --nearest pbd --calendar us-banking

chrono calc - çıkış kodları

Ayrı, daha küçük bir tablo: hesap makinesinin bildireceği bir kapsama kararı yoktur.

KodAnlamı
0hesaplandı
1kullanım hatası - hatalı bir bayrak, imkânsız bir tarih, aralık taşması ya da içinde hiç iş günü bulunmayan bir takvim dosyası
5adım ya da birim bu sürümde derlenmemiş ya da adım, vermediğiniz bir takvim gerektiriyor. Bir betik “henüz değil” ile “yanlış” arasındaki farkı ayırt edebilsin diye bilerek kullanım hatasından ayrı tutulmuştur

Sırada