use exonum::runtime::{SnapshotExt, SUPERVISOR_INSTANCE_ID};
use exonum_testkit::{ApiKind, Spec, TestKit, TestKitBuilder};
use exonum_supervisor::{ConfigPropose, Schema, Supervisor, SupervisorConfig};
use crate::{config_api::create_proposal, utils::CFG_CHANGE_HEIGHT};
fn assert_supervisor_config(testkit: &TestKit, config: SupervisorConfig) {
let snapshot = testkit.snapshot();
let schema: Schema<_> = snapshot.service_schema(Supervisor::NAME).unwrap();
let current_config = schema.configuration.get().unwrap();
assert_eq!(current_config, config);
}
#[test]
fn initial_configuration() {
let testkit = TestKitBuilder::validator()
.with(Supervisor::simple())
.build();
assert_supervisor_config(&testkit, Supervisor::simple_config());
let testkit = TestKitBuilder::validator()
.with(Supervisor::decentralized())
.build();
assert_supervisor_config(&testkit, Supervisor::decentralized_config());
}
#[test]
#[should_panic(expected = "Invalid configuration for supervisor.")]
fn incorrect_configuration() {
let incorrect_config = vec![0x12, 0x34]; let bogus_spec = Spec::new(Supervisor).with_instance(
SUPERVISOR_INSTANCE_ID,
Supervisor::NAME,
incorrect_config,
);
TestKitBuilder::validator().with(bogus_spec).build();
}
#[tokio::test]
async fn configure_call() {
let mut testkit = TestKitBuilder::validator()
.with(Supervisor::simple())
.build();
let config_proposal = ConfigPropose::new(0, CFG_CHANGE_HEIGHT)
.service_config(SUPERVISOR_INSTANCE_ID, Supervisor::decentralized_config());
create_proposal(&testkit.api(), config_proposal).await;
testkit.create_blocks_until(CFG_CHANGE_HEIGHT.next());
assert_supervisor_config(&testkit, Supervisor::decentralized_config());
}
#[tokio::test]
async fn supervisor_config_api() {
let mut testkit = TestKitBuilder::validator()
.with(Supervisor::simple())
.build();
assert_eq!(
testkit
.api()
.private(ApiKind::Service("supervisor"))
.get::<SupervisorConfig>("supervisor-config")
.await
.unwrap(),
Supervisor::simple_config(),
);
let mut testkit = TestKitBuilder::validator()
.with(Supervisor::decentralized())
.build();
assert_eq!(
testkit
.api()
.private(ApiKind::Service("supervisor"))
.get::<SupervisorConfig>("supervisor-config")
.await
.unwrap(),
Supervisor::decentralized_config(),
);
}