اختبار التواريخ في خط الأنابيب
النافذة للاستكشاف. وهذا هو النصف الآخر: نسخة لسطر الأوامر بحجم نحو 2.4 ميغابايت لا تحتاج إلى تثبيت أي بيئة تشغيل، ورمز الخروج فيها هو حكم التغطية لا رمز خروج البرنامج المستهدف.
رمز الخروج هو الحكم
هذا هو قرار التصميم الذي يجعل الأداة قابلة للبرمجة النصية. فعند انتهاء الجلسة يجيب رمز الخروج عن سؤال «هل سرى استبدال الوقت» لا عن «ماذا أعاد التطبيق». وبذلك يستطيع خط الأنابيب أن يفشل عندما لا يحدث الاستبدال بصمت - وهذا هو الفشل الجدير بالفشل من أجله، لأن كل ما يأتي بعده اختبار لم يُثبت شيئًا.
ويظل رمز خروج البرنامج المستهدف نفسه مُبلَّغًا عنه في بيانات الجلسة.
| الرمز | المعنى |
|---|---|
| 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 بت قبل كل إصدار.