canic-host 0.100.12

Host-side App build, Fleet install, deployment, and release-set library for Canic workspaces
Documentation
use super::*;
use crate::test_support::temp_dir;
use canic_core::{ids::BuildNetwork, role_contract::CanicFeatureKey};

#[test]
fn generated_fleet_coordinator_wrapper_satisfies_its_runtime_only_contract() {
    let root = temp_dir("canic-generated-fleet-coordinator-contract");
    let workspace_root = Path::new(env!("CARGO_MANIFEST_DIR")).join("../..");
    let context = WorkspaceBuildContext {
        role: FLEET_COORDINATOR_ROLE.to_string(),
        profile: CanisterBuildProfile::Fast,
        environment: "test".to_string(),
        build_network: BuildNetwork::Ic,
        workspace_root: workspace_root.clone(),
        icp_root: root.clone(),
        config_path: workspace_root.join("canic.toml"),
        local_replica: None,
        refresh_canonical_wasm_store_did: false,
        release_build_id: None,
    };

    let manifest_path = ensure_generated_wrapper(&context).expect("generate Coordinator wrapper");
    let manifest = fs::read_to_string(&manifest_path).expect("read generated manifest");
    let runtime = fs::read_to_string(
        manifest_path
            .parent()
            .expect("wrapper manifest parent")
            .join("src/lib.rs"),
    )
    .expect("read generated runtime");

    assert!(manifest.contains("app = \"fleet_coordinator\""));
    assert!(manifest.contains("role = \"fleet_coordinator\""));
    assert!(manifest.contains("default-features = false"));
    assert!(manifest.contains("features = [\"fleet-coordinator-canister\"]"));
    assert!(!manifest.contains("[build-dependencies]"));
    assert_eq!(
        runtime,
        "canic::start_fleet_coordinator!();\ncanic::finish!();\n"
    );

    let validation =
        validate_built_in_fleet_coordinator_package(&manifest_path, PackageValidationMode::Build);
    let RolePackageValidation::Supported(evidence) = validation else {
        panic!("generated wrapper should satisfy the package contract: {validation:?}");
    };
    assert_eq!(
        evidence.direct_features,
        std::collections::BTreeSet::from([CanicFeatureKey::FleetCoordinatorCanister])
    );

    fs::remove_dir_all(root).expect("clean temp dir");
}