|
31 | 31 |
|
32 | 32 | from nodescraper.enums.systeminteraction import SystemInteractionLevel |
33 | 33 | from nodescraper.plugins.inband.amdsmi.amdsmi_collector import AmdSmiCollector |
| 34 | +from nodescraper.plugins.inband.amdsmi.amdsmidata import AmdSmiDataModel |
| 35 | +from nodescraper.plugins.inband.amdsmi.collector_args import AmdSmiCollectorArgs |
| 36 | + |
| 37 | + |
| 38 | +def test_collector_args_instantiation(): |
| 39 | + """Test AmdSmiCollectorArgs can be instantiated with and without cper_file_path""" |
| 40 | + |
| 41 | + args2 = AmdSmiCollectorArgs(cper_file_path="/path/to/test.cper") |
| 42 | + assert args2.cper_file_path == "/path/to/test.cper" |
| 43 | + |
| 44 | + |
| 45 | +def test_data_model_cper_afid_field(): |
| 46 | + """Test AmdSmiDataModel accepts cper_afid field""" |
| 47 | + data1 = AmdSmiDataModel(cper_afid=12345) |
| 48 | + assert data1.cper_afid == 12345 |
| 49 | + |
| 50 | + data2 = AmdSmiDataModel() |
| 51 | + assert data2.cper_afid is None |
| 52 | + |
| 53 | + data3 = AmdSmiDataModel(**{"cper_afid": 99999}) |
| 54 | + assert data3.cper_afid == 99999 |
34 | 55 |
|
35 | 56 |
|
36 | 57 | def make_cmd_result(stdout: str, stderr: str = "", exit_code: int = 0) -> MagicMock: |
@@ -483,3 +504,116 @@ def mock_single_json(cmd: str) -> MagicMock: |
483 | 504 | assert isinstance(result, list) |
484 | 505 | assert len(result) == 1 |
485 | 506 | assert result[0]["tool"] == "amdsmi" |
| 507 | + |
| 508 | + |
| 509 | +def test_get_cper_afid_success(conn_mock, system_info, monkeypatch): |
| 510 | + """Test successful AFID retrieval from CPER file""" |
| 511 | + |
| 512 | + def mock_run_sut_cmd(cmd: str) -> MagicMock: |
| 513 | + if "which amd-smi" in cmd: |
| 514 | + return make_cmd_result("/usr/bin/amd-smi") |
| 515 | + if "ras --afid --cper-file" in cmd: |
| 516 | + return make_cmd_result("12345\n") |
| 517 | + return make_cmd_result("") |
| 518 | + |
| 519 | + c = AmdSmiCollector( |
| 520 | + system_info=system_info, |
| 521 | + system_interaction_level=SystemInteractionLevel.PASSIVE, |
| 522 | + connection=conn_mock, |
| 523 | + ) |
| 524 | + monkeypatch.setattr(c, "_run_sut_cmd", mock_run_sut_cmd) |
| 525 | + |
| 526 | + afid = c._get_cper_afid("/path/to/test.cper") |
| 527 | + |
| 528 | + assert afid is not None |
| 529 | + assert afid == 12345 |
| 530 | + |
| 531 | + |
| 532 | +def test_get_cper_afid_invalid_output(conn_mock, system_info, monkeypatch): |
| 533 | + """Test AFID retrieval with invalid/non-integer output""" |
| 534 | + |
| 535 | + def mock_run_sut_cmd(cmd: str) -> MagicMock: |
| 536 | + if "which amd-smi" in cmd: |
| 537 | + return make_cmd_result("/usr/bin/amd-smi") |
| 538 | + if "ras --afid --cper-file" in cmd: |
| 539 | + return make_cmd_result("not_a_number\n") |
| 540 | + return make_cmd_result("") |
| 541 | + |
| 542 | + c = AmdSmiCollector( |
| 543 | + system_info=system_info, |
| 544 | + system_interaction_level=SystemInteractionLevel.PASSIVE, |
| 545 | + connection=conn_mock, |
| 546 | + ) |
| 547 | + monkeypatch.setattr(c, "_run_sut_cmd", mock_run_sut_cmd) |
| 548 | + |
| 549 | + afid = c._get_cper_afid("/path/to/test.cper") |
| 550 | + |
| 551 | + assert afid is None |
| 552 | + |
| 553 | + |
| 554 | +def test_get_cper_afid_command_failure(conn_mock, system_info, monkeypatch): |
| 555 | + """Test AFID retrieval when command fails""" |
| 556 | + |
| 557 | + def mock_run_sut_cmd(cmd: str) -> MagicMock: |
| 558 | + if "which amd-smi" in cmd: |
| 559 | + return make_cmd_result("/usr/bin/amd-smi") |
| 560 | + if "ras --afid --cper-file" in cmd: |
| 561 | + return make_cmd_result("", stderr="Error: file not found", exit_code=1) |
| 562 | + return make_cmd_result("") |
| 563 | + |
| 564 | + c = AmdSmiCollector( |
| 565 | + system_info=system_info, |
| 566 | + system_interaction_level=SystemInteractionLevel.PASSIVE, |
| 567 | + connection=conn_mock, |
| 568 | + ) |
| 569 | + monkeypatch.setattr(c, "_run_sut_cmd", mock_run_sut_cmd) |
| 570 | + |
| 571 | + # _run_amd_smi returns None on non-zero exit code |
| 572 | + afid = c._get_cper_afid("/path/to/test.cper") |
| 573 | + |
| 574 | + assert afid is None |
| 575 | + |
| 576 | + |
| 577 | +def test_collect_data_with_cper_file(conn_mock, system_info, mock_commands): |
| 578 | + """Test collect_data with cper_file_path argument""" |
| 579 | + from nodescraper.plugins.inband.amdsmi.collector_args import AmdSmiCollectorArgs |
| 580 | + |
| 581 | + c = AmdSmiCollector( |
| 582 | + system_info=system_info, |
| 583 | + system_interaction_level=SystemInteractionLevel.PASSIVE, |
| 584 | + connection=conn_mock, |
| 585 | + ) |
| 586 | + |
| 587 | + # Add mock for AFID command |
| 588 | + original_mock = mock_commands |
| 589 | + |
| 590 | + def extended_mock(cmd: str) -> MagicMock: |
| 591 | + if "ras --afid --cper-file" in cmd: |
| 592 | + return make_cmd_result("99999\n") |
| 593 | + return original_mock(cmd) |
| 594 | + |
| 595 | + c._run_sut_cmd = extended_mock |
| 596 | + |
| 597 | + args = AmdSmiCollectorArgs(cper_file_path="/path/to/test.cper") |
| 598 | + result, data = c.collect_data(args) |
| 599 | + |
| 600 | + assert result is not None |
| 601 | + assert data is not None |
| 602 | + assert data.cper_afid == 99999 |
| 603 | + |
| 604 | + |
| 605 | +def test_collect_data_without_cper_file(conn_mock, system_info, mock_commands): |
| 606 | + """Test collect_data without cper_file_path argument""" |
| 607 | + |
| 608 | + c = AmdSmiCollector( |
| 609 | + system_info=system_info, |
| 610 | + system_interaction_level=SystemInteractionLevel.PASSIVE, |
| 611 | + connection=conn_mock, |
| 612 | + ) |
| 613 | + c._run_sut_cmd = mock_commands |
| 614 | + |
| 615 | + result, data = c.collect_data() |
| 616 | + |
| 617 | + assert result is not None |
| 618 | + assert data is not None |
| 619 | + assert data.cper_afid is None |
0 commit comments