def testShutdownSignal(self): o = self._makeOptions(tests=['stest'], usercode='ucode6') with redirectio() as xio: with self.assertLogs(level='INFO') as cm: main_test(o) self.assertIn('4 passed, 0 failed, 0 pending', xio.contents) self.assertIn('All tests passed', xio.contents)
def testSendInsteadOfRecv(self): o = self._makeOptions(tests=['stest'], usercode='ucode11') with redirectio() as xio: with self.assertLogs(level='DEBUG') as cm: main_test(o) self.assertIn('0 passed, 1 failed, 3 pending', xio.contents) self.assertIn('send_packet was called instead of recv_packet', xio.contents)
def testEmptyUserProgram(self): o = self._makeOptions(tests=['stest'], usercode='ucode1') with redirectio() as xio: with self.assertLogs(level='INFO') as cm: main_test(o) self.assertIn('0 passed, 1 failed, 3 pending', xio.contents) self.assertNotIn('All tests passed', xio.contents)
def testScenarioTimeoutHandledCorrectly(self): o = self._makeOptions(tests=['stest'], usercode='ucode5') with redirectio() as xio: with self.assertLogs(level='INFO') as cm: main_test(o) self.assertIn('4 passed, 0 failed, 0 pending', xio.contents) self.assertIn('All tests passed', xio.contents)
def testPacketMatchFail(self): o = self._makeOptions(tests=['stest'], usercode='ucode10') with redirectio() as xio: with self.assertLogs(level='INFO') as cm: main_test(o) self.assertIn('1 passed, 1 failed, 2 pending', xio.contents) self.assertRegex(xio.contents, re.compile('an\s+exact\s+match\s+of\s+packet\s+contents\s+failed', re.M | re.I))
def testDeviceMatchFail(self): o = self._makeOptions(tests=['stest'], usercode='ucode9') with redirectio() as xio: with self.assertLogs(level='INFO') as cm: main_test(o) self.assertIn('1 passed, 1 failed, 2 pending', xio.contents) self.assertRegex(xio.contents, re.compile('unexpected\s+output\s+port\s+router-eth2', re.M))
def testOneRecvCall(self): o = self._makeOptions(tests=['stest'], usercode='ucode2') with redirectio() as xio: with self.assertLogs(level='INFO') as cm: main_test(o) self.assertIn('1 passed, 1 failed, 2 pending', xio.contents) self.assertRegex(xio.contents, re.compile('Passed:\s*1\s*Incoming ARP request', re.M)) self.assertRegex(xio.contents, re.compile('Failed:\s*Outgoing ARP reply',re.M))
def testEpicFail(self): o = self._makeOptions(tests=['stest'], usercode='ucode8') with redirectio() as xio: with self.assertLogs(level='INFO') as cm: main_test(o) self.assertNotIn('All tests passed', xio.contents) self.assertIn('0 passed, 1 failed, 3 pending', xio.contents) self.assertRegex(xio.contents, re.compile('Your\s+code\s+crashed', re.M))
def testTooManySends(self): o = self._makeOptions(tests=['stest'], usercode='ucode7') with redirectio() as xio: with self.assertLogs(level='INFO') as cm: main_test(o) self.assertIn('4 passed, 0 failed, 0 pending', xio.contents) self.assertRegex(xio.contents, re.compile('Your\s+code\s+didn\'t\s+crash,\s+but\s+something\s+unexpected\s+happened.', re.M)) self.assertNotIn('All tests passed', xio.contents)
def testTwoRecvCalls(self): o = self._makeOptions(tests=['stest'], usercode='ucode3') with redirectio() as xio: with self.assertLogs(level='INFO') as cm: main_test(o) self.assertIn('1 passed, 1 failed, 2 pending', xio.contents) self.assertRegex(xio.contents, re.compile('Passed:\s*1\s*Incoming ARP request', re.M)) self.assertRegex(xio.contents, re.compile('Failed:\s*Outgoing ARP reply',re.M)) self.assertRegex(xio.contents, re.compile('recv_packet\s+was\s+called\s+instead\s+of\s+send_packet', re.M))
def testDryRun(self): o = self._makeOptions(dryrun=True, compile=['stest'], usercode='ucode1.py') with self.assertLogs(level='INFO') as cm: main_test(o) self.assertIn('Imported your code successfully', cm.output[0]) o = self._makeOptions(dryrun=True, compile=['stest'], usercode='ucode1') with self.assertLogs(level='INFO') as cm: main_test(o) self.assertIn('Imported your code successfully', cm.output[0])
def start_framework(args): global _netobj, _setup_ok setup_logging(args.debug, args.logfile) # assume testmode if compile flag is set testmode = False if args.compile or args.tests: testmode = True args.codearg = _parse_codeargs(args.codearg) if args.verbose: VerboseOutput.enable() if args.cli: t = Topology() if args.topology: try: t = load_from_file(args.topology) except FileNotFoundError: print("No such file {} exists to load topology.".format( args.topology)) return run_simulation(t) return waiters = 1 if args.app: waiters += 1 barrier = Barrier(waiters) if args.app: ApplicationLayer._init() _appt = Thread(target=_start_app, args=(args.app, barrier)) _appt.start() if args.app: args.fwconfig = [] elif args.fwconfig is None or len(args.fwconfig) == 0: args.fwconfig = ('all', ) if testmode: if args.compile: if args.usercode: log_info("You specified user code to run with compile flag, " "but I'm just doing compile.") for scenario in args.compile: log_info("Compiling scenario {}".format(scenario)) compile_scenario(scenario) else: if not args.usercode: log_failure("In test mode, but not user code supplied.") return setattr(sys, "platform", "test") with Firewall([], args.fwconfig): _setup_ok = True barrier.wait() main_test(args) else: if sys.platform != 'win32' and os.geteuid() != 0: log_warn("You're running in real mode, but not as root. " "You should expect errors, but I'm going to " "continue anyway.") if args.exclude is None: args.exclude = [] if args.intf is None: args.intf = [] devlist = make_device_list(includes=args.intf, excludes=args.exclude) if not devlist: log_failure("There are no network interfaces I can use after " "processing include/exclude lists") alldevs = make_device_list([], []) log_failure("Here are all the interfaces I see on your system: " "{}".format(', '.join(list(alldevs)))) barrier.wait() return with Firewall(devlist, args.fwconfig): _setup_ok = True barrier.wait() _netobj = LLNetReal(devlist) main_real(args.usercode, _netobj, args)
def testBadScenario(self): o = self._makeOptions(debug=False, tests=['ucode1'], usercode='ucode1') with self.assertRaises(ImportError): main_test(o)
def start_framework(args): global _netobj, _setup_ok setup_logging(args.debug, args.logfile) if args.listif: devlist = _assemble_device_list(args) dlist = [ str(d) for d in devlist ] log_info("Devices found: {}".format(','.join(dlist))) return # assume testmode if compile flag is set testmode = False if args.compile or args.tests: testmode = True args.codearg = _parse_codeargs(args.codearg) if args.verbose: VerboseOutput.enable() if args.cli: t = Topology() if args.topology: try: t = load_from_file(args.topology) except FileNotFoundError: print ("No such file {} exists to load topology.".format(args.topology)) return run_simulation(t) return waiters = 1 if args.app: waiters += 1 barrier = Barrier(waiters) if args.app: ApplicationLayer._init() _appt = Thread(target=_start_app, args=(args.app,barrier)) _appt.start() if args.app: args.fwconfig = [] elif args.fwconfig is None or len(args.fwconfig) == 0: args.fwconfig = ('all',) if testmode: if args.compile: if args.usercode: log_info("You specified user code to run with compile flag, " "but I'm just doing compile.") for scenario in args.compile: log_info("Compiling scenario {}".format(scenario)) compile_scenario(scenario) else: if not args.usercode: log_failure("In test mode, but not user code supplied.") return global platform platform = sys.platform setattr(sys, "origplatform", platform) setattr(sys, "platform", "test") with Firewall([], args.fwconfig): _setup_ok = True barrier.wait() main_test(args) else: if sys.platform != 'win32' and os.geteuid() != 0: log_warn("You're running in real mode, but not as root. " "You should expect errors, but I'm going to " "continue anyway.") devlist = _assemble_device_list(args) if not devlist: log_failure("There are no network interfaces I can use after " "processing include/exclude lists") alldevs = make_device_list([], []) log_failure("Here are all the interfaces I see on your system: " "{}".format(', '.join(list(alldevs)))) barrier.wait() return with Firewall(devlist, args.fwconfig): _setup_ok = True barrier.wait() _netobj = LLNetReal(devlist) main_real(args.usercode, _netobj, args)