diff options
author | pcpthm <[email protected]> | 2019-03-21 17:05:12 +0000 |
---|---|---|
committer | pcpthm <[email protected]> | 2019-03-21 23:04:48 +0000 |
commit | e734190c24d2a5aca5b62c2b1ab7e6136017a25c (patch) | |
tree | 106ca91f918767cdee896d879ece4930410b6ea7 /crates/ra_syntax | |
parent | 51323a852a8979a71c21725b3b2771224132b85f (diff) |
Refactor parser fuzz testing
Diffstat (limited to 'crates/ra_syntax')
-rw-r--r-- | crates/ra_syntax/fuzz/Cargo.toml | 8 | ||||
-rw-r--r-- | crates/ra_syntax/fuzz/fuzz_targets/parser.rs | 6 | ||||
-rw-r--r-- | crates/ra_syntax/src/fuzz.rs | 12 | ||||
-rw-r--r-- | crates/ra_syntax/src/lib.rs | 9 | ||||
-rw-r--r-- | crates/ra_syntax/tests/test.rs | 4 |
5 files changed, 23 insertions, 16 deletions
diff --git a/crates/ra_syntax/fuzz/Cargo.toml b/crates/ra_syntax/fuzz/Cargo.toml index 4a255882e..c54d12813 100644 --- a/crates/ra_syntax/fuzz/Cargo.toml +++ b/crates/ra_syntax/fuzz/Cargo.toml | |||
@@ -4,14 +4,14 @@ name = "ra_syntax-fuzz" | |||
4 | version = "0.0.1" | 4 | version = "0.0.1" |
5 | authors = ["rust-analyzer developers"] | 5 | authors = ["rust-analyzer developers"] |
6 | publish = false | 6 | publish = false |
7 | edition = "2018" | ||
7 | 8 | ||
8 | [package.metadata] | 9 | [package.metadata] |
9 | cargo-fuzz = true | 10 | cargo-fuzz = true |
10 | 11 | ||
11 | [dependencies.ra_syntax] | 12 | [dependencies] |
12 | path = ".." | 13 | ra_syntax = { path = ".." } |
13 | [dependencies.libfuzzer-sys] | 14 | libfuzzer-sys = { git = "https://github.com/rust-fuzz/libfuzzer-sys.git" } |
14 | git = "https://github.com/rust-fuzz/libfuzzer-sys.git" | ||
15 | 15 | ||
16 | # Prevent this from interfering with workspaces | 16 | # Prevent this from interfering with workspaces |
17 | [workspace] | 17 | [workspace] |
diff --git a/crates/ra_syntax/fuzz/fuzz_targets/parser.rs b/crates/ra_syntax/fuzz/fuzz_targets/parser.rs index 4667d5579..76a8b08d0 100644 --- a/crates/ra_syntax/fuzz/fuzz_targets/parser.rs +++ b/crates/ra_syntax/fuzz/fuzz_targets/parser.rs | |||
@@ -1,9 +1,9 @@ | |||
1 | #![no_main] | 1 | #![no_main] |
2 | #[macro_use] extern crate libfuzzer_sys; | 2 | use libfuzzer_sys::fuzz_target; |
3 | extern crate ra_syntax; | 3 | use ra_syntax::fuzz::check_parser; |
4 | 4 | ||
5 | fuzz_target!(|data: &[u8]| { | 5 | fuzz_target!(|data: &[u8]| { |
6 | if let Ok(text) = std::str::from_utf8(data) { | 6 | if let Ok(text) = std::str::from_utf8(data) { |
7 | ra_syntax::check_fuzz_invariants(text) | 7 | check_parser(text) |
8 | } | 8 | } |
9 | }); | 9 | }); |
diff --git a/crates/ra_syntax/src/fuzz.rs b/crates/ra_syntax/src/fuzz.rs new file mode 100644 index 000000000..03f453a6e --- /dev/null +++ b/crates/ra_syntax/src/fuzz.rs | |||
@@ -0,0 +1,12 @@ | |||
1 | use crate::{SourceFile, validation, AstNode}; | ||
2 | |||
3 | fn check_file_invariants(file: &SourceFile) { | ||
4 | let root = file.syntax(); | ||
5 | validation::validate_block_structure(root); | ||
6 | let _ = file.errors(); | ||
7 | } | ||
8 | |||
9 | pub fn check_parser(text: &str) { | ||
10 | let file = SourceFile::parse(text); | ||
11 | check_file_invariants(&file); | ||
12 | } | ||
diff --git a/crates/ra_syntax/src/lib.rs b/crates/ra_syntax/src/lib.rs index 7334d53ef..4f3020440 100644 --- a/crates/ra_syntax/src/lib.rs +++ b/crates/ra_syntax/src/lib.rs | |||
@@ -29,6 +29,8 @@ mod ptr; | |||
29 | 29 | ||
30 | pub mod algo; | 30 | pub mod algo; |
31 | pub mod ast; | 31 | pub mod ast; |
32 | #[doc(hidden)] | ||
33 | pub mod fuzz; | ||
32 | 34 | ||
33 | pub use rowan::{SmolStr, TextRange, TextUnit}; | 35 | pub use rowan::{SmolStr, TextRange, TextUnit}; |
34 | pub use ra_parser::SyntaxKind; | 36 | pub use ra_parser::SyntaxKind; |
@@ -83,13 +85,6 @@ impl SourceFile { | |||
83 | } | 85 | } |
84 | } | 86 | } |
85 | 87 | ||
86 | pub fn check_fuzz_invariants(text: &str) { | ||
87 | let file = SourceFile::parse(text); | ||
88 | let root = file.syntax(); | ||
89 | validation::validate_block_structure(root); | ||
90 | let _ = file.errors(); | ||
91 | } | ||
92 | |||
93 | /// This test does not assert anything and instead just shows off the crate's | 88 | /// This test does not assert anything and instead just shows off the crate's |
94 | /// API. | 89 | /// API. |
95 | #[test] | 90 | #[test] |
diff --git a/crates/ra_syntax/tests/test.rs b/crates/ra_syntax/tests/test.rs index 458740c13..3de4a65af 100644 --- a/crates/ra_syntax/tests/test.rs +++ b/crates/ra_syntax/tests/test.rs | |||
@@ -8,7 +8,7 @@ use std::{ | |||
8 | }; | 8 | }; |
9 | 9 | ||
10 | use test_utils::{project_dir, dir_tests, read_text, collect_tests}; | 10 | use test_utils::{project_dir, dir_tests, read_text, collect_tests}; |
11 | use ra_syntax::{SourceFile, AstNode, check_fuzz_invariants}; | 11 | use ra_syntax::{SourceFile, AstNode, fuzz}; |
12 | 12 | ||
13 | #[test] | 13 | #[test] |
14 | fn lexer_tests() { | 14 | fn lexer_tests() { |
@@ -47,7 +47,7 @@ fn parser_tests() { | |||
47 | #[test] | 47 | #[test] |
48 | fn parser_fuzz_tests() { | 48 | fn parser_fuzz_tests() { |
49 | for (_, text) in collect_tests(&test_data_dir(), &["parser/fuzz-failures"]) { | 49 | for (_, text) in collect_tests(&test_data_dir(), &["parser/fuzz-failures"]) { |
50 | check_fuzz_invariants(&text) | 50 | fuzz::check_parser(&text) |
51 | } | 51 | } |
52 | } | 52 | } |
53 | 53 | ||