use super::*; #[test] fn fuzz() { assert!( Events::from_str("[]A=\\\\\r\\\n\n").is_err(), "empty sections are not allowed, and it won't crash either" ); assert!( Events::from_str(include_str!( "../../fixtures/clusterfuzz-testcase-minimized-gix-config-parse-6431708583690240" )) .is_err(), "works without hanging - these 400kb take 10s in debug mode right now, but just as long in release mode. With nom all tests ran in below 1s in debug mode" ); } #[test] fn filters_receive_event_refs_for_content_access() { fn reject_drop_values(event: EventRef<'_>) -> bool { !matches!(event, EventRef::Value(value) if value == b"drop".as_slice()) } let events = Events::from_bytes(b"[core]\nkeep = keep\ndrop = drop\n", Some(reject_drop_values)) .expect("content-based filters can inspect event bytes through views"); assert!( !events .iter() .any(|event| matches!(event, EventRef::Value(value) if value == b"drop".as_slice())), "the filter can reject events by inspecting their value bytes" ); } #[test] #[rustfmt::skip] fn complex() { let config = r#"[user] email = code@eddie.sh name = Foo Bar [core] autocrlf = input [push] default = simple [commit] gpgsign = true [gpg] program = gpg [url "ssh://git@github.com/"] insteadOf = "github://" [url "ssh://git@git.eddie.sh/edward/"] insteadOf = "gitea://" [pull] ff = only [init] defaultBranch = master"#; let events = Events::from_str(config).unwrap(); assert_eq!( events.iter().collect::>(), vec![ section::header_event("user", None), newline(), whitespace(" "), name("email"), whitespace(" "), separator(), whitespace(" "), value("code@eddie.sh"), newline(), whitespace(" "), name("name"), whitespace(" "), separator(), whitespace(" "), value("Foo Bar"), newline(), section::header_event("core", None), newline(), whitespace(" "), name("autocrlf"), whitespace(" "), separator(), whitespace(" "), value("input"), newline(), section::header_event("push", None), newline(), whitespace(" "), name("default"), whitespace(" "), separator(), whitespace(" "), value("simple"), newline(), section::header_event("commit", None), newline(), whitespace(" "), name("gpgsign"), whitespace(" "), separator(), whitespace(" "), value("true"), newline(), section::header_event("gpg", None), newline(), whitespace(" "), name("program"), whitespace(" "), separator(), whitespace(" "), value("gpg"), newline(), section::header_event("url", "ssh://git@github.com/"), newline(), whitespace(" "), name("insteadOf"), whitespace(" "), separator(), whitespace(" "), value("\"github://\""), newline(), section::header_event("url", "ssh://git@git.eddie.sh/edward/"), newline(), whitespace(" "), name("insteadOf"), whitespace(" "), separator(), whitespace(" "), value("\"gitea://\""), newline(), section::header_event("pull", None), newline(), whitespace(" "), name("ff"), whitespace(" "), separator(), whitespace(" "), value("only"), newline(), section::header_event("init", None), newline(), whitespace(" "), name("defaultBranch"), whitespace(" "), separator(), whitespace(" "), value("master"), ] ); } #[test] fn skips_bom() { let bytes = b" [core] a = 1 "; let bytes_with_gb18030_bom = "\u{feff} [core] a = 1 "; fn render_events(events: &Events) -> Vec { let mut out = Vec::new(); for event in events.iter() { event.write_to(&mut out).expect("in-memory writes cannot fail"); } out } assert_eq!( Events::from_bytes(bytes, None).map(|events| render_events(&events)), Events::from_bytes(bytes_with_gb18030_bom.as_bytes(), None).map(|events| render_events(&events)) ); assert_eq!( Events::from_bytes(bytes, None).map(|events| render_events(&events)), Events::from_bytes(bytes_with_gb18030_bom.as_bytes(), None).map(|events| render_events(&events)) ); }