libfaketime สำหรับ Windows
คำตอบสั้น ๆ: libfaketime ไม่ทำงานบน Windows และทำไม่ได้ - มันสร้างบน LD_PRELOAD ซึ่ง Windows ไม่มี Chrono Mock คือแนวคิดเดียวกัน ที่สร้างขึ้นตามวิธีที่ Windows อนุญาต
ทำไมจึงพอร์ตตรง ๆ ไม่ได้
libfaketime ทำงานโดยให้ตัวโหลดไดนามิกวางไลบรารีเล็ก ๆ ไว้หน้าไลบรารี C เพื่อให้การเรียก time() ของโปรแกรมไปถึงตัวแทนที่ก่อน ฮุกนั้นคือ LD_PRELOAD บน Linux และ DYLD_INSERT_LIBRARIES บน macOS README ของมันเองระบุเพียงสองแพลตฟอร์มนี้
Windows ไม่มีของที่เทียบเท่า และนาฬิกาของมันก็ไม่ได้อยู่หลังฟังก์ชันเดียวอยู่แล้ว แอปอ่านเวลาผ่าน Win32 API ผ่าน API เนทีฟที่อยู่ข้างใต้ และผ่านสิ่งที่รันไทม์ห่อหุ้มทั้งสองอย่างนั้นไว้ - ดังนั้นแนวคิดนี้ในฉบับ Windows จึงเป็นไลบรารีที่ฉีดเข้าไปในโพรเซสเป้าหมาย เปลี่ยนเส้นทางชุดของฟังก์ชันที่ส่งออก ไม่ใช่ซิมโบลเดียว
ตัวเลือกที่จับคู่กัน
| libfaketime | Chrono 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 |
เป็นค่าเริ่มต้นที่นี่ - ดูด้านล่าง |
LD_PRELOAD=libfaketime.so.1 |
ไม่ต้องตั้งค่าอะไร - เครื่องมือฉีดเอง |
ดังนั้นสองฝั่งของการทดสอบเดียวกันหน้าตาเป็นแบบนี้:
# 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
จุดที่ทั้งสองต่างกันจริง ๆ
นาฬิกาแบบโมโนโทนิกกลับด้านกัน libfaketime ปลอมมันเป็นค่าเริ่มต้นและให้ FAKETIME_DONT_FAKE_MONOTONIC เพื่อหยุด ส่วนที่นี่ตัวนับความละเอียดสูงคงเป็นของจริงเป็นค่าเริ่มต้น เพราะการปรับสเกลมันทำให้การเรนเดอร์ไม่เสถียรในการทดสอบ และ --scale-qpc เป็นการเลือกเปิด สวิตช์นั้นคือสิ่งที่ทำให้ monotonic ของ Python 3.13+ Stopwatch ของ .NET และ nanoTime ของ Java ตามนาฬิกาของเซสชัน
Windows มีจุดให้ดักมากกว่า นอกจากนาฬิกาติดผนังแล้วยังมีเขตเวลา แกนเวลาที่ผ่านไป ตัวจับเวลาสี่ตระกูล ฟังก์ชัน sleep และ wait และการสร้างโพรเซส - รวมเป็น 44 ช่องทาง ในจำนวนนี้ 30 ช่องถูกเลื่อน ส่วนที่เหลือ 14 ช่อง รวมถึงการเชื่อมต่อเครือข่าย ถูกนับอย่างเดียว
เครื่องมือนี้รายงานความครอบคลุมของตัวเอง ทุกเซสชันจบด้วยผลสรุป ช่องทางที่แอปอ่านจริงพร้อมจำนวนของแต่ละช่อง และช่องทางที่ตกหล่น นั่นเป็นส่วนที่ไม่มีของเทียบเท่าบนแพลตฟอร์มใดเลย
libfaketime เก่าแก่กว่าและกว้างกว่าในสนามของตัวเอง มันมีการใช้งานมาหลายปี ครอบคลุมจุดเข้าของไลบรารี C หลากหลาย และบน Linux มันคือเครื่องมือที่ถูกต้อง ไม่มีอะไรที่นี่มาแทนที่มันได้ที่นั่น
ถ้าคุณต้องการ libfaketime ตัวจริง
มีสองเส้นทางที่ซื่อสัตย์ และทั้งสองย้ายโปรแกรมที่ทดสอบไปอยู่บน Linux:
- WSL - บิลด์และรัน libfaketime ภายในระบบย่อย Linux เหมาะเมื่อสิ่งที่ทดสอบเป็นโปรแกรม Linux ที่คุณบังเอิญพัฒนาบน Windows
- คอนเทนเนอร์ - แนวคิดเดียวกัน ทำซ้ำได้มากกว่า
ไม่มีทางใดช่วยแอป Windows ได้ ซึ่งเป็นกรณีที่เครื่องมือนี้มีอยู่เพื่อ