From 9aadb18186c0804f6cc6179bf8ea993337dc669d Mon Sep 17 00:00:00 2001 From: Nathaniel Brough Date: Tue, 5 Dec 2023 10:26:58 -0800 Subject: Add simple fuzz testing (#2581) --- tests/fuzz/src/compile.rs | 74 +++++++++++++++++++++++++++++++++++++++++++++++ tests/fuzz/src/parse.rs | 8 +++++ 2 files changed, 82 insertions(+) create mode 100644 tests/fuzz/src/compile.rs create mode 100644 tests/fuzz/src/parse.rs (limited to 'tests/fuzz/src') diff --git a/tests/fuzz/src/compile.rs b/tests/fuzz/src/compile.rs new file mode 100644 index 00000000..deb71778 --- /dev/null +++ b/tests/fuzz/src/compile.rs @@ -0,0 +1,74 @@ +#![no_main] + +use comemo::Prehashed; +use libfuzzer_sys::fuzz_target; +use typst::diag::{FileError, FileResult}; +use typst::eval::Tracer; +use typst::foundations::{Bytes, Datetime}; +use typst::syntax::{FileId, Source}; +use typst::text::{Font, FontBook}; +use typst::visualize::Color; +use typst::{Library, World}; + +const FONT: &[u8] = include_bytes!("../../../assets/fonts/LinLibertine_R.ttf"); + +struct FuzzWorld { + library: Prehashed, + book: Prehashed, + font: Font, + source: Source, +} + +impl FuzzWorld { + fn new(text: &str) -> Self { + let font = Font::new(FONT.into(), 0).unwrap(); + let book = FontBook::from_fonts([&font]); + Self { + library: Prehashed::new(Library::build()), + book: Prehashed::new(book), + font, + source: Source::detached(text), + } + } +} + +impl World for FuzzWorld { + fn library(&self) -> &Prehashed { + &self.library + } + + fn book(&self) -> &Prehashed { + &self.book + } + + fn main(&self) -> Source { + self.source.clone() + } + + fn source(&self, src: FileId) -> FileResult { + Err(FileError::NotFound(src.vpath().as_rootless_path().into())) + } + + fn file(&self, src: FileId) -> FileResult { + Err(FileError::NotFound(src.vpath().as_rootless_path().into())) + } + + fn font(&self, _: usize) -> Option { + Some(self.font.clone()) + } + + fn today(&self, _: Option) -> Option { + None + } +} + +fuzz_target!(|text: &str| { + let world = FuzzWorld::new(text); + let mut tracer = Tracer::new(); + if let Ok(document) = typst::compile(&world, &mut tracer) { + if let Some(page) = document.pages.first() { + std::hint::black_box(typst_render::render(page, 1.0, Color::WHITE)); + } + } + comemo::evict(10); +}); diff --git a/tests/fuzz/src/parse.rs b/tests/fuzz/src/parse.rs new file mode 100644 index 00000000..f151661a --- /dev/null +++ b/tests/fuzz/src/parse.rs @@ -0,0 +1,8 @@ +#![no_main] + +use libfuzzer_sys::fuzz_target; +use typst_syntax::parse; + +fuzz_target!(|text: &str| { + std::hint::black_box(parse(text)); +}); -- cgit v1.2.3