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

पाइपलाइन में तारीख़ का परीक्षण

विंडो खोजबीन के लिए है। यह दूसरा आधा हिस्सा है: लगभग 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-बिट दोनों बिल्ड में हाथ से परखा जाता है।

आज़माएँ