blob: 1cf767d8d86723224ceb6cf3397c3144b5866148 [file] [log] [blame]
use cargo_deny::{field_eq, func_name, test_utils::*};
/// Verifies we can detect and error on builtin globs
#[test]
fn detects_scripts_by_builtin_glob() {
let mut diags = gather_bans(
func_name!(),
KrateGather {
name: "build-bans",
features: &["scripts"],
no_default_features: true,
targets: &["x86_64-unknown-linux-gnu"],
..Default::default()
},
Config::new(
r#"
[build]
enable-builtin-globs = true
include-dependencies = true
"#,
),
);
diags.retain(|d| {
field_eq!(d, "/fields/graphs/0/Krate/name", "ring")
&& field_eq!(d, "/fields/code", "denied-by-extension")
});
insta::assert_json_snapshot!(diags);
}
/// Verifies we can detect and error on extensions provided by the user
#[test]
fn detects_scripts_by_user_extension() {
let mut diags = gather_bans(
func_name!(),
KrateGather {
name: "build-bans",
features: &[],
no_default_features: true,
targets: &["x86_64-unknown-linux-gnu"],
..Default::default()
},
Config::new("[build]\ninclude-workspace = true\nscript-extensions = ['cs']"),
);
diags.retain(|d| field_eq!(d, "/fields/graphs/0/Krate/name", "build-bans"));
insta::assert_json_snapshot!(diags);
}
/// Verifies we detect and error on scripts detected by shebang
#[test]
fn detects_scripts_by_shebang() {
let mut diags = gather_bans(
func_name!(),
KrateGather {
name: "build-bans",
features: &["mixed"],
no_default_features: true,
targets: &["x86_64-unknown-linux-gnu"],
..Default::default()
},
Config::new("[build]\ninterpreted = 'deny'"),
);
diags.retain(|d| {
field_eq!(d, "/fields/graphs/0/Krate/name", "ittapi-sys")
&& field_eq!(d, "/fields/code", "detected-executable-script")
});
insta::assert_json_snapshot!(diags);
}
/// Verifies we detect and error on native executables
#[test]
fn detects_native_executables() {
let mut diags = gather_bans(
func_name!(),
KrateGather {
name: "build-bans",
features: &["native", "curious"],
no_default_features: true,
targets: &["x86_64-unknown-linux-gnu"],
..Default::default()
},
Config::new(
r#"
[build]
enable-builtin-globs = true
include-dependencies = true
"#,
),
);
diags.retain(|d| field_eq!(d, "/fields/code", "detected-executable"));
insta::assert_json_snapshot!(diags);
}
/// Verifies user provided builscript checksums are always validated correctly
#[test]
fn detects_build_script_mismatch() {
let mut diags = gather_bans(
func_name!(),
KrateGather {
name: "build-bans",
features: &["mixed"],
no_default_features: true,
targets: &["x86_64-unknown-linux-gnu"],
..Default::default()
},
Config::new(
r#"
[[build.bypass]]
name = "ittapi-sys"
build-script = "00abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef00"
"#,
),
);
diags.retain(|d| {
field_eq!(d, "/fields/graphs/0/Krate/name", "ittapi-sys")
&& field_eq!(d, "/fields/code", "checksum-mismatch")
});
insta::assert_json_snapshot!(diags);
}
/// Verifies that matching build scripts cause the rest of the build check to be
/// skipped
#[test]
fn skips_matching_build_scripts() {
let diags = gather_bans(
func_name!(),
KrateGather {
name: "build-bans",
features: &["mixed", "scripts"],
no_default_features: true,
targets: &["x86_64-unknown-linux-gnu"],
..Default::default()
},
Config::new(
r#"
[build]
executables = "deny"
[[build.bypass]]
name = "ittapi-sys"
build-script = "474a3eb189a698475d8a6f4b358eb0790db6379aea8b8a85ac925102784cd520"
[[build.bypass]]
name = "ring"
build-script = "1a850d791184374f614d01c86c8d6c9ba0500e64cb746edc9720ceaaa1cd8eaf"
"#,
),
);
insta::assert_json_snapshot!(diags);
}
/// Verifies that build scripts are denied if not allowed nor bypassed
#[test]
fn allows_build_scripts_or_bypass() {
let diags = gather_bans(
func_name!(),
KrateGather {
name: "build-bans",
features: &["mixed", "scripts"],
no_default_features: true,
targets: &["x86_64-unknown-linux-gnu"],
..Default::default()
},
Config::new(
r#"
[build]
allow-build-scripts = ["ittapi-sys"]
executables = "allow"
[[build.bypass]]
name = "ring"
build-script = "1a850d791184374f614d01c86c8d6c9ba0500e64cb746edc9720ceaaa1cd8eaf"
"#,
),
);
insta::assert_json_snapshot!(diags);
}
/// Verifies executables are allowed by glob patterns
#[test]
fn allows_by_glob() {
let diags = gather_bans(
func_name!(),
KrateGather {
name: "build-bans",
features: &["scripts"],
no_default_features: true,
targets: &["x86_64-unknown-linux-gnu"],
..Default::default()
},
Config::new(
r#"
[build]
enable-builtin-globs = true
include-dependencies = true
[[build.bypass]]
name = "ring"
allow-globs = [
"crypto/**.pl",
"src/rsa/convert_nist_rsa_test_vectors.py",
]
"#,
),
);
insta::assert_json_snapshot!(diags);
}
/// Verifies executables are allowed by path/checksum
#[test]
fn allows_by_path() {
let mut diags = gather_bans(
func_name!(),
KrateGather {
name: "build-bans",
features: &["native"],
no_default_features: true,
targets: &["x86_64-unknown-linux-gnu"],
..Default::default()
},
Config::new(
r#"
[[build.bypass]]
name = "prost-build"
allow = [
{ path = "third-party/protobuf/protoc-linux-aarch_64", checksum = "5392f0e58ad06e089462d93304dfe82337acbbefb87a0749a7dc2ed32af04af7" },
{ path = "third-party/protobuf/protoc-linux-x86_32" },
{ path = "third-party/protobuf/protoc-linux-x86_64", checksum = "151dfe76345298b055000c31376f925222ef3426d6b7892b8156421fdd3fd3c4" },
{ path = "third-party/protobuf/protoc-osx-aarch64", checksum = "2363256459ab02d5abdda2db52e96879f9417102d14086fe852d97d0380b79ff" },
{ path = "third-party/protobuf/protoc-osx-x86_64", checksum = "e7dff9c38bf0cbcf43f055b8269ea939d6b298f611de16481ba7d3e2eec0bc2f" },
{ path = "third-party/protobuf/protoc-win32.exe", checksum = "62e803f7433799af63acf605f7fe19108d22d0c73e82a475b27d3ff0cfbf1990" },
]
"#,
),
);
diags.retain(|d| {
field_eq!(d, "/fields/graphs/0/Krate/name", "prost-build")
&& field_eq!(d, "/fields/code", "checksum-match")
});
insta::assert_json_snapshot!(diags);
}
/// Verifies unmatched configs emit diagnostics
#[test]
fn emits_unmatched_warnings() {
let mut diags = gather_bans(
func_name!(),
KrateGather {
name: "build-bans",
features: &["native"],
no_default_features: true,
targets: &["x86_64-unknown-linux-gnu"],
..Default::default()
},
Config::new(
r#"
[[build.bypass]]
name = "this-crate-does-not-exist"
[[build.bypass]]
name = "prost-build"
allow = [
{ path = "third-party/protobuf/boop", checksum = "5392f0e58ad06e089462d93304dfe82337acbbefb87a0749a7dc2ed32af04af7" },
]
allow-globs = [
"first-party/**",
"src/**.rs",
"second-party/you/*",
]
"#,
),
);
diags.retain(|d| {
field_eq!(d, "/fields/code", "unmatched-path-bypass")
|| field_eq!(d, "/fields/code", "unmatched-glob")
|| field_eq!(d, "/fields/code", "unmatched-bypass")
});
insta::assert_json_snapshot!(diags);
}