83 lines
5.0 KiB
Rust
83 lines
5.0 KiB
Rust
//! Tests for crashes in the rendering stage.
|
|
//!
|
|
//! Ensures that redering a particular SVG doesn't crash, but we don't care
|
|
//! about the resulting image or even whether there were errors during rendering.
|
|
|
|
use rsvg::{CairoRenderer, Loader};
|
|
|
|
use std::path::PathBuf;
|
|
|
|
fn render_crash(filename: &str) {
|
|
let mut full_filename = PathBuf::new();
|
|
full_filename.push("tests/fixtures/render-crash");
|
|
full_filename.push(filename);
|
|
|
|
let handle = Loader::new()
|
|
.read_path(&full_filename)
|
|
.unwrap_or_else(|e| panic!("could not load: {}", e));
|
|
|
|
let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, 100, 100).unwrap();
|
|
let cr = cairo::Context::new(&surface).expect("Failed to create a cairo context");
|
|
|
|
// We just test for crashes during rendering, and don't care about success/error.
|
|
let _ = CairoRenderer::new(&handle)
|
|
.render_document(&cr, &cairo::Rectangle::new(0.0, 0.0, 100.0, 100.0));
|
|
}
|
|
|
|
macro_rules! t {
|
|
($test_name:ident, $filename:expr) => {
|
|
#[test]
|
|
fn $test_name() {
|
|
render_crash($filename);
|
|
}
|
|
};
|
|
}
|
|
|
|
#[rustfmt::skip]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
t!(bug187_set_gradient_on_empty_path_svg, "bug187-set-gradient-on-empty-path.svg");
|
|
t!(bug193_filters_conv_05_f_svg, "bug193-filters-conv-05-f.svg");
|
|
t!(bug227_negative_dasharray_value_svg, "bug227-negative-dasharray-value.svg");
|
|
t!(bug266_filters_with_error_attributes_svg, "bug266-filters-with-error-attributes.svg");
|
|
t!(bug277_filter_on_empty_group_svg, "bug277-filter-on-empty-group.svg");
|
|
t!(bug292_clip_empty_group_svg, "bug292-clip-empty-group.svg");
|
|
t!(bug293_mask_empty_group_svg, "bug293-mask-empty-group.svg");
|
|
t!(bug324_empty_svg_svg, "bug324-empty-svg.svg");
|
|
t!(bug337_font_ex_svg, "bug337-font-ex.svg");
|
|
t!(bug338_zero_sized_image_svg, "bug338-zero-sized-image.svg");
|
|
t!(bug340_marker_with_zero_sized_vbox_svg, "bug340-marker-with-zero-sized-vbox.svg");
|
|
t!(bug342_use_references_ancestor_svg, "bug342-use-references-ancestor.svg");
|
|
t!(bug343_fecomponenttransfer_child_in_error_svg, "bug343-feComponentTransfer-child-in-error.svg");
|
|
t!(bug344_too_large_viewbox_svg, "bug344-too-large-viewbox.svg");
|
|
t!(bug345_too_large_size_svg, "bug345-too-large-size.svg");
|
|
t!(bug395_femorphology_negative_scaling_svg, "bug395-feMorphology-negative-scaling.svg");
|
|
t!(bug497_path_with_all_invalid_commands_svg, "bug497-path-with-all-invalid-commands.svg");
|
|
t!(bug581491_zero_sized_text_svg, "bug581491-zero-sized-text.svg");
|
|
t!(bug588_big_viewbox_yields_invalid_transform_svg, "bug588-big-viewbox-yields-invalid-transform.svg");
|
|
t!(bug591_vbox_overflow_svg, "bug591-vbox-overflow.svg");
|
|
t!(bug593_mask_empty_bbox_svg, "bug593-mask-empty-bbox.svg");
|
|
t!(bug721_pattern_cycle_from_child_svg, "bug721-pattern-cycle-from-child.svg");
|
|
t!(bug721_pattern_cycle_from_other_child_svg, "bug721-pattern-cycle-from-other-child.svg");
|
|
t!(bug777155_zero_sized_pattern_svg, "bug777155-zero-sized-pattern.svg");
|
|
t!(bug928_empty_fetile_bounds_svg, "bug928-empty-feTile-bounds.svg");
|
|
t!(bug932_too_big_font_size, "bug932-too-big-font-size.svg");
|
|
t!(bug1059_feoffset_overflow, "bug1059-feoffset-overflow.svg");
|
|
t!(bug1060_zero_sized_image_from_data_uri, "bug1060-zero-sized-image-from-data-uri.svg");
|
|
t!(bug1062_feturbulence_limit_numoctaves, "bug1062-feTurbulence-limit-numOctaves.svg");
|
|
t!(bug1088_fuzz_cairo_out_of_bounds, "bug1088-fuzz-cairo-out-of-bounds.svg");
|
|
t!(bug1092_fuzz_recursive_use_stack_overflow, "bug1092-fuzz-recursive-use-stack-overflow.svg");
|
|
t!(bug1100_fuzz_layer_nesting_depth, "bug1100-fuzz-layer-nesting-depth.svg");
|
|
t!(bug1115_feturbulence_overflow, "bug1115-feTurbulence-overflow.svg");
|
|
t!(bug1118_fuzz_large_transform_and_recursive_use, "bug1118-fuzz-large-transform-and-recursive-use.svg");
|
|
t!(femerge_color_interpolation_srgb_svg, "feMerge-color-interpolation-srgb.svg");
|
|
t!(filters_non_invertible_paffine_svg, "filters-non-invertible-paffine.svg");
|
|
t!(gradient_with_empty_bbox_svg, "gradient-with-empty-bbox.svg");
|
|
t!(gradient_with_no_children_svg, "gradient-with-no-children.svg");
|
|
t!(pattern_with_empty_bbox_svg, "pattern-with-empty-bbox.svg");
|
|
t!(pattern_with_no_children_svg, "pattern-with-no-children.svg");
|
|
t!(pixelrectangle_duplicate_crash_svg, "PixelRectangle-duplicate-crash.svg");
|
|
t!(recursive_feimage_svg, "recursive-feimage.svg");
|
|
}
|