#protocols #packet #events #file #reading

subunit

Rust 中实现的子单元 v2 协议

1 个不稳定版本

使用旧的 Rust 2015

0.2.1 2023年8月9日

#461测试

Apache-2.0

24KB
491

Subunit Rust

subunit-rust on Travis CI subunit-rust on crates.io subunit-rust on Appveyor CI

此存储库包含子单元 v2 协议的 Rust 实现。它提供了在 Rust 中原生读写子单元流的接口。子单元 v2 协议在 testing-cabal/subunit 仓库中有文档说明。

读取子单元数据包

读取子单元数据包首先需要一个实现 Read 特质的对象,包含子单元流。使用 parse_subunit() 函数首先在内存中缓冲整个流,然后解析内容并返回一个 Event 结构体的向量。例如,解析来自文件的子单元流:

    let mut f = File::open("results.subunit")?;
    let events = parse_subunit(f).unwrap();

在这个例子中,results.subunit 文件将打开并解析,events 向量中的每个子单元数据包都将有一个 Event 结构体。

写入子单元数据包

写入子单元数据包首先需要创建一个描述数据包内容的 event 结构体。例如:

    let mut event_start = Event {
        status: Some("inprogress".to_string()),
        test_id: Some("A_test_id".to_string()),
        timestamp: Some(Utc.ymd(2014, 7, 8).and_hms(9, 10, 11)),
        tags: Some(vec!["tag_a".to_string(), "tag_b".to_string()]),
        file_content: None,
        file_name: None,
        mime_type: None,
        route_code: None
    };

典型的测试事件通常涉及两个数据包,一个用于标记测试的开始,另一个用于标记测试的结束

    let mut event_end = Event {
        status: Some("success".to_string()),
        test_id: Some("A_test_id".to_string()),
        timestamp: Some(Utc.ymd(2014, 7, 8).and_hms(9, 12, 0)),
        tags: Some(vec!["tag_a".to_string(), "tag_b".to_string()]),
        file_content: Some("stdout content".to_string().into_bytes()),
        file_name: Some("stdout:''".to_string()),
        mime_type: Some("text/plain;charset=utf8".to_string()),
        route_code: None
    };

然后您需要将数据包写入某个地方。任何实现了 std::io::Write 特质的对象都可以用于数据包,包括文件和 TCPStream 等东西。在这种情况下,我们将使用 Vec 将其保存在内存中

    let mut subunit_stream: Vec<u8> = Vec::new();

    subunit_stream = event_start.write(subunit_stream)?;
    subunit_stream = event_end.write(subunit_stream)?;

这样,subunit_stream 缓冲区将包含该测试事件的子单元流内容。

依赖项

~1.5MB
~21K SLoC