libfaketime لنظام Windows
الجواب المختصر: libfaketime لا تعمل على Windows ولا يمكن أن تعمل - فهي مبنية على LD_PRELOAD غير الموجودة في Windows. أما Chrono Mock فهي الفكرة نفسها مبنيّة بالطريقة التي يسمح بها Windows.
لماذا لا يمكن نقلها ببساطة
تعمل libfaketime بأن يضع المحمِّل الديناميكي مكتبة صغيرة أمام مكتبة C، فتصل استدعاءات البرنامج إلى time() إلى البديل أولًا. وهذا الخطّاف هو LD_PRELOAD في Linux وDYLD_INSERT_LIBRARIES في macOS. وملف README الخاص بها يسرد هاتين المنصتين بالضبط.
ولا مثيل لذلك في Windows، وساعته لا تقع خلف دالة واحدة على أي حال. فالتطبيقات تقرأ الوقت عبر واجهة Win32 البرمجية، وعبر الواجهة الأصلية تحتها، وعبر ما تلفّه بيئة تشغيلها حول أي منهما - ولذا فإن نسخة هذه الفكرة في 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 مواضع أكثر للاعتراض. فبعد ساعة الحائط هناك المنطقة الزمنية، ومحور الزمن المنقضي، وأربع عائلات من المؤقّتات، ودوال النوم والانتظار، وإنشاء العمليات - أي 44 قناة في المجموع. تُزاح 30 منها، أما الباقي (14)، ومنها اتصالات الشبكة، فيُعدّ فقط.
هذه الأداة تُبلّغ عن تغطيتها هي. فكل جلسة تنتهي بحكم، وبالقنوات التي قرأها التطبيق فعلًا مع عدد لكل منها، وبالقنوات التي فاتت. وهذا الجزء لا مثيل له في أي من المنصتين.
libfaketime أقدم وأوسع في ميدانها. فخلفها سنوات من الاستخدام، وتغطي نطاقًا واسعًا من نقاط دخول مكتبة C، وهي في Linux الأداة الصحيحة. ولا شيء هنا يحلّ محلها هناك.
إن كنت تريد libfaketime نفسها فعلًا
طريقان صادقان، وكلاهما ينقل البرنامج قيد الاختبار إلى Linux:
- WSL - ابنِ libfaketime وشغّلها داخل النظام الفرعي لـ Linux. وهذا مناسب حين يكون ما تختبره برنامج Linux تطوّره على Windows.
- حاوية - الفكرة نفسها، وأكثر قابلية للتكرار.
ولا يفيد أيٌّ منهما تطبيق Windows، وهذه هي الحالة التي وُجدت هذه الأداة من أجلها.