fn test_get_host_stats()

in nfm-controller/src/events/host_stats_provider.rs [304:420]


    fn test_get_host_stats() {
        // Set our command expectations.
        let mut fake_runner = FakeCommandRunner::new();
        fake_runner.add_expectation(
            "ethtool",
            &["-S", "eth1"],
            Ok(Output {
                status: ExitStatus::from_raw(0),
                stdout: format!(ethtool_template!(), 5, 6, 9, 7, 8, 10)
                    .as_bytes()
                    .to_vec(),
                stderr: vec![],
            }),
        );
        fake_runner.add_expectation(
            "ethtool",
            &["-S", "eth2"],
            Ok(Output {
                status: ExitStatus::from_raw(0),
                stdout: format!(ethtool_template!(), 55, 66, 99, 77, 88, 1010)
                    .as_bytes()
                    .to_vec(),
                stderr: vec![],
            }),
        );

        // Build what we expect should be loaded.
        let device1 = NetworkDevice {
            interface_id: "id1".to_string(),
            device_name: "eth1".to_string(),
        };
        let device2 = NetworkDevice {
            interface_id: "id2".to_string(),
            device_name: "eth2".to_string(),
        };
        let expected_stats1 = NetworkInterfaceStats {
            bw_in_allowance_exceeded: 5,
            bw_out_allowance_exceeded: 6,
            conntrack_allowance_exceeded: 7,
            linklocal_allowance_exceeded: 8,
            pps_allowance_exceeded: 9,
            conntrack_allowance_available: 10,
        };
        let expected_stats2 = NetworkInterfaceStats {
            bw_in_allowance_exceeded: 55,
            bw_out_allowance_exceeded: 66,
            conntrack_allowance_exceeded: 77,
            linklocal_allowance_exceeded: 88,
            pps_allowance_exceeded: 99,
            conntrack_allowance_available: 1010,
        };

        // Do work.
        let mut host_stats_provider = HostStatsProviderImpl {
            network_interface_stats: HashMap::new(),
            command_runner: Box::new(fake_runner.clone()),
        };
        host_stats_provider.set_network_devices(&[device1.clone(), device2.clone()]);

        // Validate stats initially loaded.
        let mut expected_internal_stats = HashMap::<NetworkDevice, NetworkInterfaceStats>::new();
        expected_internal_stats.insert(device1, expected_stats1);
        expected_internal_stats.insert(device2, expected_stats2);
        assert_eq!(
            host_stats_provider.network_interface_stats,
            expected_internal_stats
        );

        // Mimic an error for eth1 and the linklocal value changed for eth2.
        fake_runner.add_expectation(
            "ethtool",
            &["-S", "eth1"],
            Err(std::io::Error::new(
                std::io::ErrorKind::TimedOut,
                "fake-error",
            )),
        );
        fake_runner.add_expectation(
            "ethtool",
            &["-S", "eth2"],
            Ok(Output {
                status: ExitStatus::from_raw(0),
                stdout: format!(ethtool_template!(), 55, 66, 99, 77, 89, 1010)
                    .as_bytes()
                    .to_vec(),
                stderr: vec![],
            }),
        );
        let mut expected_stats = HostStats {
            interface_stats: vec![
                // eth1 values show no change after command failure.
                GroupedInterfaceStats {
                    interface_id: "id1".to_string(),
                    stats: NetworkInterfaceStats {
                        conntrack_allowance_available: 10,
                        ..Default::default()
                    },
                },
                // eth2 values represent the diff on command success.
                GroupedInterfaceStats {
                    interface_id: "id2".to_string(),
                    stats: NetworkInterfaceStats {
                        linklocal_allowance_exceeded: 1,
                        conntrack_allowance_available: 1010,
                        ..Default::default()
                    },
                },
            ],
        };

        // Do work again, and validate.
        assert_eq!(
            host_stats_provider.get_stats().interface_stats.sort(),
            expected_stats.interface_stats.sort()
        );
        assert!(fake_runner.expectations.lock().unwrap().is_empty());
    }