% Regression tests for isotpscanner ~ vcan_socket needs_root linux not_pypy automotive_comm scanner + Configuration ~ conf = Imports with open(scapy_path("test/contrib/automotive/interface_mockup.py")) as f: exec(f.read()) ISOTPSocket = ISOTPSoftSocket from unittest.mock import patch + Usage tests = Test wrong usage result = subprocess.Popen([sys.executable, "scapy/tools/automotive/isotpscanner.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) std_out, std_err = result.communicate() if result.returncode: print(std_out) print(std_err) assert result.returncode != 0 expected_output = plain_str(b'usage:') assert expected_output in plain_str(std_err) = Test show help result = subprocess.Popen([sys.executable, "scapy/tools/automotive/isotpscanner.py", "--help"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) std_out, _ = result.communicate() expected_output = plain_str(b'Scan for open ISOTP-Sockets.') assert result.wait() == 0 assert expected_output in plain_str(std_out) = Test Python2 call result = subprocess.Popen([sys.executable, "scapy/tools/automotive/isotpscanner.py", "-i", "socketcan", "-c", iface0, "-s", "0x600", "-e", "0x600", "-v", "-n", "0", "-t", "0"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) returncode = result.wait() expected_output = plain_str(b'Start scan') std_out, std_err = result.communicate() assert returncode == 0 assert expected_output in plain_str(std_out) = Test Python2 call with one python-can arg result = subprocess.Popen([sys.executable, "scapy/tools/automotive/isotpscanner.py", "-i", "socketcan", "-c", iface0, "-a", "bitrate=500000", "-s", "0x600", "-e", "0x600", "-v", "-n", "0", "-t", "0"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) returncode = result.wait() expected_output = plain_str(b'Start scan') std_out, std_err = result.communicate() assert returncode == 0 assert expected_output in plain_str(std_out) = Test Python2 call with multiple python-can args result = subprocess.Popen([sys.executable, "scapy/tools/automotive/isotpscanner.py", "-i", "socketcan", "-c", iface0, "-a", "bitrate=500000 receive_own_messages=True", "-s", "0x600", "-e", "0x600", "-v", "-n", "0", "-t", "0"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) returncode = result.wait() expected_output = plain_str(b'Start scan') std_out, std_err = result.communicate() assert returncode == 0 assert expected_output in plain_str(std_out) = Test Python2 call with multiple python-can args 2 result = subprocess.Popen([sys.executable, "scapy/tools/automotive/isotpscanner.py", "-i", "socketcan", "-c", iface0, "--python-can_args", "bitrate=500000 receive_own_messages=True", "-s", "0x600", "-e", "0x600", "-v", "-n", "0", "-t", "0"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) returncode = result.wait() expected_output = plain_str(b'Start scan') std_out, std_err = result.communicate() assert returncode == 0 assert expected_output in plain_str(std_out) + Scan tests = Test standard scan exit_if_no_isotp_module() drain_bus(iface0) recv_result = subprocess.Popen(("isotprecv -s 700 -d 600 -l " + iface0).split()) result = subprocess.Popen([sys.executable, "scapy/tools/automotive/isotpscanner.py"] + can_socket_string_list + ["-s", "0x600", "-e", "0x600"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) returncode1 = result.wait() std_out1, std_err1 = result.communicate() recv_result.terminate() print(std_out1) print(std_err1) assert returncode1 == 0 expected_output = [b'0x600', b'0x700'] for out in expected_output: assert plain_str(out) in plain_str(std_out1) = Test extended scan def isotp_scan(sock, # type: SuperSocket scan_range=range(0x7ff + 1), # type: Iterable[int] extended_addressing=False, # type: bool extended_scan_range=range(0x100), # type: Iterable[int] noise_listen_time=2, # type: int sniff_time=0.1, # type: float output_format=None, # type: Optional[str] can_interface=None, # type: Optional[str] extended_can_id=False, # type: bool verbose=False # type: bool ): # type: (...) -> Union[str, List[SuperSocket]] assert sock is not None assert 0x601 in scan_range assert 0x602 not in scan_range assert extended_addressing == True assert 0 in extended_scan_range assert 0xff in extended_scan_range assert output_format == "text" assert verbose == False assert extended_can_id == False assert "vcan0" in can_interface return "Success" testargs = ["scapy/tools/automotive/isotpscanner.py"] + can_socket_string_list + ["-s", "0x601", "-e", "0x601", "-x"] with patch.object(sys, "argv", testargs), patch.object(scapy.contrib.isotp, "isotp_scan", isotp_scan): from scapy.tools.automotive.isotpscanner import main main() = Test scan with piso flag def isotp_scan(sock, # type: SuperSocket scan_range=range(0x7ff + 1), # type: Iterable[int] extended_addressing=False, # type: bool extended_scan_range=range(0x100), # type: Iterable[int] noise_listen_time=2, # type: int sniff_time=0.1, # type: float output_format=None, # type: Optional[str] can_interface=None, # type: Optional[str] extended_can_id=False, # type: bool verbose=False # type: bool ): # type: (...) -> Union[str, List[SuperSocket]] assert sock is not None assert 0x601 in scan_range assert 0x602 not in scan_range assert extended_addressing == True assert 0 in extended_scan_range assert 0xff in extended_scan_range assert output_format == "code" assert verbose == False assert extended_can_id == False assert "vcan0" in can_interface return "Success" testargs = ["scapy/tools/automotive/isotpscanner.py"] + can_socket_string_list + ["-s", "0x601", "-e", "0x601", "-x", "-C"] with patch.object(sys, "argv", testargs), patch.object(scapy.contrib.isotp, "isotp_scan", isotp_scan): from scapy.tools.automotive.isotpscanner import main main() + Cleanup = Delete vcan interfaces assert cleanup_interfaces()