canic-core 0.100.87

Canic — a canister orchestration and management toolkit for the Internet Computer
Documentation
// Category A - Internal runtime-configured tests (ConfigTestBuilder when needed).

use crate::{
    config::schema::CanisterKind,
    dto::topology::{DirectoryEntryInput, DirectoryProvenance, FleetDirectoryInput},
    ids::{AppId, CanisterRole, CanonicalNetworkId, FleetBinding, FleetId, FleetKey},
    ops::storage::directory::fleet::FleetDirectoryOps,
    storage::stable::directory::{DirectoryEntryRecord, fleet::FleetDirectoryData},
    test::{
        config::ConfigTestBuilder,
        seams::{lock, p},
        support::import_test_env,
    },
};

fn provenance() -> DirectoryProvenance {
    DirectoryProvenance {
        fleet: FleetBinding {
            fleet: FleetKey {
                canonical_network_id: CanonicalNetworkId::ic_mainnet(),
                fleet_id: FleetId::from_generated_bytes([1; 32]),
            },
            app: AppId::from("app"),
        },
        source_root: p(20),
    }
}

fn fleet_input(entries: Vec<DirectoryEntryInput>) -> FleetDirectoryInput {
    FleetDirectoryInput {
        provenance: provenance(),
        entries,
    }
}

fn install_index_service_test_config(service_role: &CanisterRole, singleton_role: &CanisterRole) {
    let _config = ConfigTestBuilder::new()
        .with_default_canister_kind(service_role.clone(), CanisterKind::Service)
        .with_default_canister_kind(singleton_role.clone(), CanisterKind::Singleton)
        .install();
    import_test_env(
        service_role.clone(),
        crate::ids::ComponentSpecId::try_from(String::from("default"))
            .expect("default Component Spec ID"),
        p(20),
    );
}

fn clear_fleet_directory() {
    FleetDirectoryOps::import_trusted_partial(FleetDirectoryData {
        entries: Vec::new(),
    })
    .expect("clear Fleet Directory");
}

#[test]
fn incomplete_index_imports_reject_roles_outside_configured_service_sets() {
    let _guard = lock();

    let service_role = CanisterRole::new("project_hub");
    let singleton_role = CanisterRole::new("project_ledger");
    let service_pid = p(21);
    let singleton_pid = p(22);

    install_index_service_test_config(&service_role, &singleton_role);
    clear_fleet_directory();

    FleetDirectoryOps::import_args_allow_incomplete(fleet_input(vec![DirectoryEntryInput {
        role: service_role.clone(),
        pid: service_pid,
    }]))
    .expect("configured app service role should import");
    FleetDirectoryOps::import_args_allow_incomplete(fleet_input(vec![DirectoryEntryInput {
        role: singleton_role.clone(),
        pid: singleton_pid,
    }]))
    .expect_err("Fleet Directory should reject roles outside explicit fleet_directory");

    FleetDirectoryOps::import(FleetDirectoryData {
        entries: vec![DirectoryEntryRecord {
            role: service_role.clone(),
            pid: service_pid,
        }],
    })
    .expect("full Fleet Directory import should accept exact configured role set");
    FleetDirectoryOps::import(FleetDirectoryData {
        entries: vec![
            DirectoryEntryRecord {
                role: service_role.clone(),
                pid: service_pid,
            },
            DirectoryEntryRecord {
                role: singleton_role,
                pid: singleton_pid,
            },
        ],
    })
    .expect_err("full Fleet Directory import should reject roles outside explicit fleet_directory");

    assert_eq!(FleetDirectoryOps::get(&service_role), Some(service_pid));
}

#[test]
fn local_index_filters_drop_roles_outside_configured_service_sets() {
    let _guard = lock();

    let service_role = CanisterRole::new("project_hub");
    let singleton_role = CanisterRole::new("project_ledger");
    let service_pid = p(21);
    let singleton_pid = p(22);

    install_index_service_test_config(&service_role, &singleton_role);

    let filtered_app = FleetDirectoryOps::filter_args_for_local_config(fleet_input(vec![
        DirectoryEntryInput {
            role: service_role.clone(),
            pid: service_pid,
        },
        DirectoryEntryInput {
            role: singleton_role,
            pid: singleton_pid,
        },
    ]))
    .expect("filter Fleet Directory for local config");
    assert_eq!(filtered_app.entries.len(), 1);
    assert_eq!(&filtered_app.entries[0].role, &service_role);
}