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
76bce79a
Unverified
Commit
76bce79a
authored
May 01, 2023
by
Andy Soffer
Committed by
GitHub
May 01, 2023
Browse files
Merge branch 'main' into fixes_std_pair_diff
parents
6f1c4b3d
f345b2ca
Changes
92
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
422 additions
and
415 deletions
+422
-415
googletest/include/gtest/gtest-death-test.h
googletest/include/gtest/gtest-death-test.h
+3
-3
googletest/include/gtest/gtest-matchers.h
googletest/include/gtest/gtest-matchers.h
+22
-55
googletest/include/gtest/gtest-printers.h
googletest/include/gtest/gtest-printers.h
+12
-10
googletest/include/gtest/gtest-test-part.h
googletest/include/gtest/gtest-test-part.h
+2
-2
googletest/include/gtest/gtest.h
googletest/include/gtest/gtest.h
+23
-23
googletest/include/gtest/internal/gtest-death-test-internal.h
...letest/include/gtest/internal/gtest-death-test-internal.h
+4
-4
googletest/include/gtest/internal/gtest-internal.h
googletest/include/gtest/internal/gtest-internal.h
+5
-3
googletest/include/gtest/internal/gtest-param-util.h
googletest/include/gtest/internal/gtest-param-util.h
+13
-13
googletest/include/gtest/internal/gtest-port.h
googletest/include/gtest/internal/gtest-port.h
+182
-113
googletest/include/gtest/internal/gtest-string.h
googletest/include/gtest/internal/gtest-string.h
+1
-1
googletest/samples/prime_tables.h
googletest/samples/prime_tables.h
+1
-1
googletest/samples/sample10_unittest.cc
googletest/samples/sample10_unittest.cc
+0
-1
googletest/samples/sample8_unittest.cc
googletest/samples/sample8_unittest.cc
+2
-0
googletest/samples/sample9_unittest.cc
googletest/samples/sample9_unittest.cc
+0
-1
googletest/src/gtest-assertion-result.cc
googletest/src/gtest-assertion-result.cc
+2
-2
googletest/src/gtest-death-test.cc
googletest/src/gtest-death-test.cc
+59
-97
googletest/src/gtest-filepath.cc
googletest/src/gtest-filepath.cc
+23
-18
googletest/src/gtest-internal-inl.h
googletest/src/gtest-internal-inl.h
+13
-13
googletest/src/gtest-port.cc
googletest/src/gtest-port.cc
+52
-54
googletest/src/gtest-printers.cc
googletest/src/gtest-printers.cc
+3
-1
No files found.
googletest/include/gtest/gtest-death-test.h
View file @
76bce79a
...
...
@@ -51,7 +51,7 @@ GTEST_DECLARE_string_(death_test_style);
namespace
testing
{
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
namespace
internal
{
...
...
@@ -203,7 +203,7 @@ class GTEST_API_ ExitedWithCode {
const
int
exit_code_
;
};
#if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
#if !
defined(
GTEST_OS_WINDOWS
)
&& !
defined(
GTEST_OS_FUCHSIA
)
// Tests that an exit code describes an exit due to termination by a
// given signal.
class
GTEST_API_
KilledBySignal
{
...
...
@@ -328,7 +328,7 @@ class GTEST_API_ KilledBySignal {
// death tests are supported; otherwise they just issue a warning. This is
// useful when you are combining death test assertions with normal test
// assertions in one test.
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
#define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
EXPECT_DEATH(statement, regex)
#define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
...
...
googletest/include/gtest/gtest-matchers.h
View file @
76bce79a
...
...
@@ -40,6 +40,7 @@
#define GOOGLETEST_INCLUDE_GTEST_GTEST_MATCHERS_H_
#include <atomic>
#include <functional>
#include <memory>
#include <ostream>
#include <string>
...
...
@@ -106,13 +107,13 @@ class MatchResultListener {
MatchResultListener
&
operator
=
(
const
MatchResultListener
&
)
=
delete
;
};
inline
MatchResultListener
::~
MatchResultListener
()
{}
inline
MatchResultListener
::~
MatchResultListener
()
=
default
;
// An instance of a subclass of this knows how to describe itself as a
// matcher.
class
GTEST_API_
MatcherDescriberInterface
{
public:
virtual
~
MatcherDescriberInterface
()
{}
virtual
~
MatcherDescriberInterface
()
=
default
;
// Describes this matcher to an ostream. The function should print
// a verb phrase that describes the property a value matching this
...
...
@@ -178,43 +179,6 @@ class MatcherInterface : public MatcherDescriberInterface {
namespace
internal
{
struct
AnyEq
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
==
b
;
}
};
struct
AnyNe
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
!=
b
;
}
};
struct
AnyLt
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
<
b
;
}
};
struct
AnyGt
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
>
b
;
}
};
struct
AnyLe
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
<=
b
;
}
};
struct
AnyGe
{
template
<
typename
A
,
typename
B
>
bool
operator
()(
const
A
&
a
,
const
B
&
b
)
const
{
return
a
>=
b
;
}
};
// A match result listener that ignores the explanation.
class
DummyMatchResultListener
:
public
MatchResultListener
{
public:
...
...
@@ -530,7 +494,7 @@ template <>
class
GTEST_API_
Matcher
<
const
std
::
string
&>
:
public
internal
::
MatcherBase
<
const
std
::
string
&>
{
public:
Matcher
()
{}
Matcher
()
=
default
;
explicit
Matcher
(
const
MatcherInterface
<
const
std
::
string
&>*
impl
)
:
internal
::
MatcherBase
<
const
std
::
string
&>
(
impl
)
{}
...
...
@@ -552,7 +516,7 @@ template <>
class
GTEST_API_
Matcher
<
std
::
string
>
:
public
internal
::
MatcherBase
<
std
::
string
>
{
public:
Matcher
()
{}
Matcher
()
=
default
;
explicit
Matcher
(
const
MatcherInterface
<
const
std
::
string
&>*
impl
)
:
internal
::
MatcherBase
<
std
::
string
>
(
impl
)
{}
...
...
@@ -580,7 +544,7 @@ template <>
class
GTEST_API_
Matcher
<
const
internal
::
StringView
&>
:
public
internal
::
MatcherBase
<
const
internal
::
StringView
&>
{
public:
Matcher
()
{}
Matcher
()
=
default
;
explicit
Matcher
(
const
MatcherInterface
<
const
internal
::
StringView
&>*
impl
)
:
internal
::
MatcherBase
<
const
internal
::
StringView
&>
(
impl
)
{}
...
...
@@ -606,7 +570,7 @@ template <>
class
GTEST_API_
Matcher
<
internal
::
StringView
>
:
public
internal
::
MatcherBase
<
internal
::
StringView
>
{
public:
Matcher
()
{}
Matcher
()
=
default
;
explicit
Matcher
(
const
MatcherInterface
<
const
internal
::
StringView
&>*
impl
)
:
internal
::
MatcherBase
<
internal
::
StringView
>
(
impl
)
{}
...
...
@@ -758,50 +722,53 @@ class ComparisonBase {
};
template
<
typename
Rhs
>
class
EqMatcher
:
public
ComparisonBase
<
EqMatcher
<
Rhs
>
,
Rhs
,
AnyEq
>
{
class
EqMatcher
:
public
ComparisonBase
<
EqMatcher
<
Rhs
>
,
Rhs
,
std
::
equal_to
<>
>
{
public:
explicit
EqMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
EqMatcher
<
Rhs
>
,
Rhs
,
AnyEq
>
(
rhs
)
{}
:
ComparisonBase
<
EqMatcher
<
Rhs
>
,
Rhs
,
std
::
equal_to
<>
>
(
rhs
)
{}
static
const
char
*
Desc
()
{
return
"is equal to"
;
}
static
const
char
*
NegatedDesc
()
{
return
"isn't equal to"
;
}
};
template
<
typename
Rhs
>
class
NeMatcher
:
public
ComparisonBase
<
NeMatcher
<
Rhs
>
,
Rhs
,
AnyNe
>
{
class
NeMatcher
:
public
ComparisonBase
<
NeMatcher
<
Rhs
>
,
Rhs
,
std
::
not_equal_to
<>>
{
public:
explicit
NeMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
NeMatcher
<
Rhs
>
,
Rhs
,
AnyNe
>
(
rhs
)
{}
:
ComparisonBase
<
NeMatcher
<
Rhs
>
,
Rhs
,
std
::
not_equal_to
<>
>
(
rhs
)
{}
static
const
char
*
Desc
()
{
return
"isn't equal to"
;
}
static
const
char
*
NegatedDesc
()
{
return
"is equal to"
;
}
};
template
<
typename
Rhs
>
class
LtMatcher
:
public
ComparisonBase
<
LtMatcher
<
Rhs
>
,
Rhs
,
AnyLt
>
{
class
LtMatcher
:
public
ComparisonBase
<
LtMatcher
<
Rhs
>
,
Rhs
,
std
::
less
<>
>
{
public:
explicit
LtMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
LtMatcher
<
Rhs
>
,
Rhs
,
AnyLt
>
(
rhs
)
{}
:
ComparisonBase
<
LtMatcher
<
Rhs
>
,
Rhs
,
std
::
less
<>
>
(
rhs
)
{}
static
const
char
*
Desc
()
{
return
"is <"
;
}
static
const
char
*
NegatedDesc
()
{
return
"isn't <"
;
}
};
template
<
typename
Rhs
>
class
GtMatcher
:
public
ComparisonBase
<
GtMatcher
<
Rhs
>
,
Rhs
,
AnyGt
>
{
class
GtMatcher
:
public
ComparisonBase
<
GtMatcher
<
Rhs
>
,
Rhs
,
std
::
greater
<>
>
{
public:
explicit
GtMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
GtMatcher
<
Rhs
>
,
Rhs
,
AnyGt
>
(
rhs
)
{}
:
ComparisonBase
<
GtMatcher
<
Rhs
>
,
Rhs
,
std
::
greater
<>
>
(
rhs
)
{}
static
const
char
*
Desc
()
{
return
"is >"
;
}
static
const
char
*
NegatedDesc
()
{
return
"isn't >"
;
}
};
template
<
typename
Rhs
>
class
LeMatcher
:
public
ComparisonBase
<
LeMatcher
<
Rhs
>
,
Rhs
,
AnyLe
>
{
class
LeMatcher
:
public
ComparisonBase
<
LeMatcher
<
Rhs
>
,
Rhs
,
std
::
less_equal
<>>
{
public:
explicit
LeMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
LeMatcher
<
Rhs
>
,
Rhs
,
AnyLe
>
(
rhs
)
{}
:
ComparisonBase
<
LeMatcher
<
Rhs
>
,
Rhs
,
std
::
less_equal
<>
>
(
rhs
)
{}
static
const
char
*
Desc
()
{
return
"is <="
;
}
static
const
char
*
NegatedDesc
()
{
return
"isn't <="
;
}
};
template
<
typename
Rhs
>
class
GeMatcher
:
public
ComparisonBase
<
GeMatcher
<
Rhs
>
,
Rhs
,
AnyGe
>
{
class
GeMatcher
:
public
ComparisonBase
<
GeMatcher
<
Rhs
>
,
Rhs
,
std
::
greater_equal
<>>
{
public:
explicit
GeMatcher
(
const
Rhs
&
rhs
)
:
ComparisonBase
<
GeMatcher
<
Rhs
>
,
Rhs
,
AnyGe
>
(
rhs
)
{}
:
ComparisonBase
<
GeMatcher
<
Rhs
>
,
Rhs
,
std
::
greater_equal
<>
>
(
rhs
)
{}
static
const
char
*
Desc
()
{
return
"is >="
;
}
static
const
char
*
NegatedDesc
()
{
return
"isn't >="
;
}
};
...
...
googletest/include/gtest/gtest-printers.h
View file @
76bce79a
...
...
@@ -206,12 +206,13 @@ struct StreamPrinter {
// Don't accept member pointers here. We'd print them via implicit
// conversion to bool, which isn't useful.
typename
=
typename
std
::
enable_if
<
!
std
::
is_member_pointer
<
T
>::
value
>::
type
,
// Only accept types for which we can find a streaming operator via
// ADL (possibly involving implicit conversions).
typename
=
decltype
(
std
::
declval
<
std
::
ostream
&>
()
<<
std
::
declval
<
const
T
&>
())
>
static
void
PrintValue
(
const
T
&
value
,
::
std
::
ostream
*
os
)
{
!
std
::
is_member_pointer
<
T
>::
value
>::
type
>
// Only accept types for which we can find a streaming operator via
// ADL (possibly involving implicit conversions).
// (Use SFINAE via return type, because it seems GCC < 12 doesn't handle name
// lookup properly when we do it in the template parameter list.)
static
auto
PrintValue
(
const
T
&
value
,
::
std
::
ostream
*
os
)
->
decltype
((
void
)(
*
os
<<
value
))
{
// Call streaming operator found by ADL, possibly with implicit conversions
// of the arguments.
*
os
<<
value
;
...
...
@@ -306,9 +307,10 @@ template <typename T>
void
PrintWithFallback
(
const
T
&
value
,
::
std
::
ostream
*
os
)
{
using
Printer
=
typename
FindFirstPrinter
<
T
,
void
,
ContainerPrinter
,
FunctionPointerPrinter
,
PointerPrinter
,
ProtobufPrinter
,
internal_stream_operator_without_lexical_name_lookup
::
StreamPrinter
,
Protobuf
Printer
,
ConvertibleTo
Integer
Printer
,
ConvertibleToStringViewPrinter
,
RawBytesPrinter
,
FallbackPrinter
>::
type
;
ConvertibleToInteger
Printer
,
ConvertibleTo
StringView
Printer
,
RawBytesPrinter
,
FallbackPrinter
>::
type
;
Printer
::
PrintValue
(
value
,
os
);
}
...
...
@@ -856,7 +858,7 @@ class UniversalPrinter<Variant<T...>> {
public:
static
void
Print
(
const
Variant
<
T
...
>&
value
,
::
std
::
ostream
*
os
)
{
*
os
<<
'('
;
#if GTEST_HAS_ABSL
#if
def
GTEST_HAS_ABSL
absl
::
visit
(
Visitor
{
os
,
value
.
index
()},
value
);
#else
std
::
visit
(
Visitor
{
os
,
value
.
index
()},
value
);
...
...
@@ -1002,7 +1004,7 @@ template <>
class
UniversalTersePrinter
<
char
*>
:
public
UniversalTersePrinter
<
const
char
*>
{
};
#ifdef __cpp_char8_t
#ifdef __cpp_
lib_
char8_t
template
<>
class
UniversalTersePrinter
<
const
char8_t
*>
{
public:
...
...
googletest/include/gtest/gtest-test-part.h
View file @
76bce79a
...
...
@@ -133,7 +133,7 @@ std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
// virtual.
class
GTEST_API_
TestPartResultArray
{
public:
TestPartResultArray
()
{}
TestPartResultArray
()
=
default
;
// Appends the given TestPartResult to the array.
void
Append
(
const
TestPartResult
&
result
);
...
...
@@ -154,7 +154,7 @@ class GTEST_API_ TestPartResultArray {
// This interface knows how to report a test part result.
class
GTEST_API_
TestPartResultReporterInterface
{
public:
virtual
~
TestPartResultReporterInterface
()
{}
virtual
~
TestPartResultReporterInterface
()
=
default
;
virtual
void
ReportTestPartResult
(
const
TestPartResult
&
result
)
=
0
;
};
...
...
googletest/include/gtest/gtest.h
View file @
76bce79a
...
...
@@ -302,7 +302,7 @@ class GTEST_API_ Test {
template
<
typename
T
,
std
::
enable_if_t
<
std
::
is_convertible
<
T
,
int64_t
>
::
value
,
bool
>
=
true
>
static
void
RecordProperty
(
const
std
::
string
&
key
,
const
T
&
value
)
{
RecordProperty
(
key
,
(
Message
()
<<
static_cast
<
int64_t
>
(
value
)
)
.
GetString
());
RecordProperty
(
key
,
(
Message
()
<<
value
).
GetString
());
}
protected:
...
...
@@ -551,14 +551,14 @@ class GTEST_API_ TestInfo {
// Returns the name of the parameter type, or NULL if this is not a typed
// or a type-parameterized test.
const
char
*
type_param
()
const
{
if
(
type_param_
.
get
()
!=
nullptr
)
return
type_param_
->
c_str
();
if
(
type_param_
!=
nullptr
)
return
type_param_
->
c_str
();
return
nullptr
;
}
// Returns the text representation of the value parameter, or NULL if this
// is not a value-parameterized test.
const
char
*
value_param
()
const
{
if
(
value_param_
.
get
()
!=
nullptr
)
return
value_param_
->
c_str
();
if
(
value_param_
!=
nullptr
)
return
value_param_
->
c_str
();
return
nullptr
;
}
...
...
@@ -600,7 +600,7 @@ class GTEST_API_ TestInfo {
const
TestResult
*
result
()
const
{
return
&
result_
;
}
private:
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
friend
class
internal
::
DefaultDeathTestFactory
;
#endif // GTEST_HAS_DEATH_TEST
friend
class
Test
;
...
...
@@ -697,7 +697,7 @@ class GTEST_API_ TestSuite {
// Returns the name of the parameter type, or NULL if this is not a
// type-parameterized test suite.
const
char
*
type_param
()
const
{
if
(
type_param_
.
get
()
!=
nullptr
)
return
type_param_
->
c_str
();
if
(
type_param_
!=
nullptr
)
return
type_param_
->
c_str
();
return
nullptr
;
}
...
...
@@ -894,7 +894,7 @@ class GTEST_API_ TestSuite {
class
Environment
{
public:
// The d'tor is virtual as we need to subclass Environment.
virtual
~
Environment
()
{}
virtual
~
Environment
()
=
default
;
// Override this to define how to set up the environment.
virtual
void
SetUp
()
{}
...
...
@@ -925,7 +925,7 @@ class GTEST_API_ AssertionException
// the order the corresponding events are fired.
class
TestEventListener
{
public:
virtual
~
TestEventListener
()
{}
virtual
~
TestEventListener
()
=
default
;
// Fired before any test activity starts.
virtual
void
OnTestProgramStart
(
const
UnitTest
&
unit_test
)
=
0
;
...
...
@@ -1671,7 +1671,7 @@ template <typename T>
class
WithParamInterface
{
public:
typedef
T
ParamType
;
virtual
~
WithParamInterface
()
{}
virtual
~
WithParamInterface
()
=
default
;
// The current parameter value. Is also available in the test fixture's
// constructor.
...
...
@@ -1747,7 +1747,7 @@ class TestWithParam : public Test, public WithParamInterface<T> {};
// Define this macro to 1 to omit the definition of FAIL(), which is a
// generic name and clashes with some other libraries.
#if !GTEST_DONT_DEFINE_FAIL
#if !
(defined(
GTEST_DONT_DEFINE_FAIL
) && GTEST_DONT_DEFINE_FAIL)
#define FAIL() GTEST_FAIL()
#endif
...
...
@@ -1756,7 +1756,7 @@ class TestWithParam : public Test, public WithParamInterface<T> {};
// Define this macro to 1 to omit the definition of SUCCEED(), which
// is a generic name and clashes with some other libraries.
#if !GTEST_DONT_DEFINE_SUCCEED
#if !
(defined(
GTEST_DONT_DEFINE_SUCCEED
) && GTEST_DONT_DEFINE_SUCCEED)
#define SUCCEED() GTEST_SUCCEED()
#endif
...
...
@@ -1800,19 +1800,19 @@ class TestWithParam : public Test, public WithParamInterface<T> {};
// Define these macros to 1 to omit the definition of the corresponding
// EXPECT or ASSERT, which clashes with some users' own code.
#if !GTEST_DONT_DEFINE_EXPECT_TRUE
#if !
(defined(
GTEST_DONT_DEFINE_EXPECT_TRUE
) && GTEST_DONT_DEFINE_EXPECT_TRUE)
#define EXPECT_TRUE(condition) GTEST_EXPECT_TRUE(condition)
#endif
#if !GTEST_DONT_DEFINE_EXPECT_FALSE
#if !
(defined(
GTEST_DONT_DEFINE_EXPECT_FALSE
) && GTEST_DONT_DEFINE_EXPECT_FALSE)
#define EXPECT_FALSE(condition) GTEST_EXPECT_FALSE(condition)
#endif
#if !GTEST_DONT_DEFINE_ASSERT_TRUE
#if !
(defined(
GTEST_DONT_DEFINE_ASSERT_TRUE
) && GTEST_DONT_DEFINE_ASSERT_TRUE)
#define ASSERT_TRUE(condition) GTEST_ASSERT_TRUE(condition)
#endif
#if !GTEST_DONT_DEFINE_ASSERT_FALSE
#if !
(defined(
GTEST_DONT_DEFINE_ASSERT_FALSE
) && GTEST_DONT_DEFINE_ASSERT_FALSE)
#define ASSERT_FALSE(condition) GTEST_ASSERT_FALSE(condition)
#endif
...
...
@@ -1891,27 +1891,27 @@ class TestWithParam : public Test, public WithParamInterface<T> {};
// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
// ASSERT_XY(), which clashes with some users' own code.
#if !GTEST_DONT_DEFINE_ASSERT_EQ
#if !
(defined(
GTEST_DONT_DEFINE_ASSERT_EQ
) && GTEST_DONT_DEFINE_ASSERT_EQ)
#define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
#endif
#if !GTEST_DONT_DEFINE_ASSERT_NE
#if !
(defined(
GTEST_DONT_DEFINE_ASSERT_NE
) && GTEST_DONT_DEFINE_ASSERT_NE)
#define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
#endif
#if !GTEST_DONT_DEFINE_ASSERT_LE
#if !
(defined(
GTEST_DONT_DEFINE_ASSERT_LE
) && GTEST_DONT_DEFINE_ASSERT_LE)
#define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
#endif
#if !GTEST_DONT_DEFINE_ASSERT_LT
#if !
(defined(
GTEST_DONT_DEFINE_ASSERT_LT
) && GTEST_DONT_DEFINE_ASSERT_LT)
#define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
#endif
#if !GTEST_DONT_DEFINE_ASSERT_GE
#if !
(defined(
GTEST_DONT_DEFINE_ASSERT_GE
) && GTEST_DONT_DEFINE_ASSERT_GE)
#define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
#endif
#if !GTEST_DONT_DEFINE_ASSERT_GT
#if !
(defined(
GTEST_DONT_DEFINE_ASSERT_GT
) && GTEST_DONT_DEFINE_ASSERT_GT)
#define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
#endif
...
...
@@ -1999,7 +1999,7 @@ GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
GTEST_API_
AssertionResult
DoubleLE
(
const
char
*
expr1
,
const
char
*
expr2
,
double
val1
,
double
val2
);
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
// Macros that test for HRESULT failure and success, these are only useful
// on Windows, and rely on Windows SDK macros and APIs to compile.
...
...
@@ -2169,7 +2169,7 @@ constexpr bool StaticAssertTypeEq() noexcept {
// Define this macro to 1 to omit the definition of TEST(), which
// is a generic name and clashes with some other libraries.
#if !GTEST_DONT_DEFINE_TEST
#if !
(defined(
GTEST_DONT_DEFINE_TEST
) && GTEST_DONT_DEFINE_TEST)
#define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name)
#endif
...
...
@@ -2201,7 +2201,7 @@ constexpr bool StaticAssertTypeEq() noexcept {
#define GTEST_TEST_F(test_fixture, test_name) \
GTEST_TEST_(test_fixture, test_name, test_fixture, \
::testing::internal::GetTypeId<test_fixture>())
#if !GTEST_DONT_DEFINE_TEST_F
#if !
(defined(
GTEST_DONT_DEFINE_TEST_F
) && GTEST_DONT_DEFINE_TEST_F)
#define TEST_F(test_fixture, test_name) GTEST_TEST_F(test_fixture, test_name)
#endif
...
...
googletest/include/gtest/internal/gtest-death-test-internal.h
View file @
76bce79a
...
...
@@ -57,7 +57,7 @@ const char kDeathTestStyleFlag[] = "death_test_style";
const
char
kDeathTestUseFork
[]
=
"death_test_use_fork"
;
const
char
kInternalRunDeathTestFlag
[]
=
"internal_run_death_test"
;
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
GTEST_DISABLE_MSC_WARNINGS_PUSH_
(
4251
\
/* class A needs to have dll-interface to be used by clients of class B */
)
...
...
@@ -88,7 +88,7 @@ class GTEST_API_ DeathTest {
static
bool
Create
(
const
char
*
statement
,
Matcher
<
const
std
::
string
&>
matcher
,
const
char
*
file
,
int
line
,
DeathTest
**
test
);
DeathTest
();
virtual
~
DeathTest
()
{}
virtual
~
DeathTest
()
=
default
;
// A helper class that aborts a death test when it's deleted.
class
ReturnSentinel
{
...
...
@@ -153,7 +153,7 @@ GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
// Factory interface for death tests. May be mocked out for testing.
class
DeathTestFactory
{
public:
virtual
~
DeathTestFactory
()
{}
virtual
~
DeathTestFactory
()
=
default
;
virtual
bool
Create
(
const
char
*
statement
,
Matcher
<
const
std
::
string
&>
matcher
,
const
char
*
file
,
int
line
,
DeathTest
**
test
)
=
0
;
...
...
@@ -238,7 +238,7 @@ inline Matcher<const ::std::string&> MakeDeathTestMatcher(
} \
break; \
case ::testing::internal::DeathTest::EXECUTE_TEST: { \
::testing::internal::DeathTest::ReturnSentinel gtest_sentinel(
\
const
::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \
gtest_dt); \
GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
...
...
googletest/include/gtest/internal/gtest-internal.h
View file @
76bce79a
...
...
@@ -41,7 +41,7 @@
#include "gtest/internal/gtest-port.h"
#if GTEST_OS_LINUX
#if
def
GTEST_OS_LINUX
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
...
...
@@ -435,7 +435,7 @@ GTEST_API_ TypeId GetTestTypeId();
// of a Test object.
class
TestFactoryBase
{
public:
virtual
~
TestFactoryBase
()
{}
virtual
~
TestFactoryBase
()
=
default
;
// Creates a test instance to run. The instance is both created and destroyed
// within TestInfoImpl::Run()
...
...
@@ -457,7 +457,7 @@ class TestFactoryImpl : public TestFactoryBase {
Test
*
CreateTest
()
override
{
return
new
TestClass
;
}
};
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
// Predicate-formatters for implementing the HRESULT checking macros
// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
...
...
@@ -900,8 +900,10 @@ class HasDebugStringAndShortDebugString {
HasDebugStringType
::
value
&&
HasShortDebugStringType
::
value
;
};
#ifdef GTEST_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
template
<
typename
T
>
constexpr
bool
HasDebugStringAndShortDebugString
<
T
>::
value
;
#endif
// When the compiler sees expression IsContainerTest<C>(0), if C is an
// STL-style container class, the first overload of IsContainerTest
...
...
googletest/include/gtest/internal/gtest-param-util.h
View file @
76bce79a
...
...
@@ -97,7 +97,7 @@ class ParamGenerator;
template
<
typename
T
>
class
ParamIteratorInterface
{
public:
virtual
~
ParamIteratorInterface
()
{}
virtual
~
ParamIteratorInterface
()
=
default
;
// A pointer to the base generator instance.
// Used only for the purposes of iterator comparison
// to make sure that two iterators belong to the same generator.
...
...
@@ -171,7 +171,7 @@ class ParamGeneratorInterface {
public:
typedef
T
ParamType
;
virtual
~
ParamGeneratorInterface
()
{}
virtual
~
ParamGeneratorInterface
()
=
default
;
// Generator interface definition
virtual
ParamIteratorInterface
<
T
>*
Begin
()
const
=
0
;
...
...
@@ -215,7 +215,7 @@ class RangeGenerator : public ParamGeneratorInterface<T> {
end_
(
end
),
step_
(
step
),
end_index_
(
CalculateEndIndex
(
begin
,
end
,
step
))
{}
~
RangeGenerator
()
override
{}
~
RangeGenerator
()
override
=
default
;
ParamIteratorInterface
<
T
>*
Begin
()
const
override
{
return
new
Iterator
(
this
,
begin_
,
0
,
step_
);
...
...
@@ -230,7 +230,7 @@ class RangeGenerator : public ParamGeneratorInterface<T> {
Iterator
(
const
ParamGeneratorInterface
<
T
>*
base
,
T
value
,
int
index
,
IncrementT
step
)
:
base_
(
base
),
value_
(
value
),
index_
(
index
),
step_
(
step
)
{}
~
Iterator
()
override
{}
~
Iterator
()
override
=
default
;
const
ParamGeneratorInterface
<
T
>*
BaseGenerator
()
const
override
{
return
base_
;
...
...
@@ -299,7 +299,7 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
template
<
typename
ForwardIterator
>
ValuesInIteratorRangeGenerator
(
ForwardIterator
begin
,
ForwardIterator
end
)
:
container_
(
begin
,
end
)
{}
~
ValuesInIteratorRangeGenerator
()
override
{}
~
ValuesInIteratorRangeGenerator
()
override
=
default
;
ParamIteratorInterface
<
T
>*
Begin
()
const
override
{
return
new
Iterator
(
this
,
container_
.
begin
());
...
...
@@ -316,7 +316,7 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
Iterator
(
const
ParamGeneratorInterface
<
T
>*
base
,
typename
ContainerType
::
const_iterator
iterator
)
:
base_
(
base
),
iterator_
(
iterator
)
{}
~
Iterator
()
override
{}
~
Iterator
()
override
=
default
;
const
ParamGeneratorInterface
<
T
>*
BaseGenerator
()
const
override
{
return
base_
;
...
...
@@ -420,7 +420,7 @@ class ParameterizedTestFactory : public TestFactoryBase {
template
<
class
ParamType
>
class
TestMetaFactoryBase
{
public:
virtual
~
TestMetaFactoryBase
()
{}
virtual
~
TestMetaFactoryBase
()
=
default
;
virtual
TestFactoryBase
*
CreateTestFactory
(
ParamType
parameter
)
=
0
;
};
...
...
@@ -439,7 +439,7 @@ class TestMetaFactory
public:
using
ParamType
=
typename
TestSuite
::
ParamType
;
TestMetaFactory
()
{}
TestMetaFactory
()
=
default
;
TestFactoryBase
*
CreateTestFactory
(
ParamType
parameter
)
override
{
return
new
ParameterizedTestFactory
<
TestSuite
>
(
parameter
);
...
...
@@ -462,7 +462,7 @@ class TestMetaFactory
// and calls RegisterTests() on each of them when asked.
class
ParameterizedTestSuiteInfoBase
{
public:
virtual
~
ParameterizedTestSuiteInfoBase
()
{}
virtual
~
ParameterizedTestSuiteInfoBase
()
=
default
;
// Base part of test suite name for display purposes.
virtual
const
std
::
string
&
GetTestSuiteName
()
const
=
0
;
...
...
@@ -691,7 +691,7 @@ using ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo<TestCase>;
// ParameterizedTestSuiteInfo descriptors.
class
ParameterizedTestSuiteRegistry
{
public:
ParameterizedTestSuiteRegistry
()
{}
ParameterizedTestSuiteRegistry
()
=
default
;
~
ParameterizedTestSuiteRegistry
()
{
for
(
auto
&
test_suite_info
:
test_suite_infos_
)
{
delete
test_suite_info
;
...
...
@@ -825,7 +825,7 @@ class CartesianProductGenerator
CartesianProductGenerator
(
const
std
::
tuple
<
ParamGenerator
<
T
>
...
>&
g
)
:
generators_
(
g
)
{}
~
CartesianProductGenerator
()
override
{}
~
CartesianProductGenerator
()
override
=
default
;
ParamIteratorInterface
<
ParamType
>*
Begin
()
const
override
{
return
new
Iterator
(
this
,
generators_
,
false
);
...
...
@@ -850,7 +850,7 @@ class CartesianProductGenerator
current_
(
is_end
?
end_
:
begin_
)
{
ComputeCurrentValue
();
}
~
IteratorImpl
()
override
{}
~
IteratorImpl
()
override
=
default
;
const
ParamGeneratorInterface
<
ParamType
>*
BaseGenerator
()
const
override
{
return
base_
;
...
...
@@ -969,7 +969,7 @@ class ParamGeneratorConverter : public ParamGeneratorInterface<To> {
:
base_
(
base
),
it_
(
it
),
end_
(
end
)
{
if
(
it_
!=
end_
)
value_
=
std
::
make_shared
<
To
>
(
static_cast
<
To
>
(
*
it_
));
}
~
Iterator
()
override
{}
~
Iterator
()
override
=
default
;
const
ParamGeneratorInterface
<
To
>*
BaseGenerator
()
const
override
{
return
base_
;
...
...
googletest/include/gtest/internal/gtest-port.h
View file @
76bce79a
...
...
@@ -161,10 +161,10 @@
// NOT define them.
//
// These macros are public so that portable tests can be written.
// Such tests typically surround code using a feature with an #if
// Such tests typically surround code using a feature with an #if
def
// which controls that code. For example:
//
// #if GTEST_HAS_DEATH_TEST
// #if
def
GTEST_HAS_DEATH_TEST
// EXPECT_DEATH(DoSomethingDeadly());
// #endif
//
...
...
@@ -178,6 +178,7 @@
// define themselves.
// GTEST_USES_SIMPLE_RE - our own simple regex is used;
// the above RE\b(s) are mutually exclusive.
// GTEST_HAS_ABSL - Google Test is compiled with Abseil.
// Misc public macros
// ------------------
...
...
@@ -202,16 +203,25 @@
// is suppressed.
// GTEST_INTERNAL_HAS_ANY - for enabling UniversalPrinter<std::any> or
// UniversalPrinter<absl::any> specializations.
// Always defined to 0 or 1.
// GTEST_INTERNAL_HAS_OPTIONAL - for enabling UniversalPrinter<std::optional>
// or
// UniversalPrinter<absl::optional>
// specializations.
// specializations.
Always defined to 0 or 1.
// GTEST_INTERNAL_HAS_STRING_VIEW - for enabling Matcher<std::string_view> or
// Matcher<absl::string_view>
// specializations.
// specializations.
Always defined to 0 or 1.
// GTEST_INTERNAL_HAS_VARIANT - for enabling UniversalPrinter<std::variant> or
// UniversalPrinter<absl::variant>
// specializations.
// specializations. Always defined to 0 or 1.
// GTEST_USE_OWN_FLAGFILE_FLAG_ - Always defined to 0 or 1.
// GTEST_HAS_CXXABI_H_ - Always defined to 0 or 1.
// GTEST_CAN_STREAM_RESULTS_ - Always defined to 0 or 1.
// GTEST_HAS_ALT_PATH_SEP_ - Always defined to 0 or 1.
// GTEST_WIDE_STRING_USES_UTF16_ - Always defined to 0 or 1.
// GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ - Always defined to 0 or 1.
// GTEST_HAS_DOWNCAST_ - Always defined to 0 or 1.
// GTEST_HAS_NOTIFICATION_- Always defined to 0 or 1.
//
// Synchronization:
// Mutex, MutexLock, ThreadLocal, GetThreadCount()
...
...
@@ -303,7 +313,19 @@
#include "gtest/internal/custom/gtest-port.h"
#include "gtest/internal/gtest-port-arch.h"
#if GTEST_HAS_ABSL
#ifndef GTEST_HAS_DOWNCAST_
#define GTEST_HAS_DOWNCAST_ 0
#endif
#ifndef GTEST_HAS_MUTEX_AND_THREAD_LOCAL_
#define GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ 0
#endif
#ifndef GTEST_HAS_NOTIFICATION_
#define GTEST_HAS_NOTIFICATION_ 0
#endif
#ifdef GTEST_HAS_ABSL
#include "absl/flags/declare.h"
#include "absl/flags/flag.h"
#include "absl/flags/reflection.h"
...
...
@@ -361,13 +383,13 @@
// Brings in definitions for functions used in the testing::internal::posix
// namespace (read, write, close, chdir, isatty, stat). We do not currently
// use them on Windows Mobile.
#if GTEST_OS_WINDOWS
#if
!
GTEST_OS_WINDOWS_MOBILE
#if
def
GTEST_OS_WINDOWS
#if
ndef
GTEST_OS_WINDOWS_MOBILE
#include <direct.h>
#include <io.h>
#endif
// In order to avoid having to include <windows.h>, use forward declaration
#if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR)
#if
defined(
GTEST_OS_WINDOWS_MINGW
)
&& !defined(__MINGW64_VERSION_MAJOR)
// MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two
// separate (equivalent) structs, instead of using typedef
typedef
struct
_CRITICAL_SECTION
GTEST_CRITICAL_SECTION
;
...
...
@@ -377,7 +399,7 @@ typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.
typedef
struct
_RTL_CRITICAL_SECTION
GTEST_CRITICAL_SECTION
;
#endif
#elif GTEST_OS_XTENSA
#elif
defined(
GTEST_OS_XTENSA
)
#include <unistd.h>
// Xtensa toolchains define strcasecmp in the string.h header instead of
// strings.h. string.h is already included.
...
...
@@ -389,7 +411,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
#include <unistd.h>
#endif // GTEST_OS_WINDOWS
#if GTEST_OS_LINUX_ANDROID
#if
def
GTEST_OS_LINUX_ANDROID
// Used to define __ANDROID_API__ matching the target NDK API level.
#include <android/api-level.h> // NOLINT
#endif
...
...
@@ -397,17 +419,21 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// Defines this to true if and only if Google Test can use POSIX regular
// expressions.
#ifndef GTEST_HAS_POSIX_RE
#if GTEST_OS_LINUX_ANDROID
#if
def
GTEST_OS_LINUX_ANDROID
// On Android, <regex.h> is only available starting with Gingerbread.
#define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
#else
#define GTEST_HAS_POSIX_RE \
!(GTEST_OS_WINDOWS || GTEST_OS_XTENSA || GTEST_OS_QURT)
#if !(defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_XTENSA) || \
defined(GTEST_OS_QURT))
#define GTEST_HAS_POSIX_RE 1
#else
#define GTEST_HAS_POSIX_RE 0
#endif
#endif // GTEST_OS_LINUX_ANDROID
#endif
// Select the regular expression implementation.
#if GTEST_HAS_ABSL
#if
def
GTEST_HAS_ABSL
// When using Abseil, RE2 is required.
#include "absl/strings/string_view.h"
#include "re2/re2.h"
...
...
@@ -443,8 +469,12 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// cleanups prior to that. To reliably check for C++ exception availability with
// clang, check for
// __EXCEPTIONS && __has_feature(cxx_exceptions).
#define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))
#elif defined(__GNUC__) && __EXCEPTIONS
#if defined(__EXCEPTIONS) && __EXCEPTIONS && __has_feature(cxx_exceptions)
#define GTEST_HAS_EXCEPTIONS 1
#else
#define GTEST_HAS_EXCEPTIONS 0
#endif
#elif defined(__GNUC__) && defined(__EXCEPTIONS) && __EXCEPTIONS
// gcc defines __EXCEPTIONS to 1 if and only if exceptions are enabled.
#define GTEST_HAS_EXCEPTIONS 1
#elif defined(__SUNPRO_CC)
...
...
@@ -452,7 +482,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// detecting whether they are enabled or not. Therefore, we assume that
// they are enabled unless the user tells us otherwise.
#define GTEST_HAS_EXCEPTIONS 1
#elif defined(__IBMCPP__) && __EXCEPTIONS
#elif defined(__IBMCPP__) &&
defined(__EXCEPTIONS) &&
__EXCEPTIONS
// xlC defines __EXCEPTIONS to 1 if and only if exceptions are enabled.
#define GTEST_HAS_EXCEPTIONS 1
#elif defined(__HP_aCC)
...
...
@@ -472,11 +502,14 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// Cygwin 1.7 and below doesn't support ::std::wstring.
// Solaris' libc++ doesn't support it either. Android has
// no support for it at least as recent as Froyo (2.2).
#define GTEST_HAS_STD_WSTRING \
(!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
GTEST_OS_HAIKU || GTEST_OS_ESP32 || GTEST_OS_ESP8266 || \
GTEST_OS_XTENSA || GTEST_OS_QURT))
#if (!(defined(GTEST_OS_LINUX_ANDROID) || defined(GTEST_OS_CYGWIN) || \
defined(GTEST_OS_SOLARIS) || defined(GTEST_OS_HAIKU) || \
defined(GTEST_OS_ESP32) || defined(GTEST_OS_ESP8266) || \
defined(GTEST_OS_XTENSA) || defined(GTEST_OS_QURT)))
#define GTEST_HAS_STD_WSTRING 1
#else
#define GTEST_HAS_STD_WSTRING 0
#endif
#endif // GTEST_HAS_STD_WSTRING
#ifndef GTEST_HAS_FILE_SYSTEM
...
...
@@ -506,7 +539,8 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// -frtti -fno-exceptions, the build fails at link time with undefined
// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
// so disable RTTI when detected.
#if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && !defined(__EXCEPTIONS)
#if defined(GTEST_OS_LINUX_ANDROID) && defined(_STLPORT_MAJOR) && \
!defined(__EXCEPTIONS)
#define GTEST_HAS_RTTI 0
#else
#define GTEST_HAS_RTTI 1
...
...
@@ -554,11 +588,17 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
//
// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
// to your compiler flags.
#define GTEST_HAS_PTHREAD \
(GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \
GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \
GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_OPENBSD || \
GTEST_OS_HAIKU || GTEST_OS_GNU_HURD)
#if (defined(GTEST_OS_LINUX) || defined(GTEST_OS_MAC) || \
defined(GTEST_OS_HPUX) || defined(GTEST_OS_QNX) || \
defined(GTEST_OS_FREEBSD) || defined(GTEST_OS_NACL) || \
defined(GTEST_OS_NETBSD) || defined(GTEST_OS_FUCHSIA) || \
defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_GNU_KFREEBSD) || \
defined(GTEST_OS_OPENBSD) || defined(GTEST_OS_HAIKU) || \
defined(GTEST_OS_GNU_HURD))
#define GTEST_HAS_PTHREAD 1
#else
#define GTEST_HAS_PTHREAD 0
#endif
#endif // GTEST_HAS_PTHREAD
#if GTEST_HAS_PTHREAD
...
...
@@ -577,8 +617,8 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
#ifndef GTEST_HAS_CLONE
// The user didn't tell us, so we need to figure it out.
#if GTEST_OS_LINUX && !defined(__ia64__)
#if GTEST_OS_LINUX_ANDROID
#if
defined(
GTEST_OS_LINUX
)
&& !defined(__ia64__)
#if
defined(
GTEST_OS_LINUX_ANDROID
)
// On Android, clone() became available at different API levels for each 32-bit
// architecture.
#if defined(__LP64__) || (defined(__arm__) && __ANDROID_API__ >= 9) || \
...
...
@@ -603,9 +643,10 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// By default, we assume that stream redirection is supported on all
// platforms except known mobile / embedded ones. Also, if the port doesn't have
// a file system, stream redirection is not supported.
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_XTENSA || \
GTEST_OS_QURT || !GTEST_HAS_FILE_SYSTEM
#if defined(GTEST_OS_WINDOWS_MOBILE) || defined(GTEST_OS_WINDOWS_PHONE) || \
defined(GTEST_OS_WINDOWS_RT) || defined(GTEST_OS_ESP8266) || \
defined(GTEST_OS_XTENSA) || defined(GTEST_OS_QURT) || \
!GTEST_HAS_FILE_SYSTEM
#define GTEST_HAS_STREAM_REDIRECTION 0
#else
#define GTEST_HAS_STREAM_REDIRECTION 1
...
...
@@ -614,13 +655,16 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// Determines whether to support death tests.
// pops up a dialog window that cannot be suppressed programmatically.
#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
(GTEST_OS_MAC && !GTEST_OS_IOS) || \
(GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || GTEST_OS_WINDOWS_MINGW || \
GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_OPENBSD || GTEST_OS_QNX || \
GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \
GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_HAIKU || \
GTEST_OS_GNU_HURD)
#if (defined(GTEST_OS_LINUX) || defined(GTEST_OS_CYGWIN) || \
defined(GTEST_OS_SOLARIS) || \
(defined(GTEST_OS_MAC) && !defined(GTEST_OS_IOS)) || \
(defined(GTEST_OS_WINDOWS_DESKTOP) && _MSC_VER) || \
defined(GTEST_OS_WINDOWS_MINGW) || defined(GTEST_OS_AIX) || \
defined(GTEST_OS_HPUX) || defined(GTEST_OS_OPENBSD) || \
defined(GTEST_OS_QNX) || defined(GTEST_OS_FREEBSD) || \
defined(GTEST_OS_NETBSD) || defined(GTEST_OS_FUCHSIA) || \
defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_GNU_KFREEBSD) || \
defined(GTEST_OS_HAIKU) || defined(GTEST_OS_GNU_HURD))
// Death tests require a file system to work properly.
#if GTEST_HAS_FILE_SYSTEM
#define GTEST_HAS_DEATH_TEST 1
...
...
@@ -638,14 +682,21 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
#endif
// Determines whether the system compiler uses UTF-16 for encoding wide strings.
#define GTEST_WIDE_STRING_USES_UTF16_ \
(GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2)
#if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_CYGWIN) || \
defined(GTEST_OS_AIX) || defined(GTEST_OS_OS2)
#define GTEST_WIDE_STRING_USES_UTF16_ 1
#else
#define GTEST_WIDE_STRING_USES_UTF16_ 0
#endif
// Determines whether test results can be streamed to a socket.
#if GTEST_OS_LINUX || GTEST_OS_GNU_KFREEBSD || GTEST_OS_DRAGONFLY || \
GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_OPENBSD || \
GTEST_OS_GNU_HURD
#if defined(GTEST_OS_LINUX) || defined(GTEST_OS_GNU_KFREEBSD) || \
defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_FREEBSD) || \
defined(GTEST_OS_NETBSD) || defined(GTEST_OS_OPENBSD) || \
defined(GTEST_OS_GNU_HURD) || defined(GTEST_OS_MAC)
#define GTEST_CAN_STREAM_RESULTS_ 1
#else
#define GTEST_CAN_STREAM_RESULTS_ 0
#endif
// Defines some utility macros.
...
...
@@ -759,14 +810,16 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
#ifndef GTEST_IS_THREADSAFE
#define GTEST_IS_THREADSAFE \
(GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \
(GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \
GTEST_HAS_PTHREAD)
#if (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \
(defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_PHONE) && \
!defined(GTEST_OS_WINDOWS_RT)) || \
GTEST_HAS_PTHREAD)
#define GTEST_IS_THREADSAFE 1
#endif
#endif // GTEST_IS_THREADSAFE
#if GTEST_IS_THREADSAFE
#if
def
GTEST_IS_THREADSAFE
// Some platforms don't support including these threading related headers.
#include <condition_variable> // NOLINT
#include <mutex> // NOLINT
...
...
@@ -808,7 +861,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
// Ask the compiler not to perform tail call optimization inside
// the marked function.
#define GTEST_NO_TAIL_CALL_ __attribute__((disable_tail_calls))
#elif
__GNUC__
#elif
defined(__GNUC__) && !defined(__NVCOMPILER)
#define GTEST_NO_TAIL_CALL_ \
__attribute__((optimize("no-optimize-sibling-calls")))
#else
...
...
@@ -881,7 +934,7 @@ GTEST_API_ bool IsTrue(bool condition);
// Defines RE.
#if GTEST_USES_RE2
#if
def
GTEST_USES_RE2
// This is almost `using RE = ::RE2`, except it is copy-constructible, and it
// needs to disambiguate the `std::string`, `absl::string_view`, and `const
...
...
@@ -906,7 +959,9 @@ class GTEST_API_ RE {
RE2
regex_
;
};
#elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE
#elif defined(GTEST_USES_POSIX_RE) || defined(GTEST_USES_SIMPLE_RE)
GTEST_DISABLE_MSC_WARNINGS_PUSH_
(
4251
\
/* class A needs to have dll-interface to be used by clients of class B */
)
// A simple C++ wrapper for <regex.h>. It uses the POSIX Extended
// Regular Expression syntax.
...
...
@@ -923,7 +978,7 @@ class GTEST_API_ RE {
~
RE
();
// Returns the string representation of the regex.
const
char
*
pattern
()
const
{
return
pattern_
;
}
const
char
*
pattern
()
const
{
return
pattern_
.
c_str
()
;
}
// FullMatch(str, re) returns true if and only if regular expression re
// matches the entire str.
...
...
@@ -941,21 +996,21 @@ class GTEST_API_ RE {
private:
void
Init
(
const
char
*
regex
);
const
char
*
pattern_
;
std
::
string
pattern_
;
bool
is_valid_
;
#if GTEST_USES_POSIX_RE
#if
def
GTEST_USES_POSIX_RE
regex_t
full_regex_
;
// For FullMatch().
regex_t
partial_regex_
;
// For PartialMatch().
#else // GTEST_USES_SIMPLE_RE
const
char
*
full_pattern_
;
// For FullMatch();
std
::
string
full_pattern_
;
// For FullMatch();
#endif
};
GTEST_DISABLE_MSC_WARNINGS_POP_
()
// 4251
#endif // ::testing::internal::RE implementation
// Formats a source file path and a line number as they would appear
...
...
@@ -1172,7 +1227,7 @@ GTEST_API_ std::string ReadEntireFile(FILE* file);
// All command line arguments.
GTEST_API_
std
::
vector
<
std
::
string
>
GetArgvs
();
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
std
::
vector
<
std
::
string
>
GetInjectableArgvs
();
// Deprecated: pass the args vector by value instead.
...
...
@@ -1183,9 +1238,9 @@ void ClearInjectableArgvs();
#endif // GTEST_HAS_DEATH_TEST
// Defines synchronization primitives.
#if GTEST_IS_THREADSAFE
#if
def
GTEST_IS_THREADSAFE
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
// Provides leak-safe Windows kernel handle ownership.
// Used in death tests and in threading support.
class
GTEST_API_
AutoHandle
{
...
...
@@ -1264,7 +1319,7 @@ GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
// On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD
// defined, but we don't want to use MinGW's pthreads implementation, which
// has conformance problems with some versions of the POSIX standard.
#if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW
#if GTEST_HAS_PTHREAD && !
defined(
GTEST_OS_WINDOWS_MINGW
)
// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
// Consequently, it cannot select a correct instantiation of ThreadWithParam
...
...
@@ -1273,7 +1328,7 @@ GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251
// problem.
class
ThreadWithParamBase
{
public:
virtual
~
ThreadWithParamBase
()
{}
virtual
~
ThreadWithParamBase
()
=
default
;
virtual
void
Run
()
=
0
;
};
...
...
@@ -1350,7 +1405,8 @@ class ThreadWithParam : public ThreadWithParamBase {
// Mutex and ThreadLocal have already been imported into the namespace.
// Nothing to do here.
#elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT
#elif defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_PHONE) && \
!defined(GTEST_OS_WINDOWS_RT)
// Mutex implements mutex on Windows platforms. It is used in conjunction
// with class MutexLock:
...
...
@@ -1734,7 +1790,7 @@ typedef GTestMutexLock MutexLock;
// ThreadLocalValueHolderBase.
class
GTEST_API_
ThreadLocalValueHolderBase
{
public:
virtual
~
ThreadLocalValueHolderBase
()
{}
virtual
~
ThreadLocalValueHolderBase
()
=
default
;
};
// Called by pthread to delete thread-local data stored by
...
...
@@ -1806,8 +1862,8 @@ class GTEST_API_ ThreadLocal {
class
ValueHolderFactory
{
public:
ValueHolderFactory
()
{}
virtual
~
ValueHolderFactory
()
{}
ValueHolderFactory
()
=
default
;
virtual
~
ValueHolderFactory
()
=
default
;
virtual
ValueHolder
*
MakeNewHolder
()
const
=
0
;
private:
...
...
@@ -1817,7 +1873,7 @@ class GTEST_API_ ThreadLocal {
class
DefaultValueHolderFactory
:
public
ValueHolderFactory
{
public:
DefaultValueHolderFactory
()
{}
DefaultValueHolderFactory
()
=
default
;
ValueHolder
*
MakeNewHolder
()
const
override
{
return
new
ValueHolder
();
}
private:
...
...
@@ -1903,7 +1959,7 @@ class GTEST_API_ ThreadLocal {
// we cannot detect it.
GTEST_API_
size_t
GetThreadCount
();
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
#define GTEST_PATH_SEP_ "\\"
#define GTEST_HAS_ALT_PATH_SEP_ 1
#else
...
...
@@ -1980,11 +2036,11 @@ namespace posix {
// File system porting.
#if GTEST_HAS_FILE_SYSTEM
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
typedef
struct
_stat
StatStruct
;
#if GTEST_OS_WINDOWS_MOBILE
#if
def
GTEST_OS_WINDOWS_MOBILE
inline
int
FileNo
(
FILE
*
file
)
{
return
reinterpret_cast
<
int
>
(
_fileno
(
file
));
}
// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
// time and thus not defined there.
...
...
@@ -1995,7 +2051,7 @@ inline int RmDir(const char* dir) { return _rmdir(dir); }
inline
bool
IsDir
(
const
StatStruct
&
st
)
{
return
(
_S_IFDIR
&
st
.
st_mode
)
!=
0
;
}
#endif // GTEST_OS_WINDOWS_MOBILE
#elif GTEST_OS_ESP8266
#elif
defined(
GTEST_OS_ESP8266
)
typedef
struct
stat
StatStruct
;
inline
int
FileNo
(
FILE
*
file
)
{
return
fileno
(
file
);
}
...
...
@@ -2012,7 +2068,7 @@ typedef struct stat StatStruct;
inline
int
FileNo
(
FILE
*
file
)
{
return
fileno
(
file
);
}
inline
int
Stat
(
const
char
*
path
,
StatStruct
*
buf
)
{
return
stat
(
path
,
buf
);
}
#if GTEST_OS_QURT
#if
def
GTEST_OS_QURT
// QuRT doesn't support any directory functions, including rmdir
inline
int
RmDir
(
const
char
*
)
{
return
0
;
}
#else
...
...
@@ -2025,17 +2081,17 @@ inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
// Other functions with a different name on Windows.
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
#ifdef __BORLANDC__
inline
int
DoIsATTY
(
int
fd
)
{
return
isatty
(
fd
);
}
inline
int
StrCaseCmp
(
const
char
*
s1
,
const
char
*
s2
)
{
return
stricmp
(
s1
,
s2
);
}
inline
char
*
StrDup
(
const
char
*
src
)
{
return
strdup
(
src
);
}
#else // !__BORLANDC__
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS || GTEST_OS_IOS || \
GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT || defined(ESP_PLATFORM)
#if defined(GTEST_OS_WINDOWS_MOBILE) || defined(GTEST_OS_ZOS) || \
defined(GTEST_OS_IOS) || defined(GTEST_OS_WINDOWS_PHONE) || \
defined(GTEST_OS_WINDOWS_RT) || defined(ESP_PLATFORM)
inline
int
DoIsATTY
(
int
/* fd */
)
{
return
0
;
}
#else
inline
int
DoIsATTY
(
int
fd
)
{
return
_isatty
(
fd
);
}
...
...
@@ -2043,24 +2099,14 @@ inline int DoIsATTY(int fd) { return _isatty(fd); }
inline
int
StrCaseCmp
(
const
char
*
s1
,
const
char
*
s2
)
{
return
_stricmp
(
s1
,
s2
);
}
inline
char
*
StrDup
(
const
char
*
src
)
{
return
_strdup
(
src
);
}
#endif // __BORLANDC__
#elif GTEST_OS_ESP8266
inline
int
DoIsATTY
(
int
fd
)
{
return
isatty
(
fd
);
}
inline
int
StrCaseCmp
(
const
char
*
s1
,
const
char
*
s2
)
{
return
strcasecmp
(
s1
,
s2
);
}
inline
char
*
StrDup
(
const
char
*
src
)
{
return
strdup
(
src
);
}
#else
inline
int
DoIsATTY
(
int
fd
)
{
return
isatty
(
fd
);
}
inline
int
StrCaseCmp
(
const
char
*
s1
,
const
char
*
s2
)
{
return
strcasecmp
(
s1
,
s2
);
}
inline
char
*
StrDup
(
const
char
*
src
)
{
return
strdup
(
src
);
}
#endif // GTEST_OS_WINDOWS
...
...
@@ -2083,13 +2129,13 @@ GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
// StrError() aren't needed on Windows CE at this time and thus not
// defined there.
#if GTEST_HAS_FILE_SYSTEM
#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE &&
\
!GTEST_OS_WINDOWS_RT && !GTEST_OS_ESP8266 &&
!GTEST_OS_XTENSA &&
\
!GTEST_OS_QURT
#if !
defined(
GTEST_OS_WINDOWS_MOBILE
)
&& !
defined(
GTEST_OS_WINDOWS_PHONE
)
&& \
!
defined(
GTEST_OS_WINDOWS_RT
)
&& !
defined(
GTEST_OS_ESP8266
)
&&
\
!
defined(GTEST_OS_XTENSA) && !defined(
GTEST_OS_QURT
)
inline
int
ChDir
(
const
char
*
dir
)
{
return
chdir
(
dir
);
}
#endif
inline
FILE
*
FOpen
(
const
char
*
path
,
const
char
*
mode
)
{
#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
#if
defined(
GTEST_OS_WINDOWS
)
&& !
defined(
GTEST_OS_WINDOWS_MINGW
)
struct
wchar_codecvt
:
public
std
::
codecvt
<
wchar_t
,
char
,
std
::
mbstate_t
>
{};
std
::
wstring_convert
<
wchar_codecvt
>
converter
;
std
::
wstring
wide_path
=
converter
.
from_bytes
(
path
);
...
...
@@ -2099,14 +2145,14 @@ inline FILE* FOpen(const char* path, const char* mode) {
return
fopen
(
path
,
mode
);
#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW
}
#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
#if !
defined(
GTEST_OS_WINDOWS_MOBILE
)
&& !
defined(
GTEST_OS_QURT
)
inline
FILE
*
FReopen
(
const
char
*
path
,
const
char
*
mode
,
FILE
*
stream
)
{
return
freopen
(
path
,
mode
,
stream
);
}
inline
FILE
*
FDOpen
(
int
fd
,
const
char
*
mode
)
{
return
fdopen
(
fd
,
mode
);
}
#endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
inline
int
FClose
(
FILE
*
fp
)
{
return
fclose
(
fp
);
}
#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
#if !
defined(
GTEST_OS_WINDOWS_MOBILE
)
&& !
defined(
GTEST_OS_QURT
)
inline
int
Read
(
int
fd
,
void
*
buf
,
unsigned
int
count
)
{
return
static_cast
<
int
>
(
read
(
fd
,
buf
,
count
));
}
...
...
@@ -2117,14 +2163,14 @@ inline int Close(int fd) { return close(fd); }
#endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
#endif // GTEST_HAS_FILE_SYSTEM
#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
#if !
defined(
GTEST_OS_WINDOWS_MOBILE
)
&& !
defined(
GTEST_OS_QURT
)
inline
const
char
*
StrError
(
int
errnum
)
{
return
strerror
(
errnum
);
}
#endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_QURT
inline
const
char
*
GetEnv
(
const
char
*
name
)
{
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE ||
\
GTEST_OS_WINDOWS_RT ||
GTEST_OS_ESP8266 || GTEST_OS_XTENSA || \
GTEST_OS_QURT
#if
defined(
GTEST_OS_WINDOWS_MOBILE
)
||
defined(
GTEST_OS_WINDOWS_PHONE
)
|| \
defined(
GTEST_OS_ESP8266
)
||
defined(
GTEST_OS_XTENSA
)
||
\
defined(
GTEST_OS_QURT
)
// We are on an embedded platform, which has no environment variables.
static_cast
<
void
>
(
name
);
// To prevent 'unused argument' warning.
return
nullptr
;
...
...
@@ -2140,7 +2186,7 @@ inline const char* GetEnv(const char* name) {
GTEST_DISABLE_MSC_DEPRECATED_POP_
()
#if GTEST_OS_WINDOWS_MOBILE
#if
def
GTEST_OS_WINDOWS_MOBILE
// Windows CE has no C library. The abort() function is used in
// several places in Google Test. This implementation provides a reasonable
// imitation of standard behaviour.
...
...
@@ -2156,7 +2202,7 @@ GTEST_DISABLE_MSC_DEPRECATED_POP_()
// MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate
// function in order to achieve that. We use macro definition here because
// snprintf is a variadic function.
#if defined(_MSC_VER) && !GTEST_OS_WINDOWS_MOBILE
#if defined(_MSC_VER) && !
defined(
GTEST_OS_WINDOWS_MOBILE
)
// MSVC 2005 and above support variadic macros.
#define GTEST_SNPRINTF_(buffer, size, format, ...) \
_snprintf_s(buffer, size, size, format, __VA_ARGS__)
...
...
@@ -2229,7 +2275,7 @@ using TimeInMillis = int64_t; // Represents time in milliseconds.
#endif // !defined(GTEST_FLAG)
// Pick a command line flags implementation.
#if GTEST_HAS_ABSL
#if
def
GTEST_HAS_ABSL
// Macros for defining flags.
#define GTEST_DEFINE_bool_(name, default_val, doc) \
...
...
@@ -2340,7 +2386,7 @@ const char* StringFromGTestEnv(const char* flag, const char* default_val);
#endif // !defined(GTEST_INTERNAL_DEPRECATED)
#if GTEST_HAS_ABSL
#if
def
GTEST_HAS_ABSL
// Always use absl::any for UniversalPrinter<> specializations if googletest
// is built with absl support.
#define GTEST_INTERNAL_HAS_ANY 1
...
...
@@ -2352,7 +2398,8 @@ using Any = ::absl::any;
}
// namespace testing
#else
#ifdef __has_include
#if __has_include(<any>) && __cplusplus >= 201703L
#if __has_include(<any>) && GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L && \
(!defined(_MSC_VER) || GTEST_HAS_RTTI)
// Otherwise for C++17 and higher use std::any for UniversalPrinter<>
// specializations.
#define GTEST_INTERNAL_HAS_ANY 1
...
...
@@ -2364,11 +2411,15 @@ using Any = ::std::any;
}
// namespace testing
// The case where absl is configured NOT to alias std::any is not
// supported.
#endif // __has_include(<any>) &&
__cplusplus
>= 201703L
#endif // __has_include(<any>) &&
GTEST_INTERNAL_CPLUSPLUS_LANG
>= 201703L
#endif // __has_include
#endif // GTEST_HAS_ABSL
#if GTEST_HAS_ABSL
#ifndef GTEST_INTERNAL_HAS_ANY
#define GTEST_INTERNAL_HAS_ANY 0
#endif
#ifdef GTEST_HAS_ABSL
// Always use absl::optional for UniversalPrinter<> specializations if
// googletest is built with absl support.
#define GTEST_INTERNAL_HAS_OPTIONAL 1
...
...
@@ -2382,7 +2433,7 @@ inline ::absl::nullopt_t Nullopt() { return ::absl::nullopt; }
}
// namespace testing
#else
#ifdef __has_include
#if __has_include(<optional>) &&
__cplusplus
>= 201703L
#if __has_include(<optional>) &&
GTEST_INTERNAL_CPLUSPLUS_LANG
>= 201703L
// Otherwise for C++17 and higher use std::optional for UniversalPrinter<>
// specializations.
#define GTEST_INTERNAL_HAS_OPTIONAL 1
...
...
@@ -2396,11 +2447,15 @@ inline ::std::nullopt_t Nullopt() { return ::std::nullopt; }
}
// namespace testing
// The case where absl is configured NOT to alias std::optional is not
// supported.
#endif // __has_include(<optional>) &&
__cplusplus
>= 201703L
#endif // __has_include(<optional>) &&
GTEST_INTERNAL_CPLUSPLUS_LANG
>= 201703L
#endif // __has_include
#endif // GTEST_HAS_ABSL
#if GTEST_HAS_ABSL
#ifndef GTEST_INTERNAL_HAS_OPTIONAL
#define GTEST_INTERNAL_HAS_OPTIONAL 0
#endif
#ifdef GTEST_HAS_ABSL
// Always use absl::string_view for Matcher<> specializations if googletest
// is built with absl support.
#define GTEST_INTERNAL_HAS_STRING_VIEW 1
...
...
@@ -2412,7 +2467,7 @@ using StringView = ::absl::string_view;
}
// namespace testing
#else
#ifdef __has_include
#if __has_include(<string_view>) &&
__cplusplus
>= 201703L
#if __has_include(<string_view>) &&
GTEST_INTERNAL_CPLUSPLUS_LANG
>= 201703L
// Otherwise for C++17 and higher use std::string_view for Matcher<>
// specializations.
#define GTEST_INTERNAL_HAS_STRING_VIEW 1
...
...
@@ -2424,11 +2479,16 @@ using StringView = ::std::string_view;
}
// namespace testing
// The case where absl is configured NOT to alias std::string_view is not
// supported.
#endif // __has_include(<string_view>) && __cplusplus >= 201703L
#endif // __has_include(<string_view>) && GTEST_INTERNAL_CPLUSPLUS_LANG >=
// 201703L
#endif // __has_include
#endif // GTEST_HAS_ABSL
#if GTEST_HAS_ABSL
#ifndef GTEST_INTERNAL_HAS_STRING_VIEW
#define GTEST_INTERNAL_HAS_STRING_VIEW 0
#endif
#ifdef GTEST_HAS_ABSL
// Always use absl::variant for UniversalPrinter<> specializations if googletest
// is built with absl support.
#define GTEST_INTERNAL_HAS_VARIANT 1
...
...
@@ -2441,7 +2501,7 @@ using Variant = ::absl::variant<T...>;
}
// namespace testing
#else
#ifdef __has_include
#if __has_include(<variant>) &&
__cplusplus
>= 201703L
#if __has_include(<variant>) &&
GTEST_INTERNAL_CPLUSPLUS_LANG
>= 201703L
// Otherwise for C++17 and higher use std::variant for UniversalPrinter<>
// specializations.
#define GTEST_INTERNAL_HAS_VARIANT 1
...
...
@@ -2453,8 +2513,17 @@ using Variant = ::std::variant<T...>;
}
// namespace internal
}
// namespace testing
// The case where absl is configured NOT to alias std::variant is not supported.
#endif // __has_include(<variant>) &&
__cplusplus
>= 201703L
#endif // __has_include(<variant>) &&
GTEST_INTERNAL_CPLUSPLUS_LANG
>= 201703L
#endif // __has_include
#endif // GTEST_HAS_ABSL
#ifndef GTEST_INTERNAL_HAS_VARIANT
#define GTEST_INTERNAL_HAS_VARIANT 0
#endif
#if defined(GTEST_INTERNAL_CPLUSPLUS_LANG) && \
GTEST_INTERNAL_CPLUSPLUS_LANG < 201703L
#define GTEST_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL 1
#endif
#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
googletest/include/gtest/internal/gtest-string.h
View file @
76bce79a
...
...
@@ -73,7 +73,7 @@ class GTEST_API_ String {
// memory using malloc().
static
const
char
*
CloneCString
(
const
char
*
c_str
);
#if GTEST_OS_WINDOWS_MOBILE
#if
def
GTEST_OS_WINDOWS_MOBILE
// Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
// able to pass strings to Win32 APIs on CE we need to convert them
// to 'Unicode', UTF-16.
...
...
googletest/samples/prime_tables.h
View file @
76bce79a
...
...
@@ -39,7 +39,7 @@
// The prime table interface.
class
PrimeTable
{
public:
virtual
~
PrimeTable
()
{}
virtual
~
PrimeTable
()
=
default
;
// Returns true if and only if n is a prime number.
virtual
bool
IsPrime
(
int
n
)
const
=
0
;
...
...
googletest/samples/sample10_unittest.cc
View file @
76bce79a
...
...
@@ -38,7 +38,6 @@ using ::testing::InitGoogleTest;
using
::
testing
::
Test
;
using
::
testing
::
TestEventListeners
;
using
::
testing
::
TestInfo
;
using
::
testing
::
TestPartResult
;
using
::
testing
::
UnitTest
;
namespace
{
...
...
googletest/samples/sample8_unittest.cc
View file @
76bce79a
...
...
@@ -32,6 +32,8 @@
// and each test is given one combination as a parameter.
// Use class definitions to test from this header.
#include <tuple>
#include "prime_tables.h"
#include "gtest/gtest.h"
namespace
{
...
...
googletest/samples/sample9_unittest.cc
View file @
76bce79a
...
...
@@ -40,7 +40,6 @@ using ::testing::Test;
using
::
testing
::
TestEventListeners
;
using
::
testing
::
TestInfo
;
using
::
testing
::
TestPartResult
;
using
::
testing
::
TestSuite
;
using
::
testing
::
UnitTest
;
namespace
{
// Provides alternative output mode which produces minimal amount of
...
...
googletest/src/gtest-assertion-result.cc
View file @
76bce79a
...
...
@@ -44,7 +44,7 @@ namespace testing {
// Used in EXPECT_TRUE/FALSE(assertion_result).
AssertionResult
::
AssertionResult
(
const
AssertionResult
&
other
)
:
success_
(
other
.
success_
),
message_
(
other
.
message_
.
get
()
!=
nullptr
message_
(
other
.
message_
!=
nullptr
?
new
::
std
::
string
(
*
other
.
message_
)
:
static_cast
<
::
std
::
string
*>
(
nullptr
))
{}
...
...
@@ -58,7 +58,7 @@ void AssertionResult::swap(AssertionResult& other) {
// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
AssertionResult
AssertionResult
::
operator
!
()
const
{
AssertionResult
negation
(
!
success_
);
if
(
message_
.
get
()
!=
nullptr
)
negation
<<
*
message_
;
if
(
message_
!=
nullptr
)
negation
<<
*
message_
;
return
negation
;
}
...
...
googletest/src/gtest-death-test.cc
View file @
76bce79a
...
...
@@ -33,14 +33,18 @@
#include "gtest/gtest-death-test.h"
#include <functional>
#include <memory>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
#include "gtest/internal/custom/gtest.h"
#include "gtest/internal/gtest-port.h"
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
#if GTEST_OS_MAC
#if
def
GTEST_OS_MAC
#include <crt_externs.h>
#endif // GTEST_OS_MAC
...
...
@@ -48,24 +52,24 @@
#include <fcntl.h>
#include <limits.h>
#if GTEST_OS_LINUX
#if
def
GTEST_OS_LINUX
#include <signal.h>
#endif // GTEST_OS_LINUX
#include <stdarg.h>
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
#include <windows.h>
#else
#include <sys/mman.h>
#include <sys/wait.h>
#endif // GTEST_OS_WINDOWS
#if GTEST_OS_QNX
#if
def
GTEST_OS_QNX
#include <spawn.h>
#endif // GTEST_OS_QNX
#if GTEST_OS_FUCHSIA
#if
def
GTEST_OS_FUCHSIA
#include <lib/fdio/fd.h>
#include <lib/fdio/io.h>
#include <lib/fdio/spawn.h>
...
...
@@ -131,13 +135,13 @@ GTEST_DEFINE_string_(
namespace
testing
{
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
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 && !GTEST_OS_FUCHSIA
#if !
defined(
GTEST_OS_WINDOWS
)
&& !
defined(
GTEST_OS_FUCHSIA
)
static
bool
g_in_fast_death_test_child
=
false
;
#endif
...
...
@@ -147,7 +151,7 @@ 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 || GTEST_OS_FUCHSIA
#if
defined(
GTEST_OS_WINDOWS
)
||
defined(
GTEST_OS_FUCHSIA
)
// On Windows and Fuchsia, death tests are thread-safe regardless of the value
// of the death_test_style flag.
...
...
@@ -169,7 +173,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 || GTEST_OS_FUCHSIA
#if
defined(
GTEST_OS_WINDOWS
)
||
defined(
GTEST_OS_FUCHSIA
)
return
exit_status
==
exit_code_
;
...
...
@@ -180,7 +184,7 @@ bool ExitedWithCode::operator()(int exit_status) const {
#endif // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
}
#if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
#if !
defined(
GTEST_OS_WINDOWS
)
&& !
defined(
GTEST_OS_FUCHSIA
)
// KilledBySignal constructor.
KilledBySignal
::
KilledBySignal
(
int
signum
)
:
signum_
(
signum
)
{}
...
...
@@ -207,7 +211,7 @@ namespace internal {
static
std
::
string
ExitSummary
(
int
exit_code
)
{
Message
m
;
#if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA
#if
defined(
GTEST_OS_WINDOWS
)
||
defined(
GTEST_OS_FUCHSIA
)
m
<<
"Exited with exit status "
<<
exit_code
;
...
...
@@ -234,7 +238,7 @@ bool ExitedUnsuccessfully(int exit_status) {
return
!
ExitedWithCode
(
0
)(
exit_status
);
}
#if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA
#if !
defined(
GTEST_OS_WINDOWS
)
&& !
defined(
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
...
...
@@ -263,7 +267,7 @@ static const char kDeathTestReturned = 'R';
static
const
char
kDeathTestThrew
=
'T'
;
static
const
char
kDeathTestInternalError
=
'I'
;
#if GTEST_OS_FUCHSIA
#if
def
GTEST_OS_FUCHSIA
// File descriptor used for the pipe in the child process.
static
const
int
kFuchsiaReadPipeFd
=
3
;
...
...
@@ -621,7 +625,18 @@ bool DeathTestImpl::Passed(bool status_ok) {
return
success
;
}
#if GTEST_OS_WINDOWS
// Note: The return value points into args, so the return value's lifetime is
// bound to that of args.
std
::
unique_ptr
<
char
*
[]
>
CreateArgvFromArgs
(
std
::
vector
<
std
::
string
>&
args
)
{
auto
result
=
std
::
make_unique
<
char
*
[]
>
(
args
.
size
()
+
1
);
for
(
size_t
i
=
0
;
i
<
args
.
size
();
++
i
)
{
result
[
i
]
=
&
args
[
i
][
0
];
}
result
[
args
.
size
()]
=
nullptr
;
// extra null terminator
return
result
;
}
#ifdef GTEST_OS_WINDOWS
// WindowsDeathTest implements death tests on Windows. Due to the
// specifics of starting new processes on Windows, death tests there are
// always threadsafe, and Google Test considers the
...
...
@@ -808,7 +823,7 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
return
OVERSEE_TEST
;
}
#elif GTEST_OS_FUCHSIA
#elif
defined(
GTEST_OS_FUCHSIA
)
class
FuchsiaDeathTest
:
public
DeathTestImpl
{
public:
...
...
@@ -836,36 +851,6 @@ class FuchsiaDeathTest : public DeathTestImpl {
zx
::
socket
stderr_socket_
;
};
// Utility class for accumulating command-line arguments.
class
Arguments
{
public:
Arguments
()
{
args_
.
push_back
(
nullptr
);
}
~
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
static_cast
<
int
>
(
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.
...
...
@@ -986,10 +971,10 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
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
()
);
std
::
vector
<
std
::
string
>
args
=
GetInjectableArgvs
();
args
.
push_back
(
filter_flag
);
args
.
push_back
(
internal_flag
);
// Build the pipe for communication with the child.
zx_status_t
status
;
...
...
@@ -1041,8 +1026,14 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
// Spawn the child process.
status
=
fdio_spawn_etc
(
child_job
,
FDIO_SPAWN_CLONE_ALL
,
args
.
Argv
()[
0
],
args
.
Argv
(),
nullptr
,
2
,
spawn_actions
,
// Note: The test component must have `fuchsia.process.Launcher` declared
// in its manifest. (Fuchsia integration tests require creating a
// "Fuchsia Test Component" which contains a "Fuchsia Component Manifest")
// Launching processes is a privileged operation in Fuchsia, and the
// declaration indicates that the ability is required for the component.
std
::
unique_ptr
<
char
*
[]
>
argv
=
CreateArgvFromArgs
(
args
);
status
=
fdio_spawn_etc
(
child_job
,
FDIO_SPAWN_CLONE_ALL
,
argv
[
0
],
argv
.
get
(),
nullptr
,
2
,
spawn_actions
,
child_process_
.
reset_and_get_address
(),
nullptr
);
GTEST_DEATH_TEST_CHECK_
(
status
==
ZX_OK
);
...
...
@@ -1173,34 +1164,6 @@ class ExecDeathTest : public ForkingDeathTest {
const
int
line_
;
};
// Utility class for accumulating command-line arguments.
class
Arguments
{
public:
Arguments
()
{
args_
.
push_back
(
nullptr
);
}
~
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
];
}
private:
std
::
vector
<
char
*>
args_
;
};
// A struct that encompasses the arguments to the child process of a
// threadsafe-style death test process.
struct
ExecDeathTestArgs
{
...
...
@@ -1208,7 +1171,7 @@ struct ExecDeathTestArgs {
int
close_fd
;
// File descriptor to close; the read end of a pipe
};
#if GTEST_OS_QNX
#if
def
GTEST_OS_QNX
extern
"C"
char
**
environ
;
#else // GTEST_OS_QNX
// The main function for a threadsafe-style death test child process.
...
...
@@ -1289,7 +1252,7 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
ExecDeathTestArgs
args
=
{
argv
,
close_fd
};
pid_t
child_pid
=
-
1
;
#if GTEST_OS_QNX
#if
def
GTEST_OS_QNX
// Obtains the current directory and sets it to be closed in the child
// process.
const
int
cwd_fd
=
open
(
"."
,
O_RDONLY
);
...
...
@@ -1320,7 +1283,7 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
GTEST_DEATH_TEST_CHECK_SYSCALL_
(
close
(
cwd_fd
));
#else // GTEST_OS_QNX
#if GTEST_OS_LINUX
#if
def
GTEST_OS_LINUX
// When a SIGPROF signal is received while fork() or clone() are executing,
// the process may hang. To avoid this, we ignore SIGPROF here and re-enable
// it after the call to fork()/clone() is complete.
...
...
@@ -1367,11 +1330,10 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
#endif // GTEST_HAS_CLONE
if
(
use_fork
&&
(
child_pid
=
fork
())
==
0
)
{
ExecDeathTestChildMain
(
&
args
);
_exit
(
0
);
_exit
(
ExecDeathTestChildMain
(
&
args
));
}
#endif // GTEST_OS_QNX
#if GTEST_OS_LINUX
#if
def
GTEST_OS_LINUX
GTEST_DEATH_TEST_CHECK_SYSCALL_
(
sigaction
(
SIGPROF
,
&
saved_sigprof_action
,
nullptr
));
#endif // GTEST_OS_LINUX
...
...
@@ -1410,10 +1372,9 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
StreamableToString
(
line_
)
+
"|"
+
StreamableToString
(
death_test_index
)
+
"|"
+
StreamableToString
(
pipe_fd
[
1
]);
Arguments
args
;
args
.
AddArguments
(
GetArgvsForDeathTestChildProcess
());
args
.
AddArgument
(
filter_flag
.
c_str
());
args
.
AddArgument
(
internal_flag
.
c_str
());
std
::
vector
<
std
::
string
>
args
=
GetArgvsForDeathTestChildProcess
();
args
.
push_back
(
filter_flag
);
args
.
push_back
(
internal_flag
);
DeathTest
::
set_last_death_test_message
(
""
);
...
...
@@ -1422,7 +1383,8 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
// is necessary.
FlushInfoLog
();
const
pid_t
child_pid
=
ExecDeathTestSpawnChild
(
args
.
Argv
(),
pipe_fd
[
0
]);
std
::
unique_ptr
<
char
*
[]
>
argv
=
CreateArgvFromArgs
(
args
);
const
pid_t
child_pid
=
ExecDeathTestSpawnChild
(
argv
.
get
(),
pipe_fd
[
0
]);
GTEST_DEATH_TEST_CHECK_SYSCALL_
(
close
(
pipe_fd
[
1
]));
set_child_pid
(
child_pid
);
set_read_fd
(
pipe_fd
[
0
]);
...
...
@@ -1463,14 +1425,14 @@ bool DefaultDeathTestFactory::Create(const char* statement,
}
}
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
if
(
GTEST_FLAG_GET
(
death_test_style
)
==
"threadsafe"
||
GTEST_FLAG_GET
(
death_test_style
)
==
"fast"
)
{
*
test
=
new
WindowsDeathTest
(
statement
,
std
::
move
(
matcher
),
file
,
line
);
}
#elif GTEST_OS_FUCHSIA
#elif
defined(
GTEST_OS_FUCHSIA
)
if
(
GTEST_FLAG_GET
(
death_test_style
)
==
"threadsafe"
||
GTEST_FLAG_GET
(
death_test_style
)
==
"fast"
)
{
...
...
@@ -1497,7 +1459,7 @@ bool DefaultDeathTestFactory::Create(const char* statement,
return
true
;
}
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
// 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.
...
...
@@ -1564,7 +1526,7 @@ static int GetStatusFileDescriptor(unsigned int parent_process_id,
// initialized from the GTEST_FLAG(internal_run_death_test) flag if
// the flag is specified; otherwise returns NULL.
InternalRunDeathTestFlag
*
ParseInternalRunDeathTestFlag
()
{
if
(
GTEST_FLAG_GET
(
internal_run_death_test
)
==
""
)
return
nullptr
;
if
(
GTEST_FLAG_GET
(
internal_run_death_test
)
.
empty
()
)
return
nullptr
;
// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
// can use it here.
...
...
@@ -1574,7 +1536,7 @@ InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
SplitString
(
GTEST_FLAG_GET
(
internal_run_death_test
),
'|'
,
&
fields
);
int
write_fd
=
-
1
;
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
unsigned
int
parent_process_id
=
0
;
size_t
write_handle_as_size_t
=
0
;
...
...
@@ -1591,7 +1553,7 @@ InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
write_fd
=
GetStatusFileDescriptor
(
parent_process_id
,
write_handle_as_size_t
,
event_handle_as_size_t
);
#elif GTEST_OS_FUCHSIA
#elif
defined(
GTEST_OS_FUCHSIA
)
if
(
fields
.
size
()
!=
3
||
!
ParseNaturalNumber
(
fields
[
1
],
&
line
)
||
!
ParseNaturalNumber
(
fields
[
2
],
&
index
))
{
...
...
googletest/src/gtest-filepath.cc
View file @
76bce79a
...
...
@@ -31,12 +31,15 @@
#include <stdlib.h>
#include <iterator>
#include <string>
#include "gtest/gtest-message.h"
#include "gtest/internal/gtest-port.h"
#if GTEST_OS_WINDOWS_MOBILE
#if
def
GTEST_OS_WINDOWS_MOBILE
#include <windows.h>
#elif GTEST_OS_WINDOWS
#elif
defined(
GTEST_OS_WINDOWS
)
#include <direct.h>
#include <io.h>
#else
...
...
@@ -47,7 +50,7 @@
#include "gtest/internal/gtest-string.h"
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
#define GTEST_PATH_MAX_ _MAX_PATH
#elif defined(PATH_MAX)
#define GTEST_PATH_MAX_ PATH_MAX
...
...
@@ -62,7 +65,7 @@
namespace
testing
{
namespace
internal
{
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
// On Windows, '\\' is the standard path separator, but many tools and the
// Windows API also accept '/' as an alternate path separator. Unless otherwise
// noted, a file path can contain either kind of path separators, or a mixture
...
...
@@ -70,7 +73,7 @@ namespace internal {
const
char
kPathSeparator
=
'\\'
;
const
char
kAlternatePathSeparator
=
'/'
;
const
char
kAlternatePathSeparatorString
[]
=
"/"
;
#if GTEST_OS_WINDOWS_MOBILE
#if
def
GTEST_OS_WINDOWS_MOBILE
// Windows CE doesn't have a current directory. You should not use
// the current directory in tests on Windows CE, but this at least
// provides a reasonable fallback.
...
...
@@ -96,19 +99,20 @@ static bool IsPathSeparator(char c) {
// Returns the current working directory, or "" if unsuccessful.
FilePath
FilePath
::
GetCurrentDir
()
{
#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \
GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_ESP32 || \
GTEST_OS_XTENSA || GTEST_OS_QURT
#if defined(GTEST_OS_WINDOWS_MOBILE) || defined(GTEST_OS_WINDOWS_PHONE) || \
defined(GTEST_OS_WINDOWS_RT) || defined(GTEST_OS_ESP8266) || \
defined(GTEST_OS_ESP32) || defined(GTEST_OS_XTENSA) || \
defined(GTEST_OS_QURT)
// These platforms do not have a current directory, so we just return
// something reasonable.
return
FilePath
(
kCurrentDirectoryString
);
#elif GTEST_OS_WINDOWS
#elif
defined(
GTEST_OS_WINDOWS
)
char
cwd
[
GTEST_PATH_MAX_
+
1
]
=
{
'\0'
};
return
FilePath
(
_getcwd
(
cwd
,
sizeof
(
cwd
))
==
nullptr
?
""
:
cwd
);
#else
char
cwd
[
GTEST_PATH_MAX_
+
1
]
=
{
'\0'
};
char
*
result
=
getcwd
(
cwd
,
sizeof
(
cwd
));
#if GTEST_OS_NACL
#if
def
GTEST_OS_NACL
// getcwd will likely fail in NaCl due to the sandbox, so return something
// reasonable. The user may have provided a shim implementation for getcwd,
// however, so fallback only when failure is detected.
...
...
@@ -151,7 +155,7 @@ size_t FilePath::CalculateRootLength() const {
const
auto
&
path
=
pathname_
;
auto
s
=
path
.
begin
();
auto
end
=
path
.
end
();
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
if
(
end
-
s
>=
2
&&
s
[
1
]
==
':'
&&
(
end
-
s
==
2
||
IsPathSeparator
(
s
[
2
]))
&&
((
'A'
<=
s
[
0
]
&&
s
[
0
]
<=
'Z'
)
||
(
'a'
<=
s
[
0
]
&&
s
[
0
]
<=
'z'
)))
{
// A typical absolute path like "C:\Windows" or "D:"
...
...
@@ -244,7 +248,7 @@ FilePath FilePath::ConcatPaths(const FilePath& directory,
// Returns true if pathname describes something findable in the file-system,
// either a file, directory, or whatever.
bool
FilePath
::
FileOrDirectoryExists
()
const
{
#if GTEST_OS_WINDOWS_MOBILE
#if
def
GTEST_OS_WINDOWS_MOBILE
LPCWSTR
unicode
=
String
::
AnsiToUtf16
(
pathname_
.
c_str
());
const
DWORD
attributes
=
GetFileAttributes
(
unicode
);
delete
[]
unicode
;
...
...
@@ -259,7 +263,7 @@ bool FilePath::FileOrDirectoryExists() const {
// that exists.
bool
FilePath
::
DirectoryExists
()
const
{
bool
result
=
false
;
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
// Don't strip off trailing separator if path is a root directory on
// Windows (like "C:\\").
const
FilePath
&
path
(
IsRootDirectory
()
?
*
this
...
...
@@ -268,7 +272,7 @@ bool FilePath::DirectoryExists() const {
const
FilePath
&
path
(
*
this
);
#endif
#if GTEST_OS_WINDOWS_MOBILE
#if
def
GTEST_OS_WINDOWS_MOBILE
LPCWSTR
unicode
=
String
::
AnsiToUtf16
(
path
.
c_str
());
const
DWORD
attributes
=
GetFileAttributes
(
unicode
);
delete
[]
unicode
;
...
...
@@ -344,14 +348,15 @@ bool FilePath::CreateDirectoriesRecursively() const {
// directory for any reason, including if the parent directory does not
// exist. Not named "CreateDirectory" because that's a macro on Windows.
bool
FilePath
::
CreateFolder
()
const
{
#if GTEST_OS_WINDOWS_MOBILE
#if
def
GTEST_OS_WINDOWS_MOBILE
FilePath
removed_sep
(
this
->
RemoveTrailingPathSeparator
());
LPCWSTR
unicode
=
String
::
AnsiToUtf16
(
removed_sep
.
c_str
());
int
result
=
CreateDirectory
(
unicode
,
nullptr
)
?
0
:
-
1
;
delete
[]
unicode
;
#elif GTEST_OS_WINDOWS
#elif
defined(
GTEST_OS_WINDOWS
)
int
result
=
_mkdir
(
pathname_
.
c_str
());
#elif GTEST_OS_ESP8266 || GTEST_OS_XTENSA || GTEST_OS_QURT
#elif defined(GTEST_OS_ESP8266) || defined(GTEST_OS_XTENSA) || \
defined(GTEST_OS_QURT)
// do nothing
int
result
=
0
;
#else
...
...
@@ -380,7 +385,7 @@ void FilePath::Normalize() {
auto
out
=
pathname_
.
begin
();
auto
i
=
pathname_
.
cbegin
();
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
// UNC paths are treated specially
if
(
pathname_
.
end
()
-
i
>=
3
&&
IsPathSeparator
(
*
i
)
&&
IsPathSeparator
(
*
(
i
+
1
))
&&
!
IsPathSeparator
(
*
(
i
+
2
)))
{
...
...
googletest/src/gtest-internal-inl.h
View file @
76bce79a
...
...
@@ -55,7 +55,7 @@
#include <netdb.h> // NOLINT
#endif
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
#include <windows.h> // NOLINT
#endif // GTEST_OS_WINDOWS
...
...
@@ -93,7 +93,7 @@ GTEST_API_ TimeInMillis GetTimeInMillis();
GTEST_API_
bool
ShouldUseColor
(
bool
stdout_is_tty
);
// Formats the given time in milliseconds as seconds. If the input is an exact N
// seconds, the output has a trailing decimal point (e.g., "N." intead of "N").
// seconds, the output has a trailing decimal point (e.g., "N." in
s
tead of "N").
GTEST_API_
std
::
string
FormatTimeInMillisAsSeconds
(
TimeInMillis
ms
);
// Converts the given time in milliseconds to a date string in the ISO 8601
...
...
@@ -384,7 +384,7 @@ class GTEST_API_ UnitTestOptions {
static
bool
FilterMatchesTest
(
const
std
::
string
&
test_suite_name
,
const
std
::
string
&
test_name
);
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
// Function for supporting the gtest_catch_exception flag.
// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
...
...
@@ -407,8 +407,8 @@ GTEST_API_ FilePath GetCurrentExecutableName();
// The role interface for getting the OS stack trace as a string.
class
OsStackTraceGetterInterface
{
public:
OsStackTraceGetterInterface
()
{}
virtual
~
OsStackTraceGetterInterface
()
{}
OsStackTraceGetterInterface
()
=
default
;
virtual
~
OsStackTraceGetterInterface
()
=
default
;
// Returns the current OS stack trace as an std::string. Parameters:
//
...
...
@@ -436,13 +436,13 @@ class OsStackTraceGetterInterface {
// A working implementation of the OsStackTraceGetterInterface interface.
class
OsStackTraceGetter
:
public
OsStackTraceGetterInterface
{
public:
OsStackTraceGetter
()
{}
OsStackTraceGetter
()
=
default
;
std
::
string
CurrentStackTrace
(
int
max_depth
,
int
skip_count
)
override
;
void
UponLeavingGTest
()
override
;
private:
#if GTEST_HAS_ABSL
#if
def
GTEST_HAS_ABSL
Mutex
mutex_
;
// Protects all internal state.
// We save the stack frame below the frame that calls user code.
...
...
@@ -672,7 +672,7 @@ class GTEST_API_ UnitTestImpl {
void
AddTestInfo
(
internal
::
SetUpTestSuiteFunc
set_up_tc
,
internal
::
TearDownTestSuiteFunc
tear_down_tc
,
TestInfo
*
test_info
)
{
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
// In order to support thread-safe death tests, we need to
// remember the original working directory when the test program
// was first invoked. We cannot do this in RUN_ALL_TESTS(), as
...
...
@@ -778,7 +778,7 @@ class GTEST_API_ UnitTestImpl {
return
gtest_trace_stack_
.
get
();
}
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
void
InitDeathTestSubprocessControlInfo
()
{
internal_run_death_test_flag_
.
reset
(
ParseInternalRunDeathTestFlag
());
}
...
...
@@ -943,7 +943,7 @@ class GTEST_API_ UnitTestImpl {
// How long the test took to run, in milliseconds.
TimeInMillis
elapsed_time_
;
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
// The decomposed components of the gtest_internal_run_death_test flag,
// parsed when RUN_ALL_TESTS is called.
std
::
unique_ptr
<
InternalRunDeathTestFlag
>
internal_run_death_test_flag_
;
...
...
@@ -967,7 +967,7 @@ inline UnitTestImpl* GetUnitTestImpl() {
return
UnitTest
::
GetInstance
()
->
impl
();
}
#if GTEST_USES_SIMPLE_RE
#if
def
GTEST_USES_SIMPLE_RE
// Internal helper functions for implementing the simple regular
// expression matcher.
...
...
@@ -993,7 +993,7 @@ GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
GTEST_API_
void
ParseGoogleTestFlagsOnly
(
int
*
argc
,
char
**
argv
);
GTEST_API_
void
ParseGoogleTestFlagsOnly
(
int
*
argc
,
wchar_t
**
argv
);
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
// Returns the message describing the last system error, regardless of the
// platform.
...
...
@@ -1064,7 +1064,7 @@ class StreamingListener : public EmptyTestEventListener {
// Abstract base class for writing strings to a socket.
class
AbstractSocketWriter
{
public:
virtual
~
AbstractSocketWriter
()
{}
virtual
~
AbstractSocketWriter
()
=
default
;
// Sends a string to the socket.
virtual
void
Send
(
const
std
::
string
&
message
)
=
0
;
...
...
googletest/src/gtest-port.cc
View file @
76bce79a
...
...
@@ -37,8 +37,12 @@
#include <cstdint>
#include <fstream>
#include <memory>
#include <ostream>
#include <string>
#include <utility>
#include <vector>
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
#include <io.h>
#include <sys/stat.h>
#include <windows.h>
...
...
@@ -51,32 +55,34 @@
#include <unistd.h>
#endif // GTEST_OS_WINDOWS
#if GTEST_OS_MAC
#if
def
GTEST_OS_MAC
#include <mach/mach_init.h>
#include <mach/task.h>
#include <mach/vm_map.h>
#endif // GTEST_OS_MAC
#if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \
GTEST_OS_NETBSD || GTEST_OS_OPENBSD
#if defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_FREEBSD) || \
defined(GTEST_OS_GNU_KFREEBSD) || defined(GTEST_OS_NETBSD) || \
defined(GTEST_OS_OPENBSD)
#include <sys/sysctl.h>
#if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD
#if defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_FREEBSD) || \
defined(GTEST_OS_GNU_KFREEBSD)
#include <sys/user.h>
#endif
#endif
#if GTEST_OS_QNX
#if
def
GTEST_OS_QNX
#include <devctl.h>
#include <fcntl.h>
#include <sys/procfs.h>
#endif // GTEST_OS_QNX
#if GTEST_OS_AIX
#if
def
GTEST_OS_AIX
#include <procinfo.h>
#include <sys/types.h>
#endif // GTEST_OS_AIX
#if GTEST_OS_FUCHSIA
#if
def
GTEST_OS_FUCHSIA
#include <zircon/process.h>
#include <zircon/syscalls.h>
#endif // GTEST_OS_FUCHSIA
...
...
@@ -90,7 +96,7 @@
namespace
testing
{
namespace
internal
{
#if GTEST_OS_LINUX || GTEST_OS_GNU_HURD
#if
defined(
GTEST_OS_LINUX
)
||
defined(
GTEST_OS_GNU_HURD
)
namespace
{
template
<
typename
T
>
...
...
@@ -113,7 +119,7 @@ size_t GetThreadCount() {
return
ReadProcFileField
<
size_t
>
(
filename
,
19
);
}
#elif GTEST_OS_MAC
#elif
defined(
GTEST_OS_MAC
)
size_t
GetThreadCount
()
{
const
task_t
task
=
mach_task_self
();
...
...
@@ -131,20 +137,20 @@ size_t GetThreadCount() {
}
}
#elif GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD
|| GTEST_OS_GNU_KFREEBSD
|| \
GTEST_OS_NETBSD
#elif
defined(
GTEST_OS_DRAGONFLY
)
||
defined(
GTEST_OS_FREEBSD
)
|| \
defined(GTEST_OS_GNU_KFREEBSD) || defined(
GTEST_OS_NETBSD
)
#if GTEST_OS_NETBSD
#if
def
GTEST_OS_NETBSD
#undef KERN_PROC
#define KERN_PROC KERN_PROC2
#define kinfo_proc kinfo_proc2
#endif
#if GTEST_OS_DRAGONFLY
#if
def
GTEST_OS_DRAGONFLY
#define KP_NLWP(kp) (kp.kp_nthreads)
#elif GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD
#elif
defined(
GTEST_OS_FREEBSD
)
||
defined(
GTEST_OS_GNU_KFREEBSD
)
#define KP_NLWP(kp) (kp.ki_numthreads)
#elif GTEST_OS_NETBSD
#elif
defined(
GTEST_OS_NETBSD
)
#define KP_NLWP(kp) (kp.p_nlwps)
#endif
...
...
@@ -156,7 +162,7 @@ size_t GetThreadCount() {
KERN_PROC
,
KERN_PROC_PID
,
getpid
(),
#if GTEST_OS_NETBSD
#if
def
GTEST_OS_NETBSD
sizeof
(
struct
kinfo_proc
),
1
,
#endif
...
...
@@ -169,7 +175,7 @@ size_t GetThreadCount() {
}
return
static_cast
<
size_t
>
(
KP_NLWP
(
info
));
}
#elif GTEST_OS_OPENBSD
#elif
defined(
GTEST_OS_OPENBSD
)
// Returns the number of threads running in the process, or 0 to indicate that
// we cannot detect it.
...
...
@@ -206,7 +212,7 @@ size_t GetThreadCount() {
return
nthreads
;
}
#elif GTEST_OS_QNX
#elif
defined(
GTEST_OS_QNX
)
// Returns the number of threads running in the process, or 0 to indicate that
// we cannot detect it.
...
...
@@ -226,7 +232,7 @@ size_t GetThreadCount() {
}
}
#elif GTEST_OS_AIX
#elif
defined(
GTEST_OS_AIX
)
size_t
GetThreadCount
()
{
struct
procentry64
entry
;
...
...
@@ -239,7 +245,7 @@ size_t GetThreadCount() {
}
}
#elif GTEST_OS_FUCHSIA
#elif
defined(
GTEST_OS_FUCHSIA
)
size_t
GetThreadCount
()
{
int
dummy_buffer
;
...
...
@@ -264,7 +270,7 @@ size_t GetThreadCount() {
#endif // GTEST_OS_LINUX
#if GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS
#if
defined(
GTEST_IS_THREADSAFE
)
&&
defined(
GTEST_OS_WINDOWS
)
AutoHandle
::
AutoHandle
()
:
handle_
(
INVALID_HANDLE_VALUE
)
{}
...
...
@@ -655,7 +661,7 @@ void ThreadLocalRegistry::OnThreadLocalDestroyed(
#endif // GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS
#if GTEST_USES_POSIX_RE
#if
def
GTEST_USES_POSIX_RE
// Implements RE. Currently only needed for death tests.
...
...
@@ -668,7 +674,6 @@ RE::~RE() {
regfree
(
&
partial_regex_
);
regfree
(
&
full_regex_
);
}
free
(
const_cast
<
char
*>
(
pattern_
));
}
// Returns true if and only if regular expression re matches the entire str.
...
...
@@ -690,7 +695,7 @@ bool RE::PartialMatch(const char* str, const RE& re) {
// Initializes an RE from its string representation.
void
RE
::
Init
(
const
char
*
regex
)
{
pattern_
=
posix
::
StrDup
(
regex
)
;
pattern_
=
regex
;
// Reserves enough bytes to hold the regular expression used for a
// full match.
...
...
@@ -718,7 +723,7 @@ void RE::Init(const char* regex) {
delete
[]
full_pattern
;
}
#elif GTEST_USES_SIMPLE_RE
#elif
defined(
GTEST_USES_SIMPLE_RE
)
// Returns true if and only if ch appears anywhere in str (excluding the
// terminating '\0' character).
...
...
@@ -920,27 +925,26 @@ bool MatchRegexAnywhere(const char* regex, const char* str) {
// Implements the RE class.
RE
::~
RE
()
{
free
(
const_cast
<
char
*>
(
pattern_
));
free
(
const_cast
<
char
*>
(
full_pattern_
));
}
RE
::~
RE
()
=
default
;
// Returns true if and only if regular expression re matches the entire str.
bool
RE
::
FullMatch
(
const
char
*
str
,
const
RE
&
re
)
{
return
re
.
is_valid_
&&
MatchRegexAnywhere
(
re
.
full_pattern_
,
str
);
return
re
.
is_valid_
&&
MatchRegexAnywhere
(
re
.
full_pattern_
.
c_str
()
,
str
);
}
// Returns true if and only if regular expression re matches a substring of
// str (including str itself).
bool
RE
::
PartialMatch
(
const
char
*
str
,
const
RE
&
re
)
{
return
re
.
is_valid_
&&
MatchRegexAnywhere
(
re
.
pattern_
,
str
);
return
re
.
is_valid_
&&
MatchRegexAnywhere
(
re
.
pattern_
.
c_str
()
,
str
);
}
// Initializes an RE from its string representation.
void
RE
::
Init
(
const
char
*
regex
)
{
pattern_
=
full_pattern_
=
nullptr
;
full_pattern_
.
clear
();
pattern_
.
clear
();
if
(
regex
!=
nullptr
)
{
pattern_
=
posix
::
StrDup
(
regex
)
;
pattern_
=
regex
;
}
is_valid_
=
ValidateRegex
(
regex
);
...
...
@@ -949,25 +953,19 @@ void RE::Init(const char* regex) {
return
;
}
const
size_t
len
=
strlen
(
regex
);
// Reserves enough bytes to hold the regular expression used for a
// full match: we need space to prepend a '^', append a '$', and
// terminate the string with '\0'.
char
*
buffer
=
static_cast
<
char
*>
(
malloc
(
len
+
3
));
full_pattern_
=
buffer
;
// full match: we need space to prepend a '^' and append a '$'.
full_pattern_
.
reserve
(
pattern_
.
size
()
+
2
);
if
(
*
regex
!=
'^'
)
*
buffer
++
=
'^'
;
// Makes sure full_pattern_ starts with '^'.
// We don't use snprintf or strncpy, as they trigger a warning when
// compiled with VC++ 8.0.
memcpy
(
buffer
,
regex
,
len
);
buffer
+=
len
;
if
(
pattern_
.
empty
()
||
pattern_
.
front
()
!=
'^'
)
{
full_pattern_
.
push_back
(
'^'
);
// Makes sure full_pattern_ starts with '^'.
}
if
(
len
==
0
||
regex
[
len
-
1
]
!=
'$'
)
*
buffer
++
=
'$'
;
// Makes sure full_pattern_ ends with '$'.
full_pattern_
.
append
(
pattern_
);
*
buffer
=
'\0'
;
if
(
pattern_
.
empty
()
||
pattern_
.
back
()
!=
'$'
)
{
full_pattern_
.
push_back
(
'$'
);
// Makes sure full_pattern_ ends with '$'.
}
}
#endif // GTEST_USES_POSIX_RE
...
...
@@ -1035,7 +1033,7 @@ class CapturedStream {
public:
// The ctor redirects the stream to a temporary file.
explicit
CapturedStream
(
int
fd
)
:
fd_
(
fd
),
uncaptured_fd_
(
dup
(
fd
))
{
#if GTEST_OS_WINDOWS
#if
def
GTEST_OS_WINDOWS
char
temp_dir_path
[
MAX_PATH
+
1
]
=
{
'\0'
};
// NOLINT
char
temp_file_path
[
MAX_PATH
+
1
]
=
{
'\0'
};
// NOLINT
...
...
@@ -1054,7 +1052,7 @@ class CapturedStream {
// directory, so we create the temporary file in a temporary directory.
std
::
string
name_template
;
#if GTEST_OS_LINUX_ANDROID
#if
def
GTEST_OS_LINUX_ANDROID
// Note: Android applications are expected to call the framework's
// Context.getExternalStorageDirectory() method through JNI to get
// the location of the world-writable SD Card directory. However,
...
...
@@ -1067,7 +1065,7 @@ class CapturedStream {
// '/sdcard' and other variants cannot be relied on, as they are not
// guaranteed to be mounted, or may have a delay in mounting.
name_template
=
"/data/local/tmp/"
;
#elif GTEST_OS_IOS
#elif
defined(
GTEST_OS_IOS
)
char
user_temp_dir
[
PATH_MAX
+
1
];
// Documented alternative to NSTemporaryDirectory() (for obtaining creating
...
...
@@ -1227,7 +1225,7 @@ std::string ReadEntireFile(FILE* file) {
return
content
;
}
#if GTEST_HAS_DEATH_TEST
#if
def
GTEST_HAS_DEATH_TEST
static
const
std
::
vector
<
std
::
string
>*
g_injected_test_argvs
=
nullptr
;
// Owned.
...
...
@@ -1254,7 +1252,7 @@ void ClearInjectableArgvs() {
}
#endif // GTEST_HAS_DEATH_TEST
#if GTEST_OS_WINDOWS_MOBILE
#if
def
GTEST_OS_WINDOWS_MOBILE
namespace
posix
{
void
Abort
()
{
DebugBreak
();
...
...
googletest/src/gtest-printers.cc
View file @
76bce79a
...
...
@@ -47,6 +47,8 @@
#include <cctype>
#include <cstdint>
#include <cwchar>
#include <iomanip>
#include <ios>
#include <ostream> // NOLINT
#include <string>
#include <type_traits>
...
...
@@ -528,7 +530,7 @@ void PrintStringTo(const ::std::string& s, ostream* os) {
}
}
#ifdef __cpp_char8_t
#ifdef __cpp_
lib_
char8_t
void
PrintU8StringTo
(
const
::
std
::
u8string
&
s
,
ostream
*
os
)
{
PrintCharsAsStringTo
(
s
.
data
(),
s
.
size
(),
os
);
}
...
...
Prev
1
2
3
4
5
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