canic-host 0.99.15

Host-side App build, Fleet install, deployment, and release-set library for Canic workspaces
Documentation
use super::*;
use canic_core::ids::BuildNetwork;

#[test]
fn resolve_root_canister_operation_owns_current_install_evidence() {
    let operation = ResolveRootCanisterOperation::new(
        Path::new("/workspace/.icp"),
        "local",
        "root",
        Path::new("/workspace/apps/demo/canic.toml"),
        None,
    );

    let evidence = operation.evidence("aaaaa-aa");

    assert_eq!(evidence, ["root_target:root", "root_canister:aaaaa-aa"]);
}

#[test]
fn build_install_targets_operation_owns_current_install_evidence() {
    let context = test_build_context();
    let targets = [build_target("root"), build_target("wasm_store")];
    let operation = BuildInstallTargetsOperation::new(&context, &targets);

    assert_eq!(
        operation.evidence(),
        ["build_target:root", "build_target:wasm_store"]
    );
    assert_eq!(operation.role_names(), ["root", "wasm_store"]);
}

#[test]
fn emit_root_manifest_operation_owns_current_install_evidence() {
    let snapshot = RootReleaseSetBuildSnapshot {
        icp_root: PathBuf::from("/workspace"),
        manifest_path: PathBuf::from("/workspace/.icp/local/canisters/root/root.release-set.json"),
        release_version: "0.91.0".to_string(),
        targets: Vec::new(),
    };
    let _operation = EmitRootManifestOperation::new(&snapshot, &[]);

    let evidence = EmitRootManifestOperation::evidence(Path::new(
        "/workspace/.icp/local/canisters/root.release-set.json",
    ));

    assert_eq!(
        evidence,
        ["manifest_path:/workspace/.icp/local/canisters/root.release-set.json"]
    );
}

fn build_target(role: &str) -> InstallBuildTarget {
    let artifact_root = PathBuf::from("/workspace/.icp/local/canisters").join(role);
    InstallBuildTarget {
        role: role.to_string(),
        spec: CanisterArtifactBuildSpec {
            role: role.to_string(),
            package_name: format!("canister_{role}"),
            package_manifest_path: PathBuf::from("/workspace/apps")
                .join(role)
                .join("Cargo.toml"),
            wasm_path: artifact_root.join(format!("{role}.wasm")),
            wasm_gz_path: artifact_root.join(format!("{role}.wasm.gz")),
            did_path: artifact_root.join(format!("{role}.did")),
            artifact_root,
        },
    }
}

#[test]
fn install_root_wasm_operation_owns_current_install_evidence() {
    let root = temp_dir("canic-install-root-operation-evidence");
    fs::create_dir_all(&root).expect("create temp root");
    let root_wasm = root.join("root.wasm");
    fs::write(&root_wasm, b"root wasm").expect("write root Wasm");
    let operation = InstallRootWasmOperation::new(
        &root,
        "local",
        "aaaaa-aa",
        root_wasm.clone(),
        &sample_fleet_activation_identity(),
        None,
    )
    .expect("prepare root install operation");

    let evidence = operation.evidence();

    assert!(evidence.contains(&"root_canister:aaaaa-aa".to_string()));
    assert!(evidence.contains(&format!("root_wasm:{}", root_wasm.display())));
    assert!(evidence.iter().any(|item| {
        item.strip_prefix("expected_module_hash:")
            .is_some_and(|hash| hash.len() == 64)
    }));

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

fn test_build_context() -> WorkspaceBuildContext {
    WorkspaceBuildContext {
        role: "root".to_string(),
        profile: CanisterBuildProfile::Fast,
        environment: "local".to_string(),
        build_network: BuildNetwork::Local,
        workspace_root: PathBuf::from("/workspace"),
        icp_root: PathBuf::from("/workspace/.icp"),
        config_path: PathBuf::from("/workspace/apps/demo/canic.toml"),
        local_replica: None,
        refresh_canonical_wasm_store_did: false,
        release_build_id: None,
    }
}

#[test]
fn current_install_activation_records_verified_root_before_advancing_the_journal() {
    let activation = include_str!("../../activation/mod.rs");

    assert_before(
        activation,
        "run_operation_with_receipt(&install_operation, Some(root_canister_id))",
        "admit_root_install_receipt(&completed_root_install.receipt_path)",
    );
    assert_before(
        activation,
        "admit_root_install_receipt(&completed_root_install.receipt_path)",
        "record_root_installed(receipt_scope.icp_root, activation, &receipt)",
    );
}