github.com/jlmucb/cloudproxy@v0.0.0-20170830161738-b5aa0b619bc4/src/third_party/googlemock/gtest/test/gtest_break_on_failure_unittest.py (about)

     1  #!/usr/bin/env python
     2  #
     3  # Copyright 2006, Google Inc.
     4  # All rights reserved.
     5  #
     6  # Redistribution and use in source and binary forms, with or without
     7  # modification, are permitted provided that the following conditions are
     8  # met:
     9  #
    10  #     * Redistributions of source code must retain the above copyright
    11  # notice, this list of conditions and the following disclaimer.
    12  #     * Redistributions in binary form must reproduce the above
    13  # copyright notice, this list of conditions and the following disclaimer
    14  # in the documentation and/or other materials provided with the
    15  # distribution.
    16  #     * Neither the name of Google Inc. nor the names of its
    17  # contributors may be used to endorse or promote products derived from
    18  # this software without specific prior written permission.
    19  #
    20  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    21  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    22  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    23  # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    24  # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    25  # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    26  # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    27  # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    28  # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    29  # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    30  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    31  
    32  """Unit test for Google Test's break-on-failure mode.
    33  
    34  A user can ask Google Test to seg-fault when an assertion fails, using
    35  either the GTEST_BREAK_ON_FAILURE environment variable or the
    36  --gtest_break_on_failure flag.  This script tests such functionality
    37  by invoking gtest_break_on_failure_unittest_ (a program written with
    38  Google Test) with different environments and command line flags.
    39  """
    40  
    41  __author__ = 'wan@google.com (Zhanyong Wan)'
    42  
    43  import gtest_test_utils
    44  import os
    45  import sys
    46  
    47  
    48  # Constants.
    49  
    50  IS_WINDOWS = os.name == 'nt'
    51  
    52  # The environment variable for enabling/disabling the break-on-failure mode.
    53  BREAK_ON_FAILURE_ENV_VAR = 'GTEST_BREAK_ON_FAILURE'
    54  
    55  # The command line flag for enabling/disabling the break-on-failure mode.
    56  BREAK_ON_FAILURE_FLAG = 'gtest_break_on_failure'
    57  
    58  # The environment variable for enabling/disabling the throw-on-failure mode.
    59  THROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_ON_FAILURE'
    60  
    61  # The environment variable for enabling/disabling the catch-exceptions mode.
    62  CATCH_EXCEPTIONS_ENV_VAR = 'GTEST_CATCH_EXCEPTIONS'
    63  
    64  # Path to the gtest_break_on_failure_unittest_ program.
    65  EXE_PATH = gtest_test_utils.GetTestExecutablePath(
    66      'gtest_break_on_failure_unittest_')
    67  
    68  
    69  environ = gtest_test_utils.environ
    70  SetEnvVar = gtest_test_utils.SetEnvVar
    71  
    72  # Tests in this file run a Google-Test-based test program and expect it
    73  # to terminate prematurely.  Therefore they are incompatible with
    74  # the premature-exit-file protocol by design.  Unset the
    75  # premature-exit filepath to prevent Google Test from creating
    76  # the file.
    77  SetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)
    78  
    79  
    80  def Run(command):
    81    """Runs a command; returns 1 if it was killed by a signal, or 0 otherwise."""
    82  
    83    p = gtest_test_utils.Subprocess(command, env=environ)
    84    if p.terminated_by_signal:
    85      return 1
    86    else:
    87      return 0
    88  
    89  
    90  # The tests.
    91  
    92  
    93  class GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase):
    94    """Tests using the GTEST_BREAK_ON_FAILURE environment variable or
    95    the --gtest_break_on_failure flag to turn assertion failures into
    96    segmentation faults.
    97    """
    98  
    99    def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault):
   100      """Runs gtest_break_on_failure_unittest_ and verifies that it does
   101      (or does not) have a seg-fault.
   102  
   103      Args:
   104        env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment
   105                          variable; None if the variable should be unset.
   106        flag_value:       value of the --gtest_break_on_failure flag;
   107                          None if the flag should not be present.
   108        expect_seg_fault: 1 if the program is expected to generate a seg-fault;
   109                          0 otherwise.
   110      """
   111  
   112      SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, env_var_value)
   113  
   114      if env_var_value is None:
   115        env_var_value_msg = ' is not set'
   116      else:
   117        env_var_value_msg = '=' + env_var_value
   118  
   119      if flag_value is None:
   120        flag = ''
   121      elif flag_value == '0':
   122        flag = '--%s=0' % BREAK_ON_FAILURE_FLAG
   123      else:
   124        flag = '--%s' % BREAK_ON_FAILURE_FLAG
   125  
   126      command = [EXE_PATH]
   127      if flag:
   128        command.append(flag)
   129  
   130      if expect_seg_fault:
   131        should_or_not = 'should'
   132      else:
   133        should_or_not = 'should not'
   134  
   135      has_seg_fault = Run(command)
   136  
   137      SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, None)
   138  
   139      msg = ('when %s%s, an assertion failure in "%s" %s cause a seg-fault.' %
   140             (BREAK_ON_FAILURE_ENV_VAR, env_var_value_msg, ' '.join(command),
   141              should_or_not))
   142      self.assert_(has_seg_fault == expect_seg_fault, msg)
   143  
   144    def testDefaultBehavior(self):
   145      """Tests the behavior of the default mode."""
   146  
   147      self.RunAndVerify(env_var_value=None,
   148                        flag_value=None,
   149                        expect_seg_fault=0)
   150  
   151    def testEnvVar(self):
   152      """Tests using the GTEST_BREAK_ON_FAILURE environment variable."""
   153  
   154      self.RunAndVerify(env_var_value='0',
   155                        flag_value=None,
   156                        expect_seg_fault=0)
   157      self.RunAndVerify(env_var_value='1',
   158                        flag_value=None,
   159                        expect_seg_fault=1)
   160  
   161    def testFlag(self):
   162      """Tests using the --gtest_break_on_failure flag."""
   163  
   164      self.RunAndVerify(env_var_value=None,
   165                        flag_value='0',
   166                        expect_seg_fault=0)
   167      self.RunAndVerify(env_var_value=None,
   168                        flag_value='1',
   169                        expect_seg_fault=1)
   170  
   171    def testFlagOverridesEnvVar(self):
   172      """Tests that the flag overrides the environment variable."""
   173  
   174      self.RunAndVerify(env_var_value='0',
   175                        flag_value='0',
   176                        expect_seg_fault=0)
   177      self.RunAndVerify(env_var_value='0',
   178                        flag_value='1',
   179                        expect_seg_fault=1)
   180      self.RunAndVerify(env_var_value='1',
   181                        flag_value='0',
   182                        expect_seg_fault=0)
   183      self.RunAndVerify(env_var_value='1',
   184                        flag_value='1',
   185                        expect_seg_fault=1)
   186  
   187    def testBreakOnFailureOverridesThrowOnFailure(self):
   188      """Tests that gtest_break_on_failure overrides gtest_throw_on_failure."""
   189  
   190      SetEnvVar(THROW_ON_FAILURE_ENV_VAR, '1')
   191      try:
   192        self.RunAndVerify(env_var_value=None,
   193                          flag_value='1',
   194                          expect_seg_fault=1)
   195      finally:
   196        SetEnvVar(THROW_ON_FAILURE_ENV_VAR, None)
   197  
   198    if IS_WINDOWS:
   199      def testCatchExceptionsDoesNotInterfere(self):
   200        """Tests that gtest_catch_exceptions doesn't interfere."""
   201  
   202        SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, '1')
   203        try:
   204          self.RunAndVerify(env_var_value='1',
   205                            flag_value='1',
   206                            expect_seg_fault=1)
   207        finally:
   208          SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, None)
   209  
   210  
   211  if __name__ == '__main__':
   212    gtest_test_utils.Main()