#!/usr/bin/env python
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import sys
import unittest

import test_env
import lib.command as command
from lib.host import Host
from lib.factory import Factory
from test_case import TestCaseWithIO


class IntegrationTest(TestCaseWithIO):

    def assertNoErrors(self):
        """Convenience method to reset stdout and assert stderr is empty."""
        self.assertOut([], n=0)
        self.assertErr([])

    def test_e2e(self):
        # Set up hermetic environment.
        host = Host()
        with host.temp_dir() as temp_dir:

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

            list_args = parser.parse_args(['list', args.name])
            list_args.command(list_args, factory)
            self.assertOut(['Found 1 matching fuzzers:'], 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()


if __name__ == '__main__':
    unittest.main()
