#!/usr/bin/env vpython
# Copyright 2014 The Chromium 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 unittest

from pylib.base import base_test_result
from pylib.gtest import gtest_test_instance


class GtestTestInstanceTests(unittest.TestCase):

  def testParseGTestListTests_simple(self):
    raw_output = [
      'TestCaseOne.',
      '  testOne',
      '  testTwo',
      'TestCaseTwo.',
      '  testThree',
      '  testFour',
    ]
    actual = gtest_test_instance.ParseGTestListTests(raw_output)
    expected = [
      'TestCaseOne.testOne',
      'TestCaseOne.testTwo',
      'TestCaseTwo.testThree',
      'TestCaseTwo.testFour',
    ]
    self.assertEqual(expected, actual)

  def testParseGTestListTests_typeParameterized_old(self):
    raw_output = [
      'TPTestCase/WithTypeParam/0.',
      '  testOne',
      '  testTwo',
    ]
    actual = gtest_test_instance.ParseGTestListTests(raw_output)
    expected = [
      'TPTestCase/WithTypeParam/0.testOne',
      'TPTestCase/WithTypeParam/0.testTwo',
    ]
    self.assertEqual(expected, actual)

  def testParseGTestListTests_typeParameterized_new(self):
    raw_output = [
      'TPTestCase/WithTypeParam/0.  # TypeParam = TypeParam0',
      '  testOne',
      '  testTwo',
    ]
    actual = gtest_test_instance.ParseGTestListTests(raw_output)
    expected = [
      'TPTestCase/WithTypeParam/0.testOne',
      'TPTestCase/WithTypeParam/0.testTwo',
    ]
    self.assertEqual(expected, actual)

  def testParseGTestListTests_valueParameterized_old(self):
    raw_output = [
      'VPTestCase.',
      '  testWithValueParam/0',
      '  testWithValueParam/1',
    ]
    actual = gtest_test_instance.ParseGTestListTests(raw_output)
    expected = [
      'VPTestCase.testWithValueParam/0',
      'VPTestCase.testWithValueParam/1',
    ]
    self.assertEqual(expected, actual)

  def testParseGTestListTests_valueParameterized_new(self):
    raw_output = [
      'VPTestCase.',
      '  testWithValueParam/0  # GetParam() = 0',
      '  testWithValueParam/1  # GetParam() = 1',
    ]
    actual = gtest_test_instance.ParseGTestListTests(raw_output)
    expected = [
      'VPTestCase.testWithValueParam/0',
      'VPTestCase.testWithValueParam/1',
    ]
    self.assertEqual(expected, actual)

  def testParseGTestListTests_emptyTestName(self):
    raw_output = [
      'TestCase.',
      '  ',
      '  nonEmptyTestName',
    ]
    actual = gtest_test_instance.ParseGTestListTests(raw_output)
    expected = [
      'TestCase.nonEmptyTestName',
    ]
    self.assertEqual(expected, actual)

  def testParseGTestOutput_pass(self):
    raw_output = [
      '[ RUN      ] FooTest.Bar',
      '[       OK ] FooTest.Bar (1 ms)',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(1, len(actual))
    self.assertEquals('FooTest.Bar', actual[0].GetName())
    self.assertEquals(1, actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.PASS, actual[0].GetType())

  def testParseGTestOutput_fail(self):
    raw_output = [
      '[ RUN      ] FooTest.Bar',
      '[   FAILED ] FooTest.Bar (1 ms)',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(1, len(actual))
    self.assertEquals('FooTest.Bar', actual[0].GetName())
    self.assertEquals(1, actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.FAIL, actual[0].GetType())

  def testParseGTestOutput_crash(self):
    raw_output = [
      '[ RUN      ] FooTest.Bar',
      '[  CRASHED ] FooTest.Bar (1 ms)',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(1, len(actual))
    self.assertEquals('FooTest.Bar', actual[0].GetName())
    self.assertEquals(1, actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.CRASH, actual[0].GetType())

  def testParseGTestOutput_errorCrash(self):
    raw_output = [
      '[ RUN      ] FooTest.Bar',
      '[ERROR:blah] Currently running: FooTest.Bar',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(1, len(actual))
    self.assertEquals('FooTest.Bar', actual[0].GetName())
    self.assertIsNone(actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.CRASH, actual[0].GetType())

  def testParseGTestOutput_fatalDcheck(self):
    raw_output = [
        '[ RUN      ] FooTest.Bar',
        '[0324/183029.116334:FATAL:test_timeouts.cc(103)] Check failed: !init',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(1, len(actual))
    self.assertEquals('FooTest.Bar', actual[0].GetName())
    self.assertIsNone(actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.CRASH, actual[0].GetType())

  def testParseGTestOutput_unknown(self):
    raw_output = [
      '[ RUN      ] FooTest.Bar',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(1, len(actual))
    self.assertEquals('FooTest.Bar', actual[0].GetName())
    self.assertEquals(0, actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.CRASH, actual[0].GetType())

  def testParseGTestOutput_nonterminalUnknown(self):
    raw_output = [
      '[ RUN      ] FooTest.Bar',
      '[ RUN      ] FooTest.Baz',
      '[       OK ] FooTest.Baz (1 ms)',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(2, len(actual))

    self.assertEquals('FooTest.Bar', actual[0].GetName())
    self.assertEquals(0, actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.CRASH, actual[0].GetType())

    self.assertEquals('FooTest.Baz', actual[1].GetName())
    self.assertEquals(1, actual[1].GetDuration())
    self.assertEquals(base_test_result.ResultType.PASS, actual[1].GetType())

  def testParseGTestOutput_deathTestCrashOk(self):
    raw_output = [
      '[ RUN      ] FooTest.Bar',
      '[ CRASHED      ]',
      '[       OK ] FooTest.Bar (1 ms)',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(1, len(actual))

    self.assertEquals('FooTest.Bar', actual[0].GetName())
    self.assertEquals(1, actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.PASS, actual[0].GetType())

  def testParseGTestOutput_typeParameterized(self):
    raw_output = [
        '[ RUN      ] Baz/FooTest.Bar/0',
        '[   FAILED ] Baz/FooTest.Bar/0, where TypeParam =  (1 ms)',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(1, len(actual))
    self.assertEquals('Baz/FooTest.Bar/0', actual[0].GetName())
    self.assertEquals(1, actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.FAIL, actual[0].GetType())

  def testParseGTestOutput_valueParameterized(self):
    raw_output = [
        '[ RUN      ] Baz/FooTest.Bar/0',
        '[   FAILED ] Baz/FooTest.Bar/0,' +
        ' where GetParam() = 4-byte object <00-00 00-00> (1 ms)',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(1, len(actual))
    self.assertEquals('Baz/FooTest.Bar/0', actual[0].GetName())
    self.assertEquals(1, actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.FAIL, actual[0].GetType())

  def testParseGTestOutput_typeAndValueParameterized(self):
    raw_output = [
        '[ RUN      ] Baz/FooTest.Bar/0',
        '[   FAILED ] Baz/FooTest.Bar/0,' +
        ' where TypeParam =  and GetParam() =  (1 ms)',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(1, len(actual))
    self.assertEquals('Baz/FooTest.Bar/0', actual[0].GetName())
    self.assertEquals(1, actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.FAIL, actual[0].GetType())

  def testParseGTestOutput_skippedTest(self):
    raw_output = [
        '[ RUN      ] FooTest.Bar',
        '[  SKIPPED ] FooTest.Bar (1 ms)',
    ]
    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
    self.assertEquals(1, len(actual))
    self.assertEquals('FooTest.Bar', actual[0].GetName())
    self.assertEquals(1, actual[0].GetDuration())
    self.assertEquals(base_test_result.ResultType.SKIP, actual[0].GetType())

  def testParseGTestXML_none(self):
    actual = gtest_test_instance.ParseGTestXML(None)
    self.assertEquals([], actual)

  def testParseGTestJSON_none(self):
    actual = gtest_test_instance.ParseGTestJSON(None)
    self.assertEquals([], actual)

  def testParseGTestJSON_example(self):
    raw_json = """
      {
        "tests": {
          "mojom_tests": {
            "parse": {
              "ast_unittest": {
                "ASTTest": {
                  "testNodeBase": {
                    "expected": "PASS",
                    "actual": "PASS",
                    "artifacts": {
                      "screenshot": ["screenshots/page.png"]
                    }
                  }
                }
              }
            }
          }
        },
        "interrupted": false,
        "path_delimiter": ".",
        "version": 3,
        "seconds_since_epoch": 1406662283.764424,
        "num_failures_by_type": {
          "FAIL": 0,
          "PASS": 1
        },
        "artifact_types": {
          "screenshot": "image/png"
        }
      }"""
    actual = gtest_test_instance.ParseGTestJSON(raw_json)
    self.assertEquals(1, len(actual))
    self.assertEquals('mojom_tests.parse.ast_unittest.ASTTest.testNodeBase',
                      actual[0].GetName())
    self.assertEquals(base_test_result.ResultType.PASS, actual[0].GetType())

  def testTestNameWithoutDisabledPrefix_disabled(self):
    test_name_list = [
      'A.DISABLED_B',
      'DISABLED_A.B',
      'DISABLED_A.DISABLED_B',
    ]
    for test_name in test_name_list:
      actual = gtest_test_instance \
          .TestNameWithoutDisabledPrefix(test_name)
      expected = 'A.B'
      self.assertEquals(expected, actual)

  def testTestNameWithoutDisabledPrefix_flaky(self):
    test_name_list = [
      'A.FLAKY_B',
      'FLAKY_A.B',
      'FLAKY_A.FLAKY_B',
    ]
    for test_name in test_name_list:
      actual = gtest_test_instance \
          .TestNameWithoutDisabledPrefix(test_name)
      expected = 'A.B'
      self.assertEquals(expected, actual)

  def testTestNameWithoutDisabledPrefix_notDisabledOrFlaky(self):
    test_name = 'A.B'
    actual = gtest_test_instance \
        .TestNameWithoutDisabledPrefix(test_name)
    expected = 'A.B'
    self.assertEquals(expected, actual)


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