1*7dc08ffcSJunyu Lai% Regression tests on Windows only for Scapy 2*7dc08ffcSJunyu Lai 3*7dc08ffcSJunyu Lai# More informations at http://www.secdev.org/projects/UTscapy/ 4*7dc08ffcSJunyu Lai 5*7dc08ffcSJunyu Lai############ 6*7dc08ffcSJunyu Lai############ 7*7dc08ffcSJunyu Lai+ Networking tests 8*7dc08ffcSJunyu Lai 9*7dc08ffcSJunyu Lai= Automaton - SelectableSelector system timeout 10*7dc08ffcSJunyu Lai 11*7dc08ffcSJunyu Laiclass TimeOutSelector(SelectableObject): 12*7dc08ffcSJunyu Lai def check_recv(self): 13*7dc08ffcSJunyu Lai return False 14*7dc08ffcSJunyu Lai 15*7dc08ffcSJunyu Laiassert select_objects([TimeOutSelector()], 0) == [] 16*7dc08ffcSJunyu Laiassert select_objects([TimeOutSelector()], 1) == [] 17*7dc08ffcSJunyu Lai 18*7dc08ffcSJunyu Lai############ 19*7dc08ffcSJunyu Lai############ 20*7dc08ffcSJunyu Lai+ Windows Networking tests 21*7dc08ffcSJunyu Lai 22*7dc08ffcSJunyu Lai= Mocked read_routes6() calls 23*7dc08ffcSJunyu Lai 24*7dc08ffcSJunyu Laiimport mock 25*7dc08ffcSJunyu Laifrom scapy.tools.UTscapy import Bunch 26*7dc08ffcSJunyu Laifrom scapy.arch.windows import _read_routes6_post2008 27*7dc08ffcSJunyu Lai 28*7dc08ffcSJunyu Laidef check_mandatory_ipv6_routes(routes6): 29*7dc08ffcSJunyu Lai """Ensure that mandatory IPv6 routes are present.""" 30*7dc08ffcSJunyu Lai if len([r for r in routes6 if r[0] == "::" and r[4] == ["::1"]]) < 1: 31*7dc08ffcSJunyu Lai return False 32*7dc08ffcSJunyu Lai if len([r for r in routes6 if r[0] == "fe80::" and (r[1] == 64 or r[1] == 32)]) < 1: 33*7dc08ffcSJunyu Lai return False 34*7dc08ffcSJunyu Lai if len([r for r in routes6 if in6_islladdr(r[0]) and r[1] == 128]) < 1: 35*7dc08ffcSJunyu Lai return False 36*7dc08ffcSJunyu Lai return True 37*7dc08ffcSJunyu Lai 38*7dc08ffcSJunyu Laidef dev_from_index_custom(if_index): 39*7dc08ffcSJunyu Lai if_list = [{'mac': 'D0:50:99:56:DD:F9', 'win_index': '13', 'guid': '{C56DFFB3-992C-4964-B000-3E7C0F76E8BA}', 'name': 'Killer E2200 Gigabit Ethernet Controller', 'description': 'Ethernet'}, {'mac': '00:FF:0E:C7:25:37', 'win_index': '3', 'guid': '{0EC72537-B662-4F5D-B34E-48BFAE799BBE}', 'name': 'TAP-Windows Adapter V9', 'description': 'Ethernet 2'}] 40*7dc08ffcSJunyu Lai values = {} 41*7dc08ffcSJunyu Lai for i in if_list: 42*7dc08ffcSJunyu Lai try: 43*7dc08ffcSJunyu Lai interface = NetworkInterface(i) 44*7dc08ffcSJunyu Lai values[interface.guid] = interface 45*7dc08ffcSJunyu Lai except (KeyError, PcapNameNotFoundError): 46*7dc08ffcSJunyu Lai pass 47*7dc08ffcSJunyu Lai for devname, iface in values.items(): 48*7dc08ffcSJunyu Lai if iface.win_index == str(if_index): 49*7dc08ffcSJunyu Lai return iface 50*7dc08ffcSJunyu Lai raise ValueError("Unknown network interface index %r" % if_index) 51*7dc08ffcSJunyu Lai 52*7dc08ffcSJunyu Lai@mock.patch("scapy.arch.windows.construct_source_candidate_set") 53*7dc08ffcSJunyu Lai@mock.patch("scapy.arch.windows.get_if_list") 54*7dc08ffcSJunyu Lai@mock.patch("scapy.arch.windows.dev_from_index") 55*7dc08ffcSJunyu Lai@mock.patch("scapy.arch.windows.POWERSHELL_PROCESS.query") 56*7dc08ffcSJunyu Laidef test_read_routes6_windows(mock_comm, mock_dev_from_index, mock_winpcapylist, mock_utils6cset): 57*7dc08ffcSJunyu Lai """Test read_routes6() on Windows""" 58*7dc08ffcSJunyu Lai # 'Get-NetRoute -AddressFamily IPV6 | select ifIndex, DestinationPrefix, NextHop' 59*7dc08ffcSJunyu Lai get_net_route_output = """ 60*7dc08ffcSJunyu LaiifIndex : 3 61*7dc08ffcSJunyu LaiDestinationPrefix : ff00::/8 62*7dc08ffcSJunyu LaiNextHop : :: 63*7dc08ffcSJunyu LaiRouteMetric : 0 64*7dc08ffcSJunyu LaiInterfaceMetric : 1 65*7dc08ffcSJunyu Lai 66*7dc08ffcSJunyu LaiifIndex : 16 67*7dc08ffcSJunyu LaiDestinationPrefix : ff00::/8 68*7dc08ffcSJunyu LaiNextHop : :: 69*7dc08ffcSJunyu LaiRouteMetric : 0 70*7dc08ffcSJunyu LaiInterfaceMetric : 1 71*7dc08ffcSJunyu Lai 72*7dc08ffcSJunyu LaiifIndex : 13 73*7dc08ffcSJunyu LaiDestinationPrefix : ff00::/8 74*7dc08ffcSJunyu LaiNextHop : :: 75*7dc08ffcSJunyu LaiRouteMetric : 0 76*7dc08ffcSJunyu LaiInterfaceMetric : 1 77*7dc08ffcSJunyu Lai 78*7dc08ffcSJunyu LaiifIndex : 1 79*7dc08ffcSJunyu LaiDestinationPrefix : ff00::/8 80*7dc08ffcSJunyu LaiNextHop : :: 81*7dc08ffcSJunyu LaiRouteMetric : 0 82*7dc08ffcSJunyu LaiInterfaceMetric : 1 83*7dc08ffcSJunyu Lai 84*7dc08ffcSJunyu LaiifIndex : 13 85*7dc08ffcSJunyu LaiDestinationPrefix : fe80::dc1d:24e8:af00:125e/128 86*7dc08ffcSJunyu LaiNextHop : :: 87*7dc08ffcSJunyu LaiRouteMetric : 20 88*7dc08ffcSJunyu LaiInterfaceMetric : 256 89*7dc08ffcSJunyu Lai 90*7dc08ffcSJunyu LaiifIndex : 3 91*7dc08ffcSJunyu LaiDestinationPrefix : fe80::9402:5804:cb16:fb3b/128 92*7dc08ffcSJunyu LaiNextHop : :: 93*7dc08ffcSJunyu LaiRouteMetric : 1 94*7dc08ffcSJunyu LaiInterfaceMetric : 0 95*7dc08ffcSJunyu Lai 96*7dc08ffcSJunyu LaiifIndex : 16 97*7dc08ffcSJunyu LaiDestinationPrefix : fe80::100:7f:fffe/128 98*7dc08ffcSJunyu LaiNextHop : :: 99*7dc08ffcSJunyu LaiRouteMetric : 1 100*7dc08ffcSJunyu LaiInterfaceMetric : 0 101*7dc08ffcSJunyu Lai 102*7dc08ffcSJunyu LaiifIndex : 3 103*7dc08ffcSJunyu LaiDestinationPrefix : fe80::/64 104*7dc08ffcSJunyu LaiNextHop : :: 105*7dc08ffcSJunyu LaiRouteMetric : 0 106*7dc08ffcSJunyu LaiInterfaceMetric : 1 107*7dc08ffcSJunyu Lai 108*7dc08ffcSJunyu LaiifIndex : 16 109*7dc08ffcSJunyu LaiDestinationPrefix : fe80::/64 110*7dc08ffcSJunyu LaiNextHop : :: 111*7dc08ffcSJunyu LaiRouteMetric : 0 112*7dc08ffcSJunyu LaiInterfaceMetric : 1 113*7dc08ffcSJunyu Lai 114*7dc08ffcSJunyu LaiifIndex : 13 115*7dc08ffcSJunyu LaiDestinationPrefix : fe80::/64 116*7dc08ffcSJunyu LaiNextHop : :: 117*7dc08ffcSJunyu LaiRouteMetric : 0 118*7dc08ffcSJunyu LaiInterfaceMetric : 1 119*7dc08ffcSJunyu Lai 120*7dc08ffcSJunyu LaiifIndex : 13 121*7dc08ffcSJunyu LaiDestinationPrefix : 2a01:e35:2f17:fe60:dc1d:24e8:af00:125e/128 122*7dc08ffcSJunyu LaiNextHop : :: 123*7dc08ffcSJunyu LaiRouteMetric : 20 124*7dc08ffcSJunyu LaiInterfaceMetric : 256 125*7dc08ffcSJunyu Lai 126*7dc08ffcSJunyu LaiifIndex : 13 127*7dc08ffcSJunyu LaiDestinationPrefix : 2a01:e35:2f17:fe60::/64 128*7dc08ffcSJunyu LaiNextHop : :: 129*7dc08ffcSJunyu LaiRouteMetric : 30 130*7dc08ffcSJunyu LaiInterfaceMetric : 256 131*7dc08ffcSJunyu Lai 132*7dc08ffcSJunyu LaiifIndex : 1 133*7dc08ffcSJunyu LaiDestinationPrefix : ::1/128 134*7dc08ffcSJunyu LaiNextHop : :: 135*7dc08ffcSJunyu LaiRouteMetric : 0 136*7dc08ffcSJunyu LaiInterfaceMetric : 256 137*7dc08ffcSJunyu Lai 138*7dc08ffcSJunyu LaiifIndex : 13 139*7dc08ffcSJunyu LaiDestinationPrefix : ::/0 140*7dc08ffcSJunyu LaiNextHop : fe80::224:d4ff:fea0:a6d7 141*7dc08ffcSJunyu LaiRouteMetric : 0 142*7dc08ffcSJunyu LaiInterfaceMetric : 256 143*7dc08ffcSJunyu Lai""" 144*7dc08ffcSJunyu Lai mock_comm.return_value = get_net_route_output.split("\n") 145*7dc08ffcSJunyu Lai mock_winpcapylist.return_value = [u'\\Device\\NPF_{0EC72537-B662-4F5D-B34E-48BFAE799BBE}', u'\\Device\\NPF_{C56DFFB3-992C-4964-B000-3E7C0F76E8BA}'] 146*7dc08ffcSJunyu Lai # Mocked in6_getifaddr() output 147*7dc08ffcSJunyu Lai mock_dev_from_index.side_effect = dev_from_index_custom 148*7dc08ffcSJunyu Lai # Random 149*7dc08ffcSJunyu Lai mock_utils6cset.side_effect = lambda x,y,z: ["::1"] if x=="::" else ["fdbb:d995:ddd8:51fc::"] 150*7dc08ffcSJunyu Lai # Test the function 151*7dc08ffcSJunyu Lai routes = _read_routes6_post2008() 152*7dc08ffcSJunyu Lai for r in routes: 153*7dc08ffcSJunyu Lai print(r) 154*7dc08ffcSJunyu Lai print(len(routes)) 155*7dc08ffcSJunyu Lai assert(len(routes) == 9) 156*7dc08ffcSJunyu Lai assert(check_mandatory_ipv6_routes(routes)) 157*7dc08ffcSJunyu Lai 158*7dc08ffcSJunyu Lai 159*7dc08ffcSJunyu Laitest_read_routes6_windows() 160*7dc08ffcSJunyu Lai 161*7dc08ffcSJunyu Lai= Test _read_routes_post2008 with missing InterfaceMetric 162*7dc08ffcSJunyu Lai 163*7dc08ffcSJunyu Laifrom scapy.arch.windows import _read_routes_post2008 164*7dc08ffcSJunyu Lai 165*7dc08ffcSJunyu Lai@mock.patch("scapy.arch.windows._get_metrics") 166*7dc08ffcSJunyu Lai@mock.patch("scapy.arch.windows.POWERSHELL_PROCESS.query") 167*7dc08ffcSJunyu Lai@mock.patch("scapy.arch.windows.get_if_list") 168*7dc08ffcSJunyu Lai@mock.patch("scapy.arch.windows.dev_from_index") 169*7dc08ffcSJunyu Laidef test_missing_ifacemetric(mock_dev_from_index, mock_winpcapylist, mock_exec_query, mock_get_metrics): 170*7dc08ffcSJunyu Lai exc_query_output = """ifIndex : 3 171*7dc08ffcSJunyu LaiDestinationPrefix : 255.255.255.255/0 172*7dc08ffcSJunyu LaiNextHop : 192.168.103.1 173*7dc08ffcSJunyu LaiRouteMetric : 10 174*7dc08ffcSJunyu LaiInterfaceMetric : 256 175*7dc08ffcSJunyu Lai 176*7dc08ffcSJunyu LaiifIndex : 13 177*7dc08ffcSJunyu LaiDestinationPrefix : 255.255.255.255/32 178*7dc08ffcSJunyu LaiNextHop : 0.0.0.0 179*7dc08ffcSJunyu LaiRouteMetric : 20 180*7dc08ffcSJunyu LaiInterfaceMetric : 181*7dc08ffcSJunyu Lai""" 182*7dc08ffcSJunyu Lai mock_exec_query.side_effect = lambda *args, **kargs: exc_query_output.split("\n") 183*7dc08ffcSJunyu Lai mock_winpcapylist.return_value = [u'\\Device\\NPF_{0EC72537-B662-4F5D-B34E-48BFAE799BBE}', u'\\Device\\NPF_{C56DFFB3-992C-4964-B000-3E7C0F76E8BA}'] 184*7dc08ffcSJunyu Lai mock_dev_from_index.side_effect = dev_from_index_custom 185*7dc08ffcSJunyu Lai mock_get_metrics.side_effect = lambda: {'16': 0, '13': 123} 186*7dc08ffcSJunyu Lai routes = _read_routes_post2008() 187*7dc08ffcSJunyu Lai for r in routes: 188*7dc08ffcSJunyu Lai print(r) 189*7dc08ffcSJunyu Lai assert len(routes) == 2 190*7dc08ffcSJunyu Lai # Test if metrics were correctly read/guessed 191*7dc08ffcSJunyu Lai assert routes[0][5] == 266 192*7dc08ffcSJunyu Lai assert routes[1][5] == 143 193*7dc08ffcSJunyu Lai 194*7dc08ffcSJunyu Laitest_missing_ifacemetric() 195*7dc08ffcSJunyu Lai 196*7dc08ffcSJunyu Lai= Test _get_metrics with weird netsh length 197*7dc08ffcSJunyu Lai 198*7dc08ffcSJunyu Laifrom scapy.arch.windows import _get_metrics 199*7dc08ffcSJunyu Lai 200*7dc08ffcSJunyu Lai@mock.patch("scapy.arch.windows.POWERSHELL_PROCESS.query") 201*7dc08ffcSJunyu Laidef test_get_metrics(mock_exec_query): 202*7dc08ffcSJunyu Lai exc_query_output = """Interface Loopback Pseudo-Interface 1 Parameters 203*7dc08ffcSJunyu Lai------------------------------- 204*7dc08ffcSJunyu LaiIfLuid : loopback_0 205*7dc08ffcSJunyu LaiIfIndex : 1 206*7dc08ffcSJunyu LaiState : connected 207*7dc08ffcSJunyu LaiMetric : 75 208*7dc08ffcSJunyu LaiLink MTU : 4294967295 byt 209*7dc08ffcSJunyu LaiReachable Time : 40500 ms 210*7dc08ffcSJunyu LaiBase Reachable Time : 30000 ms 211*7dc08ffcSJunyu LaiRetransmission Interval : 1000 ms 212*7dc08ffcSJunyu LaiDAD Transmits : 0 213*7dc08ffcSJunyu LaiSite Prefix Length : 64 214*7dc08ffcSJunyu LaiSite Id : 1 215*7dc08ffcSJunyu LaiForwarding : disabled 216*7dc08ffcSJunyu LaiAdvertising : disabled 217*7dc08ffcSJunyu LaiNeighbor Discovery : disabled 218*7dc08ffcSJunyu LaiNeighbor Unreachability Detection : disabled 219*7dc08ffcSJunyu LaiRouter Discovery : dhcp 220*7dc08ffcSJunyu LaiManaged Address Configuration : enabled 221*7dc08ffcSJunyu LaiOther Stateful Configuration : enabled 222*7dc08ffcSJunyu LaiWeak Host Sends : disabled 223*7dc08ffcSJunyu LaiWeak Host Receives : disabled 224*7dc08ffcSJunyu LaiUse Automatic Metric : enabled 225*7dc08ffcSJunyu LaiIgnore Default Routes : disabled 226*7dc08ffcSJunyu LaiAdvertised Router Lifetime : 1800 seconds 227*7dc08ffcSJunyu LaiAdvertise Default Route : disabled 228*7dc08ffcSJunyu LaiCurrent Hop Limit : 0 229*7dc08ffcSJunyu LaiForce ARPND Wake up patterns : disabled 230*7dc08ffcSJunyu LaiDirected MAC Wake up patterns : disabled 231*7dc08ffcSJunyu LaiECN capability : application 232*7dc08ffcSJunyu Lai 233*7dc08ffcSJunyu LaiInterface Wi-Fi Parameters 234*7dc08ffcSJunyu Lai------------------------------- 235*7dc08ffcSJunyu LaiIfLuid : wireless_32768 236*7dc08ffcSJunyu LaiIfIndex : 7 237*7dc08ffcSJunyu LaiState : connected 238*7dc08ffcSJunyu LaiMetric : 55 239*7dc08ffcSJunyu LaiLink MTU : 1500 bytes 240*7dc08ffcSJunyu LaiReachable Time : 43500 ms 241*7dc08ffcSJunyu LaiBase Reachable Time : 30000 ms 242*7dc08ffcSJunyu LaiRetransmission Interval : 1000 ms 243*7dc08ffcSJunyu LaiDAD Transmits : 3 244*7dc08ffcSJunyu LaiSite Prefix Length : 64 245*7dc08ffcSJunyu LaiSite Id : 1 246*7dc08ffcSJunyu LaiForwarding : disabled 247*7dc08ffcSJunyu LaiAdvertising : disabled 248*7dc08ffcSJunyu LaiNeighbor Discovery : enabled 249*7dc08ffcSJunyu LaiNeighbor Unreachability Detection : enabled 250*7dc08ffcSJunyu LaiRouter Discovery : dhcp 251*7dc08ffcSJunyu LaiManaged Address Configuration : enabled 252*7dc08ffcSJunyu LaiOther Stateful Configuration : enabled 253*7dc08ffcSJunyu LaiWeak Host Sends : disabled 254*7dc08ffcSJunyu LaiWeak Host Receives : disabled 255*7dc08ffcSJunyu LaiUse Automatic Metric : enabled 256*7dc08ffcSJunyu LaiIgnore Default Routes : disabled 257*7dc08ffcSJunyu LaiAdvertised Router Lifetime : 1800 seconds 258*7dc08ffcSJunyu LaiAdvertise Default Route : disabled 259*7dc08ffcSJunyu LaiCurrent Hop Limit : 0 260*7dc08ffcSJunyu LaiForce ARPND Wake up patterns : disabled 261*7dc08ffcSJunyu LaiDirected MAC Wake up patterns : disabled 262*7dc08ffcSJunyu LaiECN capability : application 263*7dc08ffcSJunyu Lai""" 264*7dc08ffcSJunyu Lai mock_exec_query.side_effect = lambda *args, **kargs: exc_query_output.split("\n") 265*7dc08ffcSJunyu Lai metrics = _get_metrics() 266*7dc08ffcSJunyu Lai print(metrics) 267*7dc08ffcSJunyu Lai assert metrics == {'1': 75, '7': 55} 268*7dc08ffcSJunyu Lai 269*7dc08ffcSJunyu Laitest_get_metrics() 270*7dc08ffcSJunyu Lai 271*7dc08ffcSJunyu Lai############ 272*7dc08ffcSJunyu Lai############ 273*7dc08ffcSJunyu Lai+ Windows arch unit tests 274*7dc08ffcSJunyu Lai 275*7dc08ffcSJunyu Lai= Test PowerShell availability 276*7dc08ffcSJunyu Laifrom scapy.config import conf 277*7dc08ffcSJunyu Laiassert conf.prog.powershell != None 278*7dc08ffcSJunyu Lai 279*7dc08ffcSJunyu Lai= Store powershell results 280*7dc08ffcSJunyu Laiimport mock 281*7dc08ffcSJunyu Laifrom scapy.config import conf 282*7dc08ffcSJunyu Lai 283*7dc08ffcSJunyu Laips_ip = get_ip_from_name(conf.iface.name) 284*7dc08ffcSJunyu Laips_if_list = get_windows_if_list() 285*7dc08ffcSJunyu Laips_read_routes = read_routes() 286*7dc08ffcSJunyu Lai 287*7dc08ffcSJunyu Lai# Turn on VBS mode 288*7dc08ffcSJunyu Laiconf.prog.powershell = None 289*7dc08ffcSJunyu Lai 290*7dc08ffcSJunyu Lai= Test get_ip_from_name with VBS 291*7dc08ffcSJunyu Laips_ip 292*7dc08ffcSJunyu Lai 293*7dc08ffcSJunyu Laiassert get_ip_from_name(conf.iface.name) == ps_ip 294*7dc08ffcSJunyu Lai 295*7dc08ffcSJunyu Lai= Test get_windows_if_list with VBS 296*7dc08ffcSJunyu Laips_if_list 297*7dc08ffcSJunyu Lai 298*7dc08ffcSJunyu Laidef is_in_if_list(i, list): 299*7dc08ffcSJunyu Lai if not i["mac"]: 300*7dc08ffcSJunyu Lai return True 301*7dc08ffcSJunyu Lai for j in list: 302*7dc08ffcSJunyu Lai if j["guid"] == i["guid"] and j["name"] == i["name"]: 303*7dc08ffcSJunyu Lai return True 304*7dc08ffcSJunyu Lai return False 305*7dc08ffcSJunyu Lai 306*7dc08ffcSJunyu Laivbs_if_list = get_windows_if_list() 307*7dc08ffcSJunyu Laivbs_if_list 308*7dc08ffcSJunyu Lai_correct = True 309*7dc08ffcSJunyu Laifor i in vbs_if_list: 310*7dc08ffcSJunyu Lai if not is_in_if_list(i, ps_if_list): 311*7dc08ffcSJunyu Lai _correct = False 312*7dc08ffcSJunyu Lai break 313*7dc08ffcSJunyu Lai 314*7dc08ffcSJunyu Laiassert _correct 315*7dc08ffcSJunyu Lai 316*7dc08ffcSJunyu Lai= Test read_routes with VBS 317*7dc08ffcSJunyu Laips_read_routes 318*7dc08ffcSJunyu Lai 319*7dc08ffcSJunyu Laidef is_in_route_list(i, list): 320*7dc08ffcSJunyu Lai # Ignore all empty IP or macs 321*7dc08ffcSJunyu Lai if i[4] == '': 322*7dc08ffcSJunyu Lai return True 323*7dc08ffcSJunyu Lai if i[3].mac == '' or i[3].guid == '' or i[3].ip == '': 324*7dc08ffcSJunyu Lai return True 325*7dc08ffcSJunyu Lai for j in list: 326*7dc08ffcSJunyu Lai if j[2] == i[2] and j[4] == i[4] and j[3].guid == i[3].guid: 327*7dc08ffcSJunyu Lai return True 328*7dc08ffcSJunyu Lai return False 329*7dc08ffcSJunyu Lai 330*7dc08ffcSJunyu Laivbs_read_routes = read_routes() 331*7dc08ffcSJunyu Laivbs_if_list 332*7dc08ffcSJunyu Lai_correct = True 333*7dc08ffcSJunyu Laifor i in vbs_read_routes: 334*7dc08ffcSJunyu Lai if not is_in_route_list(i, ps_read_routes): 335*7dc08ffcSJunyu Lai _correct = False 336*7dc08ffcSJunyu Lai break 337*7dc08ffcSJunyu Lai 338*7dc08ffcSJunyu Laiassert _correct 339*7dc08ffcSJunyu Lai 340*7dc08ffcSJunyu Laiconf.prog._reload() 341*7dc08ffcSJunyu Lai 342*7dc08ffcSJunyu Lai= show_interfaces 343*7dc08ffcSJunyu Lai 344*7dc08ffcSJunyu Laifrom scapy.arch import show_interfaces 345*7dc08ffcSJunyu Lai 346*7dc08ffcSJunyu Laiwith ContextManagerCaptureOutput() as cmco: 347*7dc08ffcSJunyu Lai show_interfaces() 348*7dc08ffcSJunyu Lai lines = cmco.get_output().split("\n")[1:] 349*7dc08ffcSJunyu Lai for l in lines: 350*7dc08ffcSJunyu Lai if not l.strip(): 351*7dc08ffcSJunyu Lai continue 352*7dc08ffcSJunyu Lai int(l[:2]) 353*7dc08ffcSJunyu Lai 354*7dc08ffcSJunyu Lai= dev_from_pcapname 355*7dc08ffcSJunyu Lai 356*7dc08ffcSJunyu Laifrom scapy.config import conf 357*7dc08ffcSJunyu Lai 358*7dc08ffcSJunyu Laiassert dev_from_pcapname(conf.iface.pcap_name).guid == conf.iface.guid 359*7dc08ffcSJunyu Lai 360*7dc08ffcSJunyu Lai= test pcap_service_status 361*7dc08ffcSJunyu Lai 362*7dc08ffcSJunyu Laistatus = pcap_service_status() 363*7dc08ffcSJunyu Laistatus 364*7dc08ffcSJunyu Laiassert status[0] in ["npcap", "npf"] 365*7dc08ffcSJunyu Laiassert status[2] == True 366*7dc08ffcSJunyu Lai 367*7dc08ffcSJunyu Lai= test pcap_service_stop 368*7dc08ffcSJunyu Lai 369*7dc08ffcSJunyu Laipcap_service_stop() 370*7dc08ffcSJunyu Laiassert pcap_service_status()[2] == False 371*7dc08ffcSJunyu Lai 372*7dc08ffcSJunyu Lai= test pcap_service_start 373*7dc08ffcSJunyu Lai 374*7dc08ffcSJunyu Laipcap_service_start() 375*7dc08ffcSJunyu Laiassert pcap_service_status()[2] == True 376*7dc08ffcSJunyu Lai 377*7dc08ffcSJunyu Lai= Test auto-pcap start UI 378*7dc08ffcSJunyu Lai 379*7dc08ffcSJunyu Laiold_ifaces = IFACES.data 380*7dc08ffcSJunyu Lai 381*7dc08ffcSJunyu Lai@mock.patch("scapy.arch.windows.get_if_list") 382*7dc08ffcSJunyu Laidef _test_autostart_ui(mocked_getiflist): 383*7dc08ffcSJunyu Lai mocked_getiflist.side_effect = lambda: [] 384*7dc08ffcSJunyu Lai IFACES.reload() 385*7dc08ffcSJunyu Lai assert IFACES.data == {} 386*7dc08ffcSJunyu Lai 387*7dc08ffcSJunyu Lai_test_autostart_ui() 388*7dc08ffcSJunyu Lai 389*7dc08ffcSJunyu LaiIFACES.data = old_ifaces