You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
aya/test/integration-test/src/tests/btf_relocations.rs

63 lines
2.8 KiB
Rust

use test_case::test_case;
use aya::{maps::Array, programs::UProbe, util::KernelVersion, BpfLoader, Btf, Endianness};
#[test_case("enum_signed_32", false, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), -0x7AAAAAAAi32 as u64)]
#[test_case("enum_signed_32", true, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), -0x7BBBBBBBi32 as u64)]
#[test_case("enum_signed_64", false, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), -0xAAAAAAABBBBBBBBi64 as u64)]
#[test_case("enum_signed_64", true, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), -0xCCCCCCCDDDDDDDDi64 as u64)]
#[test_case("enum_unsigned_32", false, None, 0xAAAAAAAA)]
#[test_case("enum_unsigned_32", true, None, 0xBBBBBBBB)]
#[test_case("enum_unsigned_64", false, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), 0xAAAAAAAABBBBBBBB)]
#[test_case("enum_unsigned_64", true, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), 0xCCCCCCCCDDDDDDDD)]
#[test_case("field", false, None, 2)]
#[test_case("field", true, None, 1)]
#[test_case("pointer", false, None, 42)]
#[test_case("pointer", true, None, 21)]
#[test_case("struct_flavors", false, None, 1)]
#[test_case("struct_flavors", true, None, 2)]
fn relocation_tests(
program: &str,
with_relocations: bool,
required_kernel_version: Option<(KernelVersion, &str)>,
expected: u64,
) {
if let Some((required_kernel_version, commit)) = required_kernel_version {
let current_kernel_version = KernelVersion::current().unwrap();
if current_kernel_version < required_kernel_version {
eprintln!("skipping test on kernel {current_kernel_version:?}, support for {program} was added in {required_kernel_version:?}; see {commit}");
return;
}
}
let mut bpf = BpfLoader::new()
.btf(
with_relocations
.then(|| Btf::parse(crate::RELOC_BTF, Endianness::default()).unwrap())
.as_ref(),
)
.load(crate::RELOC_BPF)
.unwrap();
let program: &mut UProbe = bpf.program_mut(program).unwrap().try_into().unwrap();
program.load().unwrap();
program
.attach(
Some("trigger_btf_relocations_program"),
0,
"/proc/self/exe",
None,
)
.unwrap();
trigger_btf_relocations_program();
let output_map: Array<_, u64> = bpf.take_map("output_map").unwrap().try_into().unwrap();
let key = 0;
assert_eq!(output_map.get(&key, 0).unwrap(), expected)
}
#[no_mangle]
#[inline(never)]
pub extern "C" fn trigger_btf_relocations_program() {
core::hint::black_box(trigger_btf_relocations_program);
}