#!/usr/bin/env vpython3

# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import json
import os
import tempfile
import unittest

# vpython-provided modules.
from pyfakefs import fake_filesystem_unittest  # pylint: disable=import-error

from test_results import TestResult

import main_program


class FakeTestExecutableWrapper:
    def __init__(self, hardcoded_test_list, hardcoded_test_results):
        self._hardcoded_test_list = hardcoded_test_list
        self._hardcoded_test_results = hardcoded_test_results

    def list_all_tests(self):
        return self._hardcoded_test_list

    def run_tests(self, list_of_tests_to_run):
        results = []
        for test in self._hardcoded_test_results:
            if test.test_name in list_of_tests_to_run:
                results.append(test)
        return results


class EndToEndTests(fake_filesystem_unittest.TestCase):
    def test_basic_scenario(self):
        with tempfile.TemporaryDirectory() as tmpdirname:
            # Prepare simulated inputs.
            test_list = [
                'test_foo', 'test_bar', 'test_foobar', 'module/test_foo'
            ]
            test_results = [
                TestResult('test_foo', 'PASS'),
                TestResult('test_bar', 'PASS'),
                TestResult('test_foobar', 'FAILED'),
                TestResult('module/test_foo', 'PASS')
            ]
            fake_executable_wrapper = FakeTestExecutableWrapper(
                test_list, test_results)
            parser = argparse.ArgumentParser()
            main_program.add_cmdline_args(parser)
            output_file = os.path.join(tmpdirname, 'test.out')
            args = parser.parse_args(
                args=['--isolated-script-test-output={}'.format(output_file)])
            fake_env = {'GTEST_SHARD_INDEX': 0, 'GTEST_TOTAL_SHARDS': 1}

            # Run code under test.
            main_program.main([fake_executable_wrapper], args, fake_env)

            # Verify results.
            with open(output_file) as f:
                actual_json_output = json.load(f)
                del actual_json_output['seconds_since_epoch']
            # yapf: disable
            expected_json_output = {
                'interrupted': False,
                'path_delimiter': '//',
                #'seconds_since_epoch': 1635974313.8388052,
                'version': 3,
                'tests': {
                    'test_foo': {
                        'expected': 'PASS',
                        'actual': 'PASS'
                    },
                    'test_bar': {
                        'expected': 'PASS',
                        'actual': 'PASS'
                    },
                    'test_foobar': {
                        'expected': 'PASS',
                        'actual': 'FAILED'
                    },
                    'module/test_foo': {
                        'expected': 'PASS',
                        'actual': 'PASS'
                    }},
                'num_failures_by_type': {
                    'PASS': 3,
                    'FAILED': 1
                }
            }
            # yapf: enable
            self.assertEqual(actual_json_output, expected_json_output)


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