backtrace-parser 0.1.0

A zero-copy parser for Rust backtraces.
Documentation
extern crate backtrace_parser;

use std::path::Path;

use backtrace_parser::Backtrace;

#[test]
fn unresolved_symbols() {
    let data = include_str!("fixtures/unresolved.txt");
    let parsed = Backtrace::parse(data).unwrap();

    let mut frames = parsed.frames();

    let symbols = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols.len(), 0);

    assert!(frames.next().is_none());
}

#[test]
fn no_symbol_info() {
    let data = include_str!("fixtures/no-info.txt");
    let parsed = Backtrace::parse(data).unwrap();

    let mut frames = parsed.frames();

    let symbols = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols.len(), 0);

    assert!(frames.next().is_none());
}

#[test]
fn line_number_overflow() {
    let data = "stack backtrace: 0: 0x0 - main\nat src/main.rs:1208925819614629174706176";
    let parsed = Backtrace::parse(data).unwrap();

    let mut frames = parsed.frames();

    let symbols = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols.len(), 1);
    assert_eq!(symbols[0].name(), Some("main"));
    assert_eq!(symbols[0].filename(), Some(Path::new("src/main.rs")));
    assert_eq!(symbols[0].lineno(), None);

    assert!(frames.next().is_none());
}

#[test]
fn full_backtrace() {
    let data = include_str!("fixtures/full.txt");
    let parsed = Backtrace::parse(data).unwrap();

    let mut frames = parsed.frames();

    let symbols0 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols0.len(), 2);
    assert_eq!(
        symbols0[0].name(),
        Some("backtrace::backtrace::libunwind::trace::h042fc201d46ac6bb")
    );
    assert_eq!(symbols0[0].filename(), Some(Path::new("/root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.9/src/backtrace/libunwind.rs")));
    assert_eq!(symbols0[0].lineno(), Some(53));
    assert_eq!(
        symbols0[1].name(),
        Some("backtrace::backtrace::trace::hd8156e10e3d1f9ca")
    );
    assert_eq!(symbols0[1].filename(), Some(Path::new("/root/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.9/src/backtrace/mod.rs")));
    assert_eq!(symbols0[1].lineno(), Some(42));

    let symbols1 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols1.len(), 1);

    let symbols2 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols2.len(), 1);

    let symbols3 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols3.len(), 1);

    let symbols4 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols4.len(), 1);

    let symbols5 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols5.len(), 2);

    let symbols6 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols6.len(), 1);

    let symbols7 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols7.len(), 3);

    let symbols8 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols8.len(), 1);

    let symbols9 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols9.len(), 1);

    let symbols10 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols10.len(), 1);

    let symbols11 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols11[0].name(), Some("_start"));

    let symbols12 = frames.next().unwrap().symbols().collect::<Vec<_>>();
    assert_eq!(symbols12[0].name(), None);

    assert!(frames.next().is_none());
}