#!/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 os
from pyfakefs import fake_filesystem_unittest
import tempfile
import unittest

from test_results import TestResult

from rust_main_program import _format_test_name
from rust_main_program import _parse_test_name
from rust_main_program import _get_exe_specific_tests
from rust_main_program import _scrape_test_list
from rust_main_program import _scrape_test_results
from rust_main_program import _parse_args
from rust_main_program import _TestExecutableWrapper


class Tests(fake_filesystem_unittest.TestCase):
    def test_format_test_name(self):
        self.assertEqual('test_exe//test_bar',
                         _format_test_name('test_exe', 'test_bar'))
        self.assertEqual('test_exe//foo/test_foo',
                         _format_test_name('test_exe', 'foo::test_foo'))

    def test_parse_test_name(self):
        self.assertEqual(('test_exe', 'test_bar'),
                         _parse_test_name('test_exe//test_bar'))
        self.assertEqual(('test_exe', 'foo::test_foo'),
                         _parse_test_name('test_exe//foo/test_foo'))

    def test_scrape_test_list(self):
        test_input = """
test_foo: test
test_bar: test
foo::test_in_mod: test
test_benchmark: benchmark
        """.strip()
        actual_results = _scrape_test_list(test_input, 'test_exe_name')
        expected_results = [
            'test_exe_name//test_foo', 'test_exe_name//test_bar',
            'test_exe_name//foo/test_in_mod'
        ]
        self.assertEqual(actual_results, expected_results)

    # https://crbug.com/1281664 meant that Rust executables might
    # incorrectly think that they were invoked with no cmdline args.
    # Back then we didn't realize that out test wrappers broken :-(.
    # The test below tries to ensure this won't happen again.
    def test_scrape_test_list_with_unexpected_lines(self):
        test_input = """
running 1 test
test test_hello ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
        """.strip()
        with self.assertRaises(ValueError):
            _scrape_test_list(test_input, 'test_exe_name')

    def test_scrape_test_results(self):
        test_input = """
running 3 tests
test test_foo ... ok
test test_bar ... ok
test foo::test_in_mod ... ok
test test_foobar ... FAILED

failures:

---- test_foobar stdout ----
thread 'test_foobar' panicked at 'assertion failed: `(left == right)`
  left: `7`,
 right: `124`', ../../build/rust/tests/test_rust_static_library/src/lib.rs:29:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    test_foobar

test result: FAILED. 3 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
        """.strip()
        list_of_expected_test_names = [
            'test_foo', 'test_bar', 'foo::test_in_mod', 'test_foobar'
        ]
        actual_results = _scrape_test_results(test_input, 'test_exe_name',
                                              list_of_expected_test_names)
        expected_results = [
            TestResult('test_exe_name//test_foo', 'PASS'),
            TestResult('test_exe_name//test_bar', 'PASS'),
            TestResult('test_exe_name//foo/test_in_mod', 'PASS'),
            TestResult('test_exe_name//test_foobar', 'FAIL')
        ]
        self.assertEqual(actual_results, expected_results)

    def test_parse_args(self):
        args = _parse_args(['--rust-test-executable=foo'])
        self.assertEqual(['foo'], args.rust_test_executables)

        args = _parse_args(
            ['--rust-test-executable=foo', '--rust-test-executable=bar'])
        self.assertEqual(['foo', 'bar'], args.rust_test_executables)

    def test_get_exe_specific_tests(self):
        result = _get_exe_specific_tests(
            "exe_name",
            ["exe_name//foo1", "exe_name//foo2", "other_exe//foo3"])
        self.assertEqual(['foo1', 'foo2'], result)

    def test_executable_wrapper_basic_construction(self):
        with tempfile.TemporaryDirectory() as tmpdirname:
            exe_filename = 'foo-bar.exe'
            exe_path = os.path.join(tmpdirname, exe_filename)
            with open(exe_path, 'w'):
                pass
            t = _TestExecutableWrapper(exe_path)
            self.assertEqual('foo-bar', t._name_of_test_executable)

    def test_executable_wrapper_missing_file(self):
        with self.assertRaises(ValueError):
            _TestExecutableWrapper('no-such-file.exe')


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