Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
687964c8
Unverified
Commit
687964c8
authored
Aug 17, 2018
by
Conor Burgess
Committed by
GitHub
Aug 17, 2018
Browse files
Merge branch 'master' into fix-argc
parents
f11a8f91
02a8ca87
Changes
222
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
1686 additions
and
261 deletions
+1686
-261
googletest/src/gtest-test-part.cc
googletest/src/gtest-test-part.cc
+2
-3
googletest/src/gtest-typed-test.cc
googletest/src/gtest-typed-test.cc
+2
-2
googletest/src/gtest.cc
googletest/src/gtest.cc
+600
-100
googletest/src/gtest_main.cc
googletest/src/gtest_main.cc
+1
-2
googletest/test/BUILD.bazel
googletest/test/BUILD.bazel
+249
-92
googletest/test/googletest-break-on-failure-unittest.py
googletest/test/googletest-break-on-failure-unittest.py
+4
-6
googletest/test/googletest-break-on-failure-unittest_.cc
googletest/test/googletest-break-on-failure-unittest_.cc
+1
-2
googletest/test/googletest-catch-exceptions-test.py
googletest/test/googletest-catch-exceptions-test.py
+6
-8
googletest/test/googletest-catch-exceptions-test_.cc
googletest/test/googletest-catch-exceptions-test_.cc
+5
-5
googletest/test/googletest-color-test.py
googletest/test/googletest-color-test.py
+2
-4
googletest/test/googletest-color-test_.cc
googletest/test/googletest-color-test_.cc
+1
-2
googletest/test/googletest-death-test-test.cc
googletest/test/googletest-death-test-test.cc
+12
-8
googletest/test/googletest-death-test_ex_test.cc
googletest/test/googletest-death-test_ex_test.cc
+2
-3
googletest/test/googletest-env-var-test.py
googletest/test/googletest-env-var-test.py
+7
-7
googletest/test/googletest-env-var-test_.cc
googletest/test/googletest-env-var-test_.cc
+4
-5
googletest/test/googletest-filepath-test.cc
googletest/test/googletest-filepath-test.cc
+1
-2
googletest/test/googletest-filter-unittest.py
googletest/test/googletest-filter-unittest.py
+6
-8
googletest/test/googletest-filter-unittest_.cc
googletest/test/googletest-filter-unittest_.cc
+1
-2
googletest/test/googletest-json-outfiles-test.py
googletest/test/googletest-json-outfiles-test.py
+162
-0
googletest/test/googletest-json-output-unittest.py
googletest/test/googletest-json-output-unittest.py
+618
-0
No files found.
googletest/src/gtest-test-part.cc
View file @
687964c8
...
...
@@ -26,10 +26,9 @@
// 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: mheule@google.com (Markus Heule)
//
// The Google C++ Testing Framework (Google Test)
// The Google C++ Testing and Mocking Framework (Google Test)
#include "gtest/gtest-test-part.h"
#include "src/gtest-internal-inl.h"
...
...
googletest/src/gtest-typed-test.cc
View file @
687964c8
...
...
@@ -26,10 +26,10 @@
// 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: wan@google.com (Zhanyong Wan)
#include "gtest/gtest-typed-test.h"
#include "gtest/gtest.h"
namespace
testing
{
...
...
googletest/src/gtest.cc
View file @
687964c8
...
...
@@ -26,10 +26,9 @@
// 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: wan@google.com (Zhanyong Wan)
//
// The Google C++ Testing Framework (Google Test)
// The Google C++ Testing and Mocking Framework (Google Test)
#include "gtest/gtest.h"
#include "gtest/internal/custom/gtest.h"
...
...
@@ -55,7 +54,7 @@
#if GTEST_OS_LINUX
//
TODO(kenton@google.com)
: Use autoconf to detect availability of
//
FIXME
: Use autoconf to detect availability of
// gettimeofday().
# define GTEST_HAS_GETTIMEOFDAY_ 1
...
...
@@ -94,9 +93,9 @@
# if GTEST_OS_WINDOWS_MINGW
// MinGW has gettimeofday() but not _ftime64().
//
TODO(kenton@google.com)
: Use autoconf to detect availability of
//
FIXME
: Use autoconf to detect availability of
// gettimeofday().
//
TODO(kenton@google.com)
: There are other ways to get the time on
//
FIXME
: There are other ways to get the time on
// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW
// supports these. consider using them instead.
# define GTEST_HAS_GETTIMEOFDAY_ 1
...
...
@@ -111,7 +110,7 @@
#else
// Assume other platforms have gettimeofday().
//
TODO(kenton@google.com)
: Use autoconf to detect availability of
//
FIXME
: Use autoconf to detect availability of
// gettimeofday().
# define GTEST_HAS_GETTIMEOFDAY_ 1
...
...
@@ -139,12 +138,20 @@
# define vsnprintf _vsnprintf
#endif // GTEST_OS_WINDOWS
#if GTEST_OS_MAC
# ifndef GTEST_OS_IOS
# include <crt_externs.h>
# endif
#endif
#if GTEST_HAS_ABSL
#include "absl/debugging/failure_signal_handler.h"
#include "absl/debugging/stacktrace.h"
#include "absl/debugging/symbolize.h"
#include "absl/strings/str_cat.h"
#endif // GTEST_HAS_ABSL
namespace
testing
{
using
internal
::
CountIf
;
...
...
@@ -166,8 +173,10 @@ static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
// A test filter that matches everything.
static
const
char
kUniversalFilter
[]
=
"*"
;
// The default output file for XML output.
static
const
char
kDefaultOutputFile
[]
=
"test_detail.xml"
;
// The default output format.
static
const
char
kDefaultOutputFormat
[]
=
"xml"
;
// The default output file.
static
const
char
kDefaultOutputFile
[]
=
"test_detail"
;
// The environment variable name for the test shard index.
static
const
char
kTestShardIndex
[]
=
"GTEST_SHARD_INDEX"
;
...
...
@@ -188,13 +197,14 @@ bool g_help_flag = false;
}
// namespace internal
// Bazel passes in the argument to '--test_filter' via the TESTBRIDGE_TEST_ONLY
// environment variable.
static
const
char
*
GetDefaultFilter
()
{
#ifdef GTEST_TEST_FILTER_ENV_VAR_
const
char
*
const
testbridge_test_only
=
g
et
e
nv
(
G
TEST
_TEST_FILTER_ENV_VAR_
);
const
char
*
const
testbridge_test_only
=
internal
::
posix
::
G
et
E
nv
(
"
TEST
BRIDGE_TEST_ONLY"
);
if
(
testbridge_test_only
!=
NULL
)
{
return
testbridge_test_only
;
}
#endif // GTEST_TEST_FILTER_ENV_VAR_
return
kUniversalFilter
;
}
...
...
@@ -231,15 +241,28 @@ GTEST_DEFINE_string_(
"exclude). A test is run if it matches one of the positive "
"patterns and does not match any of the negative patterns."
);
GTEST_DEFINE_bool_
(
install_failure_signal_handler
,
internal
::
BoolFromGTestEnv
(
"install_failure_signal_handler"
,
false
),
"If true and supported on the current platform, "
GTEST_NAME_
" should "
"install a signal handler that dumps debugging information when fatal "
"signals are raised."
);
GTEST_DEFINE_bool_
(
list_tests
,
false
,
"List all tests without running them."
);
// The net priority order after flag processing is thus:
// --gtest_output command line flag
// GTEST_OUTPUT environment variable
// XML_OUTPUT_FILE environment variable
// ''
GTEST_DEFINE_string_
(
output
,
internal
::
StringFromGTestEnv
(
"output"
,
""
),
"A format (currently must be
\"
xml
\"
), optionally followed "
"by a colon and an output file name or directory. A directory "
"is indicated by a trailing pathname separator. "
internal
::
StringFromGTestEnv
(
"output"
,
internal
::
OutputFlagAlsoCheckEnvVar
().
c_str
()),
"A format (defaults to
\"
xml
\"
but can be specified to be
\"
json
\"
), "
"optionally followed by a colon and an output file name or directory. "
"A directory is indicated by a trailing pathname separator. "
"Examples:
\"
xml:filename.xml
\"
,
\"
xml::directoryname/
\"
. "
"If a directory is specified, output files will be created "
"within that directory, with file-names based on the test "
...
...
@@ -390,12 +413,15 @@ void AssertHelper::operator=(const Message& message) const {
GTEST_API_
GTEST_DEFINE_STATIC_MUTEX_
(
g_linked_ptr_mutex
);
// A copy of all command line arguments. Set by InitGoogleTest().
::
std
::
vector
<
testing
::
internal
::
string
>
g_argvs
;
::
std
::
vector
<
std
::
string
>
g_argvs
;
const
::
std
::
vector
<
testing
::
internal
::
string
>
&
GetArgvs
()
{
::
std
::
vector
<
std
::
string
>
GetArgvs
()
{
#if defined(GTEST_CUSTOM_GET_ARGVS_)
return
GTEST_CUSTOM_GET_ARGVS_
();
#else // defined(GTEST_CUSTOM_GET_ARGVS_)
// GTEST_CUSTOM_GET_ARGVS_() may return a container of std::string or
// ::string. This code converts it to the appropriate type.
const
auto
&
custom
=
GTEST_CUSTOM_GET_ARGVS_
();
return
::
std
::
vector
<
std
::
string
>
(
custom
.
begin
(),
custom
.
end
());
#else // defined(GTEST_CUSTOM_GET_ARGVS_)
return
g_argvs
;
#endif // defined(GTEST_CUSTOM_GET_ARGVS_)
}
...
...
@@ -434,16 +460,21 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
if
(
gtest_output_flag
==
NULL
)
return
""
;
std
::
string
format
=
GetOutputFormat
();
if
(
format
.
empty
())
format
=
std
::
string
(
kDefaultOutputFormat
);
const
char
*
const
colon
=
strchr
(
gtest_output_flag
,
':'
);
if
(
colon
==
NULL
)
return
internal
::
FilePath
::
ConcatPaths
(
return
internal
::
FilePath
::
MakeFileName
(
internal
::
FilePath
(
UnitTest
::
GetInstance
()
->
original_working_dir
()),
internal
::
FilePath
(
kDefaultOutputFile
)).
string
();
internal
::
FilePath
(
kDefaultOutputFile
),
0
,
format
.
c_str
()).
string
();
internal
::
FilePath
output_name
(
colon
+
1
);
if
(
!
output_name
.
IsAbsolutePath
())
//
TODO(wan@google.com)
: on Windows \some\path is not an absolute
//
FIXME
: on Windows \some\path is not an absolute
// path (as its meaning depends on the current drive), yet the
// following logic for turning it into an absolute path is wrong.
// Fix it.
...
...
@@ -817,7 +848,7 @@ TimeInMillis GetTimeInMillis() {
SYSTEMTIME
now_systime
;
FILETIME
now_filetime
;
ULARGE_INTEGER
now_int64
;
//
TODO(kenton@google.com)
: Shouldn't this just use
//
FIXME
: Shouldn't this just use
// GetSystemTimeAsFileTime()?
GetSystemTime
(
&
now_systime
);
if
(
SystemTimeToFileTime
(
&
now_systime
,
&
now_filetime
))
{
...
...
@@ -833,11 +864,11 @@ TimeInMillis GetTimeInMillis() {
// MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
// (deprecated function) there.
//
TODO(kenton@google.com)
: Use GetTickCount()? Or use
//
FIXME
: Use GetTickCount()? Or use
// SystemTimeToFileTime()
GTEST_DISABLE_MSC_
WARNINGS
_PUSH_
(
4996
)
GTEST_DISABLE_MSC_
DEPRECATED
_PUSH_
()
_ftime64
(
&
now
);
GTEST_DISABLE_MSC_
WARNINGS
_POP_
()
GTEST_DISABLE_MSC_
DEPRECATED
_POP_
()
return
static_cast
<
TimeInMillis
>
(
now
.
time
)
*
1000
+
now
.
millitm
;
#elif GTEST_HAS_GETTIMEOFDAY_
...
...
@@ -1372,7 +1403,7 @@ AssertionResult DoubleNearPredFormat(const char* expr1,
const
double
diff
=
fabs
(
val1
-
val2
);
if
(
diff
<=
abs_error
)
return
AssertionSuccess
();
//
TODO(wan)
: do not print the value of an expression if it's
//
FIXME
: do not print the value of an expression if it's
// already a literal.
return
AssertionFailure
()
<<
"The difference between "
<<
expr1
<<
" and "
<<
expr2
...
...
@@ -2577,12 +2608,10 @@ void ReportInvalidTestCaseType(const char* test_case_name,
<<
"probably rename one of the classes to put the tests into different
\n
"
<<
"test cases."
;
GTEST_LOG_
(
ERROR
)
<<
FormatFileLocation
(
code_location
.
file
.
c_str
(),
code_location
.
line
)
<<
" "
<<
errors
.
GetString
();
GTEST_LOG_
(
ERROR
)
<<
FormatFileLocation
(
code_location
.
file
.
c_str
(),
code_location
.
line
)
<<
" "
<<
errors
.
GetString
();
}
}
// namespace internal
namespace
{
...
...
@@ -2904,7 +2933,7 @@ static int GetBitOffset(WORD color_mask) {
if
(
color_mask
==
0
)
return
0
;
int
bitOffset
=
0
;
while
((
color_mask
&
1
)
==
0
)
{
while
((
color_mask
&
1
)
==
0
)
{
color_mask
>>=
1
;
++
bitOffset
;
}
...
...
@@ -2913,16 +2942,20 @@ static int GetBitOffset(WORD color_mask) {
static
WORD
GetNewColor
(
GTestColor
color
,
WORD
old_color_attrs
)
{
// Let's reuse the BG
static
const
WORD
background_mask
=
BACKGROUND_BLUE
|
BACKGROUND_GREEN
|
BACKGROUND_RED
|
BACKGROUND_INTENSITY
;
static
const
WORD
foreground_mask
=
FOREGROUND_BLUE
|
FOREGROUND_GREEN
|
FOREGROUND_RED
|
FOREGROUND_INTENSITY
;
static
const
WORD
background_mask
=
BACKGROUND_BLUE
|
BACKGROUND_GREEN
|
BACKGROUND_RED
|
BACKGROUND_INTENSITY
;
static
const
WORD
foreground_mask
=
FOREGROUND_BLUE
|
FOREGROUND_GREEN
|
FOREGROUND_RED
|
FOREGROUND_INTENSITY
;
const
WORD
existing_bg
=
old_color_attrs
&
background_mask
;
WORD
new_color
=
GetColorAttribute
(
color
)
|
existing_bg
|
FOREGROUND_INTENSITY
;
WORD
new_color
=
GetColorAttribute
(
color
)
|
existing_bg
|
FOREGROUND_INTENSITY
;
static
const
int
bg_bitOffset
=
GetBitOffset
(
background_mask
);
static
const
int
fg_bitOffset
=
GetBitOffset
(
foreground_mask
);
if
(((
new_color
&
background_mask
)
>>
bg_bitOffset
)
==
((
new_color
&
foreground_mask
)
>>
fg_bitOffset
))
{
new_color
^=
FOREGROUND_INTENSITY
;
//invert intensity
if
(((
new_color
&
background_mask
)
>>
bg_bitOffset
)
==
((
new_color
&
foreground_mask
)
>>
fg_bitOffset
))
{
new_color
^=
FOREGROUND_INTENSITY
;
// invert intensity
}
return
new_color
;
}
...
...
@@ -2983,7 +3016,6 @@ bool ShouldUseColor(bool stdout_is_tty) {
// cannot simply emit special characters and have the terminal change colors.
// This routine must actually emit the characters rather than return a string
// that would be colored when printed, as can be done on Linux.
GTEST_ATTRIBUTE_PRINTF_
(
2
,
3
)
static
void
ColoredPrintf
(
GTestColor
color
,
const
char
*
fmt
,
...)
{
va_list
args
;
va_start
(
args
,
fmt
);
...
...
@@ -3033,7 +3065,7 @@ static void ColoredPrintf(GTestColor color, const char* fmt, ...) {
va_end
(
args
);
}
// Text printed in Google Test's text output and --g
uni
t_list_tests
// Text printed in Google Test's text output and --g
tes
t_list_tests
// output to label the type parameter and value parameter for a test.
static
const
char
kTypeParamLabel
[]
=
"TypeParam"
;
static
const
char
kValueParamLabel
[]
=
"GetParam()"
;
...
...
@@ -3309,7 +3341,7 @@ void TestEventRepeater::Append(TestEventListener *listener) {
listeners_
.
push_back
(
listener
);
}
//
TODO(vladl@google.com)
: Factor the search functionality into Vector::Find.
//
FIXME
: Factor the search functionality into Vector::Find.
TestEventListener
*
TestEventRepeater
::
Release
(
TestEventListener
*
listener
)
{
for
(
size_t
i
=
0
;
i
<
listeners_
.
size
();
++
i
)
{
if
(
listeners_
[
i
]
==
listener
)
{
...
...
@@ -3444,6 +3476,11 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {
// to delimit this attribute from prior attributes.
static
std
::
string
TestPropertiesAsXmlAttributes
(
const
TestResult
&
result
);
// Streams an XML representation of the test properties of a TestResult
// object.
static
void
OutputXmlTestProperties
(
std
::
ostream
*
stream
,
const
TestResult
&
result
);
// The output file.
const
std
::
string
output_file_
;
...
...
@@ -3469,7 +3506,7 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
xmlout
=
posix
::
FOpen
(
output_file_
.
c_str
(),
"w"
);
}
if
(
xmlout
==
NULL
)
{
//
TODO(wan)
: report the reason of the failure.
//
FIXME
: report the reason of the failure.
//
// We don't do it for now as:
//
...
...
@@ -3479,8 +3516,8 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
// 3. To interpret the meaning of errno in a thread-safe way,
// we need the strerror_r() function, which is not available on
// Windows.
GTEST_LOG_
(
FATAL
)
<<
"Unable to open file
\"
"
<<
output_file_
<<
"
\"
"
;
GTEST_LOG_
(
FATAL
)
<<
"Unable to open file
\"
"
<<
output_file_
<<
"
\"
"
;
}
std
::
stringstream
stream
;
PrintXmlUnitTest
(
&
stream
,
unit_test
);
...
...
@@ -3498,7 +3535,7 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
// module will consist of ordinary English text.
// If this module is ever modified to produce version 1.1 XML output,
// most invalid characters can be retained using character references.
//
TODO(wan)
: It might be nice to have a minimally invasive, human-readable
//
FIXME
: It might be nice to have a minimally invasive, human-readable
// escaping scheme for invalid characters, rather than dropping them.
std
::
string
XmlUnitTestResultPrinter
::
EscapeXml
(
const
std
::
string
&
str
,
bool
is_attribute
)
{
...
...
@@ -3559,6 +3596,7 @@ std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
// The following routines generate an XML representation of a UnitTest
// object.
// GOOGLETEST_CM0009 DO NOT DELETE
//
// This is how Google Test concepts map to the DTD:
//
...
...
@@ -3648,13 +3686,17 @@ void XmlUnitTestResultPrinter::OutputXmlAttribute(
}
// Prints an XML representation of a TestInfo object.
//
TODO(wan)
: There is also value in printing properties with the plain printer.
//
FIXME
: There is also value in printing properties with the plain printer.
void
XmlUnitTestResultPrinter
::
OutputXmlTestInfo
(
::
std
::
ostream
*
stream
,
const
char
*
test_case_name
,
const
TestInfo
&
test_info
)
{
const
TestResult
&
result
=
*
test_info
.
result
();
const
std
::
string
kTestcase
=
"testcase"
;
if
(
test_info
.
is_in_another_shard
())
{
return
;
}
*
stream
<<
" <testcase"
;
OutputXmlAttribute
(
stream
,
kTestcase
,
"name"
,
test_info
.
name
());
...
...
@@ -3671,7 +3713,6 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
OutputXmlAttribute
(
stream
,
kTestcase
,
"time"
,
FormatTimeInMillisAsSeconds
(
result
.
elapsed_time
()));
OutputXmlAttribute
(
stream
,
kTestcase
,
"classname"
,
test_case_name
);
*
stream
<<
TestPropertiesAsXmlAttributes
(
result
);
int
failures
=
0
;
for
(
int
i
=
0
;
i
<
result
.
total_part_count
();
++
i
)
{
...
...
@@ -3693,10 +3734,15 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
}
}
if
(
failures
==
0
)
if
(
failures
==
0
&&
result
.
test_property_count
()
==
0
)
{
*
stream
<<
" />
\n
"
;
else
}
else
{
if
(
failures
==
0
)
{
*
stream
<<
">
\n
"
;
}
OutputXmlTestProperties
(
stream
,
result
);
*
stream
<<
" </testcase>
\n
"
;
}
}
// Prints an XML representation of a TestCase object
...
...
@@ -3751,7 +3797,6 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
OutputXmlAttribute
(
stream
,
kTestsuites
,
"random_seed"
,
StreamableToString
(
unit_test
.
random_seed
()));
}
*
stream
<<
TestPropertiesAsXmlAttributes
(
unit_test
.
ad_hoc_test_result
());
OutputXmlAttribute
(
stream
,
kTestsuites
,
"name"
,
"AllTests"
);
...
...
@@ -3777,8 +3822,374 @@ std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
return
attributes
.
GetString
();
}
void
XmlUnitTestResultPrinter
::
OutputXmlTestProperties
(
std
::
ostream
*
stream
,
const
TestResult
&
result
)
{
const
std
::
string
kProperties
=
"properties"
;
const
std
::
string
kProperty
=
"property"
;
if
(
result
.
test_property_count
()
<=
0
)
{
return
;
}
*
stream
<<
"<"
<<
kProperties
<<
">
\n
"
;
for
(
int
i
=
0
;
i
<
result
.
test_property_count
();
++
i
)
{
const
TestProperty
&
property
=
result
.
GetTestProperty
(
i
);
*
stream
<<
"<"
<<
kProperty
;
*
stream
<<
" name=
\"
"
<<
EscapeXmlAttribute
(
property
.
key
())
<<
"
\"
"
;
*
stream
<<
" value=
\"
"
<<
EscapeXmlAttribute
(
property
.
value
())
<<
"
\"
"
;
*
stream
<<
"/>
\n
"
;
}
*
stream
<<
"</"
<<
kProperties
<<
">
\n
"
;
}
// End XmlUnitTestResultPrinter
// This class generates an JSON output file.
class
JsonUnitTestResultPrinter
:
public
EmptyTestEventListener
{
public:
explicit
JsonUnitTestResultPrinter
(
const
char
*
output_file
);
virtual
void
OnTestIterationEnd
(
const
UnitTest
&
unit_test
,
int
iteration
);
private:
// Returns an JSON-escaped copy of the input string str.
static
std
::
string
EscapeJson
(
const
std
::
string
&
str
);
//// Verifies that the given attribute belongs to the given element and
//// streams the attribute as JSON.
static
void
OutputJsonKey
(
std
::
ostream
*
stream
,
const
std
::
string
&
element_name
,
const
std
::
string
&
name
,
const
std
::
string
&
value
,
const
std
::
string
&
indent
,
bool
comma
=
true
);
static
void
OutputJsonKey
(
std
::
ostream
*
stream
,
const
std
::
string
&
element_name
,
const
std
::
string
&
name
,
int
value
,
const
std
::
string
&
indent
,
bool
comma
=
true
);
// Streams a JSON representation of a TestInfo object.
static
void
OutputJsonTestInfo
(
::
std
::
ostream
*
stream
,
const
char
*
test_case_name
,
const
TestInfo
&
test_info
);
// Prints a JSON representation of a TestCase object
static
void
PrintJsonTestCase
(
::
std
::
ostream
*
stream
,
const
TestCase
&
test_case
);
// Prints a JSON summary of unit_test to output stream out.
static
void
PrintJsonUnitTest
(
::
std
::
ostream
*
stream
,
const
UnitTest
&
unit_test
);
// Produces a string representing the test properties in a result as
// a JSON dictionary.
static
std
::
string
TestPropertiesAsJson
(
const
TestResult
&
result
,
const
std
::
string
&
indent
);
// The output file.
const
std
::
string
output_file_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
JsonUnitTestResultPrinter
);
};
// Creates a new JsonUnitTestResultPrinter.
JsonUnitTestResultPrinter
::
JsonUnitTestResultPrinter
(
const
char
*
output_file
)
:
output_file_
(
output_file
)
{
if
(
output_file_
.
empty
())
{
GTEST_LOG_
(
FATAL
)
<<
"JSON output file may not be null"
;
}
}
void
JsonUnitTestResultPrinter
::
OnTestIterationEnd
(
const
UnitTest
&
unit_test
,
int
/*iteration*/
)
{
FILE
*
jsonout
=
NULL
;
FilePath
output_file
(
output_file_
);
FilePath
output_dir
(
output_file
.
RemoveFileName
());
if
(
output_dir
.
CreateDirectoriesRecursively
())
{
jsonout
=
posix
::
FOpen
(
output_file_
.
c_str
(),
"w"
);
}
if
(
jsonout
==
NULL
)
{
// FIXME: report the reason of the failure.
//
// We don't do it for now as:
//
// 1. There is no urgent need for it.
// 2. It's a bit involved to make the errno variable thread-safe on
// all three operating systems (Linux, Windows, and Mac OS).
// 3. To interpret the meaning of errno in a thread-safe way,
// we need the strerror_r() function, which is not available on
// Windows.
GTEST_LOG_
(
FATAL
)
<<
"Unable to open file
\"
"
<<
output_file_
<<
"
\"
"
;
}
std
::
stringstream
stream
;
PrintJsonUnitTest
(
&
stream
,
unit_test
);
fprintf
(
jsonout
,
"%s"
,
StringStreamToString
(
&
stream
).
c_str
());
fclose
(
jsonout
);
}
// Returns an JSON-escaped copy of the input string str.
std
::
string
JsonUnitTestResultPrinter
::
EscapeJson
(
const
std
::
string
&
str
)
{
Message
m
;
for
(
size_t
i
=
0
;
i
<
str
.
size
();
++
i
)
{
const
char
ch
=
str
[
i
];
switch
(
ch
)
{
case
'\\'
:
case
'"'
:
case
'/'
:
m
<<
'\\'
<<
ch
;
break
;
case
'\b'
:
m
<<
"
\\
b"
;
break
;
case
'\t'
:
m
<<
"
\\
t"
;
break
;
case
'\n'
:
m
<<
"
\\
n"
;
break
;
case
'\f'
:
m
<<
"
\\
f"
;
break
;
case
'\r'
:
m
<<
"
\\
r"
;
break
;
default:
if
(
ch
<
' '
)
{
m
<<
"
\\
u00"
<<
String
::
FormatByte
(
static_cast
<
unsigned
char
>
(
ch
));
}
else
{
m
<<
ch
;
}
break
;
}
}
return
m
.
GetString
();
}
// The following routines generate an JSON representation of a UnitTest
// object.
// Formats the given time in milliseconds as seconds.
static
std
::
string
FormatTimeInMillisAsDuration
(
TimeInMillis
ms
)
{
::
std
::
stringstream
ss
;
ss
<<
(
static_cast
<
double
>
(
ms
)
*
1e-3
)
<<
"s"
;
return
ss
.
str
();
}
// Converts the given epoch time in milliseconds to a date string in the
// RFC3339 format, without the timezone information.
static
std
::
string
FormatEpochTimeInMillisAsRFC3339
(
TimeInMillis
ms
)
{
struct
tm
time_struct
;
if
(
!
PortableLocaltime
(
static_cast
<
time_t
>
(
ms
/
1000
),
&
time_struct
))
return
""
;
// YYYY-MM-DDThh:mm:ss
return
StreamableToString
(
time_struct
.
tm_year
+
1900
)
+
"-"
+
String
::
FormatIntWidth2
(
time_struct
.
tm_mon
+
1
)
+
"-"
+
String
::
FormatIntWidth2
(
time_struct
.
tm_mday
)
+
"T"
+
String
::
FormatIntWidth2
(
time_struct
.
tm_hour
)
+
":"
+
String
::
FormatIntWidth2
(
time_struct
.
tm_min
)
+
":"
+
String
::
FormatIntWidth2
(
time_struct
.
tm_sec
)
+
"Z"
;
}
static
inline
std
::
string
Indent
(
int
width
)
{
return
std
::
string
(
width
,
' '
);
}
void
JsonUnitTestResultPrinter
::
OutputJsonKey
(
std
::
ostream
*
stream
,
const
std
::
string
&
element_name
,
const
std
::
string
&
name
,
const
std
::
string
&
value
,
const
std
::
string
&
indent
,
bool
comma
)
{
const
std
::
vector
<
std
::
string
>&
allowed_names
=
GetReservedAttributesForElement
(
element_name
);
GTEST_CHECK_
(
std
::
find
(
allowed_names
.
begin
(),
allowed_names
.
end
(),
name
)
!=
allowed_names
.
end
())
<<
"Key
\"
"
<<
name
<<
"
\"
is not allowed for value
\"
"
<<
element_name
<<
"
\"
."
;
*
stream
<<
indent
<<
"
\"
"
<<
name
<<
"
\"
:
\"
"
<<
EscapeJson
(
value
)
<<
"
\"
"
;
if
(
comma
)
*
stream
<<
",
\n
"
;
}
void
JsonUnitTestResultPrinter
::
OutputJsonKey
(
std
::
ostream
*
stream
,
const
std
::
string
&
element_name
,
const
std
::
string
&
name
,
int
value
,
const
std
::
string
&
indent
,
bool
comma
)
{
const
std
::
vector
<
std
::
string
>&
allowed_names
=
GetReservedAttributesForElement
(
element_name
);
GTEST_CHECK_
(
std
::
find
(
allowed_names
.
begin
(),
allowed_names
.
end
(),
name
)
!=
allowed_names
.
end
())
<<
"Key
\"
"
<<
name
<<
"
\"
is not allowed for value
\"
"
<<
element_name
<<
"
\"
."
;
*
stream
<<
indent
<<
"
\"
"
<<
name
<<
"
\"
: "
<<
StreamableToString
(
value
);
if
(
comma
)
*
stream
<<
",
\n
"
;
}
// Prints a JSON representation of a TestInfo object.
void
JsonUnitTestResultPrinter
::
OutputJsonTestInfo
(
::
std
::
ostream
*
stream
,
const
char
*
test_case_name
,
const
TestInfo
&
test_info
)
{
const
TestResult
&
result
=
*
test_info
.
result
();
const
std
::
string
kTestcase
=
"testcase"
;
const
std
::
string
kIndent
=
Indent
(
10
);
*
stream
<<
Indent
(
8
)
<<
"{
\n
"
;
OutputJsonKey
(
stream
,
kTestcase
,
"name"
,
test_info
.
name
(),
kIndent
);
if
(
test_info
.
value_param
()
!=
NULL
)
{
OutputJsonKey
(
stream
,
kTestcase
,
"value_param"
,
test_info
.
value_param
(),
kIndent
);
}
if
(
test_info
.
type_param
()
!=
NULL
)
{
OutputJsonKey
(
stream
,
kTestcase
,
"type_param"
,
test_info
.
type_param
(),
kIndent
);
}
OutputJsonKey
(
stream
,
kTestcase
,
"status"
,
test_info
.
should_run
()
?
"RUN"
:
"NOTRUN"
,
kIndent
);
OutputJsonKey
(
stream
,
kTestcase
,
"time"
,
FormatTimeInMillisAsDuration
(
result
.
elapsed_time
()),
kIndent
);
OutputJsonKey
(
stream
,
kTestcase
,
"classname"
,
test_case_name
,
kIndent
,
false
);
*
stream
<<
TestPropertiesAsJson
(
result
,
kIndent
);
int
failures
=
0
;
for
(
int
i
=
0
;
i
<
result
.
total_part_count
();
++
i
)
{
const
TestPartResult
&
part
=
result
.
GetTestPartResult
(
i
);
if
(
part
.
failed
())
{
*
stream
<<
",
\n
"
;
if
(
++
failures
==
1
)
{
*
stream
<<
kIndent
<<
"
\"
"
<<
"failures"
<<
"
\"
: [
\n
"
;
}
const
std
::
string
location
=
internal
::
FormatCompilerIndependentFileLocation
(
part
.
file_name
(),
part
.
line_number
());
const
std
::
string
message
=
EscapeJson
(
location
+
"
\n
"
+
part
.
message
());
*
stream
<<
kIndent
<<
" {
\n
"
<<
kIndent
<<
"
\"
failure
\"
:
\"
"
<<
message
<<
"
\"
,
\n
"
<<
kIndent
<<
"
\"
type
\"
:
\"\"\n
"
<<
kIndent
<<
" }"
;
}
}
if
(
failures
>
0
)
*
stream
<<
"
\n
"
<<
kIndent
<<
"]"
;
*
stream
<<
"
\n
"
<<
Indent
(
8
)
<<
"}"
;
}
// Prints an JSON representation of a TestCase object
void
JsonUnitTestResultPrinter
::
PrintJsonTestCase
(
std
::
ostream
*
stream
,
const
TestCase
&
test_case
)
{
const
std
::
string
kTestsuite
=
"testsuite"
;
const
std
::
string
kIndent
=
Indent
(
6
);
*
stream
<<
Indent
(
4
)
<<
"{
\n
"
;
OutputJsonKey
(
stream
,
kTestsuite
,
"name"
,
test_case
.
name
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"tests"
,
test_case
.
reportable_test_count
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"failures"
,
test_case
.
failed_test_count
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"disabled"
,
test_case
.
reportable_disabled_test_count
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"errors"
,
0
,
kIndent
);
OutputJsonKey
(
stream
,
kTestsuite
,
"time"
,
FormatTimeInMillisAsDuration
(
test_case
.
elapsed_time
()),
kIndent
,
false
);
*
stream
<<
TestPropertiesAsJson
(
test_case
.
ad_hoc_test_result
(),
kIndent
)
<<
",
\n
"
;
*
stream
<<
kIndent
<<
"
\"
"
<<
kTestsuite
<<
"
\"
: [
\n
"
;
bool
comma
=
false
;
for
(
int
i
=
0
;
i
<
test_case
.
total_test_count
();
++
i
)
{
if
(
test_case
.
GetTestInfo
(
i
)
->
is_reportable
())
{
if
(
comma
)
{
*
stream
<<
",
\n
"
;
}
else
{
comma
=
true
;
}
OutputJsonTestInfo
(
stream
,
test_case
.
name
(),
*
test_case
.
GetTestInfo
(
i
));
}
}
*
stream
<<
"
\n
"
<<
kIndent
<<
"]
\n
"
<<
Indent
(
4
)
<<
"}"
;
}
// Prints a JSON summary of unit_test to output stream out.
void
JsonUnitTestResultPrinter
::
PrintJsonUnitTest
(
std
::
ostream
*
stream
,
const
UnitTest
&
unit_test
)
{
const
std
::
string
kTestsuites
=
"testsuites"
;
const
std
::
string
kIndent
=
Indent
(
2
);
*
stream
<<
"{
\n
"
;
OutputJsonKey
(
stream
,
kTestsuites
,
"tests"
,
unit_test
.
reportable_test_count
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuites
,
"failures"
,
unit_test
.
failed_test_count
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuites
,
"disabled"
,
unit_test
.
reportable_disabled_test_count
(),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuites
,
"errors"
,
0
,
kIndent
);
if
(
GTEST_FLAG
(
shuffle
))
{
OutputJsonKey
(
stream
,
kTestsuites
,
"random_seed"
,
unit_test
.
random_seed
(),
kIndent
);
}
OutputJsonKey
(
stream
,
kTestsuites
,
"timestamp"
,
FormatEpochTimeInMillisAsRFC3339
(
unit_test
.
start_timestamp
()),
kIndent
);
OutputJsonKey
(
stream
,
kTestsuites
,
"time"
,
FormatTimeInMillisAsDuration
(
unit_test
.
elapsed_time
()),
kIndent
,
false
);
*
stream
<<
TestPropertiesAsJson
(
unit_test
.
ad_hoc_test_result
(),
kIndent
)
<<
",
\n
"
;
OutputJsonKey
(
stream
,
kTestsuites
,
"name"
,
"AllTests"
,
kIndent
);
*
stream
<<
kIndent
<<
"
\"
"
<<
kTestsuites
<<
"
\"
: [
\n
"
;
bool
comma
=
false
;
for
(
int
i
=
0
;
i
<
unit_test
.
total_test_case_count
();
++
i
)
{
if
(
unit_test
.
GetTestCase
(
i
)
->
reportable_test_count
()
>
0
)
{
if
(
comma
)
{
*
stream
<<
",
\n
"
;
}
else
{
comma
=
true
;
}
PrintJsonTestCase
(
stream
,
*
unit_test
.
GetTestCase
(
i
));
}
}
*
stream
<<
"
\n
"
<<
kIndent
<<
"]
\n
"
<<
"}
\n
"
;
}
// Produces a string representing the test properties in a result as
// a JSON dictionary.
std
::
string
JsonUnitTestResultPrinter
::
TestPropertiesAsJson
(
const
TestResult
&
result
,
const
std
::
string
&
indent
)
{
Message
attributes
;
for
(
int
i
=
0
;
i
<
result
.
test_property_count
();
++
i
)
{
const
TestProperty
&
property
=
result
.
GetTestProperty
(
i
);
attributes
<<
",
\n
"
<<
indent
<<
"
\"
"
<<
property
.
key
()
<<
"
\"
: "
<<
"
\"
"
<<
EscapeJson
(
property
.
value
())
<<
"
\"
"
;
}
return
attributes
.
GetString
();
}
// End JsonUnitTestResultPrinter
#if GTEST_CAN_STREAM_RESULTS_
// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
...
...
@@ -3854,21 +4265,77 @@ void StreamingListener::SocketWriter::MakeConnection() {
const
char
*
const
OsStackTraceGetterInterface
::
kElidedFramesMarker
=
"... "
GTEST_NAME_
" internal frames ..."
;
std
::
string
OsStackTraceGetter
::
CurrentStackTrace
(
int
/*max_depth*/
,
int
/*skip_count*/
)
{
std
::
string
OsStackTraceGetter
::
CurrentStackTrace
(
int
max_depth
,
int
skip_count
)
GTEST_LOCK_EXCLUDED_
(
mutex_
)
{
#if GTEST_HAS_ABSL
std
::
string
result
;
if
(
max_depth
<=
0
)
{
return
result
;
}
max_depth
=
std
::
min
(
max_depth
,
kMaxStackTraceDepth
);
std
::
vector
<
void
*>
raw_stack
(
max_depth
);
// Skips the frames requested by the caller, plus this function.
const
int
raw_stack_size
=
absl
::
GetStackTrace
(
&
raw_stack
[
0
],
max_depth
,
skip_count
+
1
);
void
*
caller_frame
=
nullptr
;
{
MutexLock
lock
(
&
mutex_
);
caller_frame
=
caller_frame_
;
}
for
(
int
i
=
0
;
i
<
raw_stack_size
;
++
i
)
{
if
(
raw_stack
[
i
]
==
caller_frame
&&
!
GTEST_FLAG
(
show_internal_stack_frames
))
{
// Add a marker to the trace and stop adding frames.
absl
::
StrAppend
(
&
result
,
kElidedFramesMarker
,
"
\n
"
);
break
;
}
char
tmp
[
1024
];
const
char
*
symbol
=
"(unknown)"
;
if
(
absl
::
Symbolize
(
raw_stack
[
i
],
tmp
,
sizeof
(
tmp
)))
{
symbol
=
tmp
;
}
char
line
[
1024
];
snprintf
(
line
,
sizeof
(
line
),
" %p: %s
\n
"
,
raw_stack
[
i
],
symbol
);
result
+=
line
;
}
return
result
;
#else // !GTEST_HAS_ABSL
static_cast
<
void
>
(
max_depth
);
static_cast
<
void
>
(
skip_count
);
return
""
;
#endif // GTEST_HAS_ABSL
}
void
OsStackTraceGetter
::
UponLeavingGTest
()
{}
void
OsStackTraceGetter
::
UponLeavingGTest
()
GTEST_LOCK_EXCLUDED_
(
mutex_
)
{
#if GTEST_HAS_ABSL
void
*
caller_frame
=
nullptr
;
if
(
absl
::
GetStackTrace
(
&
caller_frame
,
1
,
3
)
<=
0
)
{
caller_frame
=
nullptr
;
}
MutexLock
lock
(
&
mutex_
);
caller_frame_
=
caller_frame
;
#endif // GTEST_HAS_ABSL
}
// A helper class that creates the premature-exit file in its
// constructor and deletes the file in its destructor.
class
ScopedPrematureExitFile
{
public:
explicit
ScopedPrematureExitFile
(
const
char
*
premature_exit_filepath
)
:
premature_exit_filepath_
(
premature_exit_filepath
)
{
:
premature_exit_filepath_
(
premature_exit_filepath
?
premature_exit_filepath
:
""
)
{
// If a path to the premature-exit file is specified...
if
(
premature_exit_filepath
!=
NULL
&&
*
premature_exit_filepath
!=
'\0'
)
{
if
(
!
premature_exit_filepath
_
.
empty
()
)
{
// create the file with a single "0" character in it. I/O
// errors are ignored as there's nothing better we can do and we
// don't want to fail the test because of this.
...
...
@@ -3879,13 +4346,18 @@ class ScopedPrematureExitFile {
}
~
ScopedPrematureExitFile
()
{
if
(
premature_exit_filepath_
!=
NULL
&&
*
premature_exit_filepath_
!=
'\0'
)
{
remove
(
premature_exit_filepath_
);
if
(
!
premature_exit_filepath_
.
empty
())
{
int
retval
=
remove
(
premature_exit_filepath_
.
c_str
());
if
(
retval
)
{
GTEST_LOG_
(
ERROR
)
<<
"Failed to remove premature exit filepath
\"
"
<<
premature_exit_filepath_
<<
"
\"
with error "
<<
retval
;
}
}
}
private:
const
char
*
const
premature_exit_filepath_
;
const
std
::
string
premature_exit_filepath_
;
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
ScopedPrematureExitFile
);
};
...
...
@@ -4155,6 +4627,11 @@ void UnitTest::AddTestPartResult(
// when a failure happens and both the --gtest_break_on_failure and
// the --gtest_catch_exceptions flags are specified.
DebugBreak
();
#elif (!defined(__native_client__)) && \
((defined(__clang__) || defined(__GNUC__)) && \
(defined(__x86_64__) || defined(__i386__)))
// with clang/gcc we can achieve the same effect on x86 by invoking int3
asm
(
"int3"
);
#else
// Dereference NULL through a volatile pointer to prevent the compiler
// from removing. We use this rather than abort() or __builtin_trap() for
...
...
@@ -4251,7 +4728,7 @@ int UnitTest::Run() {
// VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
// Users of prior VC versions shall suffer the agony and pain of
// clicking through the countless debug dialogs.
//
TODO(vladl@google.com)
: find a way to suppress the abort dialog() in the
//
FIXME
: find a way to suppress the abort dialog() in the
// debug mode when compiled with VC 7.1 or lower.
if
(
!
GTEST_FLAG
(
break_on_failure
))
_set_abort_behavior
(
...
...
@@ -4405,10 +4882,12 @@ void UnitTestImpl::ConfigureXmlOutput() {
if
(
output_format
==
"xml"
)
{
listeners
()
->
SetDefaultXmlGenerator
(
new
XmlUnitTestResultPrinter
(
UnitTestOptions
::
GetAbsolutePathToOutputFile
().
c_str
()));
}
else
if
(
output_format
==
"json"
)
{
listeners
()
->
SetDefaultXmlGenerator
(
new
JsonUnitTestResultPrinter
(
UnitTestOptions
::
GetAbsolutePathToOutputFile
().
c_str
()));
}
else
if
(
output_format
!=
""
)
{
GTEST_LOG_
(
WARNING
)
<<
"WARNING: unrecognized output format
\"
"
<<
output_format
<<
"
\"
ignored."
;
<<
output_format
<<
"
\"
ignored."
;
}
}
...
...
@@ -4423,8 +4902,7 @@ void UnitTestImpl::ConfigureStreamingOutput() {
listeners
()
->
Append
(
new
StreamingListener
(
target
.
substr
(
0
,
pos
),
target
.
substr
(
pos
+
1
)));
}
else
{
GTEST_LOG_
(
WARNING
)
<<
"unrecognized streaming target
\"
"
<<
target
GTEST_LOG_
(
WARNING
)
<<
"unrecognized streaming target
\"
"
<<
target
<<
"
\"
ignored."
;
}
}
...
...
@@ -4464,6 +4942,13 @@ void UnitTestImpl::PostFlagParsingInit() {
// Configures listeners for streaming test results to the specified server.
ConfigureStreamingOutput
();
#endif // GTEST_CAN_STREAM_RESULTS_
#if GTEST_HAS_ABSL
if
(
GTEST_FLAG
(
install_failure_signal_handler
))
{
absl
::
FailureSignalHandlerOptions
options
;
absl
::
InstallFailureSignalHandler
(
options
);
}
#endif // GTEST_HAS_ABSL
}
}
...
...
@@ -4507,11 +4992,11 @@ TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
Test
::
SetUpTestCaseFunc
set_up_tc
,
Test
::
TearDownTestCaseFunc
tear_down_tc
)
{
// Can we find a TestCase with the given name?
const
std
::
vector
<
TestCase
*>::
const_iterator
test_case
=
std
::
find_if
(
test_cases_
.
begin
(),
test_cases_
.
end
(),
const
std
::
vector
<
TestCase
*>::
const_
reverse_
iterator
test_case
=
std
::
find_if
(
test_cases_
.
r
begin
(),
test_cases_
.
r
end
(),
TestCaseNameIs
(
test_case_name
));
if
(
test_case
!=
test_cases_
.
end
())
if
(
test_case
!=
test_cases_
.
r
end
())
return
*
test_case
;
// No. Let's create one.
...
...
@@ -4552,13 +5037,8 @@ static void TearDownEnvironment(Environment* env) { env->TearDown(); }
// All other functions called from RunAllTests() may safely assume that
// parameterized tests are ready to be counted and run.
bool
UnitTestImpl
::
RunAllTests
()
{
// Makes sure InitGoogleTest() was called.
if
(
!
GTestIsInitialized
())
{
GTEST_LOG_
(
ERROR
)
<<
"
\n
This test program did NOT call ::testing::InitGoogleTest "
"before calling RUN_ALL_TESTS(). Please fix it."
;
return
false
;
}
// True iff Google Test is initialized before RUN_ALL_TESTS() is called.
const
bool
gtest_is_initialized_before_run_all_tests
=
GTestIsInitialized
();
// Do not run any test if the --help flag was specified.
if
(
g_help_flag
)
...
...
@@ -4686,6 +5166,20 @@ bool UnitTestImpl::RunAllTests() {
repeater
->
OnTestProgramEnd
(
*
parent_
);
if
(
!
gtest_is_initialized_before_run_all_tests
)
{
ColoredPrintf
(
COLOR_RED
,
"
\n
IMPORTANT NOTICE - DO NOT IGNORE:
\n
"
"This test program did NOT call "
GTEST_INIT_GOOGLE_TEST_NAME_
"() before calling RUN_ALL_TESTS(). This is INVALID. Soon "
GTEST_NAME_
" will start to enforce the valid usage. "
"Please fix it ASAP, or IT WILL START TO FAIL.
\n
"
);
// NOLINT
#if GTEST_FOR_GOOGLE_
ColoredPrintf
(
COLOR_RED
,
"For more details, see http://wiki/Main/ValidGUnitMain.
\n
"
);
#endif // GTEST_FOR_GOOGLE_
}
return
!
failed
;
}
...
...
@@ -4732,7 +5226,7 @@ bool ShouldShard(const char* total_shards_env,
<<
"Invalid environment variables: you have "
<<
kTestShardIndex
<<
" = "
<<
shard_index
<<
", but have left "
<<
kTestTotalShards
<<
" unset.
\n
"
;
ColoredPrintf
(
COLOR_RED
,
"%s"
,
msg
.
GetString
().
c_str
());
ColoredPrintf
(
COLOR_RED
,
msg
.
GetString
().
c_str
());
fflush
(
stdout
);
exit
(
EXIT_FAILURE
);
}
else
if
(
total_shards
!=
-
1
&&
shard_index
==
-
1
)
{
...
...
@@ -4740,7 +5234,7 @@ bool ShouldShard(const char* total_shards_env,
<<
"Invalid environment variables: you have "
<<
kTestTotalShards
<<
" = "
<<
total_shards
<<
", but have left "
<<
kTestShardIndex
<<
" unset.
\n
"
;
ColoredPrintf
(
COLOR_RED
,
"%s"
,
msg
.
GetString
().
c_str
());
ColoredPrintf
(
COLOR_RED
,
msg
.
GetString
().
c_str
());
fflush
(
stdout
);
exit
(
EXIT_FAILURE
);
}
else
if
(
shard_index
<
0
||
shard_index
>=
total_shards
)
{
...
...
@@ -4749,7 +5243,7 @@ bool ShouldShard(const char* total_shards_env,
<<
kTestShardIndex
<<
" < "
<<
kTestTotalShards
<<
", but you have "
<<
kTestShardIndex
<<
"="
<<
shard_index
<<
", "
<<
kTestTotalShards
<<
"="
<<
total_shards
<<
".
\n
"
;
ColoredPrintf
(
COLOR_RED
,
"%s"
,
msg
.
GetString
().
c_str
());
ColoredPrintf
(
COLOR_RED
,
msg
.
GetString
().
c_str
());
fflush
(
stdout
);
exit
(
EXIT_FAILURE
);
}
...
...
@@ -4787,8 +5281,8 @@ bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
// each TestCase and TestInfo object.
// If shard_tests == true, further filters tests based on sharding
// variables in the environment - see
// https://github.com/google/googletest/blob/master/googletest/docs/
A
dvanced
Guide
.md
.
// Returns the number of tests that should run.
// https://github.com/google/googletest/blob/master/googletest/docs/
a
dvanced.md
//
.
Returns the number of tests that should run.
int
UnitTestImpl
::
FilterTests
(
ReactionToSharding
shard_tests
)
{
const
Int32
total_shards
=
shard_tests
==
HONOR_SHARDING_PROTOCOL
?
Int32FromEnvOrDie
(
kTestTotalShards
,
-
1
)
:
-
1
;
...
...
@@ -4931,11 +5425,15 @@ OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
return
os_stack_trace_getter_
;
}
// Returns the TestResult for the test that's currently running, or
// the TestResult for the ad hoc test if no test is running.
// Returns the most specific TestResult currently running.
TestResult
*
UnitTestImpl
::
current_test_result
()
{
return
current_test_info_
?
&
(
current_test_info_
->
result_
)
:
&
ad_hoc_test_result_
;
if
(
current_test_info_
!=
NULL
)
{
return
&
current_test_info_
->
result_
;
}
if
(
current_test_case_
!=
NULL
)
{
return
&
current_test_case_
->
ad_hoc_test_result_
;
}
return
&
ad_hoc_test_result_
;
}
// Shuffles all test cases, and the tests within each test case,
...
...
@@ -5016,8 +5514,7 @@ bool SkipPrefix(const char* prefix, const char** pstr) {
// part can be omitted.
//
// Returns the value of the flag, or NULL if the parsing failed.
static
const
char
*
ParseFlagValue
(
const
char
*
str
,
const
char
*
flag
,
static
const
char
*
ParseFlagValue
(
const
char
*
str
,
const
char
*
flag
,
bool
def_optional
)
{
// str and flag must not be NULL.
if
(
str
==
NULL
||
flag
==
NULL
)
return
NULL
;
...
...
@@ -5088,9 +5585,8 @@ bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
//
// On success, stores the value of the flag in *value, and returns
// true. On failure, returns false without changing *value.
static
bool
ParseStringFlag
(
const
char
*
str
,
const
char
*
flag
,
std
::
string
*
value
)
{
template
<
typename
String
>
static
bool
ParseStringFlag
(
const
char
*
str
,
const
char
*
flag
,
String
*
value
)
{
// Gets the value of the flag as a string.
const
char
*
const
value_str
=
ParseFlagValue
(
str
,
flag
,
false
);
...
...
@@ -5126,7 +5622,7 @@ static bool HasGoogleTestFlagPrefix(const char* str) {
// @Y changes the color to yellow.
// @D changes to the default terminal text color.
//
//
TODO(wan@google.com)
: Write tests for this once we add stdout
//
FIXME
: Write tests for this once we add stdout
// capturing to Google Test.
static
void
PrintColorEncoded
(
const
char
*
str
)
{
GTestColor
color
=
COLOR_DEFAULT
;
// The current color.
...
...
@@ -5190,22 +5686,22 @@ static const char kColorEncodedHelpMessage[] =
"Test Output:
\n
"
" @G--"
GTEST_FLAG_PREFIX_
"color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D
\n
"
" Enable/disable colored output. The default is @Gauto@D.
\n
"
" @G-
-
"
GTEST_FLAG_PREFIX_
"print_time=0@D
\n
"
"
-
@G-"
GTEST_FLAG_PREFIX_
"print_time=0@D
\n
"
" Don't print the elapsed time of each test.
\n
"
" @G--"
GTEST_FLAG_PREFIX_
"output=xml@Y[@G:@YDIRECTORY_PATH@G"
" @G--"
GTEST_FLAG_PREFIX_
"output=
@Y(@Gjson@Y|@G
xml@Y
)
[@G:@YDIRECTORY_PATH@G"
GTEST_PATH_SEP_
"@Y|@G:@YFILE_PATH]@D
\n
"
" Generate a
n
XML report in the given directory or with the given
file
\n
"
" name. @YFILE_PATH@D defaults to @Gtest_detail.xml@D.
\n
"
#if GTEST_CAN_STREAM_RESULTS_
" Generate a
JSON or
XML report in the given directory or with the given
\n
"
"
file
name. @YFILE_PATH@D defaults to @Gtest_detail
s
.xml@D.
\n
"
#
if GTEST_CAN_STREAM_RESULTS_
" @G--"
GTEST_FLAG_PREFIX_
"stream_result_to=@YHOST@G:@YPORT@D
\n
"
" Stream test results to the given server.
\n
"
#endif // GTEST_CAN_STREAM_RESULTS_
#
endif // GTEST_CAN_STREAM_RESULTS_
"
\n
"
"Assertion Behavior:
\n
"
#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
#
if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
" @G--"
GTEST_FLAG_PREFIX_
"death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D
\n
"
" Set the default death test style.
\n
"
#endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
#
endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
" @G--"
GTEST_FLAG_PREFIX_
"break_on_failure@D
\n
"
" Turn assertion failures into debugger break-points.
\n
"
" @G--"
GTEST_FLAG_PREFIX_
"throw_on_failure@D
\n
"
...
...
@@ -5261,8 +5757,7 @@ static bool ParseGoogleTestFlag(const char* const arg) {
static
void
LoadFlagsFromFile
(
const
std
::
string
&
path
)
{
FILE
*
flagfile
=
posix
::
FOpen
(
path
.
c_str
(),
"r"
);
if
(
!
flagfile
)
{
GTEST_LOG_
(
FATAL
)
<<
"Unable to open file
\"
"
<<
GTEST_FLAG
(
flagfile
)
GTEST_LOG_
(
FATAL
)
<<
"Unable to open file
\"
"
<<
GTEST_FLAG
(
flagfile
)
<<
"
\"
"
;
}
std
::
string
contents
(
ReadEntireFile
(
flagfile
));
...
...
@@ -5369,6 +5864,10 @@ void InitGoogleTestImpl(int* argc, CharType** argv) {
g_argvs
.
push_back
(
StreamableToString
(
argv
[
i
]));
}
#if GTEST_HAS_ABSL
absl
::
InitializeSymbolizer
(
g_argvs
[
0
].
c_str
());
#endif // GTEST_HAS_ABSL
ParseGoogleTestFlagsOnly
(
argc
,
argv
);
GetUnitTestImpl
()
->
PostFlagParsingInit
();
}
...
...
@@ -5404,8 +5903,9 @@ void InitGoogleTest(int* argc, wchar_t** argv) {
std
::
string
TempDir
()
{
#if defined(GTEST_CUSTOM_TEMPDIR_FUNCTION_)
return
GTEST_CUSTOM_TEMPDIR_FUNCTION_
();
return
GTEST_CUSTOM_TEMPDIR_FUNCTION_
();
#endif
#if GTEST_OS_WINDOWS_MOBILE
return
"
\\
temp
\\
"
;
#elif GTEST_OS_WINDOWS
...
...
googletest/src/gtest_main.cc
View file @
687964c8
...
...
@@ -26,13 +26,12 @@
// 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.
//
#include <stdio.h>
#include "gtest/gtest.h"
GTEST_API_
int
main
(
int
argc
,
char
**
argv
)
{
printf
(
"Running main() from
gtest_main.cc
\n
"
);
printf
(
"Running main() from
%s
\n
"
,
__FILE__
);
testing
::
InitGoogleTest
(
&
argc
,
argv
);
return
RUN_ALL_TESTS
();
}
googletest/test/BUILD.bazel
View file @
687964c8
...
...
@@ -34,35 +34,65 @@
licenses
([
"notice"
])
""" gtest own tests """
config_setting
(
name
=
"windows"
,
values
=
{
"cpu"
:
"x64_windows"
},
)
config_setting
(
name
=
"windows_msvc"
,
values
=
{
"cpu"
:
"x64_windows_msvc"
},
)
config_setting
(
name
=
"has_absl"
,
values
=
{
"define"
:
"absl=1"
},
)
#on windows exclude gtest-tuple.h and gtest-tuple
_
test.cc
#on windows exclude gtest-tuple.h and g
oogle
test-tuple
-
test.cc
cc_test
(
name
=
"gtest_all_test"
,
size
=
"small"
,
srcs
=
glob
(
include
=
[
"gtest-*.cc"
,
"*.h"
,
"googletest/include/gtest/**/*.h"
,
],
exclude
=
[
"gtest-unittest-api_test.cc"
,
"gtest-tuple_test.cc"
,
"googletest/src/gtest-all.cc"
,
"gtest_all_test.cc"
,
"gtest-death-test_ex_test.cc"
,
"gtest-listener_test.cc"
,
"gtest-unittest-api_test.cc"
,
"gtest-param-test_test.cc"
,
],
)
+
select
({
srcs
=
glob
(
include
=
[
"gtest-*.cc"
,
"googletest-*.cc"
,
"*.h"
,
"googletest/include/gtest/**/*.h"
,
],
exclude
=
[
"gtest-unittest-api_test.cc"
,
"googletest-tuple-test.cc"
,
"googletest/src/gtest-all.cc"
,
"gtest_all_test.cc"
,
"gtest-death-test_ex_test.cc"
,
"gtest-listener_test.cc"
,
"gtest-unittest-api_test.cc"
,
"googletest-param-test-test.cc"
,
"googletest-catch-exceptions-test_.cc"
,
"googletest-color-test_.cc"
,
"googletest-env-var-test_.cc"
,
"googletest-filter-unittest_.cc"
,
"googletest-break-on-failure-unittest_.cc"
,
"googletest-listener-test.cc"
,
"googletest-output-test_.cc"
,
"googletest-list-tests-unittest_.cc"
,
"googletest-shuffle-test_.cc"
,
"googletest-uninitialized-test_.cc"
,
"googletest-death-test_ex_test.cc"
,
"googletest-param-test-test"
,
"googletest-throw-on-failure-test_.cc"
,
"googletest-param-test-invalid-name1-test_.cc"
,
"googletest-param-test-invalid-name2-test_.cc"
,
],
)
+
select
({
"//:windows"
:
[],
"//:windows_msvc"
:
[],
"//conditions:default"
:
[
"gtest-tuple
_
test.cc"
,
"g
oogle
test-tuple
-
test.cc"
,
],
}),
}),
copts
=
select
({
"//:windows"
:
[
"-DGTEST_USE_OWN_TR1_TUPLE=0"
],
"//:windows_msvc"
:
[
"-DGTEST_USE_OWN_TR1_TUPLE=0"
],
...
...
@@ -84,16 +114,28 @@ cc_test(
deps
=
[
"//:gtest_main"
],
)
# Tests death tests.
cc_test
(
name
=
"googletest-death-test-test"
,
size
=
"medium"
,
srcs
=
[
"googletest-death-test-test.cc"
],
deps
=
[
"//:gtest_main"
],
)
cc_test
(
name
=
"gtest_test_macro_stack_footprint_test"
,
size
=
"small"
,
srcs
=
[
"gtest_test_macro_stack_footprint_test.cc"
],
deps
=
[
"//:gtest"
],
)
#These googletest tests have their own main()
cc_test
(
name
=
"gtest-listener
_
test"
,
name
=
"g
oogle
test-listener
-
test"
,
size
=
"small"
,
srcs
=
[
"gtest-listener_test.cc"
,
],
deps
=
[
"//:gtest"
,
],
srcs
=
[
"googletest-listener-test.cc"
],
deps
=
[
"//:gtest_main"
],
)
cc_test
(
...
...
@@ -108,24 +150,31 @@ cc_test(
)
cc_test
(
name
=
"gtest-param-test
_
test"
,
name
=
"g
oogle
test-param-test
-
test"
,
size
=
"small"
,
srcs
=
[
"gtest-param-test2_test.cc"
,
"gtest-param-test_test.cc"
,
"gtest-param-test_test.h"
,
],
deps
=
[
"//:gtest"
,
"googletest-param-test-test.cc"
,
"googletest-param-test-test.h"
,
"googletest-param-test2-test.cc"
,
],
deps
=
[
"//:gtest"
],
)
cc_test
(
name
=
"gtest_unittest"
,
size
=
"small"
,
srcs
=
[
"gtest_unittest.cc"
],
args
=
[
"--heap_check=strict"
],
shard_count
=
2
,
deps
=
[
"//:gtest_main"
],
)
# Py tests
py_library
(
name
=
"gtest_test_utils"
,
testonly
=
1
,
srcs
=
[
"gtest_test_utils.py"
],
)
cc_binary
(
...
...
@@ -134,6 +183,7 @@ cc_binary(
srcs
=
[
"gtest_help_test_.cc"
],
deps
=
[
"//:gtest_main"
],
)
py_test
(
name
=
"gtest_help_test"
,
size
=
"small"
,
...
...
@@ -143,82 +193,92 @@ py_test(
)
cc_binary
(
name
=
"gtest
_
output
_
test_"
,
name
=
"g
oogle
test
-
output
-
test_"
,
testonly
=
1
,
srcs
=
[
"gtest
_
output
_
test_.cc"
],
srcs
=
[
"g
oogle
test
-
output
-
test_.cc"
],
deps
=
[
"//:gtest"
],
)
py_test
(
name
=
"gtest
_
output
_
test"
,
name
=
"g
oogle
test
-
output
-
test"
,
size
=
"small"
,
srcs
=
[
"gtest_output_test.py"
],
srcs
=
[
"googletest-output-test.py"
],
args
=
select
({
":has_absl"
:
[],
"//conditions:default"
:
[
"--no_stacktrace_support"
],
}),
data
=
[
"gtest
_
output
_
test
_
golden
_
lin.txt"
,
":gtest
_
output
_
test_"
,
"g
oogle
test
-
output
-
test
-
golden
-
lin.txt"
,
":g
oogle
test
-
output
-
test_"
,
],
deps
=
[
":gtest_test_utils"
],
)
cc_binary
(
name
=
"gtest
_
color
_
test_"
,
name
=
"g
oogle
test
-
color
-
test_"
,
testonly
=
1
,
srcs
=
[
"gtest
_
color
_
test_.cc"
],
srcs
=
[
"g
oogle
test
-
color
-
test_.cc"
],
deps
=
[
"//:gtest"
],
)
py_test
(
name
=
"gtest
_
color
_
test"
,
name
=
"g
oogle
test
-
color
-
test"
,
size
=
"small"
,
srcs
=
[
"gtest
_
color
_
test.py"
],
data
=
[
":gtest
_
color
_
test_"
],
srcs
=
[
"g
oogle
test
-
color
-
test.py"
],
data
=
[
":g
oogle
test
-
color
-
test_"
],
deps
=
[
":gtest_test_utils"
],
)
cc_binary
(
name
=
"gtest
_
env
_
var
_
test_"
,
name
=
"g
oogle
test
-
env
-
var
-
test_"
,
testonly
=
1
,
srcs
=
[
"gtest
_
env
_
var
_
test_.cc"
],
srcs
=
[
"g
oogle
test
-
env
-
var
-
test_.cc"
],
deps
=
[
"//:gtest"
],
)
py_test
(
name
=
"gtest
_
env
_
var
_
test"
,
size
=
"
small
"
,
srcs
=
[
"gtest
_
env
_
var
_
test.py"
],
data
=
[
":gtest
_
env
_
var
_
test_"
],
name
=
"g
oogle
test
-
env
-
var
-
test"
,
size
=
"
medium
"
,
srcs
=
[
"g
oogle
test
-
env
-
var
-
test.py"
],
data
=
[
":g
oogle
test
-
env
-
var
-
test_"
],
deps
=
[
":gtest_test_utils"
],
)
cc_binary
(
name
=
"gtest
_
filter
_
unittest_"
,
name
=
"g
oogle
test
-
filter
-
unittest_"
,
testonly
=
1
,
srcs
=
[
"gtest
_
filter
_
unittest_.cc"
],
srcs
=
[
"g
oogle
test
-
filter
-
unittest_.cc"
],
deps
=
[
"//:gtest"
],
)
py_test
(
name
=
"gtest
_
filter
_
unittest"
,
size
=
"
small
"
,
srcs
=
[
"gtest
_
filter
_
unittest.py"
],
data
=
[
":gtest
_
filter
_
unittest_"
],
name
=
"g
oogle
test
-
filter
-
unittest"
,
size
=
"
medium
"
,
srcs
=
[
"g
oogle
test
-
filter
-
unittest.py"
],
data
=
[
":g
oogle
test
-
filter
-
unittest_"
],
deps
=
[
":gtest_test_utils"
],
)
cc_binary
(
name
=
"gtest
_
break
_
on
_
failure
_
unittest_"
,
name
=
"g
oogle
test
-
break
-
on
-
failure
-
unittest_"
,
testonly
=
1
,
srcs
=
[
"gtest
_
break
_
on
_
failure
_
unittest_.cc"
],
srcs
=
[
"g
oogle
test
-
break
-
on
-
failure
-
unittest_.cc"
],
deps
=
[
"//:gtest"
],
)
py_test
(
name
=
"gtest
_
break
_
on
_
failure
_
unittest"
,
name
=
"g
oogle
test
-
break
-
on
-
failure
-
unittest"
,
size
=
"small"
,
srcs
=
[
"gtest
_
break
_
on
_
failure
_
unittest.py"
],
data
=
[
":gtest
_
break
_
on
_
failure
_
unittest_"
],
srcs
=
[
"g
oogle
test
-
break
-
on
-
failure
-
unittest.py"
],
data
=
[
":g
oogle
test
-
break
-
on
-
failure
-
unittest_"
],
deps
=
[
":gtest_test_utils"
],
)
cc_test
(
name
=
"gtest_assert_by_exception_test"
,
size
=
"small"
,
...
...
@@ -226,72 +286,75 @@ cc_test(
deps
=
[
"//:gtest"
],
)
cc_binary
(
name
=
"gtest
_
throw
_
on
_
failure
_
test_"
,
name
=
"g
oogle
test
-
throw
-
on
-
failure
-
test_"
,
testonly
=
1
,
srcs
=
[
"gtest
_
throw
_
on
_
failure
_
test_.cc"
],
srcs
=
[
"g
oogle
test
-
throw
-
on
-
failure
-
test_.cc"
],
deps
=
[
"//:gtest"
],
)
py_test
(
name
=
"gtest
_
throw
_
on
_
failure
_
test"
,
name
=
"g
oogle
test
-
throw
-
on
-
failure
-
test"
,
size
=
"small"
,
srcs
=
[
"gtest
_
throw
_
on
_
failure
_
test.py"
],
data
=
[
":gtest
_
throw
_
on
_
failure
_
test_"
],
srcs
=
[
"g
oogle
test
-
throw
-
on
-
failure
-
test.py"
],
data
=
[
":g
oogle
test
-
throw
-
on
-
failure
-
test_"
],
deps
=
[
":gtest_test_utils"
],
)
cc_binary
(
name
=
"gtest
_
list
_
tests
_
unittest_"
,
name
=
"g
oogle
test
-
list
-
tests
-
unittest_"
,
testonly
=
1
,
srcs
=
[
"gtest
_
list
_
tests
_
unittest_.cc"
],
srcs
=
[
"g
oogle
test
-
list
-
tests
-
unittest_.cc"
],
deps
=
[
"//:gtest"
],
)
py_test
(
name
=
"gtest
_
list
_
tests
_
unittest"
,
name
=
"g
oogle
test
-
list
-
tests
-
unittest"
,
size
=
"small"
,
srcs
=
[
"gtest
_
list
_
tests
_
unittest.py"
],
data
=
[
":gtest
_
list
_
tests
_
unittest_"
],
srcs
=
[
"g
oogle
test
-
list
-
tests
-
unittest.py"
],
data
=
[
":g
oogle
test
-
list
-
tests
-
unittest_"
],
deps
=
[
":gtest_test_utils"
],
)
cc_binary
(
name
=
"gtest
_
shuffle
_
test_"
,
srcs
=
[
"gtest
_
shuffle
_
test_.cc"
],
name
=
"g
oogle
test
-
shuffle
-
test_"
,
srcs
=
[
"g
oogle
test
-
shuffle
-
test_.cc"
],
deps
=
[
"//:gtest"
],
)
py_test
(
name
=
"gtest
_
shuffle
_
test"
,
name
=
"g
oogle
test
-
shuffle
-
test"
,
size
=
"small"
,
srcs
=
[
"gtest
_
shuffle
_
test.py"
],
data
=
[
":gtest
_
shuffle
_
test_"
],
srcs
=
[
"g
oogle
test
-
shuffle
-
test.py"
],
data
=
[
":g
oogle
test
-
shuffle
-
test_"
],
deps
=
[
":gtest_test_utils"
],
)
cc_binary
(
name
=
"gtest
_
catch
_
exceptions
_
no
_
ex
_
test_"
,
name
=
"g
oogle
test
-
catch
-
exceptions
-
no
-
ex
-
test_"
,
testonly
=
1
,
srcs
=
[
"gtest
_
catch
_
exceptions
_
test_.cc"
],
srcs
=
[
"g
oogle
test
-
catch
-
exceptions
-
test_.cc"
],
deps
=
[
"//:gtest_main"
],
)
cc_binary
(
name
=
"gtest
_
catch
_
exceptions
_
ex
_
test_"
,
name
=
"g
oogle
test
-
catch
-
exceptions
-
ex
-
test_"
,
testonly
=
1
,
srcs
=
[
"gtest
_
catch
_
exceptions
_
test_.cc"
],
srcs
=
[
"g
oogle
test
-
catch
-
exceptions
-
test_.cc"
],
copts
=
[
"-fexceptions"
],
deps
=
[
"//:gtest_main"
],
)
py_test
(
name
=
"gtest
_
catch
_
exceptions
_
test"
,
name
=
"g
oogle
test
-
catch
-
exceptions
-
test"
,
size
=
"small"
,
srcs
=
[
"gtest
_
catch
_
exceptions
_
test.py"
],
srcs
=
[
"g
oogle
test
-
catch
-
exceptions
-
test.py"
],
data
=
[
":gtest
_
catch
_
exceptions
_
ex
_
test_"
,
":gtest
_
catch
_
exceptions
_
no
_
ex
_
test_"
,
":g
oogle
test
-
catch
-
exceptions
-
ex
-
test_"
,
":g
oogle
test
-
catch
-
exceptions
-
no
-
ex
-
test_"
,
],
deps
=
[
":gtest_test_utils"
],
)
...
...
@@ -317,6 +380,10 @@ py_test(
"gtest_xml_output_unittest.py"
,
"gtest_xml_test_utils.py"
,
],
args
=
select
({
":has_absl"
:
[],
"//conditions:default"
:
[
"--no_stacktrace_support"
],
}),
data
=
[
# We invoke gtest_no_test_unittest to verify the XML output
# when the test program contains no test definition.
...
...
@@ -355,16 +422,106 @@ py_test(
)
cc_binary
(
name
=
"gtest
_
uninitialized
_
test_"
,
name
=
"g
oogle
test
-
uninitialized
-
test_"
,
testonly
=
1
,
srcs
=
[
"gtest
_
uninitialized
_
test_.cc"
],
srcs
=
[
"g
oogle
test
-
uninitialized
-
test_.cc"
],
deps
=
[
"//:gtest"
],
)
py_test
(
name
=
"gtest
_
uninitialized
_
test"
,
name
=
"g
oogle
test
-
uninitialized
-
test"
,
size
=
"medium"
,
srcs
=
[
"gtest_uninitialized_test.py"
],
data
=
[
":gtest_uninitialized_test_"
],
srcs
=
[
"googletest-uninitialized-test.py"
],
data
=
[
"googletest-uninitialized-test_"
],
deps
=
[
":gtest_test_utils"
],
)
cc_binary
(
name
=
"gtest_testbridge_test_"
,
testonly
=
1
,
srcs
=
[
"gtest_testbridge_test_.cc"
],
deps
=
[
"//:gtest_main"
],
)
# Tests that filtering via testbridge works
py_test
(
name
=
"gtest_testbridge_test"
,
size
=
"small"
,
srcs
=
[
"gtest_testbridge_test.py"
],
data
=
[
":gtest_testbridge_test_"
],
deps
=
[
":gtest_test_utils"
],
)
py_test
(
name
=
"googletest-json-outfiles-test"
,
size
=
"small"
,
srcs
=
[
"googletest-json-outfiles-test.py"
,
"gtest_json_test_utils.py"
,
],
data
=
[
":gtest_xml_outfile1_test_"
,
":gtest_xml_outfile2_test_"
,
],
deps
=
[
":gtest_test_utils"
],
)
py_test
(
name
=
"googletest-json-output-unittest"
,
size
=
"medium"
,
srcs
=
[
"googletest-json-output-unittest.py"
,
"gtest_json_test_utils.py"
,
],
data
=
[
# We invoke gtest_no_test_unittest to verify the JSON output
# when the test program contains no test definition.
":gtest_no_test_unittest"
,
":gtest_xml_output_unittest_"
,
],
args
=
select
({
":has_absl"
:
[],
"//conditions:default"
:
[
"--no_stacktrace_support"
],
}),
deps
=
[
":gtest_test_utils"
],
)
# Verifies interaction of death tests and exceptions.
cc_test
(
name
=
"googletest-death-test_ex_catch_test"
,
size
=
"medium"
,
srcs
=
[
"googletest-death-test_ex_test.cc"
],
copts
=
[
"-fexceptions"
],
defines
=
[
"GTEST_ENABLE_CATCH_EXCEPTIONS_=1"
],
deps
=
[
"//:gtest"
],
)
cc_binary
(
name
=
"googletest-param-test-invalid-name1-test_"
,
testonly
=
1
,
srcs
=
[
"googletest-param-test-invalid-name1-test_.cc"
],
deps
=
[
"//:gtest"
],
)
cc_binary
(
name
=
"googletest-param-test-invalid-name2-test_"
,
testonly
=
1
,
srcs
=
[
"googletest-param-test-invalid-name2-test_.cc"
],
deps
=
[
"//:gtest"
],
)
py_test
(
name
=
"googletest-param-test-invalid-name1-test"
,
size
=
"small"
,
srcs
=
[
"googletest-param-test-invalid-name1-test.py"
],
data
=
[
":googletest-param-test-invalid-name1-test_"
],
deps
=
[
":gtest_test_utils"
],
)
py_test
(
name
=
"googletest-param-test-invalid-name2-test"
,
size
=
"small"
,
srcs
=
[
"googletest-param-test-invalid-name2-test.py"
],
data
=
[
":googletest-param-test-invalid-name2-test_"
],
deps
=
[
":gtest_test_utils"
],
)
googletest/test/gtest
_
break
_
on
_
failure
_
unittest.py
→
googletest/test/g
oogle
test
-
break
-
on
-
failure
-
unittest.py
View file @
687964c8
...
...
@@ -34,12 +34,10 @@
A user can ask Google Test to seg-fault when an assertion fails, using
either the GTEST_BREAK_ON_FAILURE environment variable or the
--gtest_break_on_failure flag. This script tests such functionality
by invoking gtest
_
break
_
on
_
failure
_
unittest_ (a program written with
by invoking g
oogle
test
-
break
-
on
-
failure
-
unittest_ (a program written with
Google Test) with different environments and command line flags.
"""
__author__
=
'wan@google.com (Zhanyong Wan)'
import
os
import
gtest_test_utils
...
...
@@ -59,9 +57,9 @@ THROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_ON_FAILURE'
# The environment variable for enabling/disabling the catch-exceptions mode.
CATCH_EXCEPTIONS_ENV_VAR
=
'GTEST_CATCH_EXCEPTIONS'
# Path to the gtest
_
break
_
on
_
failure
_
unittest_ program.
# Path to the g
oogle
test
-
break
-
on
-
failure
-
unittest_ program.
EXE_PATH
=
gtest_test_utils
.
GetTestExecutablePath
(
'gtest
_
break
_
on
_
failure
_
unittest_'
)
'g
oogle
test
-
break
-
on
-
failure
-
unittest_'
)
environ
=
gtest_test_utils
.
environ
...
...
@@ -95,7 +93,7 @@ class GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase):
"""
def
RunAndVerify
(
self
,
env_var_value
,
flag_value
,
expect_seg_fault
):
"""Runs gtest
_
break
_
on
_
failure
_
unittest_ and verifies that it does
"""Runs g
oogle
test
-
break
-
on
-
failure
-
unittest_ and verifies that it does
(or does not) have a seg-fault.
Args:
...
...
googletest/test/gtest
_
break
_
on
_
failure
_
unittest_.cc
→
googletest/test/g
oogle
test
-
break
-
on
-
failure
-
unittest_.cc
View file @
687964c8
...
...
@@ -26,8 +26,7 @@
// 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: wan@google.com (Zhanyong Wan)
// Unit test for Google Test's break-on-failure mode.
//
...
...
googletest/test/gtest
_
catch
_
exceptions
_
test.py
→
googletest/test/g
oogle
test
-
catch
-
exceptions
-
test.py
View file @
687964c8
...
...
@@ -30,13 +30,11 @@
"""Tests Google Test's exception catching behavior.
This script invokes gtest
_
catch
_
exceptions
_
test_ and
gtest
_
catch
_
exceptions
_
ex
_
test_ (programs written with
This script invokes g
oogle
test
-
catch
-
exceptions
-
test_ and
g
oogle
test
-
catch
-
exceptions
-
ex
-
test_ (programs written with
Google Test) and verifies their output.
"""
__author__
=
'vladl@google.com (Vlad Losev)'
import
gtest_test_utils
# Constants.
...
...
@@ -45,15 +43,15 @@ LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
NO_CATCH_EXCEPTIONS_FLAG
=
FLAG_PREFIX
+
'catch_exceptions=0'
FILTER_FLAG
=
FLAG_PREFIX
+
'filter'
# Path to the gtest
_
catch
_
exceptions
_
ex
_
test_ binary, compiled with
# Path to the g
oogle
test
-
catch
-
exceptions
-
ex
-
test_ binary, compiled with
# exceptions enabled.
EX_EXE_PATH
=
gtest_test_utils
.
GetTestExecutablePath
(
'gtest
_
catch
_
exceptions
_
ex
_
test_'
)
'g
oogle
test
-
catch
-
exceptions
-
ex
-
test_'
)
# Path to the gtest
_
catch
_
exceptions
_
test_ binary, compiled with
# Path to the g
oogle
test
-
catch
-
exceptions
-
test_ binary, compiled with
# exceptions disabled.
EXE_PATH
=
gtest_test_utils
.
GetTestExecutablePath
(
'gtest
_
catch
_
exceptions
_
no
_
ex
_
test_'
)
'g
oogle
test
-
catch
-
exceptions
-
no
-
ex
-
test_'
)
environ
=
gtest_test_utils
.
environ
SetEnvVar
=
gtest_test_utils
.
SetEnvVar
...
...
googletest/test/gtest
_
catch
_
exceptions
_
test_.cc
→
googletest/test/g
oogle
test
-
catch
-
exceptions
-
test_.cc
View file @
687964c8
...
...
@@ -26,17 +26,17 @@
// 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)
//
// Tests for Google Test itself. Tests in this file throw C++ or SEH
// exceptions, and the output is verified by gtest_catch_exceptions_test.py.
#include "gtest/gtest.h"
// exceptions, and the output is verified by
// googletest-catch-exceptions-test.py.
#include <stdio.h> // NOLINT
#include <stdlib.h> // For exit().
#include "gtest/gtest.h"
#if GTEST_HAS_SEH
# include <windows.h>
#endif
...
...
googletest/test/gtest
_
color
_
test.py
→
googletest/test/g
oogle
test
-
color
-
test.py
View file @
687964c8
...
...
@@ -31,8 +31,6 @@
"""Verifies that Google Test correctly determines whether to use colors."""
__author__
=
'wan@google.com (Zhanyong Wan)'
import
os
import
gtest_test_utils
...
...
@@ -40,7 +38,7 @@ IS_WINDOWS = os.name == 'nt'
COLOR_ENV_VAR
=
'GTEST_COLOR'
COLOR_FLAG
=
'gtest_color'
COMMAND
=
gtest_test_utils
.
GetTestExecutablePath
(
'gtest
_
color
_
test_'
)
COMMAND
=
gtest_test_utils
.
GetTestExecutablePath
(
'g
oogle
test
-
color
-
test_'
)
def
SetEnvVar
(
env_var
,
value
):
...
...
@@ -53,7 +51,7 @@ def SetEnvVar(env_var, value):
def
UsesColor
(
term
,
color_env_var
,
color_flag
):
"""Runs gtest
_
color
_
test_ and returns its exit code."""
"""Runs g
oogle
test
-
color
-
test_ and returns its exit code."""
SetEnvVar
(
'TERM'
,
term
)
SetEnvVar
(
COLOR_ENV_VAR
,
color_env_var
)
...
...
googletest/test/gtest
_
color
_
test_.cc
→
googletest/test/g
oogle
test
-
color
-
test_.cc
View file @
687964c8
...
...
@@ -26,8 +26,7 @@
// 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: wan@google.com (Zhanyong Wan)
// A helper program for testing how Google Test determines whether to use
// colors in the output. It prints "YES" and returns 1 if Google Test
...
...
googletest/test/gtest-death-test
_
test.cc
→
googletest/test/g
oogle
test-death-test
-
test.cc
View file @
687964c8
...
...
@@ -26,8 +26,7 @@
// 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: wan@google.com (Zhanyong Wan)
//
// Tests for death tests.
...
...
@@ -200,7 +199,7 @@ int DieInDebugElse12(int* sideeffect) {
return
12
;
}
# if GTEST_OS_WINDOWS
# if GTEST_OS_WINDOWS
|| GTEST_OS_FUCHSIA
// Tests the ExitedWithCode predicate.
TEST
(
ExitStatusPredicateTest
,
ExitedWithCode
)
{
...
...
@@ -272,7 +271,7 @@ TEST(ExitStatusPredicateTest, KilledBySignal) {
EXPECT_FALSE
(
pred_kill
(
status_segv
));
}
# endif // GTEST_OS_WINDOWS
# endif // GTEST_OS_WINDOWS
|| GTEST_OS_FUCHSIA
// Tests that the death test macros expand to code which may or may not
// be followed by operator<<, and that in either case the complete text
...
...
@@ -617,7 +616,11 @@ TEST_F(TestForDeathTest, ReturnIsFailure) {
TEST_F
(
TestForDeathTest
,
TestExpectDebugDeath
)
{
int
sideeffect
=
0
;
EXPECT_DEBUG_DEATH
(
DieInDebugElse12
(
&
sideeffect
),
"death.*DieInDebugElse12"
)
// Put the regex in a local variable to make sure we don't get an "unused"
// warning in opt mode.
const
char
*
regex
=
"death.*DieInDebugElse12"
;
EXPECT_DEBUG_DEATH
(
DieInDebugElse12
(
&
sideeffect
),
regex
)
<<
"Must accept a streamed message"
;
# ifdef NDEBUG
...
...
@@ -780,11 +783,12 @@ static void TestExitMacros() {
// Of all signals effects on the process exit code, only those of SIGABRT
// are documented on Windows.
// See http://msdn.microsoft.com/en-us/
library/dwwzkt4c(VS.71).aspx
.
// See http
s
://msdn.microsoft.com/en-us/
query-bi/m/dwwzkt4c
.
EXPECT_EXIT
(
raise
(
SIGABRT
),
testing
::
ExitedWithCode
(
3
),
""
)
<<
"b_ar"
;
# el
se
# el
if !GTEST_OS_FUCHSIA
// Fuchsia has no unix signals.
EXPECT_EXIT
(
raise
(
SIGKILL
),
testing
::
KilledBySignal
(
SIGKILL
),
""
)
<<
"foo"
;
ASSERT_EXIT
(
raise
(
SIGUSR2
),
testing
::
KilledBySignal
(
SIGUSR2
),
""
)
<<
"bar"
;
...
...
@@ -1275,7 +1279,7 @@ TEST(ParseNaturalNumberTest, WorksForShorterIntegers) {
# if GTEST_OS_WINDOWS
TEST
(
EnvironmentTest
,
HandleFitsIntoSizeT
)
{
//
TODO(vladl@google.com)
: Remove this test after this condition is verified
//
FIXME
: Remove this test after this condition is verified
// in a static assertion in gtest-death-test.cc in the function
// GetStatusFileDescriptor.
ASSERT_TRUE
(
sizeof
(
HANDLE
)
<=
sizeof
(
size_t
));
...
...
googletest/test/gtest-death-test_ex_test.cc
→
googletest/test/g
oogle
test-death-test_ex_test.cc
View file @
687964c8
...
...
@@ -26,8 +26,7 @@
// 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)
//
// Tests that verify interaction of exceptions and death tests.
...
...
@@ -69,7 +68,7 @@ TEST(CxxExceptionDeathTest, PrintsMessageForStdExceptions) {
"exceptional message"
);
// Verifies that the location is mentioned in the failure text.
EXPECT_NONFATAL_FAILURE
(
EXPECT_DEATH
(
throw
TestException
(),
""
),
"gtest-death-test_ex_test.cc"
);
"g
oogle
test-death-test_ex_test.cc"
);
}
# endif // GTEST_HAS_EXCEPTIONS
...
...
googletest/test/gtest
_
env
_
var
_
test.py
→
googletest/test/g
oogle
test
-
env
-
var
-
test.py
View file @
687964c8
...
...
@@ -31,8 +31,6 @@
"""Verifies that Google Test correctly parses environment variables."""
__author__
=
'wan@google.com (Zhanyong Wan)'
import
os
import
gtest_test_utils
...
...
@@ -40,7 +38,7 @@ import gtest_test_utils
IS_WINDOWS
=
os
.
name
==
'nt'
IS_LINUX
=
os
.
name
==
'posix'
and
os
.
uname
()[
0
]
==
'Linux'
COMMAND
=
gtest_test_utils
.
GetTestExecutablePath
(
'gtest
_
env
_
var
_
test_'
)
COMMAND
=
gtest_test_utils
.
GetTestExecutablePath
(
'g
oogle
test
-
env
-
var
-
test_'
)
environ
=
os
.
environ
.
copy
()
...
...
@@ -62,7 +60,7 @@ def SetEnvVar(env_var, value):
def
GetFlag
(
flag
):
"""Runs gtest
_
env
_
var
_
test_ and returns its output."""
"""Runs g
oogle
test
-
env
-
var
-
test_ and returns its output."""
args
=
[
COMMAND
]
if
flag
is
not
None
:
...
...
@@ -81,24 +79,26 @@ def TestFlag(flag, test_val, default_val):
class
GTestEnvVarTest
(
gtest_test_utils
.
TestCase
):
def
testEnvVarAffectsFlag
(
self
):
"""Tests that environment variable should affect the corresponding flag."""
TestFlag
(
'break_on_failure'
,
'1'
,
'0'
)
TestFlag
(
'color'
,
'yes'
,
'auto'
)
TestFlag
(
'filter'
,
'FooTest.Bar'
,
'*'
)
SetEnvVar
(
'XML_OUTPUT_FILE'
,
None
)
# For 'output' test
SetEnvVar
(
'XML_OUTPUT_FILE'
,
None
)
# For 'output' test
TestFlag
(
'output'
,
'xml:tmp/foo.xml'
,
''
)
TestFlag
(
'print_time'
,
'0'
,
'1'
)
TestFlag
(
'repeat'
,
'999'
,
'1'
)
TestFlag
(
'throw_on_failure'
,
'1'
,
'0'
)
TestFlag
(
'death_test_style'
,
'fast'
,
'threadsafe'
)
TestFlag
(
'death_test_style'
,
'threadsafe'
,
'fast'
)
TestFlag
(
'catch_exceptions'
,
'0'
,
'1'
)
if
IS_LINUX
:
TestFlag
(
'death_test_use_fork'
,
'1'
,
'0'
)
TestFlag
(
'stack_trace_depth'
,
'0'
,
'100'
)
def
testXmlOutputFile
(
self
):
"""Tests that $XML_OUTPUT_FILE affects the output flag."""
...
...
@@ -107,7 +107,7 @@ class GTestEnvVarTest(gtest_test_utils.TestCase):
AssertEq
(
'xml:tmp/bar.xml'
,
GetFlag
(
'output'
))
def
testXmlOutputFileOverride
(
self
):
"""Tests that $XML_OUTPUT_FILE is overridden by $GTEST_OUTPUT"""
"""Tests that $XML_OUTPUT_FILE is overridden by $GTEST_OUTPUT
.
"""
SetEnvVar
(
'GTEST_OUTPUT'
,
'xml:tmp/foo.xml'
)
SetEnvVar
(
'XML_OUTPUT_FILE'
,
'tmp/bar.xml'
)
...
...
googletest/test/gtest
_
env
_
var
_
test_.cc
→
googletest/test/g
oogle
test
-
env
-
var
-
test_.cc
View file @
687964c8
...
...
@@ -26,15 +26,14 @@
// 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: wan@google.com (Zhanyong Wan)
// A helper program for testing that Google Test parses the environment
// variables correctly.
#include "gtest/gtest.h"
#include <iostream>
#include "gtest/gtest.h"
#include "src/gtest-internal-inl.h"
using
::
std
::
cout
;
...
...
@@ -114,7 +113,7 @@ int main(int argc, char** argv) {
testing
::
InitGoogleTest
(
&
argc
,
argv
);
if
(
argc
!=
2
)
{
cout
<<
"Usage: gtest
_
env
_
var
_
test_ NAME_OF_FLAG
\n
"
;
cout
<<
"Usage: g
oogle
test
-
env
-
var
-
test_ NAME_OF_FLAG
\n
"
;
return
1
;
}
...
...
googletest/test/gtest-filepath
_
test.cc
→
googletest/test/g
oogle
test-filepath
-
test.cc
View file @
687964c8
...
...
@@ -27,7 +27,6 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//
// Google Test filepath utilities
//
// This file tests classes and functions used internally by
...
...
@@ -51,7 +50,7 @@ namespace internal {
namespace
{
#if GTEST_OS_WINDOWS_MOBILE
//
TODO(wan@google.com)
: Move these to the POSIX adapter section in
//
FIXME
: Move these to the POSIX adapter section in
// gtest-port.h.
// Windows CE doesn't have the remove C function.
...
...
googletest/test/gtest
_
filter
_
unittest.py
→
googletest/test/g
oogle
test
-
filter
-
unittest.py
View file @
687964c8
...
...
@@ -33,15 +33,13 @@
A user can specify which test(s) in a Google Test program to run via either
the GTEST_FILTER environment variable or the --gtest_filter flag.
This script tests such functionality by invoking
gtest
_
filter
_
unittest_ (a program written with Google Test) with different
g
oogle
test
-
filter
-
unittest_ (a program written with Google Test) with different
environments and command line flags.
Note that test sharding may also influence which tests are filtered. Therefore,
we test that here also.
"""
__author__
=
'wan@google.com (Zhanyong Wan)'
import
os
import
re
import
sets
...
...
@@ -100,8 +98,8 @@ FILTER_FLAG = 'gtest_filter'
# The command line flag for including 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_'
)
# Command to run the g
oogle
test
-
filter
-
unittest_ program.
COMMAND
=
gtest_test_utils
.
GetTestExecutablePath
(
'g
oogle
test
-
filter
-
unittest_'
)
# Regex for determining whether parameterized tests are enabled in the binary.
PARAM_TEST_REGEX
=
re
.
compile
(
r
'/ParamTest'
)
...
...
@@ -120,7 +118,7 @@ LIST_TESTS_FLAG = '--gtest_list_tests'
SUPPORTS_DEATH_TESTS
=
'HasDeathTest'
in
gtest_test_utils
.
Subprocess
(
[
COMMAND
,
LIST_TESTS_FLAG
]).
output
# Full names of all tests in gtest
_
filter
_
unittests_.
# Full names of all tests in g
oogle
test
-
filter
-
unittests_.
PARAM_TESTS
=
[
'SeqP/ParamTest.TestX/0'
,
'SeqP/ParamTest.TestX/1'
,
...
...
@@ -292,7 +290,7 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase):
args
=
None
,
check_exit_0
=
False
):
"""Checks that binary runs correct tests for the given filter and shard.
Runs all shards of gtest
_
filter
_
unittest_ with the given filter, and
Runs all shards of g
oogle
test
-
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, .
...
...
@@ -330,7 +328,7 @@ class GTestFilterUnitTest(gtest_test_utils.TestCase):
def
RunAndVerifyAllowingDisabled
(
self
,
gtest_filter
,
tests_to_run
):
"""Checks that the binary runs correct set of tests for the given filter.
Runs gtest
_
filter
_
unittest_ with the given filter, and enables
Runs g
oogle
test
-
filter
-
unittest_ with the given filter, and enables
disabled tests. Verifies that the right set of tests were run.
Args:
...
...
googletest/test/gtest
_
filter
_
unittest_.cc
→
googletest/test/g
oogle
test
-
filter
-
unittest_.cc
View file @
687964c8
...
...
@@ -26,8 +26,7 @@
// 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: wan@google.com (Zhanyong Wan)
// Unit test for Google Test test filters.
//
...
...
googletest/test/googletest-json-outfiles-test.py
0 → 100644
View file @
687964c8
#!/usr/bin/env python
# Copyright 2018, 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.
"""Unit test for the gtest_json_output module."""
import
json
import
os
import
gtest_json_test_utils
import
gtest_test_utils
GTEST_OUTPUT_SUBDIR
=
'json_outfiles'
GTEST_OUTPUT_1_TEST
=
'gtest_xml_outfile1_test_'
GTEST_OUTPUT_2_TEST
=
'gtest_xml_outfile2_test_'
EXPECTED_1
=
{
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'timestamp'
:
u
'*'
,
u
'name'
:
u
'AllTests'
,
u
'testsuites'
:
[{
u
'name'
:
u
'PropertyOne'
,
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[{
u
'name'
:
u
'TestSomeProperties'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'PropertyOne'
,
u
'SetUpProp'
:
u
'1'
,
u
'TestSomeProperty'
:
u
'1'
,
u
'TearDownProp'
:
u
'1'
,
}],
}],
}
EXPECTED_2
=
{
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'timestamp'
:
u
'*'
,
u
'name'
:
u
'AllTests'
,
u
'testsuites'
:
[{
u
'name'
:
u
'PropertyTwo'
,
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[{
u
'name'
:
u
'TestSomeProperties'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'PropertyTwo'
,
u
'SetUpProp'
:
u
'2'
,
u
'TestSomeProperty'
:
u
'2'
,
u
'TearDownProp'
:
u
'2'
,
}],
}],
}
class
GTestJsonOutFilesTest
(
gtest_test_utils
.
TestCase
):
"""Unit test for Google Test's JSON output functionality."""
def
setUp
(
self
):
# We want the trailing '/' that the last "" provides in os.path.join, for
# telling Google Test to create an output directory instead of a single file
# for xml output.
self
.
output_dir_
=
os
.
path
.
join
(
gtest_test_utils
.
GetTempDir
(),
GTEST_OUTPUT_SUBDIR
,
''
)
self
.
DeleteFilesAndDir
()
def
tearDown
(
self
):
self
.
DeleteFilesAndDir
()
def
DeleteFilesAndDir
(
self
):
try
:
os
.
remove
(
os
.
path
.
join
(
self
.
output_dir_
,
GTEST_OUTPUT_1_TEST
+
'.json'
))
except
os
.
error
:
pass
try
:
os
.
remove
(
os
.
path
.
join
(
self
.
output_dir_
,
GTEST_OUTPUT_2_TEST
+
'.json'
))
except
os
.
error
:
pass
try
:
os
.
rmdir
(
self
.
output_dir_
)
except
os
.
error
:
pass
def
testOutfile1
(
self
):
self
.
_TestOutFile
(
GTEST_OUTPUT_1_TEST
,
EXPECTED_1
)
def
testOutfile2
(
self
):
self
.
_TestOutFile
(
GTEST_OUTPUT_2_TEST
,
EXPECTED_2
)
def
_TestOutFile
(
self
,
test_name
,
expected
):
gtest_prog_path
=
gtest_test_utils
.
GetTestExecutablePath
(
test_name
)
command
=
[
gtest_prog_path
,
'--gtest_output=json:%s'
%
self
.
output_dir_
]
p
=
gtest_test_utils
.
Subprocess
(
command
,
working_dir
=
gtest_test_utils
.
GetTempDir
())
self
.
assert_
(
p
.
exited
)
self
.
assertEquals
(
0
,
p
.
exit_code
)
# FIXME: libtool causes the built test binary to be
# named lt-gtest_xml_outfiles_test_ instead of
# gtest_xml_outfiles_test_. To account for this possibility, we
# allow both names in the following code. We should remove this
# when libtool replacement tool is ready.
output_file_name1
=
test_name
+
'.json'
output_file1
=
os
.
path
.
join
(
self
.
output_dir_
,
output_file_name1
)
output_file_name2
=
'lt-'
+
output_file_name1
output_file2
=
os
.
path
.
join
(
self
.
output_dir_
,
output_file_name2
)
self
.
assert_
(
os
.
path
.
isfile
(
output_file1
)
or
os
.
path
.
isfile
(
output_file2
),
output_file1
)
if
os
.
path
.
isfile
(
output_file1
):
with
open
(
output_file1
)
as
f
:
actual
=
json
.
load
(
f
)
else
:
with
open
(
output_file2
)
as
f
:
actual
=
json
.
load
(
f
)
self
.
assertEqual
(
expected
,
gtest_json_test_utils
.
normalize
(
actual
))
if
__name__
==
'__main__'
:
os
.
environ
[
'GTEST_STACK_TRACE_DEPTH'
]
=
'0'
gtest_test_utils
.
Main
()
googletest/test/googletest-json-output-unittest.py
0 → 100644
View file @
687964c8
#!/usr/bin/env python
# Copyright 2018, 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.
"""Unit test for the gtest_json_output module."""
import
datetime
import
errno
import
json
import
os
import
re
import
sys
import
gtest_json_test_utils
import
gtest_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.json'
GTEST_PROGRAM_NAME
=
'gtest_xml_output_unittest_'
# The flag indicating stacktraces are not supported
NO_STACKTRACE_SUPPORT_FLAG
=
'--no_stacktrace_support'
SUPPORTS_STACK_TRACES
=
NO_STACKTRACE_SUPPORT_FLAG
not
in
sys
.
argv
if
SUPPORTS_STACK_TRACES
:
STACK_TRACE_TEMPLATE
=
'
\n
Stack trace:
\n
*'
else
:
STACK_TRACE_TEMPLATE
=
''
EXPECTED_NON_EMPTY
=
{
u
'tests'
:
23
,
u
'failures'
:
4
,
u
'disabled'
:
2
,
u
'errors'
:
0
,
u
'timestamp'
:
u
'*'
,
u
'time'
:
u
'*'
,
u
'ad_hoc_property'
:
u
'42'
,
u
'name'
:
u
'AllTests'
,
u
'testsuites'
:
[
{
u
'name'
:
u
'SuccessfulTest'
,
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'Succeeds'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'SuccessfulTest'
}
]
},
{
u
'name'
:
u
'FailedTest'
,
u
'tests'
:
1
,
u
'failures'
:
1
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'Fails'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'FailedTest'
,
u
'failures'
:
[
{
u
'failure'
:
u
'gtest_xml_output_unittest_.cc:*
\n
'
u
'Expected equality of these values:
\n
'
u
' 1
\n
2'
+
STACK_TRACE_TEMPLATE
,
u
'type'
:
u
''
}
]
}
]
},
{
u
'name'
:
u
'DisabledTest'
,
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
1
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'DISABLED_test_not_run'
,
u
'status'
:
u
'NOTRUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'DisabledTest'
}
]
},
{
u
'name'
:
u
'MixedResultTest'
,
u
'tests'
:
3
,
u
'failures'
:
1
,
u
'disabled'
:
1
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'Succeeds'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'MixedResultTest'
},
{
u
'name'
:
u
'Fails'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'MixedResultTest'
,
u
'failures'
:
[
{
u
'failure'
:
u
'gtest_xml_output_unittest_.cc:*
\n
'
u
'Expected equality of these values:
\n
'
u
' 1
\n
2'
+
STACK_TRACE_TEMPLATE
,
u
'type'
:
u
''
},
{
u
'failure'
:
u
'gtest_xml_output_unittest_.cc:*
\n
'
u
'Expected equality of these values:
\n
'
u
' 2
\n
3'
+
STACK_TRACE_TEMPLATE
,
u
'type'
:
u
''
}
]
},
{
u
'name'
:
u
'DISABLED_test'
,
u
'status'
:
u
'NOTRUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'MixedResultTest'
}
]
},
{
u
'name'
:
u
'XmlQuotingTest'
,
u
'tests'
:
1
,
u
'failures'
:
1
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'OutputsCData'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'XmlQuotingTest'
,
u
'failures'
:
[
{
u
'failure'
:
u
'gtest_xml_output_unittest_.cc:*
\n
'
u
'Failed
\n
XML output: <?xml encoding="utf-8">'
u
'<top><![CDATA[cdata text]]></top>'
+
STACK_TRACE_TEMPLATE
,
u
'type'
:
u
''
}
]
}
]
},
{
u
'name'
:
u
'InvalidCharactersTest'
,
u
'tests'
:
1
,
u
'failures'
:
1
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'InvalidCharactersInMessage'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'InvalidCharactersTest'
,
u
'failures'
:
[
{
u
'failure'
:
u
'gtest_xml_output_unittest_.cc:*
\n
'
u
'Failed
\n
Invalid characters in brackets'
u
' [
\x01\x02
]'
+
STACK_TRACE_TEMPLATE
,
u
'type'
:
u
''
}
]
}
]
},
{
u
'name'
:
u
'PropertyRecordingTest'
,
u
'tests'
:
4
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'SetUpTestCase'
:
u
'yes'
,
u
'TearDownTestCase'
:
u
'aye'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'OneProperty'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'PropertyRecordingTest'
,
u
'key_1'
:
u
'1'
},
{
u
'name'
:
u
'IntValuedProperty'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'PropertyRecordingTest'
,
u
'key_int'
:
u
'1'
},
{
u
'name'
:
u
'ThreeProperties'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'PropertyRecordingTest'
,
u
'key_1'
:
u
'1'
,
u
'key_2'
:
u
'2'
,
u
'key_3'
:
u
'3'
},
{
u
'name'
:
u
'TwoValuesForOneKeyUsesLastValue'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'PropertyRecordingTest'
,
u
'key_1'
:
u
'2'
}
]
},
{
u
'name'
:
u
'NoFixtureTest'
,
u
'tests'
:
3
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'RecordProperty'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'NoFixtureTest'
,
u
'key'
:
u
'1'
},
{
u
'name'
:
u
'ExternalUtilityThatCallsRecordIntValuedProperty'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'NoFixtureTest'
,
u
'key_for_utility_int'
:
u
'1'
},
{
u
'name'
:
u
'ExternalUtilityThatCallsRecordStringValuedProperty'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'NoFixtureTest'
,
u
'key_for_utility_string'
:
u
'1'
}
]
},
{
u
'name'
:
u
'TypedTest/0'
,
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'HasTypeParamAttribute'
,
u
'type_param'
:
u
'int'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'TypedTest/0'
}
]
},
{
u
'name'
:
u
'TypedTest/1'
,
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'HasTypeParamAttribute'
,
u
'type_param'
:
u
'long'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'TypedTest/1'
}
]
},
{
u
'name'
:
u
'Single/TypeParameterizedTestCase/0'
,
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'HasTypeParamAttribute'
,
u
'type_param'
:
u
'int'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'Single/TypeParameterizedTestCase/0'
}
]
},
{
u
'name'
:
u
'Single/TypeParameterizedTestCase/1'
,
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'HasTypeParamAttribute'
,
u
'type_param'
:
u
'long'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'Single/TypeParameterizedTestCase/1'
}
]
},
{
u
'name'
:
u
'Single/ValueParamTest'
,
u
'tests'
:
4
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[
{
u
'name'
:
u
'HasValueParamAttribute/0'
,
u
'value_param'
:
u
'33'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'Single/ValueParamTest'
},
{
u
'name'
:
u
'HasValueParamAttribute/1'
,
u
'value_param'
:
u
'42'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'Single/ValueParamTest'
},
{
u
'name'
:
u
'AnotherTestThatHasValueParamAttribute/0'
,
u
'value_param'
:
u
'33'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'Single/ValueParamTest'
},
{
u
'name'
:
u
'AnotherTestThatHasValueParamAttribute/1'
,
u
'value_param'
:
u
'42'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'Single/ValueParamTest'
}
]
}
]
}
EXPECTED_FILTERED
=
{
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'timestamp'
:
u
'*'
,
u
'name'
:
u
'AllTests'
,
u
'ad_hoc_property'
:
u
'42'
,
u
'testsuites'
:
[{
u
'name'
:
u
'SuccessfulTest'
,
u
'tests'
:
1
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'testsuite'
:
[{
u
'name'
:
u
'Succeeds'
,
u
'status'
:
u
'RUN'
,
u
'time'
:
u
'*'
,
u
'classname'
:
u
'SuccessfulTest'
,
}]
}],
}
EXPECTED_EMPTY
=
{
u
'tests'
:
0
,
u
'failures'
:
0
,
u
'disabled'
:
0
,
u
'errors'
:
0
,
u
'time'
:
u
'*'
,
u
'timestamp'
:
u
'*'
,
u
'name'
:
u
'AllTests'
,
u
'testsuites'
:
[],
}
GTEST_PROGRAM_PATH
=
gtest_test_utils
.
GetTestExecutablePath
(
GTEST_PROGRAM_NAME
)
SUPPORTS_TYPED_TESTS
=
'TypedTest'
in
gtest_test_utils
.
Subprocess
(
[
GTEST_PROGRAM_PATH
,
GTEST_LIST_TESTS_FLAG
],
capture_stderr
=
False
).
output
class
GTestJsonOutputUnitTest
(
gtest_test_utils
.
TestCase
):
"""Unit test for Google Test's JSON output functionality.
"""
# This test currently breaks on platforms that do not support typed and
# type-parameterized tests, so we don't run it under them.
if
SUPPORTS_TYPED_TESTS
:
def
testNonEmptyJsonOutput
(
self
):
"""Verifies JSON output for a Google Test binary with non-empty output.
Runs a test program that generates a non-empty JSON output, and
tests that the JSON output is expected.
"""
self
.
_TestJsonOutput
(
GTEST_PROGRAM_NAME
,
EXPECTED_NON_EMPTY
,
1
)
def
testEmptyJsonOutput
(
self
):
"""Verifies JSON output for a Google Test binary without actual tests.
Runs a test program that generates an empty JSON output, and
tests that the JSON output is expected.
"""
self
.
_TestJsonOutput
(
'gtest_no_test_unittest'
,
EXPECTED_EMPTY
,
0
)
def
testTimestampValue
(
self
):
"""Checks whether the timestamp attribute in the JSON output is valid.
Runs a test program that generates an empty JSON output, and checks if
the timestamp attribute in the testsuites tag is valid.
"""
actual
=
self
.
_GetJsonOutput
(
'gtest_no_test_unittest'
,
[],
0
)
date_time_str
=
actual
[
'timestamp'
]
# datetime.strptime() is only available in Python 2.5+ so we have to
# parse the expected datetime manually.
match
=
re
.
match
(
r
'(\d+)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)'
,
date_time_str
)
self
.
assertTrue
(
re
.
match
,
'JSON datettime string %s has incorrect format'
%
date_time_str
)
date_time_from_json
=
datetime
.
datetime
(
year
=
int
(
match
.
group
(
1
)),
month
=
int
(
match
.
group
(
2
)),
day
=
int
(
match
.
group
(
3
)),
hour
=
int
(
match
.
group
(
4
)),
minute
=
int
(
match
.
group
(
5
)),
second
=
int
(
match
.
group
(
6
)))
time_delta
=
abs
(
datetime
.
datetime
.
now
()
-
date_time_from_json
)
# timestamp value should be near the current local time
self
.
assertTrue
(
time_delta
<
datetime
.
timedelta
(
seconds
=
600
),
'time_delta is %s'
%
time_delta
)
def
testDefaultOutputFile
(
self
):
"""Verifies the default output file name.
Confirms that Google Test produces an JSON output file with the expected
default name if no name is explicitly specified.
"""
output_file
=
os
.
path
.
join
(
gtest_test_utils
.
GetTempDir
(),
GTEST_DEFAULT_OUTPUT_FILE
)
gtest_prog_path
=
gtest_test_utils
.
GetTestExecutablePath
(
'gtest_no_test_unittest'
)
try
:
os
.
remove
(
output_file
)
except
OSError
:
e
=
sys
.
exc_info
()[
1
]
if
e
.
errno
!=
errno
.
ENOENT
:
raise
p
=
gtest_test_utils
.
Subprocess
(
[
gtest_prog_path
,
'%s=json'
%
GTEST_OUTPUT_FLAG
],
working_dir
=
gtest_test_utils
.
GetTempDir
())
self
.
assert_
(
p
.
exited
)
self
.
assertEquals
(
0
,
p
.
exit_code
)
self
.
assert_
(
os
.
path
.
isfile
(
output_file
))
def
testSuppressedJsonOutput
(
self
):
"""Verifies that no JSON output is generated.
Tests that no JSON file is generated if the default JSON listener is
shut down before RUN_ALL_TESTS is invoked.
"""
json_path
=
os
.
path
.
join
(
gtest_test_utils
.
GetTempDir
(),
GTEST_PROGRAM_NAME
+
'out.json'
)
if
os
.
path
.
isfile
(
json_path
):
os
.
remove
(
json_path
)
command
=
[
GTEST_PROGRAM_PATH
,
'%s=json:%s'
%
(
GTEST_OUTPUT_FLAG
,
json_path
),
'--shut_down_xml'
]
p
=
gtest_test_utils
.
Subprocess
(
command
)
if
p
.
terminated_by_signal
:
# p.signal is available only if p.terminated_by_signal is True.
self
.
assertFalse
(
p
.
terminated_by_signal
,
'%s was killed by signal %d'
%
(
GTEST_PROGRAM_NAME
,
p
.
signal
))
else
:
self
.
assert_
(
p
.
exited
)
self
.
assertEquals
(
1
,
p
.
exit_code
,
"'%s' exited with code %s, which doesn't match "
'the expected exit code %s.'
%
(
command
,
p
.
exit_code
,
1
))
self
.
assert_
(
not
os
.
path
.
isfile
(
json_path
))
def
testFilteredTestJsonOutput
(
self
):
"""Verifies JSON output when a filter is applied.
Runs a test program that executes only some tests and verifies that
non-selected tests do not show up in the JSON output.
"""
self
.
_TestJsonOutput
(
GTEST_PROGRAM_NAME
,
EXPECTED_FILTERED
,
0
,
extra_args
=
[
'%s=SuccessfulTest.*'
%
GTEST_FILTER_FLAG
])
def
_GetJsonOutput
(
self
,
gtest_prog_name
,
extra_args
,
expected_exit_code
):
"""Returns the JSON output generated by running the program gtest_prog_name.
Furthermore, the program's exit code must be expected_exit_code.
Args:
gtest_prog_name: Google Test binary name.
extra_args: extra arguments to binary invocation.
expected_exit_code: program's exit code.
"""
json_path
=
os
.
path
.
join
(
gtest_test_utils
.
GetTempDir
(),
gtest_prog_name
+
'out.json'
)
gtest_prog_path
=
gtest_test_utils
.
GetTestExecutablePath
(
gtest_prog_name
)
command
=
(
[
gtest_prog_path
,
'%s=json:%s'
%
(
GTEST_OUTPUT_FLAG
,
json_path
)]
+
extra_args
)
p
=
gtest_test_utils
.
Subprocess
(
command
)
if
p
.
terminated_by_signal
:
self
.
assert_
(
False
,
'%s was killed by signal %d'
%
(
gtest_prog_name
,
p
.
signal
))
else
:
self
.
assert_
(
p
.
exited
)
self
.
assertEquals
(
expected_exit_code
,
p
.
exit_code
,
"'%s' exited with code %s, which doesn't match "
'the expected exit code %s.'
%
(
command
,
p
.
exit_code
,
expected_exit_code
))
with
open
(
json_path
)
as
f
:
actual
=
json
.
load
(
f
)
return
actual
def
_TestJsonOutput
(
self
,
gtest_prog_name
,
expected
,
expected_exit_code
,
extra_args
=
None
):
"""Checks the JSON output generated by the Google Test binary.
Asserts that the JSON document generated by running the program
gtest_prog_name matches expected_json, a string containing another
JSON document. Furthermore, the program's exit code must be
expected_exit_code.
Args:
gtest_prog_name: Google Test binary name.
expected: expected output.
expected_exit_code: program's exit code.
extra_args: extra arguments to binary invocation.
"""
actual
=
self
.
_GetJsonOutput
(
gtest_prog_name
,
extra_args
or
[],
expected_exit_code
)
self
.
assertEqual
(
expected
,
gtest_json_test_utils
.
normalize
(
actual
))
if
__name__
==
'__main__'
:
if
NO_STACKTRACE_SUPPORT_FLAG
in
sys
.
argv
:
# unittest.main() can't handle unknown flags
sys
.
argv
.
remove
(
NO_STACKTRACE_SUPPORT_FLAG
)
os
.
environ
[
'GTEST_STACK_TRACE_DEPTH'
]
=
'1'
gtest_test_utils
.
Main
()
Prev
1
…
4
5
6
7
8
9
10
11
12
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment