Chrono Mock
ภาษาไทย

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 จึงเป็นไลบรารีที่ฉีดเข้าไปในโพรเซสเป้าหมาย เปลี่ยนเส้นทางชุดของฟังก์ชันที่ส่งออก ไม่ใช่ซิมโบลเดียว

ตัวเลือกที่จับคู่กัน

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 เป็นค่าเริ่มต้นที่นี่ - ดูด้านล่าง
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 ได้ ซึ่งเป็นกรณีที่เครื่องมือนี้มีอยู่เพื่อ

ลองใช้