Coverage Report

Created: 2025-12-31 07:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
});