diff options
Diffstat (limited to '')
-rw-r--r-- | src/go/collectors/go.d.plugin/modules/nvidia_smi/nvidia_smi_test.go | 561 |
1 files changed, 561 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/nvidia_smi/nvidia_smi_test.go b/src/go/collectors/go.d.plugin/modules/nvidia_smi/nvidia_smi_test.go new file mode 100644 index 000000000..af2d3a159 --- /dev/null +++ b/src/go/collectors/go.d.plugin/modules/nvidia_smi/nvidia_smi_test.go @@ -0,0 +1,561 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package nvidia_smi + +import ( + "errors" + "fmt" + "os" + "testing" + + "github.com/netdata/netdata/go/go.d.plugin/agent/module" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var ( + dataConfigJSON, _ = os.ReadFile("testdata/config.json") + dataConfigYAML, _ = os.ReadFile("testdata/config.yaml") + + dataXMLRTX2080Win, _ = os.ReadFile("testdata/rtx-2080-win.xml") + dataXMLRTX4090Driver535, _ = os.ReadFile("testdata/rtx-4090-driver-535.xml") + dataXMLRTX3060, _ = os.ReadFile("testdata/rtx-3060.xml") + dataXMLTeslaP100, _ = os.ReadFile("testdata/tesla-p100.xml") + + dataXMLA100SXM4MIG, _ = os.ReadFile("testdata/a100-sxm4-mig.xml") + + dataHelpQueryGPU, _ = os.ReadFile("testdata/help-query-gpu.txt") + dataCSVTeslaP100, _ = os.ReadFile("testdata/tesla-p100.csv") +) + +func Test_testDataIsValid(t *testing.T) { + for name, data := range map[string][]byte{ + "dataConfigJSON": dataConfigJSON, + "dataConfigYAML": dataConfigYAML, + "dataXMLRTX2080Win": dataXMLRTX2080Win, + "dataXMLRTX4090Driver535": dataXMLRTX4090Driver535, + "dataXMLRTX3060": dataXMLRTX3060, + "dataXMLTeslaP100": dataXMLTeslaP100, + "dataXMLA100SXM4MIG": dataXMLA100SXM4MIG, + "dataHelpQueryGPU": dataHelpQueryGPU, + "dataCSVTeslaP100": dataCSVTeslaP100, + } { + require.NotNil(t, data, name) + } +} + +func TestNvidiaSMI_ConfigurationSerialize(t *testing.T) { + module.TestConfigurationSerialize(t, &NvidiaSMI{}, dataConfigJSON, dataConfigYAML) +} + +func TestNvidiaSMI_Init(t *testing.T) { + tests := map[string]struct { + prepare func(nv *NvidiaSMI) + wantFail bool + }{ + "fails if can't local nvidia-smi": { + wantFail: true, + prepare: func(nv *NvidiaSMI) { + nv.binName += "!!!" + }, + }, + } + + for name, test := range tests { + t.Run(name, func(t *testing.T) { + nv := New() + + test.prepare(nv) + + if test.wantFail { + assert.Error(t, nv.Init()) + } else { + assert.NoError(t, nv.Init()) + } + }) + } +} + +func TestNvidiaSMI_Charts(t *testing.T) { + assert.NotNil(t, New().Charts()) +} + +func TestNvidiaSMI_Check(t *testing.T) { + tests := map[string]struct { + prepare func(nv *NvidiaSMI) + wantFail bool + }{ + "success A100-SXM4 MIG [XML]": { + wantFail: false, + prepare: prepareCaseMIGA100formatXML, + }, + "success RTX 3060 [XML]": { + wantFail: false, + prepare: prepareCaseRTX3060formatXML, + }, + "success Tesla P100 [XML]": { + wantFail: false, + prepare: prepareCaseTeslaP100formatXML, + }, + "success Tesla P100 [CSV]": { + wantFail: false, + prepare: prepareCaseTeslaP100formatCSV, + }, + "success RTX 2080 Win [XML]": { + wantFail: false, + prepare: prepareCaseRTX2080WinFormatXML, + }, + "fail on queryGPUInfoXML error": { + wantFail: true, + prepare: prepareCaseErrOnQueryGPUInfoXML, + }, + "fail on queryGPUInfoCSV error": { + wantFail: true, + prepare: prepareCaseErrOnQueryGPUInfoCSV, + }, + "fail on queryHelpQueryGPU error": { + wantFail: true, + prepare: prepareCaseErrOnQueryHelpQueryGPU, + }, + } + + for name, test := range tests { + t.Run(name, func(t *testing.T) { + nv := New() + + test.prepare(nv) + + if test.wantFail { + assert.Error(t, nv.Check()) + } else { + assert.NoError(t, nv.Check()) + } + }) + } +} + +func TestNvidiaSMI_Collect(t *testing.T) { + type testCaseStep struct { + prepare func(nv *NvidiaSMI) + check func(t *testing.T, nv *NvidiaSMI) + } + tests := map[string][]testCaseStep{ + "success A100-SXM4 MIG [XML]": { + { + prepare: prepareCaseMIGA100formatXML, + check: func(t *testing.T, nv *NvidiaSMI) { + mx := nv.Collect() + + expected := map[string]int64{ + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_bar1_memory_usage_free": 68718428160, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_bar1_memory_usage_used": 1048576, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_frame_buffer_memory_usage_free": 42273341440, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_frame_buffer_memory_usage_reserved": 634388480, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_frame_buffer_memory_usage_used": 39845888, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_graphics_clock": 1410, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_mem_clock": 1215, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_mig_current_mode_disabled": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_mig_current_mode_enabled": 1, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_mig_devices_count": 2, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_pcie_bandwidth_usage_rx": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_pcie_bandwidth_usage_tx": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_pcie_bandwidth_utilization_rx": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_pcie_bandwidth_utilization_tx": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P0": 1, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P1": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P10": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P11": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P12": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P13": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P14": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P15": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P2": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P3": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P4": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P5": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P6": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P7": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P8": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_performance_state_P9": 0, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_power_draw": 66, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_sm_clock": 1410, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_temperature": 36, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_video_clock": 1275, + "gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_voltage": 881, + "mig_instance_1_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_bar1_memory_usage_free": 34358689792, + "mig_instance_1_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_bar1_memory_usage_used": 0, + "mig_instance_1_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_ecc_error_sram_uncorrectable": 0, + "mig_instance_1_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_frame_buffer_memory_usage_free": 20916994048, + "mig_instance_1_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_frame_buffer_memory_usage_reserved": 0, + "mig_instance_1_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_frame_buffer_memory_usage_used": 19922944, + "mig_instance_2_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_bar1_memory_usage_free": 34358689792, + "mig_instance_2_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_bar1_memory_usage_used": 0, + "mig_instance_2_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_ecc_error_sram_uncorrectable": 0, + "mig_instance_2_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_frame_buffer_memory_usage_free": 20916994048, + "mig_instance_2_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_frame_buffer_memory_usage_reserved": 0, + "mig_instance_2_gpu_GPU-27b94a00-ed54-5c24-b1fd-1054085de32a_frame_buffer_memory_usage_used": 19922944, + } + + assert.Equal(t, expected, mx) + }, + }, + }, + "success RTX 4090 Driver 535 [XML]": { + { + prepare: prepareCaseRTX4090Driver535formatXML, + check: func(t *testing.T, nv *NvidiaSMI) { + mx := nv.Collect() + + expected := map[string]int64{ + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_bar1_memory_usage_free": 267386880, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_bar1_memory_usage_used": 1048576, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_decoder_utilization": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_encoder_utilization": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_fan_speed_perc": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_frame_buffer_memory_usage_free": 25390219264, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_frame_buffer_memory_usage_reserved": 362807296, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_frame_buffer_memory_usage_used": 2097152, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_gpu_utilization": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_graphics_clock": 210, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_mem_clock": 405, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_mem_utilization": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_pcie_bandwidth_usage_rx": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_pcie_bandwidth_usage_tx": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_pcie_bandwidth_utilization_rx": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_pcie_bandwidth_utilization_tx": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P0": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P1": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P10": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P11": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P12": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P13": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P14": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P15": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P2": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P3": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P4": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P5": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P6": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P7": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P8": 1, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_performance_state_P9": 0, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_power_draw": 26, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_sm_clock": 210, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_temperature": 40, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_video_clock": 1185, + "gpu_GPU-71d1acc2-662d-2166-bf9f-65272d2fc437_voltage": 880, + } + + assert.Equal(t, expected, mx) + }, + }, + }, + "success RTX 3060 [XML]": { + { + prepare: prepareCaseRTX3060formatXML, + check: func(t *testing.T, nv *NvidiaSMI) { + mx := nv.Collect() + + expected := map[string]int64{ + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_bar1_memory_usage_free": 8586788864, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_bar1_memory_usage_used": 3145728, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_decoder_utilization": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_encoder_utilization": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_frame_buffer_memory_usage_free": 6228541440, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_frame_buffer_memory_usage_reserved": 206569472, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_frame_buffer_memory_usage_used": 5242880, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_gpu_utilization": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_graphics_clock": 210, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_mem_clock": 405, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_mem_utilization": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_pcie_bandwidth_usage_rx": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_pcie_bandwidth_usage_tx": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_pcie_bandwidth_utilization_rx": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_pcie_bandwidth_utilization_tx": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P0": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P1": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P10": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P11": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P12": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P13": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P14": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P15": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P2": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P3": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P4": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P5": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P6": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P7": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P8": 1, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_performance_state_P9": 0, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_power_draw": 8, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_sm_clock": 210, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_temperature": 45, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_video_clock": 555, + "gpu_GPU-473d8d0f-d462-185c-6b36-6fc23e23e571_voltage": 631, + } + + assert.Equal(t, expected, mx) + }, + }, + }, + "success Tesla P100 [XML]": { + { + prepare: prepareCaseTeslaP100formatXML, + check: func(t *testing.T, nv *NvidiaSMI) { + mx := nv.Collect() + + expected := map[string]int64{ + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_bar1_memory_usage_free": 17177772032, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_bar1_memory_usage_used": 2097152, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_decoder_utilization": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_encoder_utilization": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_frame_buffer_memory_usage_free": 17070817280, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_frame_buffer_memory_usage_reserved": 108003328, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_frame_buffer_memory_usage_used": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_gpu_utilization": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_graphics_clock": 405, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_mem_clock": 715, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_mem_utilization": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_pcie_bandwidth_usage_rx": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_pcie_bandwidth_usage_tx": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_pcie_bandwidth_utilization_rx": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_pcie_bandwidth_utilization_tx": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P0": 1, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P1": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P10": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P11": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P12": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P13": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P14": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P15": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P2": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P3": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P4": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P5": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P6": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P7": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P8": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_performance_state_P9": 0, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_power_draw": 26, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_sm_clock": 405, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_temperature": 38, + "gpu_GPU-d3da8716-eaab-75db-efc1-60e88e1cd55e_video_clock": 835, + } + + assert.Equal(t, expected, mx) + }, + }, + }, + "success Tesla P100 [CSV]": { + { + prepare: prepareCaseTeslaP100formatCSV, + check: func(t *testing.T, nv *NvidiaSMI) { + mx := nv.Collect() + + expected := map[string]int64{ + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_frame_buffer_memory_usage_free": 17070817280, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_frame_buffer_memory_usage_reserved": 108003328, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_frame_buffer_memory_usage_used": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_gpu_utilization": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_graphics_clock": 405, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_mem_clock": 715, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_mem_utilization": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P0": 1, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P1": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P10": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P11": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P12": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P13": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P14": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P15": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P2": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P3": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P4": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P5": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P6": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P7": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P8": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_performance_state_P9": 0, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_power_draw": 28, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_sm_clock": 405, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_temperature": 37, + "gpu_GPU-ef1b2c9b-38d8-2090-2bd1-f567a3eb42a6_video_clock": 835, + } + + assert.Equal(t, expected, mx) + }, + }, + }, + "success RTX 2080 Win [XML]": { + { + prepare: prepareCaseRTX2080WinFormatXML, + check: func(t *testing.T, nv *NvidiaSMI) { + mx := nv.Collect() + + expected := map[string]int64{ + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_bar1_memory_usage_free": 266338304, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_bar1_memory_usage_used": 2097152, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_decoder_utilization": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_encoder_utilization": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_fan_speed_perc": 37, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_frame_buffer_memory_usage_free": 7494172672, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_frame_buffer_memory_usage_reserved": 190840832, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_frame_buffer_memory_usage_used": 903872512, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_gpu_utilization": 2, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_graphics_clock": 193, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_mem_clock": 403, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_mem_utilization": 7, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_pcie_bandwidth_usage_rx": 93184000, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_pcie_bandwidth_usage_tx": 13312000, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_pcie_bandwidth_utilization_rx": 59, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_pcie_bandwidth_utilization_tx": 8, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P0": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P1": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P10": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P11": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P12": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P13": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P14": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P15": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P2": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P3": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P4": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P5": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P6": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P7": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P8": 1, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_performance_state_P9": 0, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_power_draw": 14, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_sm_clock": 193, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_temperature": 29, + "gpu_GPU-fbd55ed4-1eec-4423-0a47-ad594b4333e3_video_clock": 539, + } + + assert.Equal(t, expected, mx) + }, + }, + }, + "fail on queryGPUInfoXML error [XML]": { + { + prepare: prepareCaseErrOnQueryGPUInfoXML, + check: func(t *testing.T, nv *NvidiaSMI) { + mx := nv.Collect() + + assert.Equal(t, map[string]int64(nil), mx) + }, + }, + }, + "fail on queryGPUInfoCSV error [CSV]": { + { + prepare: prepareCaseErrOnQueryGPUInfoCSV, + check: func(t *testing.T, nv *NvidiaSMI) { + mx := nv.Collect() + + assert.Equal(t, map[string]int64(nil), mx) + }, + }, + }, + "fail on queryHelpQueryGPU error": { + { + prepare: prepareCaseErrOnQueryHelpQueryGPU, + check: func(t *testing.T, nv *NvidiaSMI) { + mx := nv.Collect() + + assert.Equal(t, map[string]int64(nil), mx) + }, + }, + }, + } + + for name, test := range tests { + t.Run(name, func(t *testing.T) { + nv := New() + + for i, step := range test { + t.Run(fmt.Sprintf("step[%d]", i), func(t *testing.T) { + step.prepare(nv) + step.check(t, nv) + }) + } + }) + } +} + +type mockNvidiaSMI struct { + gpuInfoXML []byte + errOnQueryGPUInfoXML bool + + gpuInfoCSV []byte + errOnQueryGPUInfoCSV bool + + helpQueryGPU []byte + errOnQueryHelpQueryGPU bool +} + +func (m *mockNvidiaSMI) queryGPUInfoXML() ([]byte, error) { + if m.errOnQueryGPUInfoXML { + return nil, errors.New("error on mock.queryGPUInfoXML()") + } + return m.gpuInfoXML, nil +} + +func (m *mockNvidiaSMI) queryGPUInfoCSV(_ []string) ([]byte, error) { + if m.errOnQueryGPUInfoCSV { + return nil, errors.New("error on mock.queryGPUInfoCSV()") + } + return m.gpuInfoCSV, nil +} + +func (m *mockNvidiaSMI) queryHelpQueryGPU() ([]byte, error) { + if m.errOnQueryHelpQueryGPU { + return nil, errors.New("error on mock.queryHelpQueryGPU()") + } + return m.helpQueryGPU, nil +} + +func prepareCaseMIGA100formatXML(nv *NvidiaSMI) { + nv.UseCSVFormat = false + nv.exec = &mockNvidiaSMI{gpuInfoXML: dataXMLA100SXM4MIG} +} + +func prepareCaseRTX3060formatXML(nv *NvidiaSMI) { + nv.UseCSVFormat = false + nv.exec = &mockNvidiaSMI{gpuInfoXML: dataXMLRTX3060} +} + +func prepareCaseRTX4090Driver535formatXML(nv *NvidiaSMI) { + nv.UseCSVFormat = false + nv.exec = &mockNvidiaSMI{gpuInfoXML: dataXMLRTX4090Driver535} +} + +func prepareCaseTeslaP100formatXML(nv *NvidiaSMI) { + nv.UseCSVFormat = false + nv.exec = &mockNvidiaSMI{gpuInfoXML: dataXMLTeslaP100} +} + +func prepareCaseRTX2080WinFormatXML(nv *NvidiaSMI) { + nv.UseCSVFormat = false + nv.exec = &mockNvidiaSMI{gpuInfoXML: dataXMLRTX2080Win} +} + +func prepareCaseErrOnQueryGPUInfoXML(nv *NvidiaSMI) { + nv.UseCSVFormat = false + nv.exec = &mockNvidiaSMI{errOnQueryGPUInfoXML: true} +} + +func prepareCaseTeslaP100formatCSV(nv *NvidiaSMI) { + nv.UseCSVFormat = true + nv.exec = &mockNvidiaSMI{helpQueryGPU: dataHelpQueryGPU, gpuInfoCSV: dataCSVTeslaP100} +} + +func prepareCaseErrOnQueryHelpQueryGPU(nv *NvidiaSMI) { + nv.UseCSVFormat = true + nv.exec = &mockNvidiaSMI{errOnQueryHelpQueryGPU: true} +} + +func prepareCaseErrOnQueryGPUInfoCSV(nv *NvidiaSMI) { + nv.UseCSVFormat = true + nv.exec = &mockNvidiaSMI{helpQueryGPU: dataHelpQueryGPU, errOnQueryGPUInfoCSV: true} +} |