antivm 1.2.0

Anti virtualmachine or sites for check you program
mod agent;
mod builder;
mod checks;
mod config;
mod ipapi;
mod protection;

pub use builder::ProtectionBuilder;
pub use protection::Protection;

#[cfg(test)]
mod tests {
    use super::*;
    use crate::config::{
        ALLOWED_COUNTRIES, BLOCKED_COUNTRIES, MIN_RAM_BYTES, VM_DRIVERS,
    };

    #[test]
    fn blocked_countries_not_empty() {
        assert!(!BLOCKED_COUNTRIES.is_empty());
    }

    #[test]
    fn cis_countries_not_blocked() {
        for code in ALLOWED_COUNTRIES {
            assert!(
                !BLOCKED_COUNTRIES.contains(code),
                "Country {code} was incorrectly added to the block list"
            );
        }
    }

    #[test]
    fn us_is_blocked() {
        assert!(BLOCKED_COUNTRIES.contains(&"US"));
    }

    #[test]
    fn vm_drivers_not_empty() {
        assert!(!VM_DRIVERS.is_empty());
    }

    #[test]
    fn vm_drivers_contain_vbox_and_vmware() {
        assert!(VM_DRIVERS.contains(&"VBoxGuest.sys"));
        assert!(VM_DRIVERS.contains(&"VBoxService.exe"));
        assert!(VM_DRIVERS.contains(&"vmxnet3.sys"));
        assert!(VM_DRIVERS.contains(&"vmci.sys"));
        assert!(VM_DRIVERS.contains(&"pvscsi.sys"));
    }

    #[test]
    fn min_ram_is_4gb() {
        assert_eq!(MIN_RAM_BYTES, 4 * 1024 * 1024 * 1024);
    }

    #[test]
    fn disabled_filters_do_not_exit() {
        ProtectionBuilder::new()
            .set_ip(false)
            .set_http(false)
            .set_vm(false)
            .set_network(false)
            .set_screen(false)
            .set_cpu(false)
            .set_ram(false)
            .init();
    }

    #[test]
    fn filtered_callback_runs_instead_of_exit() {
        use std::cell::Cell;
        use std::rc::Rc;

        let called = Rc::new(Cell::new(false));
        let flag = Rc::clone(&called);
        let protection = Protection {
            ip_filter:       false,
            http_filter:     false,
            network_filter:  false,
            vm_filter:       false,
            screen_filter:   false,
            cpu_filter:      false,
            ram_filter:      false,
            http_url:        String::new(),
            ip_api_url:      String::new(),
            timeout_secs:    1,
            filter_callback: Some(Box::new(move || flag.set(true))),
        };
        protection.on_fail();
        assert!(called.get());
    }
}