Пример #1
0
 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)
Пример #2
0
 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)
Пример #3
0
 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)
Пример #4
0
 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)
Пример #5
0
 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))
Пример #6
0
 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))
Пример #7
0
 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))
Пример #8
0
 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))
Пример #9
0
 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)
Пример #10
0
 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))
Пример #11
0
    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])
Пример #12
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)
Пример #13
0
 def testBadScenario(self):
     o = self._makeOptions(debug=False, tests=['ucode1'], usercode='ucode1')
     with self.assertRaises(ImportError):
         main_test(o)
Пример #14
0
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)