Improves EXPECT_DEATH_IF_SUPPORTED to allow streaming of messages and enforcing the validity of arguments (by Vlad Losev); adds samples for the event listener API (by Vlad Losev); simplifies the tests using EXPECT_DEATH_IF_SUPPORTED (by Zhanyong Wan).
This commit is contained in:
		
							
								
								
									
										165
									
								
								samples/sample10_unittest.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								samples/sample10_unittest.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,165 @@
 | 
			
		||||
// Copyright 2009 Google Inc. All Rights Reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: vladl@google.com (Vlad Losev)
 | 
			
		||||
 | 
			
		||||
// This sample shows how to use Google Test listener API to implement
 | 
			
		||||
// a primitive leak checker.
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include <gtest/gtest.h>
 | 
			
		||||
 | 
			
		||||
using ::testing::InitGoogleTest;
 | 
			
		||||
using ::testing::Test;
 | 
			
		||||
using ::testing::TestInfo;
 | 
			
		||||
using ::testing::TestPartResult;
 | 
			
		||||
using ::testing::UnitTest;
 | 
			
		||||
using ::testing::internal::EmptyTestEventListener;
 | 
			
		||||
using ::testing::internal::EventListeners;
 | 
			
		||||
using ::testing::internal::TestCase;
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// TODO(vladl@google.com): Get rid of the accessor class once the API is
 | 
			
		||||
// published.
 | 
			
		||||
class UnitTestAccessor {
 | 
			
		||||
 public:
 | 
			
		||||
  static bool Passed(const UnitTest& unit_test) { return unit_test.Passed(); }
 | 
			
		||||
  static EventListeners& listeners(UnitTest* unit_test) {
 | 
			
		||||
    return unit_test->listeners();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
using ::testing::internal::UnitTestAccessor;
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
// We will track memory used by this class.
 | 
			
		||||
class Water {
 | 
			
		||||
 public:
 | 
			
		||||
  // Normal Water declarations go here.
 | 
			
		||||
 | 
			
		||||
  // operator new and operator delete help us control water allocation.
 | 
			
		||||
  void* operator new(size_t allocation_size) {
 | 
			
		||||
    allocated_++;
 | 
			
		||||
    return malloc(allocation_size);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void operator delete(void* block, size_t allocation_size) {
 | 
			
		||||
    allocated_--;
 | 
			
		||||
    free(block);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static int allocated() { return allocated_; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  static int allocated_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int Water::allocated_ = 0;
 | 
			
		||||
 | 
			
		||||
// This event listener monitors how many Water objects are created and
 | 
			
		||||
// destroyed by each test, and reports a failure if a test leaks some Water
 | 
			
		||||
// objects. It does this by comparing the number of live Water objects at
 | 
			
		||||
// the beginning of a test and at the end of a test.
 | 
			
		||||
class LeakChecker : public EmptyTestEventListener {
 | 
			
		||||
 private:
 | 
			
		||||
  // Called before a test starts.
 | 
			
		||||
  virtual void OnTestStart(const TestInfo& test_info) {
 | 
			
		||||
    initially_allocated_ = Water::allocated();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Called after a test ends.
 | 
			
		||||
  virtual void OnTestEnd(const TestInfo& test_info) {
 | 
			
		||||
    int difference = Water::allocated() - initially_allocated_;
 | 
			
		||||
 | 
			
		||||
    // You can generate a failure in any event handler except
 | 
			
		||||
    // OnTestPartResult. Just use an appropriate Google Test assertion to do
 | 
			
		||||
    // it.
 | 
			
		||||
    EXPECT_TRUE(difference <= 0)
 | 
			
		||||
        << "Leaked " << difference << " unit(s) of Water!";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int initially_allocated_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST(ListenersTest, DoesNotLeak) {
 | 
			
		||||
  Water* water = new Water;
 | 
			
		||||
  delete water;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This should fail when the --check_for_leaks command line flag is
 | 
			
		||||
// specified.
 | 
			
		||||
TEST(ListenersTest, LeaksWater) {
 | 
			
		||||
  Water* water = new Water;
 | 
			
		||||
  EXPECT_TRUE(water != NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  bool check_for_leaks = false;
 | 
			
		||||
  if (argc > 1 && strcmp(argv[1], "--check_for_leaks") == 0 )
 | 
			
		||||
    check_for_leaks = true;
 | 
			
		||||
  else
 | 
			
		||||
    printf("%s\n", "Run this program with --check_for_leaks to enable "
 | 
			
		||||
           "custom leak checking in the tests.");
 | 
			
		||||
 | 
			
		||||
  // If we are given the --check_for_leaks command line flag, installs the
 | 
			
		||||
  // leak checker.
 | 
			
		||||
  if (check_for_leaks) {
 | 
			
		||||
    EventListeners& listeners = UnitTestAccessor::listeners(
 | 
			
		||||
        UnitTest::GetInstance());
 | 
			
		||||
 | 
			
		||||
    // Adds the leak checker to the end of the test event listener list,
 | 
			
		||||
    // after the default text output printer and the default XML report
 | 
			
		||||
    // generator.
 | 
			
		||||
    //
 | 
			
		||||
    // The order is important - it ensures that failures generated in the
 | 
			
		||||
    // leak checker's OnTestEnd() method are processed by the text and XML
 | 
			
		||||
    // printers *before* their OnTestEnd() methods are called, such that
 | 
			
		||||
    // they are attributed to the right test. Remember that a listener
 | 
			
		||||
    // receives an OnXyzStart event *after* listeners preceding it in the
 | 
			
		||||
    // list received that event, and receives an OnXyzEnd event *before*
 | 
			
		||||
    // listeners preceding it.
 | 
			
		||||
    //
 | 
			
		||||
    // We don't need to worry about deleting the new listener later, as
 | 
			
		||||
    // Google Test will do it.
 | 
			
		||||
    listeners.Append(new LeakChecker);
 | 
			
		||||
  }
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										188
									
								
								samples/sample9_unittest.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								samples/sample9_unittest.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,188 @@
 | 
			
		||||
// Copyright 2009 Google Inc. All Rights Reserved.
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
//
 | 
			
		||||
// Author: vladl@google.com (Vlad Losev)
 | 
			
		||||
 | 
			
		||||
// This sample shows how to use Google Test listener API to implement
 | 
			
		||||
// an alternative console output and how to use the UnitTest reflection API
 | 
			
		||||
// to enumerate test cases and tests and to inspect their results.
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include <gtest/gtest.h>
 | 
			
		||||
 | 
			
		||||
using ::testing::InitGoogleTest;
 | 
			
		||||
using ::testing::Test;
 | 
			
		||||
using ::testing::TestInfo;
 | 
			
		||||
using ::testing::TestPartResult;
 | 
			
		||||
using ::testing::UnitTest;
 | 
			
		||||
using ::testing::internal::EmptyTestEventListener;
 | 
			
		||||
using ::testing::internal::EventListeners;
 | 
			
		||||
using ::testing::internal::TestCase;
 | 
			
		||||
 | 
			
		||||
namespace testing {
 | 
			
		||||
namespace internal {
 | 
			
		||||
 | 
			
		||||
// TODO(vladl@google.com): Get rid of the accessor class once the API is
 | 
			
		||||
// published.
 | 
			
		||||
class UnitTestAccessor {
 | 
			
		||||
 public:
 | 
			
		||||
  static bool Passed(const UnitTest& unit_test) { return unit_test.Passed(); }
 | 
			
		||||
  static EventListeners& listeners(UnitTest* unit_test) {
 | 
			
		||||
    return unit_test->listeners();
 | 
			
		||||
  }
 | 
			
		||||
  static int GetTotalTestCaseCount(const UnitTest& unit_test) {
 | 
			
		||||
    return unit_test.total_test_case_count();
 | 
			
		||||
  }
 | 
			
		||||
  static const TestCase* GetTestCase(const UnitTest& unit_test, int index) {
 | 
			
		||||
    return unit_test.GetTestCase(index);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 | 
			
		||||
using ::testing::internal::UnitTestAccessor;
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
// Provides alternative output mode which produces minimal amount of
 | 
			
		||||
// information about tests.
 | 
			
		||||
class TersePrinter : public EmptyTestEventListener {
 | 
			
		||||
 private:
 | 
			
		||||
  // Called before any test activity starts.
 | 
			
		||||
  virtual void OnTestProgramStart(const UnitTest& unit_test) {}
 | 
			
		||||
 | 
			
		||||
  // Called after all test activities have ended.
 | 
			
		||||
  virtual void OnTestProgramEnd(const UnitTest& unit_test) {
 | 
			
		||||
    fprintf(stdout,
 | 
			
		||||
            "TEST %s\n",
 | 
			
		||||
            UnitTestAccessor::Passed(unit_test) ? "PASSED" : "FAILED");
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Called before a test starts.
 | 
			
		||||
  virtual void OnTestStart(const TestInfo& test_info) {
 | 
			
		||||
    fprintf(stdout,
 | 
			
		||||
            "*** Test %s.%s starting.\n",
 | 
			
		||||
            test_info.test_case_name(),
 | 
			
		||||
            test_info.name());
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Called after a test ends.
 | 
			
		||||
  virtual void OnTestEnd(const TestInfo& test_info) {
 | 
			
		||||
    fprintf(stdout,
 | 
			
		||||
            "*** Test %s.%s ending.\n",
 | 
			
		||||
            test_info.test_case_name(),
 | 
			
		||||
            test_info.name());
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Called after a failed assertion or a SUCCESS().
 | 
			
		||||
  virtual void OnNewTestPartResult(const TestPartResult& test_part_result) {
 | 
			
		||||
    fprintf(stdout,
 | 
			
		||||
            "%s in %s:%d\n%s\n",
 | 
			
		||||
            test_part_result.failed() ? "*** Failure" : "Success",
 | 
			
		||||
            test_part_result.file_name(),
 | 
			
		||||
            test_part_result.line_number(),
 | 
			
		||||
            test_part_result.summary());
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
  }
 | 
			
		||||
};  // class TersePrinter
 | 
			
		||||
 | 
			
		||||
TEST(CustomOutputTest, PrintsMessage) {
 | 
			
		||||
  printf("Printing something from the test body...\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(CustomOutputTest, Succeeds) {
 | 
			
		||||
  SUCCEED() << "SUCCEED() has been invoked from here";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(CustomOutputTest, Fails) {
 | 
			
		||||
  EXPECT_EQ(1, 2)
 | 
			
		||||
      << "This test fails in order to demonstrate alternative failure messages";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
 | 
			
		||||
int main(int argc, char **argv) {
 | 
			
		||||
  InitGoogleTest(&argc, argv);
 | 
			
		||||
 | 
			
		||||
  bool terse_output = false;
 | 
			
		||||
  if (argc > 1 && strcmp(argv[1], "--terse_output") == 0 )
 | 
			
		||||
    terse_output = true;
 | 
			
		||||
  else
 | 
			
		||||
    printf("%s\n", "Run this program with --terse_output to change the way "
 | 
			
		||||
           "it prints its output.");
 | 
			
		||||
 | 
			
		||||
  // If we are given the --terse_output command line flag, suppresses the
 | 
			
		||||
  // standard output and attaches own result printer.
 | 
			
		||||
  if (terse_output) {
 | 
			
		||||
    EventListeners& listeners = UnitTestAccessor::listeners(
 | 
			
		||||
        UnitTest::GetInstance());
 | 
			
		||||
 | 
			
		||||
    // Removes the default console output listener from the list so it will
 | 
			
		||||
    // not receive events from Google Test and won't print any output. Since
 | 
			
		||||
    // this operation transfers ownership of the listener to the caller we
 | 
			
		||||
    // have to delete it as well.
 | 
			
		||||
    delete listeners.Release(listeners.default_result_printer());
 | 
			
		||||
 | 
			
		||||
    // Adds the custom output listener to the list. It will now receive
 | 
			
		||||
    // events from Google Test and print the alternative output. We don't
 | 
			
		||||
    // have to worry about deleting it since Google Test assumes ownership
 | 
			
		||||
    // over it after adding it to the list.
 | 
			
		||||
    listeners.Append(new TersePrinter);
 | 
			
		||||
  }
 | 
			
		||||
  int ret_val = RUN_ALL_TESTS();
 | 
			
		||||
 | 
			
		||||
  // This is an example of using the UnitTest reflection API to inspect test
 | 
			
		||||
  // results. Here we discount failures from the tests we expected to fail.
 | 
			
		||||
  int unexpectedly_failed_tests = 0;
 | 
			
		||||
  for (int i = 0;
 | 
			
		||||
       i < UnitTestAccessor::GetTotalTestCaseCount(*UnitTest::GetInstance());
 | 
			
		||||
       ++i) {
 | 
			
		||||
    const TestCase* test_case = UnitTestAccessor::GetTestCase(
 | 
			
		||||
        *UnitTest::GetInstance(), i);
 | 
			
		||||
    for (int j = 0; j < test_case->total_test_count(); ++j) {
 | 
			
		||||
      const TestInfo* test_info = test_case->GetTestInfo(j);
 | 
			
		||||
      // Counts failed tests that were not meant to fail (those without
 | 
			
		||||
      // 'Fails' in the name).
 | 
			
		||||
      if (test_info->result()->Failed() &&
 | 
			
		||||
          strcmp(test_info->name(), "Fails") != 0) {
 | 
			
		||||
        unexpectedly_failed_tests++;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Test that were meant to fail should not affect the test program outcome.
 | 
			
		||||
  if (unexpectedly_failed_tests == 0)
 | 
			
		||||
    ret_val = 0;
 | 
			
		||||
 | 
			
		||||
  return ret_val;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user