Chrono Mock
भाषाहिन्दी

Windows के लिए libfaketime

संक्षिप्त उत्तर: libfaketime Windows पर नहीं चलता, और चल भी नहीं सकता - यह LD_PRELOAD पर बना है, जो Windows में नहीं होता। Chrono Mock वही विचार है, उस तरह बनाया गया जिस तरह Windows अनुमति देता है।

इसे सीधे पोर्ट क्यों नहीं किया जा सकता

libfaketime इस तरह काम करता है कि डायनेमिक लोडर C लाइब्रेरी के आगे एक छोटी लाइब्रेरी रख देता है, जिससे प्रोग्राम की time() कॉल पहले प्रतिस्थापन तक पहुँचती हैं। वह हुक Linux पर LD_PRELOAD है और macOS पर DYLD_INSERT_LIBRARIES। उसकी अपनी 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 उसे चालू करता है। यही स्विच Python 3.13+ के monotonic, .NET के Stopwatch और Java के nanoTime को सत्र की घड़ी का अनुसरण कराता है।

Windows में रोकने की जगहें ज़्यादा हैं। वॉल क्लॉक के अलावा टाइम ज़ोन, बीते-समय का अक्ष, टाइमरों के चार परिवार, स्लीप और वेट फ़ंक्शन, और प्रोसेस निर्माण हैं - कुल मिलाकर 44 चैनल। इनमें से 30 खिसकाए जाते हैं, और बाक़ी 14, जिनमें नेटवर्क कनेक्शन भी हैं, गिने जाते हैं।

यह टूल अपनी कवरेज ख़ुद रिपोर्ट करता है। हर सत्र एक निर्णय के साथ, उन चैनलों के साथ जो ऐप्लिकेशन ने वास्तव में पढ़े और हर एक की गिनती के साथ, और उन चैनलों के साथ ख़त्म होता है जो छूट गए। यह वह हिस्सा है जिसका किसी भी प्लेटफ़ॉर्म पर कोई समकक्ष नहीं है।

libfaketime पुराना है और अपने क्षेत्र में ज़्यादा व्यापक। उसके पीछे वर्षों का उपयोग है, वह C लाइब्रेरी के प्रवेश बिंदुओं की एक बड़ी श्रृंखला कवर करता है, और Linux पर वही सही टूल है। यहाँ की कोई भी चीज़ वहाँ उसकी जगह नहीं लेती।

अगर आपको वास्तव में libfaketime ही चाहिए

दो ईमानदार रास्ते हैं, और दोनों परीक्षणाधीन प्रोग्राम को Linux पर ले जाते हैं:

  • WSL - Linux सबसिस्टम के भीतर libfaketime बनाएँ और चलाएँ। तब ठीक है जब जिसे परखा जा रहा है वह Linux प्रोग्राम है जिसे आप संयोग से Windows पर विकसित करते हैं।
  • एक कंटेनर - वही विचार, ज़्यादा दोहराने योग्य।

दोनों में से कोई Windows ऐप्लिकेशन के काम नहीं आता, और यही वह मामला है जिसके लिए यह टूल मौजूद है।

आज़माएँ