Пример #1
0
    def test_e2e(self):
        # Set up hermetic environment.
        host = Host()
        host.fd_out = self._stdout
        host.fd_err = self._stderr

        with host.temp_dir() as temp_dir:

            # (Re-)parse the command line arguments, a la main.py.
            factory = Factory(host=host)
            parser = factory.parser
            args = parser.parse_args()

            # Ensure exactly 1 fuzzer is selected.
            fuzzer = factory.create_fuzzer(args)
            self.assertNoErrors()
            args.name = str(fuzzer)

            list_args = parser.parse_args(['list', args.name])
            list_args.command(list_args, factory)
            self.assertOut(
                ['Found 1 matching fuzzer for "{}":'.format(str(fuzzer))], n=1)
            self.assertNoErrors()

            start_args = parser.parse_args(
                ['start', '-o', temp_dir.pathname, args.name])
            proc = command.start_fuzzer(start_args, factory)
            self.assertNoErrors()

            stop_args = parser.parse_args(['stop', args.name])
            command.stop_fuzzer(stop_args, factory)
            self.assertNoErrors()
            if proc:
                proc.wait()

            check_args = parser.parse_args(['check', args.name])
            command.check_fuzzer(check_args, factory)
            self.assertOut(['{}: STOPPED'.format(args.name)], n=1)
            self.assertNoErrors()

            unit = os.path.join(temp_dir.pathname, 'unit')
            with open(unit, 'w') as opened:
                opened.write('hello world')

            repro_args = parser.parse_args(['repro', args.name, unit])
            command.repro_units(repro_args, factory)
            self.assertNoErrors()

            analyze_args = ['analyze', '-max_total_time=10', args.name]
            if args.local:
                analyze_args.append('--local')
            analyze_args = parser.parse_args(analyze_args)
            command.analyze_fuzzer(analyze_args, factory)
            self.assertNoErrors()
Пример #2
0
    def test_single_fuzzer(self):
        # (Re-)parse the command line arguments, a la main.py.
        args = self.parser.parse_args()

        # Ensure exactly 1 fuzzer is selected.
        fuzzer = self.factory.create_fuzzer(args)
        self.assertNoErrors()
        args.name = str(fuzzer)

        list_args = self.parser.parse_args(['list', args.name])
        list_args.command(list_args, self.factory)
        self.assertOut(
            ['Found 1 matching fuzzer for "{}":'.format(str(fuzzer))], n=1)
        self.assertNoErrors()

        start_args = self.parser.parse_args(
            ['start', '-o', self.temp_dir, args.name])
        proc = command.start_fuzzer(start_args, self.factory)
        self.assertNoErrors()

        stop_args = self.parser.parse_args(['stop', args.name])
        command.stop_fuzzer(stop_args, self.factory)
        self.assertNoErrors()
        if proc:
            proc.wait()

        check_args = self.parser.parse_args(['check', args.name])
        command.check_fuzzer(check_args, self.factory)
        self.assertOut(['{}: STOPPED'.format(args.name)], n=1)
        self.assertNoErrors()

        unit = os.path.join(self.temp_dir, 'unit')
        with open(unit, 'w') as opened:
            opened.write('hello world')

        repro_args = self.parser.parse_args(['repro', args.name, unit])
        command.repro_units(repro_args, self.factory)
        self.assertNoErrors()

        analyze_args = ['analyze', '-max_total_time=10', args.name]
        if args.local:
            analyze_args.append('--local')
        analyze_args = self.parser.parse_args(analyze_args)
        command.analyze_fuzzer(analyze_args, self.factory)
        self.assertNoErrors()
Пример #3
0
    def test_check_fuzzer(self):
        # No name, none running
        args = self.parse_args('check')
        command.check_fuzzer(args, self.factory)
        self.assertLogged(
            'No fuzzers are running.',
            'Include \'name\' to check specific fuzzers.',
        )

        # Name provided, not installed
        fuzzer1 = self.create_fuzzer('fake-package2/fake-target1',
                                     resolve=False)
        args = self.parse_args('check', 'fake-package2/fake-target1')
        command.check_fuzzer(args, self.factory)
        self.assertLogged(
            'fake-package2/fake-target1: NOT INSTALLED',
            '',
        )

        # No name, some running
        fuzzer1 = self.create_fuzzer('fake-package1/fake-target1')
        fuzzer2 = self.create_fuzzer('fake-package1/fake-target2')
        fuzzer3 = self.create_fuzzer('fake-package1/fake-target3')
        self.set_running(fuzzer1.executable_url)
        self.set_running(fuzzer3.executable_url)
        args = self.parse_args('check')
        command.check_fuzzer(args, self.factory)
        self.assertLogged(
            'fake-package1/fake-target1: RUNNING',
            '    Corpus size:  0 inputs / 0 bytes',
            '',
            'fake-package1/fake-target3: RUNNING',
            '    Corpus size:  0 inputs / 0 bytes',
            '',
        )

        # Name provided, running
        args = self.parse_args('check', 'fake-package1/fake-target3')
        command.check_fuzzer(args, self.factory)
        self.assertLogged(
            'fake-package1/fake-target3: RUNNING',
            '    Corpus size:  0 inputs / 0 bytes',
            '',
        )

        # Name provided, not running
        args = self.parse_args('check', 'fake-package1/fake-target2')
        command.check_fuzzer(args, self.factory)
        self.assertLogged(
            'fake-package1/fake-target2: STOPPED',
            '    Corpus size:  0 inputs / 0 bytes',
            '',
        )

        # Add some artifacts
        fuzzer = self.create_fuzzer('fake-package1/fake-target2')
        self.host.touch(os.path.join(fuzzer.output, 'crash-deadbeef'))
        self.host.touch(os.path.join(fuzzer.output, 'leak-feedface'))
        command.check_fuzzer(args, self.factory)
        self.assertLogged(
            'fake-package1/fake-target2: STOPPED',
            '    Corpus size:  0 inputs / 0 bytes',
            '    Artifacts:',
            '        {}/crash-deadbeef'.format(fuzzer.output),
            '        {}/leak-feedface'.format(fuzzer.output),
            '',
        )