/src/gitoxide/gix-merge/fuzz/fuzz_targets/blob.rs
Line | Count | Source |
1 | | #![no_main] |
2 | | use anyhow::Result; |
3 | | use arbitrary::Arbitrary; |
4 | | use gix_merge::blob::builtin_driver::text::{Conflict, ConflictStyle, Options}; |
5 | | use gix_merge::blob::Resolution; |
6 | | use libfuzzer_sys::fuzz_target; |
7 | | use std::hint::black_box; |
8 | | use std::num::NonZero; |
9 | | |
10 | 3.41k | fn fuzz_text_merge( |
11 | 3.41k | Ctx { |
12 | 3.41k | base, |
13 | 3.41k | ours, |
14 | 3.41k | theirs, |
15 | 3.41k | marker_size, |
16 | 3.41k | }: Ctx, |
17 | 3.41k | ) -> Result<()> { |
18 | 3.41k | let mut buf = Vec::new(); |
19 | 3.41k | let mut input = imara_diff::intern::InternedInput::default(); |
20 | 10.2k | for diff_algorithm in [ |
21 | 3.41k | imara_diff::Algorithm::Histogram, |
22 | 3.41k | imara_diff::Algorithm::Myers, |
23 | 3.41k | imara_diff::Algorithm::MyersMinimal, |
24 | 3.41k | ] { |
25 | 10.2k | let mut opts = Options { |
26 | 10.2k | diff_algorithm, |
27 | 10.2k | conflict: Default::default(), |
28 | 10.2k | }; |
29 | 20.4k | for (left, right) in [(ours, theirs), (theirs, ours)] { |
30 | 20.4k | let resolution = gix_merge::blob::builtin_driver::text( |
31 | 20.4k | &mut buf, |
32 | 20.4k | &mut input, |
33 | 20.4k | Default::default(), |
34 | 20.4k | left, |
35 | 20.4k | base, |
36 | 20.4k | right, |
37 | 20.4k | opts, |
38 | | ); |
39 | 20.4k | if resolution == Resolution::Conflict { |
40 | 88.1k | for conflict in [ |
41 | 17.6k | Conflict::ResolveWithOurs, |
42 | 17.6k | Conflict::ResolveWithTheirs, |
43 | 17.6k | Conflict::ResolveWithUnion, |
44 | 17.6k | Conflict::Keep { |
45 | 17.6k | style: ConflictStyle::Diff3, |
46 | 17.6k | marker_size, |
47 | 17.6k | }, |
48 | 17.6k | Conflict::Keep { |
49 | 17.6k | style: ConflictStyle::ZealousDiff3, |
50 | 17.6k | marker_size, |
51 | 17.6k | }, |
52 | 88.1k | ] { |
53 | 88.1k | opts.conflict = conflict; |
54 | 88.1k | gix_merge::blob::builtin_driver::text( |
55 | 88.1k | &mut buf, |
56 | 88.1k | &mut input, |
57 | 88.1k | Default::default(), |
58 | 88.1k | left, |
59 | 88.1k | base, |
60 | 88.1k | right, |
61 | 88.1k | opts, |
62 | 88.1k | ); |
63 | 88.1k | } |
64 | 2.85k | } |
65 | | } |
66 | | } |
67 | 3.41k | Ok(()) |
68 | 3.41k | } |
69 | | |
70 | | #[derive(Debug, Arbitrary)] |
71 | | struct Ctx<'a> { |
72 | | base: &'a [u8], |
73 | | ours: &'a [u8], |
74 | | theirs: &'a [u8], |
75 | | marker_size: NonZero<u8>, |
76 | | } |
77 | | |
78 | | fuzz_target!(|ctx: Ctx<'_>| { |
79 | | _ = black_box(fuzz_text_merge(ctx)); |
80 | | }); |