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
f3a9fa6a
"superbench/common/utils/gen_traffic_pattern_config.py" did not exist on "3c97381fd263493b2e38fa362d6a2cb33f3bde63"
Unverified
Commit
f3a9fa6a
authored
Aug 16, 2018
by
Gennadiy Civil
Committed by
GitHub
Aug 16, 2018
Browse files
Merge branch 'master' into master
parents
6c093a23
490554aa
Changes
245
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
505 additions
and
184 deletions
+505
-184
googletest/samples/sample2_unittest.cc
googletest/samples/sample2_unittest.cc
+0
-3
googletest/samples/sample3-inl.h
googletest/samples/sample3-inl.h
+0
-2
googletest/samples/sample3_unittest.cc
googletest/samples/sample3_unittest.cc
+0
-3
googletest/samples/sample4.cc
googletest/samples/sample4.cc
+0
-2
googletest/samples/sample4.h
googletest/samples/sample4.h
+0
-3
googletest/samples/sample4_unittest.cc
googletest/samples/sample4_unittest.cc
+5
-3
googletest/samples/sample5_unittest.cc
googletest/samples/sample5_unittest.cc
+2
-3
googletest/samples/sample6_unittest.cc
googletest/samples/sample6_unittest.cc
+1
-2
googletest/samples/sample7_unittest.cc
googletest/samples/sample7_unittest.cc
+1
-14
googletest/samples/sample8_unittest.cc
googletest/samples/sample8_unittest.cc
+1
-2
googletest/samples/sample9_unittest.cc
googletest/samples/sample9_unittest.cc
+1
-2
googletest/scripts/fuse_gtest_files.py
googletest/scripts/fuse_gtest_files.py
+1
-1
googletest/scripts/gen_gtest_pred_impl.py
googletest/scripts/gen_gtest_pred_impl.py
+10
-10
googletest/scripts/upload.py
googletest/scripts/upload.py
+4
-4
googletest/src/gtest-all.cc
googletest/src/gtest-all.cc
+2
-3
googletest/src/gtest-death-test.cc
googletest/src/gtest-death-test.cc
+267
-33
googletest/src/gtest-filepath.cc
googletest/src/gtest-filepath.cc
+7
-9
googletest/src/gtest-internal-inl.h
googletest/src/gtest-internal-inl.h
+18
-19
googletest/src/gtest-port.cc
googletest/src/gtest-port.cc
+90
-55
googletest/src/gtest-printers.cc
googletest/src/gtest-printers.cc
+95
-11
No files found.
googletest/samples/sample2_unittest.cc
View file @
f3a9fa6a
...
...
@@ -28,9 +28,6 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// A sample program demonstrating using Google C++ testing framework.
//
// Author: wan@google.com (Zhanyong Wan)
// This sample shows how to write a more complex unit test for a class
// that has multiple member functions.
...
...
googletest/samples/sample3-inl.h
View file @
f3a9fa6a
...
...
@@ -28,8 +28,6 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// A sample program demonstrating using Google C++ testing framework.
//
// Author: wan@google.com (Zhanyong Wan)
#ifndef GTEST_SAMPLES_SAMPLE3_INL_H_
#define GTEST_SAMPLES_SAMPLE3_INL_H_
...
...
googletest/samples/sample3_unittest.cc
View file @
f3a9fa6a
...
...
@@ -28,9 +28,6 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// A sample program demonstrating using Google C++ testing framework.
//
// Author: wan@google.com (Zhanyong Wan)
// In this example, we use a more advanced feature of Google Test called
// test fixture.
...
...
googletest/samples/sample4.cc
View file @
f3a9fa6a
...
...
@@ -28,8 +28,6 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// A sample program demonstrating using Google C++ testing framework.
//
// Author: wan@google.com (Zhanyong Wan)
#include <stdio.h>
...
...
googletest/samples/sample4.h
View file @
f3a9fa6a
...
...
@@ -28,9 +28,6 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// A sample program demonstrating using Google C++ testing framework.
//
// Author: wan@google.com (Zhanyong Wan)
#ifndef GTEST_SAMPLES_SAMPLE4_H_
#define GTEST_SAMPLES_SAMPLE4_H_
...
...
googletest/samples/sample4_unittest.cc
View file @
f3a9fa6a
...
...
@@ -26,13 +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)
#include "gtest/gtest.h"
#include "sample4.h"
#include "gtest/gtest.h"
namespace
{
// Tests the Increment() method.
TEST
(
Counter
,
Increment
)
{
Counter
c
;
...
...
@@ -43,4 +44,5 @@ TEST(Counter, Increment) {
EXPECT_EQ
(
1
,
c
.
Increment
());
EXPECT_EQ
(
2
,
c
.
Increment
());
}
}
// namespace
googletest/samples/sample5_unittest.cc
View file @
f3a9fa6a
...
...
@@ -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)
// This sample teaches how to reuse a test fixture in multiple test
// cases by deriving sub-fixtures from it.
...
...
@@ -46,9 +45,9 @@
#include <limits.h>
#include <time.h>
#include "sample3-inl.h"
#include "gtest/gtest.h"
#include "sample1.h"
#include "sample3-inl.h"
namespace
{
// In this sample, we want to ensure that every test finishes within
// ~5 seconds. If a test takes longer to run, we consider it a
...
...
googletest/samples/sample6_unittest.cc
View file @
f3a9fa6a
...
...
@@ -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)
// This sample shows how to test common properties of multiple
// implementations of the same interface (aka interface tests).
...
...
googletest/samples/sample7_unittest.cc
View file @
f3a9fa6a
...
...
@@ -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)
// This sample shows how to test common properties of multiple
// implementations of an interface (aka interface tests) using
...
...
@@ -40,7 +39,6 @@
#include "gtest/gtest.h"
namespace
{
#if GTEST_HAS_PARAM_TEST
using
::
testing
::
TestWithParam
;
using
::
testing
::
Values
;
...
...
@@ -116,15 +114,4 @@ INSTANTIATE_TEST_CASE_P(OnTheFlyAndPreCalculated, PrimeTableTestSmpl7,
Values
(
&
CreateOnTheFlyPrimeTable
,
&
CreatePreCalculatedPrimeTable
<
1000
>
));
#else
// Google Test may not support value-parameterized tests with some
// compilers. If we use conditional compilation to compile out all
// code referring to the gtest_main library, MSVC linker will not link
// that library at all and consequently complain about missing entry
// point defined in that library (fatal error LNK1561: entry point
// must be defined). This dummy test keeps gtest_main linked in.
TEST
(
DummyTest
,
ValueParameterizedTestsAreNotSupportedOnThisPlatform
)
{}
#endif // GTEST_HAS_PARAM_TEST
}
// namespace
googletest/samples/sample8_unittest.cc
View file @
f3a9fa6a
...
...
@@ -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)
// This sample shows how to test code relying on some global flag variables.
// Combine() helps with generating all possible combinations of such flags,
...
...
googletest/samples/sample9_unittest.cc
View file @
f3a9fa6a
...
...
@@ -25,8 +25,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)
// This sample shows how to use Google Test listener API to implement
// an alternative console output and how to use the UnitTest reflection API
...
...
googletest/scripts/fuse_gtest_files.py
View file @
f3a9fa6a
...
...
@@ -52,7 +52,7 @@ EXAMPLES
This tool is experimental. In particular, it assumes that there is no
conditional inclusion of Google Test headers. Please report any
problems to googletestframework@googlegroups.com. You can read
https://github.com/google/googletest/blob/master/googletest/docs/
A
dvanced
Guide
.md for
https://github.com/google/googletest/blob/master/googletest/docs/
a
dvanced.md for
more information.
"""
...
...
googletest/scripts/gen_gtest_pred_impl.py
View file @
f3a9fa6a
...
...
@@ -115,10 +115,9 @@ def HeaderPreamble(n):
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
// Makes sure this header is not included before gtest.h.
#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
# error Do not include gtest_pred_impl.h directly. Include gtest.h instead.
#endif // GTEST_INCLUDE_GTEST_GTEST_H_
#include "gtest/gtest.h"
namespace testing {
// This header implements a family of generic predicate assertion
// macros:
...
...
@@ -295,16 +294,17 @@ def HeaderPostamble():
return
"""
} // namespace testing
#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
"""
def
GenerateFile
(
path
,
content
):
"""Given a file path and a content string
, overwrites it with the
given content.
"""
"""Given a file path and a content string
overwrites it with the
given content.
"""
print
'Updating file %s . . .'
%
path
f
=
file
(
path
,
'w+'
)
print
>>
f
,
content
,
f
.
close
()
...
...
@@ -314,8 +314,8 @@ def GenerateFile(path, content):
def
GenerateHeader
(
n
):
"""Given the maximum arity n, updates the header file that implements
the predicate assertions.
"""
the predicate assertions.
"""
GenerateFile
(
HEADER
,
HeaderPreamble
(
n
)
+
''
.
join
([
ImplementationForArity
(
i
)
for
i
in
OneTo
(
n
)])
...
...
googletest/scripts/upload.py
View file @
f3a9fa6a
...
...
@@ -242,7 +242,7 @@ class AbstractRpcServer(object):
The authentication process works as follows:
1) We get a username and password from the user
2) We use ClientLogin to obtain an AUTH token for the user
(see http://
co
de.google.com/
apis/account
s/AuthForInstalledApps
.html
).
(see http
s
://de
velopers
.google.com/
identity/protocol
s/AuthForInstalledApps).
3) We pass the auth token to /_ah/login on the server to obtain an
authentication cookie. If login was successful, it tries to redirect
us to the URL we provided.
...
...
@@ -506,7 +506,7 @@ def EncodeMultipartFormData(fields, files):
(content_type, body) ready for httplib.HTTP instance.
Source:
http://
aspn.activestate.com/ASPN/Cookbook/Python/R
ecipe/146306
http
s
://
web.archive.org/web/20160116052001/code.activestate.com/r
ecipe
s
/146306
"""
BOUNDARY
=
'-M-A-G-I-C---B-O-U-N-D-A-R-Y-'
CRLF
=
'
\r\n
'
...
...
@@ -807,7 +807,7 @@ class SubversionVCS(VersionControlSystem):
# svn cat translates keywords but svn diff doesn't. As a result of this
# behavior patching.PatchChunks() fails with a chunk mismatch error.
# This part was originally written by the Review Board development team
# who had the same problem (http://reviews.review
-
board.org/r/276/).
# who had the same problem (http
s
://reviews.reviewboard.org/r/276/).
# Mapping of keywords to known aliases
svn_keywords
=
{
# Standard keywords
...
...
@@ -860,7 +860,7 @@ class SubversionVCS(VersionControlSystem):
status_lines
=
status
.
splitlines
()
# If file is in a cl, the output will begin with
# "\n--- Changelist 'cl_name':\n". See
# http://svn.collab.net/repos/svn/trunk/notes/changelist-design.txt
# http
s
://
web.archive.org/web/20090918234815/
svn.collab.net/repos/svn/trunk/notes/changelist-design.txt
if
(
len
(
status_lines
)
==
3
and
not
status_lines
[
0
]
and
status_lines
[
1
].
startswith
(
"--- Changelist"
)):
...
...
googletest/src/gtest-all.cc
View file @
f3a9fa6a
...
...
@@ -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)
//
// Google C++ Testing Framework (Google Test)
// Google C++ Testing and Mocking Framework (Google Test)
//
// Sometimes it's desirable to build Google Test by compiling a single file.
// This file serves this purpose.
...
...
googletest/src/gtest-death-test.cc
View file @
f3a9fa6a
...
...
@@ -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), vladl@google.com (Vlad Losev)
//
// This file implements death tests.
...
...
@@ -62,26 +61,30 @@
# include <spawn.h>
# endif // GTEST_OS_QNX
# if GTEST_OS_FUCHSIA
# include <lib/fdio/io.h>
# include <lib/fdio/spawn.h>
# include <zircon/processargs.h>
# include <zircon/syscalls.h>
# include <zircon/syscalls/port.h>
# endif // GTEST_OS_FUCHSIA
#endif // GTEST_HAS_DEATH_TEST
#include "gtest/gtest-message.h"
#include "gtest/internal/gtest-string.h"
// Indicates that this translation unit is part of Google Test's
// implementation. It must come before gtest-internal-inl.h is
// included, or there will be a compiler error. This trick exists to
// prevent the accidental inclusion of gtest-internal-inl.h in the
// user's code.
#define GTEST_IMPLEMENTATION_ 1
#include "src/gtest-internal-inl.h"
#undef GTEST_IMPLEMENTATION_
namespace
testing
{
// Constants.
// The default death test style.
static
const
char
kDefaultDeathTestStyle
[]
=
"fast"
;
//
// This is defined in internal/gtest-port.h as "fast", but can be overridden by
// a definition in internal/custom/gtest-port.h. The recommended value, which is
// used internally at Google, is "threadsafe".
static
const
char
kDefaultDeathTestStyle
[]
=
GTEST_DEFAULT_DEATH_TEST_STYLE
;
GTEST_DEFINE_string_
(
death_test_style
,
...
...
@@ -121,7 +124,7 @@ namespace internal {
// Valid only for fast death tests. Indicates the code is running in the
// child process of a fast style death test.
# if !GTEST_OS_WINDOWS
# if !GTEST_OS_WINDOWS
&& !GTEST_OS_FUCHSIA
static
bool
g_in_fast_death_test_child
=
false
;
# endif
...
...
@@ -131,10 +134,10 @@ static bool g_in_fast_death_test_child = false;
// tests. IMPORTANT: This is an internal utility. Using it may break the
// implementation of death tests. User code MUST NOT use it.
bool
InDeathTestChild
()
{
# if GTEST_OS_WINDOWS
# if GTEST_OS_WINDOWS
|| GTEST_OS_FUCHSIA
// On Windows, death tests are thread-safe regardless of the value
of the
// death_test_style flag.
// On Windows
and Fuchsia
, death tests are thread-safe regardless of the value
//
of the
death_test_style flag.
return
!
GTEST_FLAG
(
internal_run_death_test
).
empty
();
# else
...
...
@@ -154,7 +157,7 @@ ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
// ExitedWithCode function-call operator.
bool
ExitedWithCode
::
operator
()(
int
exit_status
)
const
{
# if GTEST_OS_WINDOWS
# if GTEST_OS_WINDOWS
|| GTEST_OS_FUCHSIA
return
exit_status
==
exit_code_
;
...
...
@@ -162,10 +165,10 @@ bool ExitedWithCode::operator()(int exit_status) const {
return
WIFEXITED
(
exit_status
)
&&
WEXITSTATUS
(
exit_status
)
==
exit_code_
;
# endif // GTEST_OS_WINDOWS
# endif // GTEST_OS_WINDOWS
|| GTEST_OS_FUCHSIA
}
# if !GTEST_OS_WINDOWS
# if !GTEST_OS_WINDOWS
&& !GTEST_OS_FUCHSIA
// KilledBySignal constructor.
KilledBySignal
::
KilledBySignal
(
int
signum
)
:
signum_
(
signum
)
{
}
...
...
@@ -182,7 +185,7 @@ bool KilledBySignal::operator()(int exit_status) const {
# endif // defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_)
return
WIFSIGNALED
(
exit_status
)
&&
WTERMSIG
(
exit_status
)
==
signum_
;
}
# endif // !GTEST_OS_WINDOWS
# endif // !GTEST_OS_WINDOWS
&& !GTEST_OS_FUCHSIA
namespace
internal
{
...
...
@@ -193,7 +196,7 @@ namespace internal {
static
std
::
string
ExitSummary
(
int
exit_code
)
{
Message
m
;
# if GTEST_OS_WINDOWS
# if GTEST_OS_WINDOWS
|| GTEST_OS_FUCHSIA
m
<<
"Exited with exit status "
<<
exit_code
;
...
...
@@ -209,7 +212,7 @@ static std::string ExitSummary(int exit_code) {
m
<<
" (core dumped)"
;
}
# endif
# endif // GTEST_OS_WINDOWS
# endif // GTEST_OS_WINDOWS
|| GTEST_OS_FUCHSIA
return
m
.
GetString
();
}
...
...
@@ -220,7 +223,7 @@ bool ExitedUnsuccessfully(int exit_status) {
return
!
ExitedWithCode
(
0
)(
exit_status
);
}
# if !GTEST_OS_WINDOWS
# if !GTEST_OS_WINDOWS
&& !GTEST_OS_FUCHSIA
// Generates a textual failure message when a death test finds more than
// one thread running, or cannot determine the number of threads, prior
// to executing the given statement. It is the responsibility of the
...
...
@@ -229,13 +232,19 @@ static std::string DeathTestThreadWarning(size_t thread_count) {
Message
msg
;
msg
<<
"Death tests use fork(), which is unsafe particularly"
<<
" in a threaded context. For this test, "
<<
GTEST_NAME_
<<
" "
;
if
(
thread_count
==
0
)
if
(
thread_count
==
0
)
{
msg
<<
"couldn't detect the number of threads."
;
else
}
else
{
msg
<<
"detected "
<<
thread_count
<<
" threads."
;
}
msg
<<
" See "
"https://github.com/google/googletest/blob/master/googletest/docs/"
"advanced.md#death-tests-and-threads"
<<
" for more explanation and suggested solutions, especially if"
<<
" this is the last message you see before your test times out."
;
return
msg
.
GetString
();
}
# endif // !GTEST_OS_WINDOWS
# endif // !GTEST_OS_WINDOWS
&& !GTEST_OS_FUCHSIA
// Flag characters for reporting a death test that did not die.
static
const
char
kDeathTestLived
=
'L'
;
...
...
@@ -243,6 +252,13 @@ static const char kDeathTestReturned = 'R';
static
const
char
kDeathTestThrew
=
'T'
;
static
const
char
kDeathTestInternalError
=
'I'
;
#if GTEST_OS_FUCHSIA
// File descriptor used for the pipe in the child process.
static
const
int
kFuchsiaReadPipeFd
=
3
;
#endif
// An enumeration describing all of the possible ways that a death test can
// conclude. DIED means that the process died while executing the test
// code; LIVED means that process lived beyond the end of the test code;
...
...
@@ -250,7 +266,7 @@ static const char kDeathTestInternalError = 'I';
// statement, which is not allowed; THREW means that the test statement
// returned control by throwing an exception. IN_PROGRESS means the test
// has not yet concluded.
//
TODO(vladl@google.com)
: Unify names and possibly values for
//
FIXME
: Unify names and possibly values for
// AbortReason, DeathTestOutcome, and flag characters above.
enum
DeathTestOutcome
{
IN_PROGRESS
,
DIED
,
LIVED
,
RETURNED
,
THREW
};
...
...
@@ -259,7 +275,7 @@ enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
// message is propagated back to the parent process. Otherwise, the
// message is simply printed to stderr. In either case, the program
// then exits with status 1.
void
DeathTestAbort
(
const
std
::
string
&
message
)
{
static
void
DeathTestAbort
(
const
std
::
string
&
message
)
{
// On a POSIX system, this function may be called from a threadsafe-style
// death test child process, which operates on a very small stack. Use
// the heap for any additional non-minuscule memory requirements.
...
...
@@ -563,7 +579,12 @@ bool DeathTestImpl::Passed(bool status_ok) {
break
;
case
DIED
:
if
(
status_ok
)
{
# if GTEST_USES_PCRE
// PCRE regexes support embedded NULs.
const
bool
matched
=
RE
::
PartialMatch
(
error_message
,
*
regex
());
# else
const
bool
matched
=
RE
::
PartialMatch
(
error_message
.
c_str
(),
*
regex
());
# endif // GTEST_USES_PCRE
if
(
matched
)
{
success
=
true
;
}
else
{
...
...
@@ -779,7 +800,200 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
set_spawned
(
true
);
return
OVERSEE_TEST
;
}
# else // We are not on Windows.
# elif GTEST_OS_FUCHSIA
class
FuchsiaDeathTest
:
public
DeathTestImpl
{
public:
FuchsiaDeathTest
(
const
char
*
a_statement
,
const
RE
*
a_regex
,
const
char
*
file
,
int
line
)
:
DeathTestImpl
(
a_statement
,
a_regex
),
file_
(
file
),
line_
(
line
)
{}
virtual
~
FuchsiaDeathTest
()
{
zx_status_t
status
=
zx_handle_close
(
child_process_
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
status
=
zx_handle_close
(
port_
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
}
// All of these virtual functions are inherited from DeathTest.
virtual
int
Wait
();
virtual
TestRole
AssumeRole
();
private:
// The name of the file in which the death test is located.
const
char
*
const
file_
;
// The line number on which the death test is located.
const
int
line_
;
zx_handle_t
child_process_
=
ZX_HANDLE_INVALID
;
zx_handle_t
port_
=
ZX_HANDLE_INVALID
;
};
// Utility class for accumulating command-line arguments.
class
Arguments
{
public:
Arguments
()
{
args_
.
push_back
(
NULL
);
}
~
Arguments
()
{
for
(
std
::
vector
<
char
*>::
iterator
i
=
args_
.
begin
();
i
!=
args_
.
end
();
++
i
)
{
free
(
*
i
);
}
}
void
AddArgument
(
const
char
*
argument
)
{
args_
.
insert
(
args_
.
end
()
-
1
,
posix
::
StrDup
(
argument
));
}
template
<
typename
Str
>
void
AddArguments
(
const
::
std
::
vector
<
Str
>&
arguments
)
{
for
(
typename
::
std
::
vector
<
Str
>::
const_iterator
i
=
arguments
.
begin
();
i
!=
arguments
.
end
();
++
i
)
{
args_
.
insert
(
args_
.
end
()
-
1
,
posix
::
StrDup
(
i
->
c_str
()));
}
}
char
*
const
*
Argv
()
{
return
&
args_
[
0
];
}
int
size
()
{
return
args_
.
size
()
-
1
;
}
private:
std
::
vector
<
char
*>
args_
;
};
// Waits for the child in a death test to exit, returning its exit
// status, or 0 if no child process exists. As a side effect, sets the
// outcome data member.
int
FuchsiaDeathTest
::
Wait
()
{
if
(
!
spawned
())
return
0
;
// Register to wait for the child process to terminate.
zx_status_t
status_zx
;
status_zx
=
zx_object_wait_async
(
child_process_
,
port_
,
0
/* key */
,
ZX_PROCESS_TERMINATED
,
ZX_WAIT_ASYNC_ONCE
);
GTEST_DEATH_TEST_CHECK_
(
status_zx
==
ZX_OK
);
// Wait for it to terminate, or an exception to be received.
zx_port_packet_t
packet
;
status_zx
=
zx_port_wait
(
port_
,
ZX_TIME_INFINITE
,
&
packet
);
GTEST_DEATH_TEST_CHECK_
(
status_zx
==
ZX_OK
);
if
(
ZX_PKT_IS_EXCEPTION
(
packet
.
type
))
{
// Process encountered an exception. Kill it directly rather than letting
// other handlers process the event.
status_zx
=
zx_task_kill
(
child_process_
);
GTEST_DEATH_TEST_CHECK_
(
status_zx
==
ZX_OK
);
// Now wait for |child_process_| to terminate.
zx_signals_t
signals
=
0
;
status_zx
=
zx_object_wait_one
(
child_process_
,
ZX_PROCESS_TERMINATED
,
ZX_TIME_INFINITE
,
&
signals
);
GTEST_DEATH_TEST_CHECK_
(
status_zx
==
ZX_OK
);
GTEST_DEATH_TEST_CHECK_
(
signals
&
ZX_PROCESS_TERMINATED
);
}
else
{
// Process terminated.
GTEST_DEATH_TEST_CHECK_
(
ZX_PKT_IS_SIGNAL_ONE
(
packet
.
type
));
GTEST_DEATH_TEST_CHECK_
(
packet
.
signal
.
observed
&
ZX_PROCESS_TERMINATED
);
}
ReadAndInterpretStatusByte
();
zx_info_process_t
buffer
;
status_zx
=
zx_object_get_info
(
child_process_
,
ZX_INFO_PROCESS
,
&
buffer
,
sizeof
(
buffer
),
nullptr
,
nullptr
);
GTEST_DEATH_TEST_CHECK_
(
status_zx
==
ZX_OK
);
GTEST_DEATH_TEST_CHECK_
(
buffer
.
exited
);
set_status
(
buffer
.
return_code
);
return
status
();
}
// The AssumeRole process for a Fuchsia death test. It creates a child
// process with the same executable as the current process to run the
// death test. The child process is given the --gtest_filter and
// --gtest_internal_run_death_test flags such that it knows to run the
// current death test only.
DeathTest
::
TestRole
FuchsiaDeathTest
::
AssumeRole
()
{
const
UnitTestImpl
*
const
impl
=
GetUnitTestImpl
();
const
InternalRunDeathTestFlag
*
const
flag
=
impl
->
internal_run_death_test_flag
();
const
TestInfo
*
const
info
=
impl
->
current_test_info
();
const
int
death_test_index
=
info
->
result
()
->
death_test_count
();
if
(
flag
!=
NULL
)
{
// ParseInternalRunDeathTestFlag() has performed all the necessary
// processing.
set_write_fd
(
kFuchsiaReadPipeFd
);
return
EXECUTE_TEST
;
}
CaptureStderr
();
// Flush the log buffers since the log streams are shared with the child.
FlushInfoLog
();
// Build the child process command line.
const
std
::
string
filter_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kFilterFlag
+
"="
+
info
->
test_case_name
()
+
"."
+
info
->
name
();
const
std
::
string
internal_flag
=
std
::
string
(
"--"
)
+
GTEST_FLAG_PREFIX_
+
kInternalRunDeathTestFlag
+
"="
+
file_
+
"|"
+
StreamableToString
(
line_
)
+
"|"
+
StreamableToString
(
death_test_index
);
Arguments
args
;
args
.
AddArguments
(
GetInjectableArgvs
());
args
.
AddArgument
(
filter_flag
.
c_str
());
args
.
AddArgument
(
internal_flag
.
c_str
());
// Build the pipe for communication with the child.
zx_status_t
status
;
zx_handle_t
child_pipe_handle
;
uint32_t
type
;
status
=
fdio_pipe_half
(
&
child_pipe_handle
,
&
type
);
GTEST_DEATH_TEST_CHECK_
(
status
>=
0
);
set_read_fd
(
status
);
// Set the pipe handle for the child.
fdio_spawn_action_t
add_handle_action
=
{};
add_handle_action
.
action
=
FDIO_SPAWN_ACTION_ADD_HANDLE
;
add_handle_action
.
h
.
id
=
PA_HND
(
type
,
kFuchsiaReadPipeFd
);
add_handle_action
.
h
.
handle
=
child_pipe_handle
;
// Spawn the child process.
status
=
fdio_spawn_etc
(
ZX_HANDLE_INVALID
,
FDIO_SPAWN_CLONE_ALL
,
args
.
Argv
()[
0
],
args
.
Argv
(),
nullptr
,
1
,
&
add_handle_action
,
&
child_process_
,
nullptr
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
// Create an exception port and attach it to the |child_process_|, to allow
// us to suppress the system default exception handler from firing.
status
=
zx_port_create
(
0
,
&
port_
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
status
=
zx_task_bind_exception_port
(
child_process_
,
port_
,
0
/* key */
,
0
/*options */
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
set_spawned
(
true
);
return
OVERSEE_TEST
;
}
#else // We are neither on Windows, nor on Fuchsia.
// ForkingDeathTest provides implementations for most of the abstract
// methods of the DeathTest interface. Only the AssumeRole method is
...
...
@@ -985,6 +1199,7 @@ static int ExecDeathTestChildMain(void* child_arg) {
}
# endif // !GTEST_OS_QNX
# if GTEST_HAS_CLONE
// Two utility routines that together determine the direction the stack
// grows.
// This could be accomplished more elegantly by a single recursive
...
...
@@ -994,20 +1209,22 @@ static int ExecDeathTestChildMain(void* child_arg) {
// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
// StackLowerThanAddress into StackGrowsDown, which then doesn't give
// correct answer.
void
StackLowerThanAddress
(
const
void
*
ptr
,
bool
*
result
)
GTEST_NO_INLINE_
;
void
StackLowerThanAddress
(
const
void
*
ptr
,
bool
*
result
)
{
static
void
StackLowerThanAddress
(
const
void
*
ptr
,
bool
*
result
)
GTEST_NO_INLINE_
;
static
void
StackLowerThanAddress
(
const
void
*
ptr
,
bool
*
result
)
{
int
dummy
;
*
result
=
(
&
dummy
<
ptr
);
}
// Make sure AddressSanitizer does not tamper with the stack here.
GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
bool
StackGrowsDown
()
{
static
bool
StackGrowsDown
()
{
int
dummy
;
bool
result
;
StackLowerThanAddress
(
&
dummy
,
&
result
);
return
result
;
}
# endif // GTEST_HAS_CLONE
// Spawns a child process with the same executable as the current process in
// a thread-safe manner and instructs it to run the death test. The
...
...
@@ -1199,6 +1416,13 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
*
test
=
new
WindowsDeathTest
(
statement
,
regex
,
file
,
line
);
}
# elif GTEST_OS_FUCHSIA
if
(
GTEST_FLAG
(
death_test_style
)
==
"threadsafe"
||
GTEST_FLAG
(
death_test_style
)
==
"fast"
)
{
*
test
=
new
FuchsiaDeathTest
(
statement
,
regex
,
file
,
line
);
}
# else
if
(
GTEST_FLAG
(
death_test_style
)
==
"threadsafe"
)
{
...
...
@@ -1223,7 +1447,7 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
// Recreates the pipe and event handles from the provided parameters,
// signals the event, and returns a file descriptor wrapped around the pipe
// handle. This function is called in the child process only.
int
GetStatusFileDescriptor
(
unsigned
int
parent_process_id
,
static
int
GetStatusFileDescriptor
(
unsigned
int
parent_process_id
,
size_t
write_handle_as_size_t
,
size_t
event_handle_as_size_t
)
{
AutoHandle
parent_process_handle
(
::
OpenProcess
(
PROCESS_DUP_HANDLE
,
...
...
@@ -1234,7 +1458,7 @@ int GetStatusFileDescriptor(unsigned int parent_process_id,
StreamableToString
(
parent_process_id
));
}
//
TODO(vladl@google.com)
: Replace the following check with a
//
FIXME
: Replace the following check with a
// compile-time assertion when available.
GTEST_CHECK_
(
sizeof
(
HANDLE
)
<=
sizeof
(
size_t
));
...
...
@@ -1319,6 +1543,16 @@ InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
write_fd
=
GetStatusFileDescriptor
(
parent_process_id
,
write_handle_as_size_t
,
event_handle_as_size_t
);
# elif GTEST_OS_FUCHSIA
if
(
fields
.
size
()
!=
3
||
!
ParseNaturalNumber
(
fields
[
1
],
&
line
)
||
!
ParseNaturalNumber
(
fields
[
2
],
&
index
))
{
DeathTestAbort
(
"Bad --gtest_internal_run_death_test flag: "
+
GTEST_FLAG
(
internal_run_death_test
));
}
# else
if
(
fields
.
size
()
!=
4
...
...
googletest/src/gtest-filepath.cc
View file @
f3a9fa6a
...
...
@@ -26,14 +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.
//
// Authors: keith.ray@gmail.com (Keith Ray)
#include "gtest/gtest-message.h"
#include "gtest/internal/gtest-filepath.h"
#include "gtest/internal/gtest-port.h"
#include <stdlib.h>
#include "gtest/internal/gtest-port.h"
#include "gtest/gtest-message.h"
#if GTEST_OS_WINDOWS_MOBILE
# include <windows.h>
...
...
@@ -48,6 +46,8 @@
# include <climits> // Some Linux distributions define PATH_MAX here.
#endif // GTEST_OS_WINDOWS_MOBILE
#include "gtest/internal/gtest-string.h"
#if GTEST_OS_WINDOWS
# define GTEST_PATH_MAX_ _MAX_PATH
#elif defined(PATH_MAX)
...
...
@@ -58,8 +58,6 @@
# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
#endif // GTEST_OS_WINDOWS
#include "gtest/internal/gtest-string.h"
namespace
testing
{
namespace
internal
{
...
...
@@ -130,7 +128,7 @@ FilePath FilePath::RemoveExtension(const char* extension) const {
return
*
this
;
}
// Returns a pointer to the last occurence of a valid path separator in
// Returns a pointer to the last occur
r
ence of a valid path separator in
// the FilePath. On Windows, for example, both '/' and '\' are valid path
// separators. Returns NULL if no path separator was found.
const
char
*
FilePath
::
FindLastPathSeparator
()
const
{
...
...
@@ -252,7 +250,7 @@ bool FilePath::DirectoryExists() const {
// root directory per disk drive.)
bool
FilePath
::
IsRootDirectory
()
const
{
#if GTEST_OS_WINDOWS
//
TODO(wan@google.com)
: on Windows a network share like
//
FIXME
: on Windows a network share like
// \\server\share can be a root directory, although it cannot be the
// current directory. Handle this properly.
return
pathname_
.
length
()
==
3
&&
IsAbsolutePath
();
...
...
@@ -352,7 +350,7 @@ FilePath FilePath::RemoveTrailingPathSeparator() const {
// Removes any redundant separators that might be in the pathname.
// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
// redundancies that might be in a pathname involving "." or "..".
//
TODO(wan@google.com)
: handle Windows network shares (e.g. \\server\share).
//
FIXME
: handle Windows network shares (e.g. \\server\share).
void
FilePath
::
Normalize
()
{
if
(
pathname_
.
c_str
()
==
NULL
)
{
pathname_
=
""
;
...
...
googletest/src/gtest-internal-inl.h
View file @
f3a9fa6a
...
...
@@ -27,24 +27,13 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Utility functions and classes used by the Google C++ testing framework.
//
// Author: wan@google.com (Zhanyong Wan)
//
// Utility functions and classes used by the Google C++ testing framework.//
// This file contains purely Google Test's internal implementation. Please
// DO NOT #INCLUDE IT IN A USER PROGRAM.
#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
#define GTEST_SRC_GTEST_INTERNAL_INL_H_
// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
// part of Google Test's implementation; otherwise it's undefined.
#if !GTEST_IMPLEMENTATION_
// If this file is included from the user's code, just say no.
# error "gtest-internal-inl.h is part of Google Test's internal implementation."
# error "It must not be included except by Google Test itself."
#endif // GTEST_IMPLEMENTATION_
#ifndef _WIN32_WCE
# include <errno.h>
#endif // !_WIN32_WCE
...
...
@@ -67,7 +56,7 @@
# include <windows.h> // NOLINT
#endif // GTEST_OS_WINDOWS
#include "gtest/gtest.h"
// NOLINT
#include "gtest/gtest.h"
#include "gtest/gtest-spi.h"
namespace
testing
{
...
...
@@ -94,6 +83,7 @@ const char kFilterFlag[] = "filter";
const
char
kListTestsFlag
[]
=
"list_tests"
;
const
char
kOutputFlag
[]
=
"output"
;
const
char
kPrintTimeFlag
[]
=
"print_time"
;
const
char
kPrintUTF8Flag
[]
=
"print_utf8"
;
const
char
kRandomSeedFlag
[]
=
"random_seed"
;
const
char
kRepeatFlag
[]
=
"repeat"
;
const
char
kShuffleFlag
[]
=
"shuffle"
;
...
...
@@ -174,6 +164,7 @@ class GTestFlagSaver {
list_tests_
=
GTEST_FLAG
(
list_tests
);
output_
=
GTEST_FLAG
(
output
);
print_time_
=
GTEST_FLAG
(
print_time
);
print_utf8_
=
GTEST_FLAG
(
print_utf8
);
random_seed_
=
GTEST_FLAG
(
random_seed
);
repeat_
=
GTEST_FLAG
(
repeat
);
shuffle_
=
GTEST_FLAG
(
shuffle
);
...
...
@@ -195,6 +186,7 @@ class GTestFlagSaver {
GTEST_FLAG
(
list_tests
)
=
list_tests_
;
GTEST_FLAG
(
output
)
=
output_
;
GTEST_FLAG
(
print_time
)
=
print_time_
;
GTEST_FLAG
(
print_utf8
)
=
print_utf8_
;
GTEST_FLAG
(
random_seed
)
=
random_seed_
;
GTEST_FLAG
(
repeat
)
=
repeat_
;
GTEST_FLAG
(
shuffle
)
=
shuffle_
;
...
...
@@ -216,6 +208,7 @@ class GTestFlagSaver {
bool
list_tests_
;
std
::
string
output_
;
bool
print_time_
;
bool
print_utf8_
;
internal
::
Int32
random_seed_
;
internal
::
Int32
repeat_
;
bool
shuffle_
;
...
...
@@ -450,6 +443,16 @@ class OsStackTraceGetter : public OsStackTraceGetterInterface {
virtual
void
UponLeavingGTest
();
private:
#if GTEST_HAS_ABSL
Mutex
mutex_
;
// Protects all internal state.
// We save the stack frame below the frame that calls user code.
// We do this because the address of the frame immediately below
// the user code changes between the call to UponLeavingGTest()
// and any calls to the stack trace code from within the user code.
void
*
caller_frame_
=
nullptr
;
#endif // GTEST_HAS_ABSL
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
OsStackTraceGetter
);
};
...
...
@@ -664,13 +667,11 @@ class GTEST_API_ UnitTestImpl {
tear_down_tc
)
->
AddTestInfo
(
test_info
);
}
#if GTEST_HAS_PARAM_TEST
// Returns ParameterizedTestCaseRegistry object used to keep track of
// value-parameterized tests and instantiate and register them.
internal
::
ParameterizedTestCaseRegistry
&
parameterized_test_registry
()
{
return
parameterized_test_registry_
;
}
#endif // GTEST_HAS_PARAM_TEST
// Sets the TestCase object for the test that's currently running.
void
set_current_test_case
(
TestCase
*
a_current_test_case
)
{
...
...
@@ -845,14 +846,12 @@ class GTEST_API_ UnitTestImpl {
// shuffled order.
std
::
vector
<
int
>
test_case_indices_
;
#if GTEST_HAS_PARAM_TEST
// ParameterizedTestRegistry object used to register value-parameterized
// tests.
internal
::
ParameterizedTestCaseRegistry
parameterized_test_registry_
;
// Indicates whether RegisterParameterizedTests() has been called already.
bool
parameterized_tests_registered_
;
#endif // GTEST_HAS_PARAM_TEST
// Index of the last death test case registered. Initially -1.
int
last_death_test_case_
;
...
...
@@ -992,7 +991,7 @@ bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
const
bool
parse_success
=
*
end
==
'\0'
&&
errno
==
0
;
//
TODO(vladl@google.com)
: Convert this to compile time assertion when it is
//
FIXME
: Convert this to compile time assertion when it is
// available.
GTEST_CHECK_
(
sizeof
(
Integer
)
<=
sizeof
(
parsed
));
...
...
@@ -1032,7 +1031,7 @@ class TestResultAccessor {
#if GTEST_CAN_STREAM_RESULTS_
// Streams test results to the given port on the given host machine.
class
GTEST_API_
StreamingListener
:
public
EmptyTestEventListener
{
class
StreamingListener
:
public
EmptyTestEventListener
{
public:
// Abstract base class for writing strings to a socket.
class
AbstractSocketWriter
{
...
...
googletest/src/gtest-port.cc
View file @
f3a9fa6a
...
...
@@ -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)
#include "gtest/internal/gtest-port.h"
...
...
@@ -63,19 +62,16 @@
# include <sys/types.h>
#endif // GTEST_OS_AIX
#if GTEST_OS_FUCHSIA
# include <zircon/process.h>
# include <zircon/syscalls.h>
#endif // GTEST_OS_FUCHSIA
#include "gtest/gtest-spi.h"
#include "gtest/gtest-message.h"
#include "gtest/internal/gtest-internal.h"
#include "gtest/internal/gtest-string.h"
// Indicates that this translation unit is part of Google Test's
// implementation. It must come before gtest-internal-inl.h is
// included, or there will be a compiler error. This trick exists to
// prevent the accidental inclusion of gtest-internal-inl.h in the
// user's code.
#define GTEST_IMPLEMENTATION_ 1
#include "src/gtest-internal-inl.h"
#undef GTEST_IMPLEMENTATION_
namespace
testing
{
namespace
internal
{
...
...
@@ -164,6 +160,25 @@ size_t GetThreadCount() {
}
}
#elif GTEST_OS_FUCHSIA
size_t
GetThreadCount
()
{
int
dummy_buffer
;
size_t
avail
;
zx_status_t
status
=
zx_object_get_info
(
zx_process_self
(),
ZX_INFO_PROCESS_THREADS
,
&
dummy_buffer
,
0
,
nullptr
,
&
avail
);
if
(
status
==
ZX_OK
)
{
return
avail
;
}
else
{
return
0
;
}
}
#else
size_t
GetThreadCount
()
{
...
...
@@ -246,9 +261,9 @@ Mutex::Mutex()
Mutex
::~
Mutex
()
{
// Static mutexes are leaked intentionally. It is not thread-safe to try
// to clean them up.
//
TODO(yukawa)
: Switch to Slim Reader/Writer (SRW) Locks, which requires
//
FIXME
: Switch to Slim Reader/Writer (SRW) Locks, which requires
// nothing to clean it up but is available only on Vista and later.
// http://
msdn
.microsoft.com/en-us/
library/
windows/desktop/
aa904937.aspx
// http
s
://
docs
.microsoft.com/en-us/windows/desktop/
Sync/slim-reader-writer--srw--locks
if
(
type_
==
kDynamic
)
{
::
DeleteCriticalSection
(
critical_section_
);
delete
critical_section_
;
...
...
@@ -369,7 +384,7 @@ class ThreadWithParamSupport : public ThreadWithParamBase {
Notification
*
thread_can_start
)
{
ThreadMainParam
*
param
=
new
ThreadMainParam
(
runnable
,
thread_can_start
);
DWORD
thread_id
;
//
TODO(yukawa)
: Consider to use _beginthreadex instead.
//
FIXME
: Consider to use _beginthreadex instead.
HANDLE
thread_handle
=
::
CreateThread
(
NULL
,
// Default security.
0
,
// Default stack size.
...
...
@@ -719,7 +734,7 @@ bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
}
// Helper function used by ValidateRegex() to format error messages.
std
::
string
FormatRegexSyntaxError
(
const
char
*
regex
,
int
index
)
{
static
std
::
string
FormatRegexSyntaxError
(
const
char
*
regex
,
int
index
)
{
return
(
Message
()
<<
"Syntax error at index "
<<
index
<<
" in simple regular expression
\"
"
<<
regex
<<
"
\"
: "
).
GetString
();
}
...
...
@@ -728,7 +743,7 @@ std::string FormatRegexSyntaxError(const char* regex, int index) {
// otherwise returns true.
bool
ValidateRegex
(
const
char
*
regex
)
{
if
(
regex
==
NULL
)
{
//
TODO(wan@google.com)
: fix the source file location in the
//
FIXME
: fix the source file location in the
// assertion failures to match where the regex is used in user
// code.
ADD_FAILURE
()
<<
"NULL is not a valid simple regular expression."
;
...
...
@@ -971,9 +986,10 @@ GTestLog::~GTestLog() {
posix
::
Abort
();
}
}
// Disable Microsoft deprecation warnings for POSIX functions called from
// this class (creat, dup, dup2, and close)
GTEST_DISABLE_MSC_
WARNINGS
_PUSH_
(
4996
)
GTEST_DISABLE_MSC_
DEPRECATED
_PUSH_
()
#if GTEST_HAS_STREAM_REDIRECTION
...
...
@@ -1057,13 +1073,14 @@ class CapturedStream {
GTEST_DISALLOW_COPY_AND_ASSIGN_
(
CapturedStream
);
};
GTEST_DISABLE_MSC_
WARNINGS
_POP_
()
GTEST_DISABLE_MSC_
DEPRECATED
_POP_
()
static
CapturedStream
*
g_captured_stderr
=
NULL
;
static
CapturedStream
*
g_captured_stdout
=
NULL
;
// Starts capturing an output stream (stdout/stderr).
void
CaptureStream
(
int
fd
,
const
char
*
stream_name
,
CapturedStream
**
stream
)
{
static
void
CaptureStream
(
int
fd
,
const
char
*
stream_name
,
CapturedStream
**
stream
)
{
if
(
*
stream
!=
NULL
)
{
GTEST_LOG_
(
FATAL
)
<<
"Only one "
<<
stream_name
<<
" capturer can exist at a time."
;
...
...
@@ -1072,7 +1089,7 @@ void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
}
// Stops capturing the output stream and returns the captured string.
std
::
string
GetCapturedStream
(
CapturedStream
**
captured_stream
)
{
static
std
::
string
GetCapturedStream
(
CapturedStream
**
captured_stream
)
{
const
std
::
string
content
=
(
*
captured_stream
)
->
GetCapturedString
();
delete
*
captured_stream
;
...
...
@@ -1103,6 +1120,10 @@ std::string GetCapturedStderr() {
#endif // GTEST_HAS_STREAM_REDIRECTION
size_t
GetFileSize
(
FILE
*
file
)
{
fseek
(
file
,
0
,
SEEK_END
);
return
static_cast
<
size_t
>
(
ftell
(
file
));
...
...
@@ -1131,22 +1152,36 @@ std::string ReadEntireFile(FILE* file) {
}
#if GTEST_HAS_DEATH_TEST
static
const
std
::
vector
<
std
::
string
>*
g_injected_test_argvs
=
NULL
;
// Owned.
static
const
::
std
::
vector
<
testing
::
internal
::
string
>*
g_injected_test_argvs
=
NULL
;
// Owned.
void
SetInjectableArgvs
(
const
::
std
::
vector
<
testing
::
internal
::
string
>*
argvs
)
{
if
(
g_injected_test_argvs
!=
argvs
)
delete
g_injected_test_argvs
;
g_injected_test_argvs
=
argvs
;
}
const
::
std
::
vector
<
testing
::
internal
::
string
>&
GetInjectableArgvs
()
{
std
::
vector
<
std
::
string
>
GetInjectableArgvs
()
{
if
(
g_injected_test_argvs
!=
NULL
)
{
return
*
g_injected_test_argvs
;
}
return
GetArgvs
();
}
void
SetInjectableArgvs
(
const
std
::
vector
<
std
::
string
>*
new_argvs
)
{
if
(
g_injected_test_argvs
!=
new_argvs
)
delete
g_injected_test_argvs
;
g_injected_test_argvs
=
new_argvs
;
}
void
SetInjectableArgvs
(
const
std
::
vector
<
std
::
string
>&
new_argvs
)
{
SetInjectableArgvs
(
new
std
::
vector
<
std
::
string
>
(
new_argvs
.
begin
(),
new_argvs
.
end
()));
}
#if GTEST_HAS_GLOBAL_STRING
void
SetInjectableArgvs
(
const
std
::
vector
<
::
string
>&
new_argvs
)
{
SetInjectableArgvs
(
new
std
::
vector
<
std
::
string
>
(
new_argvs
.
begin
(),
new_argvs
.
end
()));
}
#endif // GTEST_HAS_GLOBAL_STRING
void
ClearInjectableArgvs
()
{
delete
g_injected_test_argvs
;
g_injected_test_argvs
=
NULL
;
}
#endif // GTEST_HAS_DEATH_TEST
#if GTEST_OS_WINDOWS_MOBILE
...
...
@@ -1221,11 +1256,12 @@ bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
bool
BoolFromGTestEnv
(
const
char
*
flag
,
bool
default_value
)
{
#if defined(GTEST_GET_BOOL_FROM_ENV_)
return
GTEST_GET_BOOL_FROM_ENV_
(
flag
,
default_value
);
#e
ndif // defined(GTEST_GET_BOOL_FROM_ENV_)
#e
lse
const
std
::
string
env_var
=
FlagToEnvVar
(
flag
);
const
char
*
const
string_value
=
posix
::
GetEnv
(
env_var
.
c_str
());
return
string_value
==
NULL
?
default_value
:
strcmp
(
string_value
,
"0"
)
!=
0
;
#endif // defined(GTEST_GET_BOOL_FROM_ENV_)
}
// Reads and returns a 32-bit integer stored in the environment
...
...
@@ -1234,7 +1270,7 @@ bool BoolFromGTestEnv(const char* flag, bool default_value) {
Int32
Int32FromGTestEnv
(
const
char
*
flag
,
Int32
default_value
)
{
#if defined(GTEST_GET_INT32_FROM_ENV_)
return
GTEST_GET_INT32_FROM_ENV_
(
flag
,
default_value
);
#e
ndif // defined(GTEST_GET_INT32_FROM_ENV_)
#e
lse
const
std
::
string
env_var
=
FlagToEnvVar
(
flag
);
const
char
*
const
string_value
=
posix
::
GetEnv
(
env_var
.
c_str
());
if
(
string_value
==
NULL
)
{
...
...
@@ -1252,37 +1288,36 @@ Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
}
return
result
;
#endif // defined(GTEST_GET_INT32_FROM_ENV_)
}
// As a special case for the 'output' flag, if GTEST_OUTPUT is not
// set, we look for XML_OUTPUT_FILE, which is set by the Bazel build
// system. The value of XML_OUTPUT_FILE is a filename without the
// "xml:" prefix of GTEST_OUTPUT.
// Note that this is meant to be called at the call site so it does
// not check that the flag is 'output'
// In essence this checks an env variable called XML_OUTPUT_FILE
// and if it is set we prepend "xml:" to its value, if it not set we return ""
std
::
string
OutputFlagAlsoCheckEnvVar
(){
std
::
string
default_value_for_output_flag
=
""
;
const
char
*
xml_output_file_env
=
posix
::
GetEnv
(
"XML_OUTPUT_FILE"
);
if
(
NULL
!=
xml_output_file_env
)
{
default_value_for_output_flag
=
std
::
string
(
"xml:"
)
+
xml_output_file_env
;
}
return
default_value_for_output_flag
;
}
// Reads and returns the string environment variable corresponding to
// the given flag; if it's not set, returns default_value.
std
::
string
StringFromGTestEnv
(
const
char
*
flag
,
const
char
*
default_value
)
{
const
char
*
StringFromGTestEnv
(
const
char
*
flag
,
const
char
*
default_value
)
{
#if defined(GTEST_GET_STRING_FROM_ENV_)
return
GTEST_GET_STRING_FROM_ENV_
(
flag
,
default_value
);
#e
ndif // defined(GTEST_GET_STRING_FROM_ENV_)
#e
lse
const
std
::
string
env_var
=
FlagToEnvVar
(
flag
);
const
char
*
value
=
posix
::
GetEnv
(
env_var
.
c_str
());
if
(
value
!=
NULL
)
{
return
value
;
}
// As a special case for the 'output' flag, if GTEST_OUTPUT is not
// set, we look for XML_OUTPUT_FILE, which is set by the Bazel build
// system. The value of XML_OUTPUT_FILE is a filename without the
// "xml:" prefix of GTEST_OUTPUT.
//
// The net priority order after flag processing is thus:
// --gtest_output command line flag
// GTEST_OUTPUT environment variable
// XML_OUTPUT_FILE environment variable
// 'default_value'
if
(
strcmp
(
flag
,
"output"
)
==
0
)
{
value
=
posix
::
GetEnv
(
"XML_OUTPUT_FILE"
);
if
(
value
!=
NULL
)
{
return
std
::
string
(
"xml:"
)
+
value
;
}
}
return
default_value
;
const
char
*
const
value
=
posix
::
GetEnv
(
env_var
.
c_str
());
return
value
==
NULL
?
default_value
:
value
;
#endif // defined(GTEST_GET_STRING_FROM_ENV_)
}
}
// namespace internal
...
...
googletest/src/gtest-printers.cc
View file @
f3a9fa6a
...
...
@@ -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)
// Google Test - The Google C++ Testing Framework
// Google Test - The Google C++ Testing and Mocking Framework
//
// This file implements a universal value printer that can print a
// value of any type T:
...
...
@@ -43,12 +42,13 @@
// defines Foo.
#include "gtest/gtest-printers.h"
#include <ctype.h>
#include <stdio.h>
#include <cctype>
#include <cwchar>
#include <ostream> // NOLINT
#include <string>
#include "gtest/internal/gtest-port.h"
#include "src/gtest-internal-inl.h"
namespace
testing
{
...
...
@@ -89,7 +89,7 @@ void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
// If the object size is bigger than kThreshold, we'll have to omit
// some details by printing only the first and the last kChunkSize
// bytes.
//
TODO(wan)
: let the user control the threshold using a flag.
//
FIXME
: let the user control the threshold using a flag.
if
(
count
<
kThreshold
)
{
PrintByteSegmentInObjectTo
(
obj_bytes
,
0
,
count
,
os
);
}
else
{
...
...
@@ -123,7 +123,7 @@ namespace internal {
// Depending on the value of a char (or wchar_t), we print it in one
// of three formats:
// - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
// - as a hex
i
decimal escape sequence (e.g. '\x7F'), or
// - as a hex
a
decimal escape sequence (e.g. '\x7F'), or
// - as a special escape sequence (e.g. '\r', '\n').
enum
CharFormat
{
kAsIs
,
...
...
@@ -180,7 +180,10 @@ static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
*
os
<<
static_cast
<
char
>
(
c
);
return
kAsIs
;
}
else
{
*
os
<<
"
\\
x"
+
String
::
FormatHexInt
(
static_cast
<
UnsignedChar
>
(
c
));
ostream
::
fmtflags
flags
=
os
->
flags
();
*
os
<<
"
\\
x"
<<
std
::
hex
<<
std
::
uppercase
<<
static_cast
<
int
>
(
static_cast
<
UnsignedChar
>
(
c
));
os
->
flags
(
flags
);
return
kHexEscape
;
}
}
...
...
@@ -227,7 +230,7 @@ void PrintCharAndCodeTo(Char c, ostream* os) {
return
;
*
os
<<
" ("
<<
static_cast
<
int
>
(
c
);
// For more convenience, we print c's code again in hex
i
decimal,
// For more convenience, we print c's code again in hex
a
decimal,
// unless c was already printed in the form '\x##' or the code is in
// [1, 9].
if
(
format
==
kHexEscape
||
(
1
<=
c
&&
c
<=
9
))
{
...
...
@@ -259,11 +262,12 @@ template <typename CharType>
GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
static
void
PrintCharsAsStringTo
(
static
CharFormat
PrintCharsAsStringTo
(
const
CharType
*
begin
,
size_t
len
,
ostream
*
os
)
{
const
char
*
const
kQuoteBegin
=
sizeof
(
CharType
)
==
1
?
"
\"
"
:
"L
\"
"
;
*
os
<<
kQuoteBegin
;
bool
is_previous_hex
=
false
;
CharFormat
print_format
=
kAsIs
;
for
(
size_t
index
=
0
;
index
<
len
;
++
index
)
{
const
CharType
cur
=
begin
[
index
];
if
(
is_previous_hex
&&
IsXDigit
(
cur
))
{
...
...
@@ -273,8 +277,13 @@ static void PrintCharsAsStringTo(
*
os
<<
"
\"
"
<<
kQuoteBegin
;
}
is_previous_hex
=
PrintAsStringLiteralTo
(
cur
,
os
)
==
kHexEscape
;
// Remember if any characters required hex escaping.
if
(
is_previous_hex
)
{
print_format
=
kHexEscape
;
}
}
*
os
<<
"
\"
"
;
return
print_format
;
}
// Prints a (const) char/wchar_t array of 'len' elements, starting at address
...
...
@@ -344,15 +353,90 @@ void PrintTo(const wchar_t* s, ostream* os) {
}
#endif // wchar_t is native
namespace
{
bool
ContainsUnprintableControlCodes
(
const
char
*
str
,
size_t
length
)
{
const
unsigned
char
*
s
=
reinterpret_cast
<
const
unsigned
char
*>
(
str
);
for
(
size_t
i
=
0
;
i
<
length
;
i
++
)
{
unsigned
char
ch
=
*
s
++
;
if
(
std
::
iscntrl
(
ch
))
{
switch
(
ch
)
{
case
'\t'
:
case
'\n'
:
case
'\r'
:
break
;
default:
return
true
;
}
}
}
return
false
;
}
bool
IsUTF8TrailByte
(
unsigned
char
t
)
{
return
0x80
<=
t
&&
t
<=
0xbf
;
}
bool
IsValidUTF8
(
const
char
*
str
,
size_t
length
)
{
const
unsigned
char
*
s
=
reinterpret_cast
<
const
unsigned
char
*>
(
str
);
for
(
size_t
i
=
0
;
i
<
length
;)
{
unsigned
char
lead
=
s
[
i
++
];
if
(
lead
<=
0x7f
)
{
continue
;
// single-byte character (ASCII) 0..7F
}
if
(
lead
<
0xc2
)
{
return
false
;
// trail byte or non-shortest form
}
else
if
(
lead
<=
0xdf
&&
(
i
+
1
)
<=
length
&&
IsUTF8TrailByte
(
s
[
i
]))
{
++
i
;
// 2-byte character
}
else
if
(
0xe0
<=
lead
&&
lead
<=
0xef
&&
(
i
+
2
)
<=
length
&&
IsUTF8TrailByte
(
s
[
i
])
&&
IsUTF8TrailByte
(
s
[
i
+
1
])
&&
// check for non-shortest form and surrogate
(
lead
!=
0xe0
||
s
[
i
]
>=
0xa0
)
&&
(
lead
!=
0xed
||
s
[
i
]
<
0xa0
))
{
i
+=
2
;
// 3-byte character
}
else
if
(
0xf0
<=
lead
&&
lead
<=
0xf4
&&
(
i
+
3
)
<=
length
&&
IsUTF8TrailByte
(
s
[
i
])
&&
IsUTF8TrailByte
(
s
[
i
+
1
])
&&
IsUTF8TrailByte
(
s
[
i
+
2
])
&&
// check for non-shortest form
(
lead
!=
0xf0
||
s
[
i
]
>=
0x90
)
&&
(
lead
!=
0xf4
||
s
[
i
]
<
0x90
))
{
i
+=
3
;
// 4-byte character
}
else
{
return
false
;
}
}
return
true
;
}
void
ConditionalPrintAsText
(
const
char
*
str
,
size_t
length
,
ostream
*
os
)
{
if
(
!
ContainsUnprintableControlCodes
(
str
,
length
)
&&
IsValidUTF8
(
str
,
length
))
{
*
os
<<
"
\n
As Text:
\"
"
<<
str
<<
"
\"
"
;
}
}
}
// anonymous namespace
// Prints a ::string object.
#if GTEST_HAS_GLOBAL_STRING
void
PrintStringTo
(
const
::
string
&
s
,
ostream
*
os
)
{
PrintCharsAsStringTo
(
s
.
data
(),
s
.
size
(),
os
);
if
(
PrintCharsAsStringTo
(
s
.
data
(),
s
.
size
(),
os
)
==
kHexEscape
)
{
if
(
GTEST_FLAG
(
print_utf8
))
{
ConditionalPrintAsText
(
s
.
data
(),
s
.
size
(),
os
);
}
}
}
#endif // GTEST_HAS_GLOBAL_STRING
void
PrintStringTo
(
const
::
std
::
string
&
s
,
ostream
*
os
)
{
PrintCharsAsStringTo
(
s
.
data
(),
s
.
size
(),
os
);
if
(
PrintCharsAsStringTo
(
s
.
data
(),
s
.
size
(),
os
)
==
kHexEscape
)
{
if
(
GTEST_FLAG
(
print_utf8
))
{
ConditionalPrintAsText
(
s
.
data
(),
s
.
size
(),
os
);
}
}
}
// Prints a ::wstring object.
...
...
Prev
1
…
4
5
6
7
8
9
10
11
12
13
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