Chrono Mock
DilTürkçe

Windows için libfaketime

Kısa cevap: libfaketime Windows’ta çalışmaz ve çalışamaz - Windows’un sahip olmadığı LD_PRELOAD üzerine kuruludur. Chrono Mock, aynı fikrin Windows’un izin verdiği şekilde kurulmuş hâlidir.

Neden basitçe taşınamaz

libfaketime, dinamik yükleyicinin C kitaplığının önüne küçük bir kitaplık yerleştirmesiyle çalışır; böylece bir programın time() çağrıları önce yedeğe ulaşır. Bu kanca Linux’ta LD_PRELOAD, macOS’ta DYLD_INSERT_LIBRARIES’dir. Kendi README’si tam olarak bu iki platformu listeler.

Windows’un bir eşdeğeri yoktur ve saati zaten tek bir işlevin arkasında yaşamaz. Uygulamalar zamanı Win32 API’si, onun altındaki yerel API ve çalışma zamanlarının ikisinin etrafına sardığı her şey aracılığıyla okur - dolayısıyla bu fikrin Windows sürümü, tek bir sembol yerine bir dizi dışa aktarılmış işlevi yönlendiren, hedef sürece enjekte edilmiş bir kitaplıktır.

Bayraklar, karşılıklarıyla

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 burada varsayılan - aşağıya bakın
LD_PRELOAD=libfaketime.so.1 ayarlanacak bir şey yok - araç enjekte eder

Yani aynı testin iki tarafı şöyle görünür:

# 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

İkisinin gerçekten ayrıldığı yerler

Monoton saatler tersine çevrilmiştir. libfaketime bunları varsayılan olarak sahtelenir ve durdurmak için FAKETIME_DONT_FAKE_MONOTONIC verir. Burada yüksek çözünürlüklü sayaç varsayılan olarak gerçek kalır; çünkü onu ölçeklemek testlerde render’ı kararsızlaştırdı ve --scale-qpc bunu etkinleştirir. Python 3.13+ monotonic, .NET Stopwatch ve Java nanoTime’ın oturum saatini izlemesini sağlayan anahtar budur.

Windows’ta yakalanacak daha çok yer var. Duvar saatinin ötesinde saat dilimi, geçen zaman ekseni, dört zamanlayıcı ailesi, uyku ve bekleme işlevleri ve süreç oluşturma var - toplamda 44 kanal. Bunların 30 tanesi kaydırılır, ağ bağlantıları da dahil kalan 14 tanesi sayılır.

Bu araç kendi kapsamasını bildirir. Her oturum bir kararla, uygulamanın gerçekten okuduğu kanalların her biri için bir sayıyla ve kaçırılan kanallarla biter. Bu, iki platformda da eşdeğeri olmayan kısımdır.

libfaketime daha eskidir ve kendi alanında daha geniştir. Arkasında yılların kullanımı vardır, C kitaplığının geniş bir giriş noktası yelpazesini kapsar ve Linux’ta doğru araçtır. Buradaki hiçbir şey onu orada değiştirmez.

Gerçekten libfaketime’ın kendisini istiyorsanız

İkisi de test edilen programı Linux’a taşıyan iki dürüst yol:

  • WSL - libfaketime’ı Linux alt sistemi içinde derleyip çalıştırın. Test edilen şey, Windows’ta geliştirdiğiniz bir Linux programıysa iyidir.
  • Bir konteyner - aynı fikir, daha tekrarlanabilir.

İkisi de bir Windows uygulamasına yardımcı olmaz; bu aracın var olma nedeni tam da budur.

Deneyin