Merge branch 'master' into win-libcxx
This commit is contained in:
		
						commit
						370cdcdcba
					
				@ -687,6 +687,9 @@ class GTEST_API_ TestInfo {
 | 
			
		||||
  // Returns the line where this test is defined.
 | 
			
		||||
  int line() const { return location_.line; }
 | 
			
		||||
 | 
			
		||||
  // Return true if this test should not be run because it's in another shard.
 | 
			
		||||
  bool is_in_another_shard() const { return is_in_another_shard_; }
 | 
			
		||||
 | 
			
		||||
  // Returns true if this test should run, that is if the test is not
 | 
			
		||||
  // disabled (or it is disabled but the also_run_disabled_tests flag has
 | 
			
		||||
  // been specified) and its full name matches the user-specified filter.
 | 
			
		||||
@ -707,10 +710,9 @@ class GTEST_API_ TestInfo {
 | 
			
		||||
 | 
			
		||||
  // Returns true iff this test will appear in the XML report.
 | 
			
		||||
  bool is_reportable() const {
 | 
			
		||||
    // The XML report includes tests matching the filter.
 | 
			
		||||
    // In the future, we may trim tests that are excluded because of
 | 
			
		||||
    // sharding.
 | 
			
		||||
    return matches_filter_;
 | 
			
		||||
    // The XML report includes tests matching the filter, excluding those
 | 
			
		||||
    // run in other shards.
 | 
			
		||||
    return matches_filter_ && !is_in_another_shard_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Returns the result of the test.
 | 
			
		||||
@ -774,6 +776,7 @@ class GTEST_API_ TestInfo {
 | 
			
		||||
  bool is_disabled_;                // True iff this test is disabled
 | 
			
		||||
  bool matches_filter_;             // True if this test matches the
 | 
			
		||||
                                    // user-specified filter.
 | 
			
		||||
  bool is_in_another_shard_;        // Will be run in another shard.
 | 
			
		||||
  internal::TestFactoryBase* const factory_;  // The factory that creates
 | 
			
		||||
                                              // the test object
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -54,6 +54,9 @@
 | 
			
		||||
#   define GTEST_OS_WINDOWS_PHONE 1
 | 
			
		||||
#  elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
 | 
			
		||||
#   define GTEST_OS_WINDOWS_RT 1
 | 
			
		||||
#  elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE)
 | 
			
		||||
#   define GTEST_OS_WINDOWS_PHONE 1
 | 
			
		||||
#   define GTEST_OS_WINDOWS_TV_TITLE 1
 | 
			
		||||
#  else
 | 
			
		||||
    // WINAPI_FAMILY defined but no known partition matched.
 | 
			
		||||
    // Default to desktop.
 | 
			
		||||
 | 
			
		||||
@ -1655,7 +1655,7 @@ namespace {
 | 
			
		||||
AssertionResult HRESULTFailureHelper(const char* expr,
 | 
			
		||||
                                     const char* expected,
 | 
			
		||||
                                     long hr) {  // NOLINT
 | 
			
		||||
# if GTEST_OS_WINDOWS_MOBILE
 | 
			
		||||
# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_TV_TITLE
 | 
			
		||||
 | 
			
		||||
  // Windows CE doesn't support FormatMessage.
 | 
			
		||||
  const char error_text[] = "";
 | 
			
		||||
@ -4813,10 +4813,11 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
 | 
			
		||||
          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
 | 
			
		||||
          matches_filter;
 | 
			
		||||
 | 
			
		||||
      const bool is_selected = is_runnable &&
 | 
			
		||||
          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
 | 
			
		||||
           ShouldRunTestOnShard(total_shards, shard_index,
 | 
			
		||||
                                num_runnable_tests));
 | 
			
		||||
      const bool is_in_another_shard =
 | 
			
		||||
          shard_tests != IGNORE_SHARDING_PROTOCOL &&
 | 
			
		||||
          !ShouldRunTestOnShard(total_shards, shard_index, num_runnable_tests);
 | 
			
		||||
      test_info->is_in_another_shard_ = is_in_another_shard;
 | 
			
		||||
      const bool is_selected = is_runnable && !is_in_another_shard;
 | 
			
		||||
 | 
			
		||||
      num_runnable_tests += is_runnable;
 | 
			
		||||
      num_selected_tests += is_selected;
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,6 @@ __author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
import os
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
IS_WINDOWS = os.name = 'nt'
 | 
			
		||||
 | 
			
		||||
COLOR_ENV_VAR = 'GTEST_COLOR'
 | 
			
		||||
 | 
			
		||||
@ -44,12 +44,8 @@ __author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import re
 | 
			
		||||
try:
 | 
			
		||||
  from sets import Set as set  # For Python 2.3 compatibility
 | 
			
		||||
except ImportError:
 | 
			
		||||
  pass
 | 
			
		||||
import sets
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
 | 
			
		||||
# Constants.
 | 
			
		||||
@ -59,10 +55,12 @@ import gtest_test_utils
 | 
			
		||||
# script in a subprocess to print whether the variable is STILL in
 | 
			
		||||
# os.environ.  We then use 'eval' to parse the child's output so that an
 | 
			
		||||
# exception is thrown if the input is anything other than 'True' nor 'False'.
 | 
			
		||||
os.environ['EMPTY_VAR'] = ''
 | 
			
		||||
child = gtest_test_utils.Subprocess(
 | 
			
		||||
    [sys.executable, '-c', 'import os; print(\'EMPTY_VAR\' in os.environ)'])
 | 
			
		||||
CAN_PASS_EMPTY_ENV = eval(child.output)
 | 
			
		||||
CAN_PASS_EMPTY_ENV = False
 | 
			
		||||
if sys.executable:
 | 
			
		||||
  os.environ['EMPTY_VAR'] = ''
 | 
			
		||||
  child = gtest_test_utils.Subprocess(
 | 
			
		||||
      [sys.executable, '-c', 'import os; print \'EMPTY_VAR\' in os.environ'])
 | 
			
		||||
  CAN_PASS_EMPTY_ENV = eval(child.output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Check if this platform can unset environment variables in child processes.
 | 
			
		||||
@ -71,11 +69,14 @@ CAN_PASS_EMPTY_ENV = eval(child.output)
 | 
			
		||||
# is NO LONGER in os.environ.
 | 
			
		||||
# We use 'eval' to parse the child's output so that an exception
 | 
			
		||||
# is thrown if the input is neither 'True' nor 'False'.
 | 
			
		||||
os.environ['UNSET_VAR'] = 'X'
 | 
			
		||||
del os.environ['UNSET_VAR']
 | 
			
		||||
child = gtest_test_utils.Subprocess(
 | 
			
		||||
    [sys.executable, '-c', 'import os; print(\'UNSET_VAR\' not in os.environ)'])
 | 
			
		||||
CAN_UNSET_ENV = eval(child.output)
 | 
			
		||||
CAN_UNSET_ENV = False
 | 
			
		||||
if sys.executable:
 | 
			
		||||
  os.environ['UNSET_VAR'] = 'X'
 | 
			
		||||
  del os.environ['UNSET_VAR']
 | 
			
		||||
  child = gtest_test_utils.Subprocess(
 | 
			
		||||
      [sys.executable, '-c', 'import os; print \'UNSET_VAR\' not in os.environ'
 | 
			
		||||
      ])
 | 
			
		||||
  CAN_UNSET_ENV = eval(child.output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Checks if we should test with an empty filter. This doesn't
 | 
			
		||||
@ -97,7 +98,7 @@ SHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'
 | 
			
		||||
FILTER_FLAG = 'gtest_filter'
 | 
			
		||||
 | 
			
		||||
# The command line flag for including disabled tests.
 | 
			
		||||
ALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests'
 | 
			
		||||
ALSO_RUN_DISABLED_TESTS_FLAG = 'gtest_also_run_disabled_tests'
 | 
			
		||||
 | 
			
		||||
# Command to run the gtest_filter_unittest_ program.
 | 
			
		||||
COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_filter_unittest_')
 | 
			
		||||
@ -246,14 +247,14 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase):
 | 
			
		||||
    for slice_var in list_of_sets:
 | 
			
		||||
      full_partition.extend(slice_var)
 | 
			
		||||
    self.assertEqual(len(set_var), len(full_partition))
 | 
			
		||||
    self.assertEqual(set(set_var), set(full_partition))
 | 
			
		||||
    self.assertEqual(sets.Set(set_var), sets.Set(full_partition))
 | 
			
		||||
 | 
			
		||||
  def AdjustForParameterizedTests(self, tests_to_run):
 | 
			
		||||
    """Adjust tests_to_run in case value parameterized tests are disabled."""
 | 
			
		||||
 | 
			
		||||
    global param_tests_present
 | 
			
		||||
    if not param_tests_present:
 | 
			
		||||
      return list(set(tests_to_run) - set(PARAM_TESTS))
 | 
			
		||||
      return list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS))
 | 
			
		||||
    else:
 | 
			
		||||
      return tests_to_run
 | 
			
		||||
 | 
			
		||||
@ -294,6 +295,7 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase):
 | 
			
		||||
    Runs all shards of gtest_filter_unittest_ with the given filter, and
 | 
			
		||||
    verifies that the right set of tests were run. The union of tests run
 | 
			
		||||
    on each shard should be identical to tests_to_run, without duplicates.
 | 
			
		||||
    If check_exit_0, .
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
      gtest_filter: A filter to apply to the tests.
 | 
			
		||||
@ -339,7 +341,7 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase):
 | 
			
		||||
    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
 | 
			
		||||
 | 
			
		||||
    # Construct the command line.
 | 
			
		||||
    args = ['--%s' % ALSO_RUN_DISABED_TESTS_FLAG]
 | 
			
		||||
    args = ['--%s' % ALSO_RUN_DISABLED_TESTS_FLAG]
 | 
			
		||||
    if gtest_filter is not None:
 | 
			
		||||
      args.append('--%s=%s' % (FILTER_FLAG, gtest_filter))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,7 @@
 | 
			
		||||
 | 
			
		||||
"""Tests the text output of Google C++ Testing Framework.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SYNOPSIS
 | 
			
		||||
       gtest_output_test.py --build_dir=BUILD/DIR --gengolden
 | 
			
		||||
         # where BUILD/DIR contains the built gtest_output_test_ file.
 | 
			
		||||
@ -51,6 +52,7 @@ import gtest_test_utils
 | 
			
		||||
GENGOLDEN_FLAG = '--gengolden'
 | 
			
		||||
CATCH_EXCEPTIONS_ENV_VAR_NAME = 'GTEST_CATCH_EXCEPTIONS'
 | 
			
		||||
 | 
			
		||||
IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
 | 
			
		||||
IS_WINDOWS = os.name == 'nt'
 | 
			
		||||
 | 
			
		||||
# TODO(vladl@google.com): remove the _lin suffix.
 | 
			
		||||
@ -250,11 +252,12 @@ test_list = GetShellCommandOutput(COMMAND_LIST_TESTS)
 | 
			
		||||
SUPPORTS_DEATH_TESTS = 'DeathTest' in test_list
 | 
			
		||||
SUPPORTS_TYPED_TESTS = 'TypedTest' in test_list
 | 
			
		||||
SUPPORTS_THREADS = 'ExpectFailureWithThreadsTest' in test_list
 | 
			
		||||
SUPPORTS_STACK_TRACES = False
 | 
			
		||||
SUPPORTS_STACK_TRACES = IS_LINUX
 | 
			
		||||
 | 
			
		||||
CAN_GENERATE_GOLDEN_FILE = (SUPPORTS_DEATH_TESTS and
 | 
			
		||||
                            SUPPORTS_TYPED_TESTS and
 | 
			
		||||
                            SUPPORTS_THREADS and
 | 
			
		||||
                            SUPPORTS_STACK_TRACES and
 | 
			
		||||
                            not IS_WINDOWS)
 | 
			
		||||
 | 
			
		||||
class GTestOutputTest(gtest_test_utils.TestCase):
 | 
			
		||||
@ -280,7 +283,7 @@ class GTestOutputTest(gtest_test_utils.TestCase):
 | 
			
		||||
  def testOutput(self):
 | 
			
		||||
    output = GetOutputOfAllCommands()
 | 
			
		||||
 | 
			
		||||
    golden_file = open(GOLDEN_PATH, 'r')
 | 
			
		||||
    golden_file = open(GOLDEN_PATH, 'rb')
 | 
			
		||||
    # A mis-configured source control system can cause \r appear in EOL
 | 
			
		||||
    # sequences when we read the golden file irrespective of an operating
 | 
			
		||||
    # system used. Therefore, we need to strip those \r's from newlines
 | 
			
		||||
@ -331,9 +334,9 @@ if __name__ == '__main__':
 | 
			
		||||
    else:
 | 
			
		||||
      message = (
 | 
			
		||||
          """Unable to write a golden file when compiled in an environment
 | 
			
		||||
that does not support all the required features (death tests, typed tests,
 | 
			
		||||
and multiple threads).  Please generate the golden file using a binary built
 | 
			
		||||
with those features enabled.""")
 | 
			
		||||
that does not support all the required features (death tests,
 | 
			
		||||
typed tests, stack traces, and multiple threads).
 | 
			
		||||
Please build this test and generate the golden file using Blaze on Linux.""")
 | 
			
		||||
 | 
			
		||||
      sys.stderr.write(message)
 | 
			
		||||
      sys.exit(1)
 | 
			
		||||
 | 
			
		||||
@ -67,7 +67,7 @@ namespace {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Used for verifying that global environment set-up and tear-down are
 | 
			
		||||
// inside the gtest_repeat loop.
 | 
			
		||||
// inside the --gtest_repeat loop.
 | 
			
		||||
 | 
			
		||||
int g_environment_set_up_count = 0;
 | 
			
		||||
int g_environment_tear_down_count = 0;
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,3 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
#
 | 
			
		||||
# Copyright 2006, Google Inc.
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
@ -30,19 +28,24 @@
 | 
			
		||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
"""Unit test utilities for Google C++ Testing Framework."""
 | 
			
		||||
# Suppresses the 'Import not at the top of the file' lint complaint.
 | 
			
		||||
# pylint: disable-msg=C6204
 | 
			
		||||
 | 
			
		||||
__author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import atexit
 | 
			
		||||
import os
 | 
			
		||||
import shutil
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
 | 
			
		||||
IS_WINDOWS = os.name == 'nt'
 | 
			
		||||
IS_CYGWIN = os.name == 'posix' and 'CYGWIN' in os.uname()[0]
 | 
			
		||||
 | 
			
		||||
import atexit
 | 
			
		||||
import shutil
 | 
			
		||||
import tempfile
 | 
			
		||||
import unittest
 | 
			
		||||
_test_module = unittest
 | 
			
		||||
 | 
			
		||||
# Suppresses the 'Import not at the top of the file' lint complaint.
 | 
			
		||||
# pylint: disable-msg=C6204
 | 
			
		||||
try:
 | 
			
		||||
  import subprocess
 | 
			
		||||
  _SUBPROCESS_MODULE_AVAILABLE = True
 | 
			
		||||
@ -53,9 +56,6 @@ except:
 | 
			
		||||
 | 
			
		||||
GTEST_OUTPUT_VAR_NAME = 'GTEST_OUTPUT'
 | 
			
		||||
 | 
			
		||||
IS_WINDOWS = os.name == 'nt'
 | 
			
		||||
IS_CYGWIN = os.name == 'posix' and 'CYGWIN' in os.uname()[0]
 | 
			
		||||
 | 
			
		||||
# The environment variable for specifying the path to the premature-exit file.
 | 
			
		||||
PREMATURE_EXIT_FILE_ENV_VAR = 'TEST_PREMATURE_EXIT_FILE'
 | 
			
		||||
 | 
			
		||||
@ -145,8 +145,6 @@ atexit.register(_RemoveTempDir)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def GetTempDir():
 | 
			
		||||
  """Returns a directory for temporary files."""
 | 
			
		||||
 | 
			
		||||
  global _temp_dir
 | 
			
		||||
  if not _temp_dir:
 | 
			
		||||
    _temp_dir = tempfile.mkdtemp()
 | 
			
		||||
@ -178,7 +176,7 @@ def GetTestExecutablePath(executable_name, build_dir=None):
 | 
			
		||||
        'Unable to find the test binary "%s". Please make sure to provide\n'
 | 
			
		||||
        'a path to the binary via the --build_dir flag or the BUILD_DIR\n'
 | 
			
		||||
        'environment variable.' % path)
 | 
			
		||||
    sys.stdout.write(message)
 | 
			
		||||
    print >> sys.stderr, message
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
  return path
 | 
			
		||||
 | 
			
		||||
@ -70,7 +70,7 @@ def SetEnvVar(env_var, value):
 | 
			
		||||
def Run(command):
 | 
			
		||||
  """Runs a command; returns True/False if its exit code is/isn't 0."""
 | 
			
		||||
 | 
			
		||||
  print('Running "%s". . .' % ' '.join(command))
 | 
			
		||||
  print 'Running "%s". . .' % ' '.join(command)
 | 
			
		||||
  p = gtest_test_utils.Subprocess(command)
 | 
			
		||||
  return p.exited and p.exit_code == 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -33,9 +33,9 @@
 | 
			
		||||
 | 
			
		||||
__author__ = 'wan@google.com (Zhanyong Wan)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_uninitialized_test_')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -46,8 +46,8 @@ def Assert(condition):
 | 
			
		||||
 | 
			
		||||
def AssertEq(expected, actual):
 | 
			
		||||
  if expected != actual:
 | 
			
		||||
    print('Expected: %s' % (expected,))
 | 
			
		||||
    print('  Actual: %s' % (actual,))
 | 
			
		||||
    print 'Expected: %s' % (expected,)
 | 
			
		||||
    print '  Actual: %s' % (actual,)
 | 
			
		||||
    raise AssertionError
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -56,8 +56,8 @@ def TestExitCodeAndOutput(command):
 | 
			
		||||
 | 
			
		||||
  # Verifies that 'command' exits with code 1.
 | 
			
		||||
  p = gtest_test_utils.Subprocess(command)
 | 
			
		||||
  Assert(p.exited)
 | 
			
		||||
  AssertEq(1, p.exit_code)
 | 
			
		||||
  if p.exited and p.exit_code == 0:
 | 
			
		||||
    Assert('IMPORTANT NOTICE' in p.output);
 | 
			
		||||
  Assert('InitGoogleTest' in p.output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -34,8 +34,8 @@
 | 
			
		||||
TEST(DummyTest, Dummy) {
 | 
			
		||||
  // This test doesn't verify anything.  We just need it to create a
 | 
			
		||||
  // realistic stage for testing the behavior of Google Test when
 | 
			
		||||
  // RUN_ALL_TESTS() is called without testing::InitGoogleTest() being
 | 
			
		||||
  // called first.
 | 
			
		||||
  // RUN_ALL_TESTS() is called without 
 | 
			
		||||
  // testing::InitGoogleTest() being called first.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
 | 
			
		||||
@ -34,9 +34,9 @@
 | 
			
		||||
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
// Verifies that the command line flag variables can be accessed
 | 
			
		||||
// in code once <gtest/gtest.h> has been #included.
 | 
			
		||||
// Do not move it after other #includes.
 | 
			
		||||
// Verifies that the command line flag variables can be accessed in
 | 
			
		||||
// code once "gtest/gtest.h" has been
 | 
			
		||||
// #included.  Do not move it after other gtest #includes.
 | 
			
		||||
TEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) {
 | 
			
		||||
  bool dummy = testing::GTEST_FLAG(also_run_disabled_tests)
 | 
			
		||||
      || testing::GTEST_FLAG(break_on_failure)
 | 
			
		||||
 | 
			
		||||
@ -31,15 +31,11 @@
 | 
			
		||||
 | 
			
		||||
"""Unit test for the gtest_xml_output module."""
 | 
			
		||||
 | 
			
		||||
__author__ = "keith.ray@gmail.com (Keith Ray)"
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
from xml.dom import minidom, Node
 | 
			
		||||
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
import gtest_xml_test_utils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GTEST_OUTPUT_SUBDIR = "xml_outfiles"
 | 
			
		||||
GTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_"
 | 
			
		||||
GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_"
 | 
			
		||||
 | 
			
		||||
@ -31,8 +31,6 @@
 | 
			
		||||
 | 
			
		||||
"""Unit test for the gtest_xml_output module"""
 | 
			
		||||
 | 
			
		||||
__author__ = 'eefacm@gmail.com (Sean Mcafee)'
 | 
			
		||||
 | 
			
		||||
import datetime
 | 
			
		||||
import errno
 | 
			
		||||
import os
 | 
			
		||||
@ -43,12 +41,16 @@ from xml.dom import minidom, Node
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
import gtest_xml_test_utils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GTEST_FILTER_FLAG = '--gtest_filter'
 | 
			
		||||
GTEST_LIST_TESTS_FLAG = '--gtest_list_tests'
 | 
			
		||||
GTEST_OUTPUT_FLAG         = "--gtest_output"
 | 
			
		||||
GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml"
 | 
			
		||||
GTEST_PROGRAM_NAME = "gtest_xml_output_unittest_"
 | 
			
		||||
GTEST_OUTPUT_FLAG = '--gtest_output'
 | 
			
		||||
GTEST_DEFAULT_OUTPUT_FILE = 'test_detail.xml'
 | 
			
		||||
GTEST_PROGRAM_NAME = 'gtest_xml_output_unittest_'
 | 
			
		||||
 | 
			
		||||
# The environment variables for test sharding.
 | 
			
		||||
TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
 | 
			
		||||
SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
 | 
			
		||||
SHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'
 | 
			
		||||
 | 
			
		||||
SUPPORTS_STACK_TRACES = False
 | 
			
		||||
 | 
			
		||||
@ -141,6 +143,19 @@ EXPECTED_FILTERED_TEST_XML = """<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
  </testsuite>
 | 
			
		||||
</testsuites>"""
 | 
			
		||||
 | 
			
		||||
EXPECTED_SHARDED_TEST_XML = """<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<testsuites tests="3" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests" ad_hoc_property="42">
 | 
			
		||||
  <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
 | 
			
		||||
    <testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
 | 
			
		||||
  </testsuite>
 | 
			
		||||
  <testsuite name="NoFixtureTest" tests="1" failures="0" disabled="0" errors="0" time="*">
 | 
			
		||||
     <testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest" key="1"/>
 | 
			
		||||
  </testsuite>
 | 
			
		||||
  <testsuite name="Single/ValueParamTest" tests="1" failures="0" disabled="0" errors="0" time="*">
 | 
			
		||||
    <testcase name="AnotherTestThatHasValueParamAttribute/1" value_param="42" status="run" time="*" classname="Single/ValueParamTest" />
 | 
			
		||||
  </testsuite>
 | 
			
		||||
</testsuites>"""
 | 
			
		||||
 | 
			
		||||
EXPECTED_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<testsuites tests="0" failures="0" disabled="0" errors="0" time="*"
 | 
			
		||||
            timestamp="*" name="AllTests">
 | 
			
		||||
@ -182,7 +197,7 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
 | 
			
		||||
    Runs a test program that generates an empty XML output, and checks if
 | 
			
		||||
    the timestamp attribute in the testsuites tag is valid.
 | 
			
		||||
    """
 | 
			
		||||
    actual = self._GetXmlOutput('gtest_no_test_unittest', [], 0)
 | 
			
		||||
    actual = self._GetXmlOutput('gtest_no_test_unittest', [], {}, 0)
 | 
			
		||||
    date_time_str = actual.documentElement.getAttributeNode('timestamp').value
 | 
			
		||||
    # datetime.strptime() is only available in Python 2.5+ so we have to
 | 
			
		||||
    # parse the expected datetime manually.
 | 
			
		||||
@ -212,8 +227,7 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
 | 
			
		||||
        'gtest_no_test_unittest')
 | 
			
		||||
    try:
 | 
			
		||||
      os.remove(output_file)
 | 
			
		||||
    except OSError:
 | 
			
		||||
      e = sys.exc_info()[1]
 | 
			
		||||
    except OSError, e:
 | 
			
		||||
      if e.errno != errno.ENOENT:
 | 
			
		||||
        raise
 | 
			
		||||
 | 
			
		||||
@ -263,7 +277,22 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
 | 
			
		||||
    self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_FILTERED_TEST_XML, 0,
 | 
			
		||||
                        extra_args=['%s=SuccessfulTest.*' % GTEST_FILTER_FLAG])
 | 
			
		||||
 | 
			
		||||
  def _GetXmlOutput(self, gtest_prog_name, extra_args, expected_exit_code):
 | 
			
		||||
  def testShardedTestXmlOutput(self):
 | 
			
		||||
    """Verifies XML output when run using multiple shards.
 | 
			
		||||
 | 
			
		||||
    Runs a test program that executes only one shard and verifies that tests
 | 
			
		||||
    from other shards do not show up in the XML output.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    self._TestXmlOutput(
 | 
			
		||||
        GTEST_PROGRAM_NAME,
 | 
			
		||||
        EXPECTED_SHARDED_TEST_XML,
 | 
			
		||||
        0,
 | 
			
		||||
        extra_env={SHARD_INDEX_ENV_VAR: '0',
 | 
			
		||||
                   TOTAL_SHARDS_ENV_VAR: '10'})
 | 
			
		||||
 | 
			
		||||
  def _GetXmlOutput(self, gtest_prog_name, extra_args, extra_env,
 | 
			
		||||
                    expected_exit_code):
 | 
			
		||||
    """
 | 
			
		||||
    Returns the xml output generated by running the program gtest_prog_name.
 | 
			
		||||
    Furthermore, the program's exit code must be expected_exit_code.
 | 
			
		||||
@ -274,7 +303,11 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
 | 
			
		||||
 | 
			
		||||
    command = ([gtest_prog_path, '%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path)] +
 | 
			
		||||
               extra_args)
 | 
			
		||||
    p = gtest_test_utils.Subprocess(command)
 | 
			
		||||
    environ_copy = os.environ.copy()
 | 
			
		||||
    if extra_env:
 | 
			
		||||
      environ_copy.update(extra_env)
 | 
			
		||||
    p = gtest_test_utils.Subprocess(command, env=environ_copy)
 | 
			
		||||
 | 
			
		||||
    if p.terminated_by_signal:
 | 
			
		||||
      self.assert_(False,
 | 
			
		||||
                   '%s was killed by signal %d' % (gtest_prog_name, p.signal))
 | 
			
		||||
@ -288,7 +321,7 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
 | 
			
		||||
    return actual
 | 
			
		||||
 | 
			
		||||
  def _TestXmlOutput(self, gtest_prog_name, expected_xml,
 | 
			
		||||
                     expected_exit_code, extra_args=None):
 | 
			
		||||
                     expected_exit_code, extra_args=None, extra_env=None):
 | 
			
		||||
    """
 | 
			
		||||
    Asserts that the XML document generated by running the program
 | 
			
		||||
    gtest_prog_name matches expected_xml, a string containing another
 | 
			
		||||
@ -297,7 +330,7 @@ class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    actual = self._GetXmlOutput(gtest_prog_name, extra_args or [],
 | 
			
		||||
                                expected_exit_code)
 | 
			
		||||
                                extra_env or {}, expected_exit_code)
 | 
			
		||||
    expected = minidom.parseString(expected_xml)
 | 
			
		||||
    self.NormalizeXml(actual.documentElement)
 | 
			
		||||
    self.AssertEquivalentNodes(expected.documentElement,
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,3 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
#
 | 
			
		||||
# Copyright 2006, Google Inc.
 | 
			
		||||
# All rights reserved.
 | 
			
		||||
#
 | 
			
		||||
@ -31,15 +29,12 @@
 | 
			
		||||
 | 
			
		||||
"""Unit test utilities for gtest_xml_output"""
 | 
			
		||||
 | 
			
		||||
__author__ = 'eefacm@gmail.com (Sean Mcafee)'
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import re
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
from xml.dom import minidom, Node
 | 
			
		||||
 | 
			
		||||
import gtest_test_utils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GTEST_OUTPUT_FLAG         = '--gtest_output'
 | 
			
		||||
GTEST_DEFAULT_OUTPUT_FILE = 'test_detail.xml'
 | 
			
		||||
 | 
			
		||||
class GTestXMLTestCase(gtest_test_utils.TestCase):
 | 
			
		||||
@ -101,7 +96,7 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
 | 
			
		||||
    self.assertEquals(
 | 
			
		||||
        len(expected_children), len(actual_children),
 | 
			
		||||
        'number of child elements differ in element ' + actual_node.tagName)
 | 
			
		||||
    for child_id, child in expected_children.items():
 | 
			
		||||
    for child_id, child in expected_children.iteritems():
 | 
			
		||||
      self.assert_(child_id in actual_children,
 | 
			
		||||
                   '<%s> is not in <%s> (in element %s)' %
 | 
			
		||||
                   (child_id, actual_children, actual_node.tagName))
 | 
			
		||||
@ -187,8 +182,8 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
 | 
			
		||||
          # Replaces the source line information with a normalized form.
 | 
			
		||||
          cdata = re.sub(source_line_pat, '\\1*\n', child.nodeValue)
 | 
			
		||||
          # Removes the actual stack trace.
 | 
			
		||||
          child.nodeValue = re.sub(r'\nStack trace:\n(.|\n)*',
 | 
			
		||||
                                   '', cdata)
 | 
			
		||||
          child.nodeValue = re.sub(r'Stack trace:\n(.|\n)*',
 | 
			
		||||
                                   'Stack trace:\n*', cdata)
 | 
			
		||||
    for child in element.childNodes:
 | 
			
		||||
      if child.nodeType == Node.ELEMENT_NODE:
 | 
			
		||||
        self.NormalizeXml(child)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user