#![allow(clippy::expect_used)]
#![allow(clippy::unwrap_used)]
use ant_service_management::{ServiceStatus, StatusSummary};
use assert_cmd::cargo::cargo_bin_cmd;
use libp2p_identity::PeerId;
use std::path::PathBuf;
const CI_USER: &str = "runner";
#[cfg(unix)]
const ANTNODE_BIN_NAME: &str = "antnode";
#[cfg(windows)]
const ANTNODE_BIN_NAME: &str = "antnode.exe";
#[test]
fn cross_platform_service_install_and_control() {
let antnode_path = PathBuf::from("..")
.join("target")
.join("release")
.join(ANTNODE_BIN_NAME);
let mut cmd = cargo_bin_cmd!("antctl");
cmd.arg("add")
.arg("--local")
.arg("--user")
.arg(CI_USER)
.arg("--count")
.arg("3")
.arg("--path")
.arg(antnode_path.to_string_lossy().to_string())
.arg("--rewards-address")
.arg("0x06C4E523ebf30bc76DE246f10FBcECb4cc39D11a")
.arg("evm-arbitrum-sepolia-test")
.assert()
.success();
let registry = get_status();
assert_eq!(registry.nodes[0].service_name, "antnode1");
assert_eq!(registry.nodes[0].peer_id, None);
assert_eq!(registry.nodes[0].status, ServiceStatus::Added);
assert_eq!(registry.nodes[1].service_name, "antnode2");
assert_eq!(registry.nodes[1].peer_id, None);
assert_eq!(registry.nodes[1].status, ServiceStatus::Added);
assert_eq!(registry.nodes[2].service_name, "antnode3");
assert_eq!(registry.nodes[2].peer_id, None);
assert_eq!(registry.nodes[2].status, ServiceStatus::Added);
let mut cmd = cargo_bin_cmd!("antctl");
cmd.arg("start").assert().success();
let registry = get_status();
assert_eq!(registry.nodes[0].service_name, "antnode1");
assert_eq!(registry.nodes[0].status, ServiceStatus::Running);
assert_eq!(registry.nodes[1].service_name, "antnode2");
assert_eq!(registry.nodes[1].status, ServiceStatus::Running);
assert_eq!(registry.nodes[2].service_name, "antnode3");
assert_eq!(registry.nodes[2].status, ServiceStatus::Running);
let peer_ids = registry
.nodes
.iter()
.map(|n| n.peer_id)
.collect::<Vec<Option<PeerId>>>();
let mut cmd = cargo_bin_cmd!("antctl");
cmd.arg("stop").assert().success();
let registry = get_status();
assert_eq!(registry.nodes[0].service_name, "antnode1");
assert_eq!(registry.nodes[0].status, ServiceStatus::Stopped);
assert_eq!(registry.nodes[0].peer_id, peer_ids[0]);
assert_eq!(registry.nodes[1].service_name, "antnode2");
assert_eq!(registry.nodes[1].status, ServiceStatus::Stopped);
assert_eq!(registry.nodes[1].peer_id, peer_ids[1]);
assert_eq!(registry.nodes[2].service_name, "antnode3");
assert_eq!(registry.nodes[2].status, ServiceStatus::Stopped);
assert_eq!(registry.nodes[2].peer_id, peer_ids[2]);
let mut cmd = cargo_bin_cmd!("antctl");
cmd.arg("start").assert().success();
let registry = get_status();
assert_eq!(registry.nodes[0].service_name, "antnode1");
assert_eq!(registry.nodes[0].status, ServiceStatus::Running);
assert_eq!(registry.nodes[0].peer_id, peer_ids[0]);
assert_eq!(registry.nodes[1].service_name, "antnode2");
assert_eq!(registry.nodes[1].status, ServiceStatus::Running);
assert_eq!(registry.nodes[1].peer_id, peer_ids[1]);
assert_eq!(registry.nodes[2].service_name, "antnode3");
assert_eq!(registry.nodes[2].status, ServiceStatus::Running);
assert_eq!(registry.nodes[2].peer_id, peer_ids[2]);
let mut cmd = cargo_bin_cmd!("antctl");
cmd.arg("stop")
.arg("--peer-id")
.arg(registry.nodes[0].peer_id.unwrap().to_string())
.arg("--peer-id")
.arg(registry.nodes[2].peer_id.unwrap().to_string())
.assert()
.success();
let registry = get_status();
assert_eq!(registry.nodes[0].service_name, "antnode1");
assert_eq!(registry.nodes[0].status, ServiceStatus::Stopped);
assert_eq!(registry.nodes[0].peer_id, peer_ids[0]);
assert_eq!(registry.nodes[1].service_name, "antnode2");
assert_eq!(registry.nodes[1].status, ServiceStatus::Running);
assert_eq!(registry.nodes[1].peer_id, peer_ids[1]);
assert_eq!(registry.nodes[2].service_name, "antnode3");
assert_eq!(registry.nodes[2].status, ServiceStatus::Stopped);
assert_eq!(registry.nodes[2].peer_id, peer_ids[2]);
let mut cmd = cargo_bin_cmd!("antctl");
cmd.arg("start")
.arg("--service-name")
.arg(registry.nodes[0].service_name.clone())
.arg("--service-name")
.arg(registry.nodes[2].service_name.clone())
.assert()
.success();
let registry = get_status();
assert_eq!(registry.nodes[0].service_name, "antnode1");
assert_eq!(registry.nodes[0].status, ServiceStatus::Running);
assert_eq!(registry.nodes[0].peer_id, peer_ids[0]);
assert_eq!(registry.nodes[1].service_name, "antnode2");
assert_eq!(registry.nodes[1].status, ServiceStatus::Running);
assert_eq!(registry.nodes[1].peer_id, peer_ids[1]);
assert_eq!(registry.nodes[2].service_name, "antnode3");
assert_eq!(registry.nodes[2].status, ServiceStatus::Running);
assert_eq!(registry.nodes[2].peer_id, peer_ids[2]);
let mut cmd = cargo_bin_cmd!("antctl");
cmd.arg("stop").assert().success();
let registry = get_status();
assert_eq!(registry.nodes[0].service_name, "antnode1");
assert_eq!(registry.nodes[0].status, ServiceStatus::Stopped);
assert_eq!(registry.nodes[0].peer_id, peer_ids[0]);
assert_eq!(registry.nodes[1].service_name, "antnode2");
assert_eq!(registry.nodes[1].status, ServiceStatus::Stopped);
assert_eq!(registry.nodes[1].peer_id, peer_ids[1]);
assert_eq!(registry.nodes[2].service_name, "antnode3");
assert_eq!(registry.nodes[2].status, ServiceStatus::Stopped);
assert_eq!(registry.nodes[2].peer_id, peer_ids[2]);
let mut cmd = cargo_bin_cmd!("antctl");
cmd.arg("remove")
.arg("--service-name")
.arg(registry.nodes[0].service_name.clone())
.arg("--service-name")
.arg(registry.nodes[1].service_name.clone())
.assert()
.success();
let registry = get_status();
assert_eq!(
1,
registry
.nodes
.iter()
.filter(|n| n.status != ServiceStatus::Removed)
.count()
);
let mut cmd = cargo_bin_cmd!("antctl");
cmd.arg("remove")
.arg("--service-name")
.arg(registry.nodes[2].service_name.clone())
.assert()
.success();
}
fn get_status() -> StatusSummary {
let output = cargo_bin_cmd!("antctl")
.arg("status")
.arg("--json")
.output()
.expect("Could not retrieve service status");
let output = String::from_utf8_lossy(&output.stdout).to_string();
serde_json::from_str(&output).unwrap()
}