mithril-client 0.14.5

Mithril client library
Documentation
use std::{fs::File, io::Write, path::Path};

use slog::{Logger, warn};

use mithril_common::CardanoNetwork;

use crate::MithrilResult;

const CLEAN_FILE_NAME: &str = "clean";
const PROTOCOL_MAGIC_ID_FILENAME: &str = "protocolMagicId";

pub fn create_bootstrap_node_files(
    logger: &Logger,
    db_dir: &Path,
    network: &str,
) -> MithrilResult<()> {
    if let Err(error) = File::create(db_dir.join(CLEAN_FILE_NAME)) {
        warn!(
            logger, "Could not create clean shutdown marker file in directory '{}'", db_dir.display();
            "error" => error.to_string()
        );
    };

    if let Ok(network) = CardanoNetwork::from_code(network.to_string(), None) {
        let mut file = File::create(db_dir.join(PROTOCOL_MAGIC_ID_FILENAME))?;
        file.write_all(format!("{}", network.magic_id()).as_bytes())?;
    };

    Ok(())
}

#[cfg(test)]
mod test {
    use mithril_common::{CardanoNetwork, temp_dir};
    use slog::o;

    use super::*;

    #[test]
    fn create_bootstrap_node_files_creates_protocol_magic_id_and_clean_files_for_mainnet() {
        let db_dir = temp_dir!().join("db");
        std::fs::create_dir_all(&db_dir).unwrap();
        let network = CardanoNetwork::from_code("mainnet".to_string(), None).unwrap();
        let logger = slog::Logger::root(slog::Discard, o!());

        create_bootstrap_node_files(&logger, &db_dir, &network.to_string()).unwrap();

        let file_content =
            std::fs::read_to_string(db_dir.join(PROTOCOL_MAGIC_ID_FILENAME)).unwrap();
        assert_eq!(file_content, network.magic_id().to_string());

        assert!(db_dir.join(CLEAN_FILE_NAME).exists());
    }

    #[test]
    fn create_bootstrap_node_files_creates_protocol_magic_id_and_clean_files_for_preprod() {
        let db_dir = temp_dir!().join("db");
        std::fs::create_dir_all(&db_dir).unwrap();
        let network = CardanoNetwork::from_code("preprod".to_string(), None).unwrap();
        let logger = slog::Logger::root(slog::Discard, o!());

        create_bootstrap_node_files(&logger, &db_dir, &network.to_string()).unwrap();

        let file_content =
            std::fs::read_to_string(db_dir.join(PROTOCOL_MAGIC_ID_FILENAME)).unwrap();
        assert_eq!(file_content, network.magic_id().to_string());

        assert!(db_dir.join(CLEAN_FILE_NAME).exists());
    }

    #[test]
    fn create_bootstrap_node_files_creates_protocol_magic_id_and_clean_files_for_preview() {
        let db_dir = temp_dir!().join("db");
        std::fs::create_dir_all(&db_dir).unwrap();
        let network = CardanoNetwork::from_code("preview".to_string(), None).unwrap();
        let logger = slog::Logger::root(slog::Discard, o!());

        create_bootstrap_node_files(&logger, &db_dir, &network.to_string()).unwrap();

        let file_content =
            std::fs::read_to_string(db_dir.join(PROTOCOL_MAGIC_ID_FILENAME)).unwrap();
        assert_eq!(file_content, network.magic_id().to_string());

        assert!(db_dir.join(CLEAN_FILE_NAME).exists());
    }

    #[test]
    fn create_bootstrap_node_files_creates_protocol_magic_id_file_and_create_clean_file_for_devnet()
    {
        let db_dir = temp_dir!().join("db");
        std::fs::create_dir_all(&db_dir).unwrap();
        let network = CardanoNetwork::from_code("devnet".to_string(), Some(123)).unwrap();
        let logger = slog::Logger::root(slog::Discard, o!());

        create_bootstrap_node_files(&logger, &db_dir, &network.to_string()).unwrap();

        let file_content =
            std::fs::read_to_string(db_dir.join(PROTOCOL_MAGIC_ID_FILENAME)).unwrap();
        assert_eq!(file_content, network.magic_id().to_string());

        assert!(db_dir.join(CLEAN_FILE_NAME).exists());
    }

    #[test]
    fn create_bootstrap_node_files_does_not_create_protocol_magic_id_file_and_create_clean_file_for_private_network()
     {
        let db_dir = temp_dir!().join("db");
        std::fs::create_dir_all(&db_dir).unwrap();
        let network = CardanoNetwork::from_code("private".to_string(), Some(123)).unwrap();
        let logger = slog::Logger::root(slog::Discard, o!());

        create_bootstrap_node_files(&logger, &db_dir, &network.to_string()).unwrap();

        assert!(!db_dir.join(PROTOCOL_MAGIC_ID_FILENAME).exists());

        assert!(db_dir.join(CLEAN_FILE_NAME).exists());
    }
}