ทดสอบวันที่ในไปป์ไลน์
หน้าต่างโปรแกรมไว้สำหรับสำรวจ ส่วนนี่คืออีกครึ่งหนึ่ง: บิลด์บรรทัดคำสั่งขนาดราว 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 บิตก่อนปล่อยแต่ละรุ่น