पाइपलाइन में तारीख़ का परीक्षण
विंडो खोजबीन के लिए है। यह दूसरा आधा हिस्सा है: लगभग 2.4 MB का कमांड-लाइन बिल्ड, जिसके लिए कोई रनटाइम इंस्टॉल नहीं करना पड़ता, और जिसका एग्ज़िट कोड टारगेट का अपना कोड नहीं, बल्कि कवरेज का निर्णय होता है।
एग्ज़िट कोड ही निर्णय है
यही वह डिज़ाइन फ़ैसला है जो इस टूल को स्क्रिप्ट के लायक बनाता है। सत्र ख़त्म होने पर एग्ज़िट कोड यह बताता है कि “समय का बदलाव असर में आया या नहीं”, यह नहीं कि “ऐप्लिकेशन ने क्या लौटाया”। इसलिए पाइपलाइन ऐसे बदलाव पर फ़ेल हो सकती है जो चुपचाप हुआ ही नहीं - और यही वह विफलता है जिस पर फ़ेल होना सार्थक है, क्योंकि उसके बाद का हर परीक्षण ऐसा परीक्षण है जिसने कुछ साबित नहीं किया।
टारगेट का अपना एग्ज़िट कोड फिर भी सत्र के डेटा में दर्ज किया जाता है।
| कोड | अर्थ |
|---|---|
| 0 | काम करता है - समय पढ़ने वाली हर प्रोसेस ने सत्र की घड़ी देखी |
| 10 | आंशिक रूप से काम करता है - कुछ चैनल कवर हुए, कुछ नहीं |
| 11 | काम नहीं करता - बदलाव प्रमुख चैनलों तक नहीं पहुँचा |
| 4 | अनिर्धारित - कवरेज स्थापित नहीं की जा सकी |
| 1 | उपयोग की त्रुटि - ग़लत फ़्लैग या ग़लत व्यंजक |
| 2 | टारगेट को लॉन्च या इंजेक्ट नहीं किया जा सका |
| 12 | टारगेट ग़ायब हो गया, जो बताता है कि वह सिंगल-इंस्टेंस ऐप्लिकेशन है |
| 3 | आंतरिक त्रुटि - इंजन शुरू नहीं हो सका, अप्रत्याशित स्थिति में पहुँच गया, या सत्र बंद करने से पहले रुक गया (उसका अपना एग्ज़िट कोड जो भी हो)। ऐसे रन में कोई निर्णय नहीं होता |
| 5 | यह ऑपरेशन इस रिलीज़ में शामिल नहीं है |
| 6 | रन बीच में कट गया - --timeout पूरा हो गया, या इंजन 15 सेकंड तक जवाब देना बंद कर गया और रोक दिया गया। यह निर्णय नहीं है: सत्र बाधित हुआ, इसलिए यह टारगेट के बारे में किसी भी तरफ़ कुछ साबित नहीं करता |
| 7 | एक और सत्र पहले से चल रहा है - एक समय में एक ही सत्र। उसके खत्म होने के बाद दोबारा कोशिश करना काफ़ी है |
| 8 | सत्र किसी निर्णय तक पहुँचा, लेकिन उसका सबूत उस फ़ाइल में नहीं है जिसे --report बताता है - डिस्क भर गई थी, या किसी दूसरे प्रोग्राम ने पुरानी फ़ाइल खुली रखी थी, जो तब वैसी ही रहती है। निर्णय फिर भी उस रिपोर्ट में है जिसे कमांड छापता है |
दोनों कमांड के हर फ़्लैग, और कैलकुलेटर की यही तालिका, कमांड-लाइन संदर्भ में हैं।
सीमित रन
पाइपलाइन किसी डेस्कटॉप ऐप्लिकेशन के इंसान द्वारा बंद किए जाने का इंतज़ार नहीं कर सकती। --ticks N N हार्टबीट के बाद सत्र ख़त्म कर देता है - हर हार्टबीट एक असली सेकंड की - और उस बिंदु तक जो मिला उसकी रिपोर्ट देता है। कवरेज वैसे भी प्रोसेस के शुरुआती पलों में तय हो जाती है, इसलिए आम तौर पर एक छोटी सीमा ही काफ़ी होती है।
# दस सेकंड चलाएँ, फिर रोकें और रिपोर्ट दें chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt
मशीनी आउटपुट और सबूत
--jsonइंसानी रिपोर्ट की जगह सत्र को मशीन-पठनीय रिकॉर्ड के रूप में देता है - वही तथ्य, हर चैनल की कवरेज समेत।--report <path>इंसानी रिपोर्ट को फ़ाइल में लिखता है, जो बिल्ड आर्टिफ़ैक्ट के तौर पर ठीक रहती है। जिस सत्र का निर्णय काम करता है के अलावा कुछ भी हो, उसकी फ़ाइल की शुरुआत अविश्वसनीय सबूत की चेतावनी से होती है, चेतावनी को सबसे नीचे दबाया नहीं जाता।- कैलकुलेटर भी
--jsonबोलता है, इसलिए पाइपलाइन अपनी ज़रूरत की तारीख़ निकालकर उसे वापस दे सकती है।
# तारीख़ निकालें, फिर उसी पर चलाएँ chrono calc --base today --snap eom --json chrono run ".\build\test.exe" --preset month-end --ticks 10 --json
एक स्टेप, मोटे तौर पर
- name: Month-end behaviour
shell: pwsh
run: |
.\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
# यहाँ शून्य के अलावा कोई भी एग्ज़िट कोड बताता है कि बदलाव लगा ही नहीं, इसलिए
# उसके बाद का परीक्षण कुछ भी साबित नहीं करता
- name: Keep the evidence
uses: actions/upload-artifact@v7
with:
name: chrono-evidence
path: evidence.txt
रनर के बारे में दो ईमानदार चेतावनियाँ
- इसे Windows रनर चाहिए। Linux या macOS बिल्ड नहीं है, और होगा भी नहीं - Linux पर libfaketime यह काम पहले से करता है।
- होस्टेड रनर पर एंटीवायरस इंजेक्शन को रोक सकता है। समय बदलने का मतलब टारगेट प्रोसेस में एक लाइब्रेरी इंजेक्ट करना है, जो Windows की एक प्रलेखित तकनीक है जिसे मैलवेयर भी इस्तेमाल करता है। जो रनर इसे रोकता है, वह झूठे पास की जगह यही बताने वाला एग्ज़िट कोड देता है - पर यह वह बात है जो आपको इस पर निर्भर होने से पहले पता कर लेनी चाहिए।
इसी कारण इस प्रोजेक्ट का अपना एंड-टू-एंड सूट होस्टेड रनर पर नहीं, असली मशीनों पर चलता है। इसका कंटिन्यूअस इंटीग्रेशन सब कुछ बनाता और यूनिट-टेस्ट करता है, और बदलाव को ख़ुद हर रिलीज़ से पहले असली ऐप्लिकेशन पर 32-बिट और 64-बिट दोनों बिल्ड में हाथ से परखा जाता है।