Pengujian tanggal dalam pipeline
Jendela untuk menjelajah. Ini adalah separuh lainnya: build baris perintah sekitar 2,4 MB tanpa runtime yang perlu dipasang, yang kode keluarnya adalah putusan cakupan, bukan kode keluar target.
Kode keluar adalah putusan
Inilah keputusan desain yang membuat alat ini dapat diskrip. Ketika sesi berakhir, kode keluar menjawab “apakah penggantian waktu berlaku”, bukan “apa yang dikembalikan aplikasi”. Sebuah pipeline karenanya dapat gagal pada penggantian yang diam-diam tidak terjadi - itulah kegagalan yang layak membuat gagal, karena semua yang datang sesudahnya adalah pengujian yang tidak membuktikan apa pun.
Kode keluar target sendiri tetap dilaporkan, dalam data sesi.
| Kode | Arti |
|---|---|
| 0 | berhasil - setiap proses yang membaca waktu melihat jam sesi |
| 10 | berhasil sebagian - sebagian kanal tercakup, sebagian tidak |
| 11 | tidak berhasil - penggantian tidak sampai ke kanal-kanal kunci |
| 4 | tidak dapat ditentukan - cakupan tidak dapat dipastikan |
| 1 | kesalahan penggunaan - flag yang salah atau ekspresi yang salah |
| 2 | target tidak dapat diluncurkan atau disuntik |
| 12 | target menghilang, yang menunjukkan aplikasi satu-instans |
| 3 | kesalahan internal - engine tidak dapat dimulai, menemui keadaan tak terduga, atau berhenti sebelum menutup sesi (apa pun kode keluarnya sendiri). Eksekusi seperti itu tidak membawa putusan |
| 5 | operasi tidak disertakan dalam rilis ini |
| 6 | eksekusi terpotong - --timeout habis, atau engine berhenti merespons selama 15 detik dan dihentikan. Ini bukan putusan: sesi terputus, sehingga tidak membuktikan apa pun tentang target ke arah mana pun |
| 7 | sesi lain sudah berjalan - hanya satu sesi dalam satu waktu. Cukup coba lagi setelah sesi itu selesai |
| 8 | sesi sudah mencapai putusan, tetapi buktinya tidak ada di file yang disebut --report - disk penuh, atau program lain membuka file lama itu, yang kemudian tetap seperti semula. Putusan tetap ada di laporan yang dicetak perintah |
Setiap flag dari kedua perintah, dan tabel yang sama untuk kalkulator, ada di referensi baris perintah.
Eksekusi terbatas
Sebuah pipeline tidak dapat menunggu manusia menutup aplikasi desktop.
--ticks N mengakhiri sesi setelah N detak - masing-masing satu detik nyata - dan
melaporkan apa yang ditemukan sampai saat itu. Cakupan toh ditentukan pada saat-saat awal proses,
jadi batas yang singkat biasanya sudah cukup.
# Sepuluh detik, lalu berhenti dan laporkan chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt
Keluaran mesin dan bukti
--jsonmengeluarkan sesi sebagai rekaman yang dapat dibaca mesin, bukan laporan untuk manusia - fakta yang sama, termasuk cakupan per kanal.--report <path>menulis laporan untuk manusia ke file, yang cocok sebagai artefak build. Sesi yang putusannya selain berhasil membuka file itu dengan banner bukti tidak andal, bukan mengubur peringatan di bagian bawah.- Kalkulator juga berbicara
--json, sehingga pipeline dapat menghitung tanggal yang dibutuhkannya lalu memasukkannya kembali.
# Hitung tanggalnya, lalu jalankan pada tanggal itu chrono calc --base today --snap eom --json chrono run ".\build\test.exe" --preset month-end --ticks 10 --json
Sebuah langkah, kira-kira
- name: Month-end behaviour
shell: pwsh
run: |
.\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
# kode keluar bukan nol di sini berarti penggantian waktu tidak berlaku, sehingga
# pengujian di bawahnya tidak akan membuktikan apa pun
- name: Keep the evidence
uses: actions/upload-artifact@v7
with:
name: chrono-evidence
path: evidence.txt
Dua catatan jujur tentang runner
- Membutuhkan runner Windows. Tidak ada build Linux atau macOS, dan tidak akan ada - di Linux, libfaketime sudah menangani hal ini.
- Antivirus pada runner yang di-host dapat memblokir injeksi. Menggeser waktu berarti menyuntikkan pustaka ke proses target, yang merupakan teknik Windows terdokumentasi yang juga dipakai malware. Runner yang memblokirnya menghasilkan kode keluar yang menyatakan hal itu, bukan kelulusan palsu - tetapi ini hal yang perlu diketahui sebelum Anda bergantung padanya.
Karena alasan yang sama, rangkaian pengujian end-to-end proyek ini berjalan di mesin sungguhan, bukan di runner yang di-host. Integrasi berkelanjutannya membangun dan menguji unit semuanya, sedangkan penggantian waktunya sendiri diuji secara manual pada aplikasi nyata, pada build 32-bit maupun 64-bit, sebelum setiap rilis.