bpf-loader-lib 0.2.1

A library to load json-described ebpf programs, and automatically poll outputs from the program
Documentation
//!  SPDX-License-Identifier: MIT
//!
//! Copyright (c) 2023, eunomia-bpf
//! All rights reserved.
//!

use serde_json::{json, Value};

use crate::{
    meta::{
        DataSectionMeta, DataSectionVariableMeta, ExportedTypesStructMemberMeta,
        ExportedTypesStructMeta, MapExportConfig, MapMeta, ProgMeta,
    },
    tests::get_assets_dir,
};

use super::ComposedObject;

#[test]
fn test_deserialize_meta() {
    let json_str = std::fs::read_to_string(get_assets_dir().join("bootstrap.json")).unwrap();
    let json_val: Value = serde_json::from_str(&json_str).unwrap();
    let decoded: ComposedObject = serde_json::from_value(json_val).unwrap();
    assert_eq!(decoded.bpf_object.len(), 47496);
    let bpf_skel = &decoded.meta.bpf_skel;
    let data_section = &bpf_skel.data_sections;
    assert_eq!(data_section.len(), 2);
    assert!(data_section.contains(&DataSectionMeta {
        name: ".rodata".into(),
        variables: vec![DataSectionVariableMeta {
            name: "min_duration_ns".into(),
            ty: "unsigned long long".into(),
            value: None,
            others: json!({}),
            cmdarg: Default::default(),
            description: None
        }]
    }));
    assert!(data_section.contains(&DataSectionMeta {
        name: ".bss".into(),
        variables: vec![DataSectionVariableMeta {
            name: "__eunomia_dummy_event_ptr".into(),
            ty: "struct event *".into(),
            value: None,
            others: json!({}),
            cmdarg: Default::default(),
            description: None
        }]
    }));
    let maps = &bpf_skel.maps;
    assert_eq!(maps.len(), 4);
    assert!(maps.contains(&MapMeta {
        ident: "exec_start".into(),
        name: "exec_start".into(),
        mmaped: false,
        sample: None,
        export_config: MapExportConfig::NoExport,
        intepreter: crate::meta::BufferValueInterpreter::DefaultStruct
    }));
    assert!(maps.contains(&MapMeta {
        ident: "rb".into(),
        name: "rb".into(),
        mmaped: false,
        sample: None,
        export_config: MapExportConfig::NoExport,
        intepreter: crate::meta::BufferValueInterpreter::DefaultStruct
    }));
    assert!(maps.contains(&MapMeta {
        ident: "rodata".into(),
        name: "client_b.rodata".into(),
        mmaped: true,
        sample: None,
        export_config: MapExportConfig::NoExport,
        intepreter: crate::meta::BufferValueInterpreter::DefaultStruct
    }));
    assert!(maps.contains(&MapMeta {
        ident: "bss".into(),
        name: "client_b.bss".into(),
        mmaped: true,
        sample: None,
        export_config: MapExportConfig::NoExport,
        intepreter: crate::meta::BufferValueInterpreter::DefaultStruct
    }));
    assert_eq!(bpf_skel.obj_name, "client_bpf");
    let progs = &bpf_skel.progs;
    assert_eq!(progs.len(), 2);
    assert!(progs.contains(&ProgMeta {
        name: "handle_exec".into(),
        link: true,
        attach: "tp/sched/sched_process_exec".into(),
        others: json!({})
    }));
    assert!(progs.contains(&ProgMeta {
        name: "handle_exit".into(),
        link: true,
        attach: "tp/sched/sched_process_exit".into(),
        others: json!({})
    }));
    let export_types = &decoded.meta.export_types;
    assert_eq!(export_types.len(), 1);
    assert!(export_types.contains(&ExportedTypesStructMeta {
        name: "event".into(),
        members: vec![
            ExportedTypesStructMemberMeta {
                name: "pid".into(),
                ty: "int".into()
            },
            ExportedTypesStructMemberMeta {
                name: "ppid".into(),
                ty: "int".into()
            },
            ExportedTypesStructMemberMeta {
                name: "exit_code".into(),
                ty: "unsigned int".into()
            },
            ExportedTypesStructMemberMeta {
                name: "duration_ns".into(),
                ty: "unsigned long long".into()
            },
            ExportedTypesStructMemberMeta {
                name: "comm".into(),
                ty: "char[16]".into()
            },
            ExportedTypesStructMemberMeta {
                name: "filename".into(),
                ty: "char[127]".into()
            },
            ExportedTypesStructMemberMeta {
                name: "exit_event".into(),
                ty: "bool".into()
            },
            ExportedTypesStructMemberMeta {
                name: "et".into(),
                ty: "enum event_type".into()
            },
        ],
        size: 176,
        type_id: 613
    }));
}