Chrono Mock
BahasaBahasa Indonesia

libfaketime untuk Windows

Jawaban singkat: libfaketime tidak berjalan di Windows, dan tidak bisa - ia dibangun di atas LD_PRELOAD, yang tidak dimiliki Windows. Chrono Mock adalah gagasan yang sama, dibangun dengan cara yang diizinkan Windows.

Mengapa ia tidak bisa begitu saja dipindahkan

libfaketime bekerja dengan membuat dynamic loader menempatkan pustaka kecil di depan pustaka C, sehingga panggilan program ke time() sampai lebih dulu ke penggantinya. Kait itu adalah LD_PRELOAD di Linux dan DYLD_INSERT_LIBRARIES di macOS. README-nya sendiri mencantumkan persis dua platform itu.

Windows tidak punya padanannya, dan jamnya toh tidak berada di balik satu fungsi. Aplikasi membaca waktu lewat API Win32, lewat API native di bawahnya, dan lewat apa pun yang dibungkus runtime mereka di sekeliling keduanya - sehingga versi Windows dari gagasan ini adalah pustaka yang disuntikkan ke proses target, mengalihkan sekumpulan fungsi yang diekspor, bukan satu simbol.

Flag-nya, dipetakan satu per satu

libfaketimeChrono Mock
FAKETIME="2020-12-24 20:30:00" --at 2020-12-24T20:30:00
FAKETIME="+14d" --at +14d
FAKETIME="-10m" --at -10m
FAKETIME="+0 x2" --mode x2
FAKETIME_DONT_FAKE_MONOTONIC=1 bawaan di sini - lihat di bawah
LD_PRELOAD=libfaketime.so.1 tidak ada yang perlu disetel - alat ini menyuntik

Jadi kedua sisi dari pengujian yang sama tampak seperti ini:

# Linux
FAKETIME="2020-12-24 20:30:00" LD_PRELOAD=/usr/local/lib/libfaketime.so.1 ./test

# Windows
chrono run "C:\apps\test.exe" --at 2020-12-24T20:30:00

Di mana keduanya benar-benar berbeda

Jam monotonik terbalik. libfaketime memalsukannya secara bawaan dan memberi Anda FAKETIME_DONT_FAKE_MONOTONIC untuk menghentikannya. Di sini penghitung beresolusi tinggi tetap nyata secara bawaan, karena menskalakannya mengacaukan stabilitas rendering dalam pengujian, dan --scale-qpc mengaktifkannya. Switch itulah yang membuat monotonic Python 3.13+, Stopwatch .NET, dan nanoTime Java mengikuti jam sesi.

Windows punya lebih banyak tempat untuk dicegat. Di luar jam dinding ada zona waktu, sumbu waktu berlalu, empat keluarga timer, fungsi sleep dan wait, serta pembuatan proses - total 44 kanal. Dari jumlah itu, 30 digeser, dan 14 sisanya, termasuk koneksi jaringan, dihitung.

Alat ini melaporkan cakupannya sendiri. Setiap sesi berakhir dengan putusan, kanal yang benar-benar dibaca aplikasi beserta hitungan untuk masing-masing, dan kanal yang terlewat. Itulah bagian yang tidak memiliki padanan di kedua platform.

libfaketime lebih tua dan lebih luas di wilayahnya sendiri. Ia punya bertahun-tahun pemakaian, mencakup beragam titik masuk pustaka C, dan di Linux ia adalah alat yang tepat. Tidak ada di sini yang menggantikannya di sana.

Jika Anda sebenarnya menginginkan libfaketime itu sendiri

Dua jalur yang jujur, keduanya memindahkan program yang diuji ke Linux:

  • WSL - bangun dan jalankan libfaketime di dalam subsistem Linux. Cocok bila yang diuji adalah program Linux yang kebetulan Anda kembangkan di Windows.
  • Container - gagasan yang sama, lebih dapat direproduksi.

Tidak satu pun membantu untuk aplikasi Windows, yang merupakan kasus tempat alat ini ada.

Cobalah