/Users/ramseymcgrath/code/PCILeechFWGenerator/tests/test_behavior_profiler.py:186: Test requires Linux with ftrace support/Users/ramseymcgrath/code/PCILeechFWGenerator/tests/test_behavior_profiler.py:254: Test requires Linux with ftrace support/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/unittest/mock.py:1048: in assert_any_call raise AssertionError( E AssertionError: run('make -s') call not found During handling of the above exception, another exception occurred: tests/test_build.py:121: in test_get_donor_info_success mock_run.assert_any_call("make -s") E AssertionError: run('make -s') call not foundtests/test_build.py:136: in test_get_donor_info_missing_fields with pytest.raises(SystemExit): E Failed: DID NOT RAISE <class 'SystemExit'>tests/test_build.py:146: in test_get_donor_info_malformed_output with pytest.raises(SystemExit): E Failed: DID NOT RAISE <class 'SystemExit'>tests/test_build.py:235: in test_integrate_behavior_profile_success assert "behavioral_timing" in enhanced_regs[0]["context"] E AssertionError: assert 'behavioral_timing' in {'access_pattern': 'write_then_read', 'dependencies': ['reg_status'], 'function': 'init_device', 'sequences': [{'function': 'init_device', 'operation': 'write', 'position': 0, 'total_ops': 3}], ...}tests/test_build.py:455: in test_build_tcl_unsupported_bar_size assert "128K" in tcl_content E assert '128K' in '#\n# PCILeech FPGA Build Script - Compatibility Mode\n#\n\n# Device configuration\n# Vendor ID: 0x8086\n# Device ID: 0x1533\n\ncreate_project test_project . -force\n\n# Set device properties\nset_property -name "VENDOR_ID" -value "0x8086" [current_project]\nset_property -name "DEVICE_ID" -value "0x1533" [current_project]\nset_property -name "SUBSYSTEM_VENDOR_ID" -value "0x8086" [current_project]\nset_property -name "SUBSYSTEM_ID" -value "0x0000" [current_project]\nset_property -name "REVISION_ID" -value "0x03" [current_project]\n\n# BAR Configuration\n# BAR Size: 128_KB\nset_property -name "BAR0_SIZE" -value "128_KB" [current_project]\n\n# Create \'sources_1\' fileset\ncreate_fileset -srcset sources_1\n\n# Include source files\nadd_files -fileset sources_1 -norecurse [file normalize "${origin_dir}/pcileech_tlps128_bar_controller.sv"]\nadd_files -fileset sources_1 -norecurse [file normalize "${origin_dir}/pcileech_tlps128_cfgspace_shadow.sv"]\nadd_files -fileset sources_1 -norecurse [file normalize "${origin_dir}/config_space_init.hex"]\n\n# MSIX Configuration\nset_property -name "MSIX_CAP_ENABLE" -value "1" [current_project]\nset_property -name "MSIX_CAP_TABLE_SIZE" -value "64" [current_project]\nset_property -name "MSIX_CAP_TABLE_BIR" -value "0" [current_project]\n'/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/unittest/mock.py:988: in assert_called_once_with raise AssertionError(msg) E AssertionError: Expected 'run' to be called once. Called 0 times. During handling of the above exception, another exception occurred: tests/test_build.py:509: in test_run_command_success mock_run.assert_called_once_with("echo test", shell=True, check=True) E AssertionError: Expected 'run' to be called once. Called 0 times.tests/test_build.py:516: in test_run_command_failure with pytest.raises(subprocess.CalledProcessError): E Failed: DID NOT RAISE <class 'subprocess.CalledProcessError'>tests/test_build.py:597: in test_malformed_register_data with pytest.raises((ValueError, TypeError)): E Failed: DID NOT RAISE (<class 'ValueError'>, <class 'TypeError'>)tests/test_build_integration.py:271: in test_full_build_workflow_with_example_data build.build_sv(enhanced_regs, sv_file) E NameError: name 'build' is not definedtests/test_build_integration.py:319: in test_behavior_profiling_integration enhanced_regs = build.integrate_behavior_profile( E NameError: name 'build' is not definedtests/test_build_integration.py:585: in test_build_script_with_example_files if hasattr(build, "build_fpga"): E NameError: name 'build' is not definedtests/test_build_integration.py:620: in test_tcl_script_execution_with_example build.run(cmd) E NameError: name 'build' is not definedtests/test_capability_pruning_enhanced.py:443: in test_complex_capability_configuration self.assertIsNotNone(find_cap(pruned_config, PCICapabilityID.PCI_EXPRESS.value)) E AssertionError: unexpectedly Nonetests/test_capability_pruning_enhanced.py:362: in test_extended_capability_pruning self.assertEqual(len(ext_caps), 4) E AssertionError: 1 != 4tests/test_capability_pruning_enhanced.py:176: in test_pruning_specific_capability_types self.assertEqual(len(caps), 5) E AssertionError: 1 != 5tests/test_capability_pruning_integration.py:310: in test_capability_pruning_integration self.assertTrue(os.path.exists(self.config_hex_path)) E AssertionError: False is not true/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/unittest/mock.py:956: in assert_called_once raise AssertionError(msg) E AssertionError: Expected 'get_donor_info' to have been called once. Called 0 times. During handling of the above exception, another exception occurred: tests/test_config_space_integration.py:130: in test_build_process_integration mock_get_donor_info.assert_called_once() E AssertionError: Expected 'get_donor_info' to have been called once. Called 0 times.tests/test_config_space_shadow.py:64: in test_save_config_space_hex self.assertEqual(len(lines), 512) E AssertionError: 1024 != 512tests/test_feature_integration.py:412: in test_all_features_integration self.assertTrue(os.path.exists(self.config_hex_path)) E AssertionError: False is not truetests/test_feature_integration.py:199: in test_msix_table_replication self.assertIn("MSIX_CAP_TABLE_OFFSET", tcl_content) E AssertionError: 'MSIX_CAP_TABLE_OFFSET' not found in '#\n# PCILeech FPGA Build Script - Compatibility Mode\n#\n\n# Device configuration\n# Vendor ID: 0x8086\n# Device ID: 0x1533\n\ncreate_project test_project . -force\n\n# Set device properties\nset_property -name "VENDOR_ID" -value "0x8086" [current_project]\nset_property -name "DEVICE_ID" -value "0x1533" [current_project]\nset_property -name "SUBSYSTEM_VENDOR_ID" -value "0x8086" [current_project]\nset_property -name "SUBSYSTEM_ID" -value "0x0000" [current_project]\nset_property -name "REVISION_ID" -value "0x03" [current_project]\n\n# BAR Configuration\n# BAR Size: 128_KB\nset_property -name "BAR0_SIZE" -value "128_KB" [current_project]\n\n# Create \'sources_1\' fileset\ncreate_fileset -srcset sources_1\n\n# Include source files\nadd_files -fileset sources_1 -norecurse [file normalize "${origin_dir}/pcileech_tlps128_bar_controller.sv"]\nadd_files -fileset sources_1 -norecurse [file normalize "${origin_dir}/pcileech_tlps128_cfgspace_shadow.sv"]\nadd_files -fileset sources_1 -norecurse [file normalize "${origin_dir}/config_space_init.hex"]\n\n# MSIX Configuration\nset_property -name "MSIX_CAP_ENABLE" -value "1" [current_project]\nset_property -name "MSIX_CAP_TABLE_SIZE" -value "64" [current_project]\nset_property -name "MSIX_CAP_TABLE_BIR" -value "0" [current_project]\n'tests/test_generate.py:64: in test_list_pci_devices_success devices = generate.list_pci_devices() generate.py:96: in list_pci_devices check_linux_requirement("PCIe device enumeration") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: PCIe device enumeration requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_generate.py:83: in test_list_pci_devices_empty devices = generate.list_pci_devices() generate.py:96: in list_pci_devices check_linux_requirement("PCIe device enumeration") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: PCIe device enumeration requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_generate.py:90: in test_list_pci_devices_malformed devices = generate.list_pci_devices() generate.py:96: in list_pci_devices check_linux_requirement("PCIe device enumeration") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: PCIe device enumeration requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_generate.py:129: in test_get_current_driver_exists driver = generate.get_current_driver("0000:03:00.0") generate.py:132: in get_current_driver check_linux_requirement("Driver detection") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: Driver detection requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_generate.py:138: in test_get_current_driver_none driver = generate.get_current_driver("0000:03:00.0") generate.py:132: in get_current_driver check_linux_requirement("Driver detection") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: Driver detection requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_generate.py:144: in test_get_current_driver_invalid_bdf generate.get_current_driver("invalid-bdf") generate.py:132: in get_current_driver check_linux_requirement("Driver detection") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: Driver detection requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_generate.py:153: in test_get_iommu_group group = generate.get_iommu_group("0000:03:00.0") generate.py:147: in get_iommu_group check_linux_requirement("IOMMU group detection") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: IOMMU group detection requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_generate.py:162: in test_get_iommu_group_invalid_bdf generate.get_iommu_group("invalid-bdf") generate.py:147: in get_iommu_group check_linux_requirement("IOMMU group detection") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: IOMMU group detection requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_generate.py:174: in test_bind_to_vfio_success generate.bind_to_vfio("0000:03:00.0", "8086", "1533", "e1000e") generate.py:303: in bind_to_vfio check_linux_requirement("VFIO device binding") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: VFIO device binding requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_generate.py:189: in test_bind_to_vfio_no_original_driver generate.bind_to_vfio("0000:03:00.0", "8086", "1533", None) generate.py:303: in bind_to_vfio check_linux_requirement("VFIO device binding") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: VFIO device binding requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_generate.py:203: in test_bind_to_vfio_driver_not_available generate.bind_to_vfio("0000:03:00.0", "8086", "1533", "e1000e") generate.py:303: in bind_to_vfio check_linux_requirement("VFIO device binding") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: VFIO device binding requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support. During handling of the above exception, another exception occurred: tests/test_generate.py:202: in test_bind_to_vfio_driver_not_available with pytest.raises(RuntimeError, match="vfio-pci driver not available"): E AssertionError: Regex pattern did not match. E Regex: 'vfio-pci driver not available' E Input: 'VFIO device binding requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.'tests/test_generate.py:208: in test_bind_to_vfio_invalid_bdf generate.bind_to_vfio("invalid-bdf", "8086", "1533", "e1000e") generate.py:303: in bind_to_vfio check_linux_requirement("VFIO device binding") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: VFIO device binding requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support./Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/unittest/mock.py:1014: in assert_has_calls raise AssertionError( E AssertionError: Calls not found. E Expected: [call('echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind'), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind')] E Actual: [call('echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind', timeout=10), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind', timeout=10), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind', timeout=10), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind', timeout=10), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind', timeout=10), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind', timeout=10)] During handling of the above exception, another exception occurred: tests/test_generate.py:230: in test_restore_original_driver_success mock_run.assert_has_calls(expected_calls) E AssertionError: Calls not found. E Expected: [call('echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind'), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind')] E Actual: [call('echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind', timeout=10), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind', timeout=10), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind', timeout=10), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind', timeout=10), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind', timeout=10), E call('echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind', timeout=10)] E E pytest introspection follows: E E Kwargs: E assert {'timeout': 10} == {} E E Left contains 1 more item: E #x1B[0m{#x1B[33m'#x1B[39;49;00m#x1B[33mtimeout#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m: #x1B[94m10#x1B[39;49;00m}#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[91m- {}#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ {#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ 'timeout': 10,#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ }#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E Args: E assert ('echo 0000:0...-pci/unbind',) == ('echo 0000:0...e1000e/bind',) E E At index 0 diff: #x1B[0m#x1B[33m'#x1B[39;49;00m#x1B[33mecho 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[90m#x1B[39;49;00m != #x1B[0m#x1B[33m'#x1B[39;49;00m#x1B[33mecho 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[90m #x1B[39;49;00m (#x1B[90m#x1B[39;49;00m E #x1B[91m- 'echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind',#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E ? ^^^^^^#x1B[90m#x1B[39;49;00m... E E ...Full output truncated (3 lines hidden), use '-vv' to show E Kwargs: E assert {'timeout': 10} == {} E E Left contains 1 more item: E #x1B[0m{#x1B[33m'#x1B[39;49;00m#x1B[33mtimeout#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m: #x1B[94m10#x1B[39;49;00m}#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[91m- {}#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ {#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ 'timeout': 10,#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ }#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E Args: E assert ('echo 0000:0...-pci/unbind',) == () E E Left contains one more item: #x1B[0m#x1B[33m'#x1B[39;49;00m#x1B[33mecho 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[91m- ()#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ (#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ 'echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind',#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ )#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E Kwargs: E assert {'timeout': 10} == {} E E Left contains 1 more item: E #x1B[0m{#x1B[33m'#x1B[39;49;00m#x1B[33mtimeout#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m: #x1B[94m10#x1B[39;49;00m}#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[91m- {}#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ {#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ 'timeout': 10,#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ }#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E Args: E assert ('echo 0000:0...e1000e/bind',) == () E E Left contains one more item: #x1B[0m#x1B[33m'#x1B[39;49;00m#x1B[33mecho 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[91m- ()#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ (#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ 'echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind',#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ )#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E Kwargs: E assert {'timeout': 10} == {} E E Left contains 1 more item: E #x1B[0m{#x1B[33m'#x1B[39;49;00m#x1B[33mtimeout#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m: #x1B[94m10#x1B[39;49;00m}#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[91m- {}#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ {#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ 'timeout': 10,#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ }#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E Args: E assert ('echo 0000:0...e1000e/bind',) == () E E Left contains one more item: #x1B[0m#x1B[33m'#x1B[39;49;00m#x1B[33mecho 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[91m- ()#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ (#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ 'echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind',#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ )#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E Kwargs: E assert {'timeout': 10} == {} E E Left contains 1 more item: E #x1B[0m{#x1B[33m'#x1B[39;49;00m#x1B[33mtimeout#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m: #x1B[94m10#x1B[39;49;00m}#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[91m- {}#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ {#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ 'timeout': 10,#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ }#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E Args: E assert ('echo 0000:0...e1000e/bind',) == () E E Left contains one more item: #x1B[0m#x1B[33m'#x1B[39;49;00m#x1B[33mecho 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[91m- ()#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ (#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ 'echo 0000:03:00.0 > /sys/bus/pci/drivers/e1000e/bind',#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ )#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E Kwargs: E assert {'timeout': 10} == {} E E Left contains 1 more item: E #x1B[0m{#x1B[33m'#x1B[39;49;00m#x1B[33mtimeout#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m: #x1B[94m10#x1B[39;49;00m}#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[91m- {}#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ {#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ 'timeout': 10,#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ }#x1B[39;49;00m#x1B[90m#x1B[39;49;00mtests/test_generate.py:365: in test_run_build_container_success generate.run_build_container("0000:03:00.0", "75t", "/dev/vfio/15", mock_args) generate.py:717: in run_build_container _validate_vfio_device_access(vfio_device, bdf) generate.py:645: in _validate_vfio_device_access current_driver = get_current_driver(bdf) generate.py:132: in get_current_driver check_linux_requirement("Driver detection") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: Driver detection requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_generate.py:394: in test_run_build_container_no_vfio_device generate.run_build_container( generate.py:704: in run_build_container _validate_container_environment() generate.py:658: in _validate_container_environment raise RuntimeError(error_msg) E RuntimeError: Podman not found in PATH. Please install Podman container runtime. During handling of the above exception, another exception occurred: tests/test_generate.py:393: in test_run_build_container_no_vfio_device with pytest.raises(RuntimeError, match="VFIO device .* not found"): E AssertionError: Regex pattern did not match. E Regex: 'VFIO device .* not found' E Input: 'Podman not found in PATH. Please install Podman container runtime.'tests/test_generate.py:435: in test_run_build_container_with_advanced_features generate.run_build_container("0000:03:00.0", "75t", "/dev/vfio/15", mock_args) generate.py:717: in run_build_container _validate_vfio_device_access(vfio_device, bdf) generate.py:645: in _validate_vfio_device_access current_driver = get_current_driver(bdf) generate.py:132: in get_current_driver check_linux_requirement("Driver detection") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: Driver detection requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support./Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/unittest/mock.py:988: in assert_called_once_with raise AssertionError(msg) E AssertionError: Expected 'generate_donor_info' to be called once. Called 0 times. During handling of the above exception, another exception occurred: tests/test_local_build.py:41: in test_default_donor_dump_behavior mock_generate.assert_called_once_with("generic") E AssertionError: Expected 'generate_donor_info' to be called once. Called 0 times./Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/unittest/mock.py:988: in assert_called_once_with raise AssertionError(msg) E AssertionError: Expected 'generate_donor_info' to be called once. Called 0 times. During handling of the above exception, another exception occurred: tests/test_local_build.py:152: in test_generate_synthetic_donor_info mock_generate_donor_info.assert_called_once_with("network") E AssertionError: Expected 'generate_donor_info' to be called once. Called 0 times./Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/unittest/mock.py:956: in assert_called_once raise AssertionError(msg) E AssertionError: Expected 'generate_donor_info' to have been called once. Called 0 times. During handling of the above exception, another exception occurred: tests/test_local_build.py:195: in test_donor_info_file_validation mock_generate.assert_called_once() E AssertionError: Expected 'generate_donor_info' to have been called once. Called 0 times.src/build_compat.py:533: in validate_donor_info int(donor_info["device_id"], 16) E ValueError: invalid literal for int() with base 16: '0xXYZ' During handling of the above exception, another exception occurred: tests/test_pci_validation.py:107: in test_validate_donor_info_invalid_format result = build.validate_donor_info(invalid_info) src/build_compat.py:539: in validate_donor_info sys.exit(1) E SystemExit: 1/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/unittest/mock.py:988: in assert_called_once_with raise AssertionError(msg) E AssertionError: Expected 'validate_donor_info' to be called once. Called 0 times. During handling of the above exception, another exception occurred: tests/test_pci_validation.py:134: in test_get_donor_info_calls_validation mock_validate.assert_called_once_with(mock_donor_info) E AssertionError: Expected 'validate_donor_info' to be called once. Called 0 times.tests/test_vfio_binding.py:30: in test_bind_to_vfio_already_bound generate.bind_to_vfio("0000:03:00.0", "8086", "1533", "vfio-pci") generate.py:303: in bind_to_vfio check_linux_requirement("VFIO device binding") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: VFIO device binding requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_vfio_binding.py:70: in test_bind_to_vfio_bind_error_but_already_bound generate.bind_to_vfio("0000:03:00.0", "8086", "1533", original_driver) generate.py:303: in bind_to_vfio check_linux_requirement("VFIO device binding") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: VFIO device binding requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.tests/test_vfio_binding_enhanced.py:260: in test_restore_original_driver_retry_logic assert mock_run.call_count == 3 E AssertionError: assert 4 == 3 E + where 4 = <MagicMock name='run_command' id='4402554464'>.call_counttests/test_vfio_binding_enhanced.py:367: in test_bind_to_vfio_maximum_retries generate.bind_to_vfio("0000:03:00.0", "8086", "1533", "e1000e") generate.py:303: in bind_to_vfio check_linux_requirement("VFIO device binding") generate.py:87: in check_linux_requirement raise RuntimeError( E RuntimeError: VFIO device binding requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support. During handling of the above exception, another exception occurred: tests/test_vfio_binding_enhanced.py:366: in test_bind_to_vfio_maximum_retries with pytest.raises(RuntimeError, match="Failed to bind to vfio-pci after .* attempts"): E AssertionError: Regex pattern did not match. E Regex: 'Failed to bind to vfio-pci after .* attempts' E Input: 'VFIO device binding requires Linux. Current platform: Darwin. Please run this on a Linux system with VFIO support.'tests/test_vivado_utils.py:83: in test_find_vivado_in_common_locations assert result is not None E assert None is not Nonetests/test_vivado_utils.py:115: in test_find_vivado_from_environment_variable result = find_vivado_installation() src/vivado_utils.py:112: in find_vivado_installation version = next( src/vivado_utils.py:113: in <genexpr> (p for p in path_parts if p[0].isdigit() and "." in p), "unknown" E IndexError: string index out of rangetests/tui/test_tui_core.py:135: in test_assess_device_suitability assert score > 0.8 E assert 0.7999999999999999 > 0.8tests/tui/test_tui_core.py:264: in test_save_and_load_profile assert profile_file.exists() E AssertionError: assert False E + where False = exists() E + where exists = PosixPath('/var/folders/pz/zdq1ptxs0h3700ssftp1vlch0000gn/T/tmpv4n0iltu/Test_Profile.json').exists/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/unittest/mock.py:956: in assert_called_once raise AssertionError(msg) E AssertionError: Expected '_run_command' to have been called once. Called 2 times. E Calls: [call('git --version'), E call('git clone https://github.com/ufrisk/pcileech-fpga.git /Users/ramseymcgrath/.cache/pcileech-fw-generator/repos/pcileech-fpga')]. During handling of the above exception, another exception occurred: tests/tui/test_tui_core.py:522: in test_ensure_git_repo mock_run_command.assert_called_once() E AssertionError: Expected '_run_command' to have been called once. Called 2 times. E Calls: [call('git --version'), E call('git clone https://github.com/ufrisk/pcileech-fpga.git /Users/ramseymcgrath/.cache/pcileech-fw-generator/repos/pcileech-fpga')]. E E pytest introspection follows: E E Args: E assert ('git clone h...ileech-fpga',) == () E E Left contains one more item: #x1B[0m#x1B[33m'#x1B[39;49;00m#x1B[33mgit clone https://github.com/ufrisk/pcileech-fpga.git /Users/ramseymcgrath/.cache/pcileech-fw-generator/repos/pcileech-fpga#x1B[39;49;00m#x1B[33m'#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E E Full diff: E #x1B[0m#x1B[91m- ()#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ (#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ 'git clone https://github.com/ufrisk/pcileech-fpga.git '#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ '/Users/ramseymcgrath/.cache/pcileech-fw-generator/repos/pcileech-fpga',#x1B[39;49;00m#x1B[90m#x1B[39;49;00m E #x1B[92m+ )#x1B[39;49;00m#x1B[90m#x1B[39;49;00mtests/tui/test_tui_main.py:160: in test_tui_app_init assert app.selected_device is None /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:275: in __get__ self._initialize_reactive(obj, self.name) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:199: in _initialize_reactive self._check_watchers(obj, name, default) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:367: in _check_watchers invoke_watcher(obj, public_watch_function, old_value, value) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:91: in invoke_watcher watch_result = cast(WatchCallbackNewValueType, watch_function)(value) src/tui/main.py:946: in watch_selected_device self._clear_compatibility_display() src/tui/main.py:1067: in _clear_compatibility_display compatibility_title = self.query_one("#compatibility-title", Static) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/dom.py:1465: in query_one base_node = self._get_dom_base() /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:870: in _get_dom_base return self.default_screen /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:883: in default_screen return self.screen if self._compose_screen is None else self._compose_screen /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:1472: in screen raise ScreenStackError("No screens on stack") from None E textual.app.ScreenStackError: No screens on stacktests/tui/test_tui_main.py:175: in test_app_properties assert hasattr(app, "selected_device") /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:275: in __get__ self._initialize_reactive(obj, self.name) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:199: in _initialize_reactive self._check_watchers(obj, name, default) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:367: in _check_watchers invoke_watcher(obj, public_watch_function, old_value, value) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:91: in invoke_watcher watch_result = cast(WatchCallbackNewValueType, watch_function)(value) src/tui/main.py:946: in watch_selected_device self._clear_compatibility_display() src/tui/main.py:1067: in _clear_compatibility_display compatibility_title = self.query_one("#compatibility-title", Static) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/dom.py:1465: in query_one base_node = self._get_dom_base() /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:870: in _get_dom_base return self.default_screen /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:883: in default_screen return self.screen if self._compose_screen is None else self._compose_screen /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:1472: in screen raise ScreenStackError("No screens on stack") from None E textual.app.ScreenStackError: No screens on stacktests/tui/test_tui_main.py:353: in test_update_build_progress app.build_progress = BuildProgress( /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:345: in __set__ self._set(obj, value) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:326: in _set self._check_watchers(obj, name, current_value) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:367: in _check_watchers invoke_watcher(obj, public_watch_function, old_value, value) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:91: in invoke_watcher watch_result = cast(WatchCallbackNewValueType, watch_function)(value) src/tui/main.py:1079: in watch_build_progress self._update_build_progress() src/tui/main.py:750: in _update_build_progress self.query_one("#build-status", Static).update( /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/dom.py:1465: in query_one base_node = self._get_dom_base() /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:870: in _get_dom_base return self.default_screen /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:883: in default_screen return self.screen if self._compose_screen is None else self._compose_screen /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:1472: in screen raise ScreenStackError("No screens on stack") from None E textual.app.ScreenStackError: No screens on stacktests/tui/test_tui_main.py:487: in test_start_build app.selected_device = test_device /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:345: in __set__ self._set(obj, value) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:299: in _set self._initialize_reactive(obj, self.name) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:199: in _initialize_reactive self._check_watchers(obj, name, default) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:367: in _check_watchers invoke_watcher(obj, public_watch_function, old_value, value) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/reactive.py:91: in invoke_watcher watch_result = cast(WatchCallbackNewValueType, watch_function)(value) src/tui/main.py:946: in watch_selected_device self._clear_compatibility_display() src/tui/main.py:1067: in _clear_compatibility_display compatibility_title = self.query_one("#compatibility-title", Static) /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/dom.py:1465: in query_one base_node = self._get_dom_base() /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:870: in _get_dom_base return self.default_screen /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:883: in default_screen return self.screen if self._compose_screen is None else self._compose_screen /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/textual/app.py:1472: in screen raise ScreenStackError("No screens on stack") from None E textual.app.ScreenStackError: No screens on stacktests/tui/test_tui_models.py:91: in test_feature_summary assert config.feature_summary == "Basic Configuration" E AssertionError: assert 'Local Build' == 'Basic Configuration' E E - Basic Configuration E + Local Build