sark-http 0.28.4

HTTP wire types, semantics, codecs, and ownership invariants for Sark
Documentation
use dope_test::alloc::Tracker;
use o3::{alloc, buffer::write::Sink};
use sark_http::field::metadata::{
    block::{Validation, Valued, buffer::Values},
    map::record::Span,
};

#[global_allocator]
static ALLOCATOR: Tracker = Tracker::new();

#[test]
fn rollback_restores_proof() {
    let mut buffer = Values::new();
    buffer
        .writer(None)
        .write_slice(b"text")
        .expect("value prefix");
    let mut writer = buffer.writer(None);
    writer
        .write_slice(b"\r\n")
        .expect("retained malformed bytes");
    writer.rollback();
    assert_eq!(buffer.as_slice(), b"text");
    assert_eq!(buffer.valued().validation(), Validation::Valid);
    buffer
        .writer(None)
        .write_slice(b"\n")
        .expect("retained malformed bytes");
    assert_eq!(buffer.valued().validation(), Validation::Malformed);
}

#[test]
fn final_fragment_validates() {
    let mut buffer = Values::new();
    buffer
        .writer(None)
        .write_slice(b"a ")
        .expect("value prefix");
    assert_eq!(buffer.valued().validation(), Validation::Malformed);
    buffer.writer(None).write_slice(b"b").expect("value suffix");
    assert_eq!(buffer.valued().validation(), Validation::Valid);
}

#[test]
fn append_failure() {
    let mut buffer = Values::new();
    buffer
        .copy_from(Valued::from_span(Span::new(b"\r", b"x")))
        .expect("cached malformed value");
    buffer.writer(None).write_slices([]).expect("empty append");
    assert_eq!(buffer.valued().validation(), Validation::Malformed);
    {
        let mut writer = buffer.writer(None);
        assert_eq!(
            Tracker::fail_after(0, || writer.write_slices([b"long-", b"value"])),
            Err(alloc::Error::Exhausted)
        );
        assert!(writer.is_retained());
    }
    assert_eq!(buffer.as_slice(), b"\rx");
    assert_eq!(buffer.valued().validation(), Validation::Malformed);
    buffer
        .writer(None)
        .write_slice(b"y")
        .expect("resume append");
    assert_eq!(buffer.as_slice(), b"\rxy");
    assert_eq!(buffer.valued().validation(), Validation::Malformed);
    assert_eq!(
        Tracker::fail_after(0, || {
            buffer.copy_from(Valued::from_span(Span::new(b"long-", b"value")))
        }),
        Err(alloc::Error::Exhausted)
    );
    assert!(buffer.is_empty());
    assert_eq!(buffer.valued().validation(), Validation::Valid);
}