1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use super::NetworkSpawnParams;
use crate::builders::VitBackendSettingsBuilder;
use crate::config::Config;
use crate::mode::interactive::{VitInteractiveCommandExec, VitUserInteractionController};
use crate::Result;
use hersir::controller::UserInteractionController;
use jortestkit::prelude::UserInteraction;
use vit_servicing_station_tests::common::data::ValidVotingTemplateGenerator;

pub fn spawn_network(
    network_spawn_params: NetworkSpawnParams,
    config: Config,
    template_generator: &mut dyn ValidVotingTemplateGenerator,
) -> Result<()> {
    let (mut vit_controller, vit_parameters) = VitBackendSettingsBuilder::default()
        .config(&config)
        .session_settings(network_spawn_params.session_settings())
        .build()?;

    let mut nodes_list = vec![];
    for spawn_param in network_spawn_params.nodes_params() {
        nodes_list.push(vit_controller.spawn_node(spawn_param)?);
    }

    let wallet_proxy =
        vit_controller.spawn_wallet_proxy_custom(&mut network_spawn_params.proxy_params())?;
    let vit_station = vit_controller.spawn_vit_station(
        vit_parameters,
        template_generator,
        config.service.version,
    )?;

    let user_integration = vit_interaction();
    let mut interaction_controller =
        UserInteractionController::new(vit_controller.hersir_controller());
    let mut vit_interaction_controller: VitUserInteractionController = Default::default();
    let nodes = interaction_controller.nodes_mut();
    nodes.extend(nodes_list);
    vit_interaction_controller.proxies_mut().push(wallet_proxy);
    vit_interaction_controller
        .vit_stations_mut()
        .push(vit_station);

    let mut command_exec = VitInteractiveCommandExec {
        controller: interaction_controller,
        vit_controller: vit_interaction_controller,
    };

    user_integration.interact(&mut command_exec)?;
    command_exec.tear_down();
    Ok(())
}

fn vit_interaction() -> UserInteraction {
    UserInteraction::new(
        "jormungandr-scenario-tests".to_string(),
        "jormungandr vit backend".to_string(),
        "type command:".to_string(),
        "exit".to_string(),
        ">".to_string(),
        vec![
            "You can control each aspect of backend:".to_string(),
            "- spawn nodes,".to_string(),
            "- send fragments,".to_string(),
            "- filter logs,".to_string(),
            "- show node stats and data.".to_string(),
        ],
    )
}