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 บิตก่อนปล่อยแต่ละรุ่น

ลองใช้