לדלג לתוכן

פתרון תכונות והזרקת כשלים

הבדיקה הבאה מצטרפת למודול tests מן ההרצאה. היא משתמשת בקידוד פשוט וידוע של אורך, ואז בודקת שה־parser לא בולע את המשך הזרם.

#[test]
fn all_supported_lengths_round_trip() {
    for length in 0..=256usize {
        let payload: Vec<u8> = (0..length).map(|n| (n % 251) as u8).collect();
        let mut encoded = (length as u16).to_be_bytes().to_vec();
        encoded.extend_from_slice(&payload);
        encoded.extend_from_slice(&[0, 1, 42]);
        let (actual, consumed) = frame(&encoded).unwrap();
        assert_eq!(actual, payload);
        assert_eq!(consumed, length + 2);
    }
}

ה־Write המזויף ינהל Vec של צעדים, למשל Short(2), Interrupted ו־Fail(WriteZero). המימוש של write_all אמור לטפל בכתיבה קצרה וב־Interrupted, אך אין לצפות ממנו לתקן כשל עמידות שאינו חלק מן ה־trait. כדי לבדוק sync ניצור שכבת אחסון עם operation מפורשת של commit ונזריק כשל בנקודה הזאת.

עבור cancellation נשתמש ב־barrier כדי להוכיח שה־buffer אינו חוזר ל־pool לפני השלמת פעולה חוסמת. עבור recovery נבדוק כל prefix של רשומה ונדרוש זנב חלקי מוכר או שגיאת corruption, בלי קבלה של נתון לא מאומת. עבור ABI נריץ תוכניות sizeof ו־offset משני הצדדים. הבדיקות אינן מוכיחות שהתקן שאינו מקיים flush יחזיק נתונים אחרי אובדן חשמל, ולכן החוזה יזכיר את ההנחה הזאת במפורש.