Merge pull request #2 from google/master
merge upstream/master into master
This commit is contained in:
commit
130e5aa86a
|
@ -10,6 +10,13 @@ language: cpp
|
||||||
# It is more tedious, but grants us far more flexibility.
|
# It is more tedious, but grants us far more flexibility.
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
|
- os: linux
|
||||||
|
dist: trusty
|
||||||
|
sudo: required
|
||||||
|
group: deprecated-2017Q3
|
||||||
|
before_install: chmod -R +x ./ci/*platformio.sh
|
||||||
|
install: ./ci/install-platformio.sh
|
||||||
|
script: ./ci/build-platformio.sh
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
sudo : true
|
sudo : true
|
||||||
|
|
|
@ -26,7 +26,7 @@ If you are a Googler, you can either create an internal change or work on GitHub
|
||||||
## Contributing A Patch
|
## Contributing A Patch
|
||||||
|
|
||||||
1. Submit an issue describing your proposed change to the
|
1. Submit an issue describing your proposed change to the
|
||||||
[issue tracker](https://github.com/abseil/googletest).
|
[issue tracker](https://github.com/google/googletest).
|
||||||
1. Please don't mix more than one logical change per submittal,
|
1. Please don't mix more than one logical change per submittal,
|
||||||
because it makes the history hard to follow. If you want to make a
|
because it makes the history hard to follow. If you want to make a
|
||||||
change that doesn't have a corresponding issue in the issue
|
change that doesn't have a corresponding issue in the issue
|
||||||
|
@ -79,7 +79,7 @@ itself is a valuable contribution.
|
||||||
To keep the source consistent, readable, diffable and easy to merge,
|
To keep the source consistent, readable, diffable and easy to merge,
|
||||||
we use a fairly rigid coding style, as defined by the [google-styleguide](https://github.com/google/styleguide) project. All patches will be expected
|
we use a fairly rigid coding style, as defined by the [google-styleguide](https://github.com/google/styleguide) project. All patches will be expected
|
||||||
to conform to the style outlined [here](https://google.github.io/styleguide/cppguide.html).
|
to conform to the style outlined [here](https://google.github.io/styleguide/cppguide.html).
|
||||||
Use [.clang-format](https://github.com/abseil/googletest/blob/master/.clang-format) to check your formatting
|
Use [.clang-format](https://github.com/google/googletest/blob/master/.clang-format) to check your formatting
|
||||||
|
|
||||||
## Requirements for Contributors ###
|
## Requirements for Contributors ###
|
||||||
|
|
||||||
|
|
2
ci/build-platformio.sh
Normal file
2
ci/build-platformio.sh
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# run PlatformIO builds
|
||||||
|
platformio run
|
5
ci/install-platformio.sh
Normal file
5
ci/install-platformio.sh
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# install PlatformIO
|
||||||
|
sudo pip install -U platformio
|
||||||
|
|
||||||
|
# update PlatformIO
|
||||||
|
platformio update
|
|
@ -5,7 +5,7 @@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
|
||||||
Name: gmock
|
Name: gmock
|
||||||
Description: GoogleMock (without main() function)
|
Description: GoogleMock (without main() function)
|
||||||
Version: @PROJECT_VERSION@
|
Version: @PROJECT_VERSION@
|
||||||
URL: https://github.com/abseil/googletest
|
URL: https://github.com/google/googletest
|
||||||
Requires: gtest
|
Requires: gtest
|
||||||
Libs: -L${libdir} -lgmock @CMAKE_THREAD_LIBS_INIT@
|
Libs: -L${libdir} -lgmock @CMAKE_THREAD_LIBS_INIT@
|
||||||
Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@
|
Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@
|
||||||
|
|
|
@ -5,7 +5,7 @@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
|
||||||
Name: gmock_main
|
Name: gmock_main
|
||||||
Description: GoogleMock (with main() function)
|
Description: GoogleMock (with main() function)
|
||||||
Version: @PROJECT_VERSION@
|
Version: @PROJECT_VERSION@
|
||||||
URL: https://github.com/abseil/googletest
|
URL: https://github.com/google/googletest
|
||||||
Requires: gmock
|
Requires: gmock
|
||||||
Libs: -L${libdir} -lgmock_main @CMAKE_THREAD_LIBS_INIT@
|
Libs: -L${libdir} -lgmock_main @CMAKE_THREAD_LIBS_INIT@
|
||||||
Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@
|
Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@
|
||||||
|
|
|
@ -661,7 +661,7 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
|
||||||
// MORE INFORMATION:
|
// MORE INFORMATION:
|
||||||
//
|
//
|
||||||
// To learn more about using these macros, please search for 'ACTION' on
|
// To learn more about using these macros, please search for 'ACTION' on
|
||||||
// https://github.com/abseil/googletest/blob/master/googlemock/docs/CookBook.md
|
// https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md
|
||||||
|
|
||||||
// An internal macro needed for implementing ACTION*().
|
// An internal macro needed for implementing ACTION*().
|
||||||
#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
|
#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
|
||||||
|
|
|
@ -289,7 +289,7 @@ $range j2 2..i
|
||||||
// MORE INFORMATION:
|
// MORE INFORMATION:
|
||||||
//
|
//
|
||||||
// To learn more about using these macros, please search for 'ACTION' on
|
// To learn more about using these macros, please search for 'ACTION' on
|
||||||
// https://github.com/abseil/googletest/blob/master/googlemock/docs/CookBook.md
|
// https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md
|
||||||
|
|
||||||
$range i 0..n
|
$range i 0..n
|
||||||
$range k 0..n-1
|
$range k 0..n-1
|
||||||
|
|
|
@ -261,7 +261,7 @@
|
||||||
//
|
//
|
||||||
// To learn more about using these macros, please search for 'MATCHER'
|
// To learn more about using these macros, please search for 'MATCHER'
|
||||||
// on
|
// on
|
||||||
// https://github.com/abseil/googletest/blob/master/googlemock/docs/CookBook.md
|
// https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md
|
||||||
|
|
||||||
#define MATCHER(name, description)\
|
#define MATCHER(name, description)\
|
||||||
class name##Matcher {\
|
class name##Matcher {\
|
||||||
|
|
|
@ -263,7 +263,7 @@ $$ }} This line fixes auto-indentation of the following code in Emacs.
|
||||||
//
|
//
|
||||||
// To learn more about using these macros, please search for 'MATCHER'
|
// To learn more about using these macros, please search for 'MATCHER'
|
||||||
// on
|
// on
|
||||||
// https://github.com/abseil/googletest/blob/master/googlemock/docs/CookBook.md
|
// https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md
|
||||||
|
|
||||||
$range i 0..n
|
$range i 0..n
|
||||||
$for i
|
$for i
|
||||||
|
|
|
@ -1296,14 +1296,24 @@ class PredicateFormatterFromMatcher {
|
||||||
// We don't write MatcherCast<const T&> either, as that allows
|
// We don't write MatcherCast<const T&> either, as that allows
|
||||||
// potentially unsafe downcasting of the matcher argument.
|
// potentially unsafe downcasting of the matcher argument.
|
||||||
const Matcher<const T&> matcher = SafeMatcherCast<const T&>(matcher_);
|
const Matcher<const T&> matcher = SafeMatcherCast<const T&>(matcher_);
|
||||||
StringMatchResultListener listener;
|
|
||||||
if (MatchPrintAndExplain(x, matcher, &listener))
|
// The expected path here is that the matcher should match (i.e. that most
|
||||||
|
// tests pass) so optimize for this case.
|
||||||
|
if (matcher.Matches(x)) {
|
||||||
return AssertionSuccess();
|
return AssertionSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
::std::stringstream ss;
|
::std::stringstream ss;
|
||||||
ss << "Value of: " << value_text << "\n"
|
ss << "Value of: " << value_text << "\n"
|
||||||
<< "Expected: ";
|
<< "Expected: ";
|
||||||
matcher.DescribeTo(&ss);
|
matcher.DescribeTo(&ss);
|
||||||
|
|
||||||
|
// Rerun the matcher to "PrintAndExain" the failure.
|
||||||
|
StringMatchResultListener listener;
|
||||||
|
if (MatchPrintAndExplain(x, matcher, &listener)) {
|
||||||
|
ss << "\n The matcher failed on the initial attempt; but passed when "
|
||||||
|
"rerun to generate the explanation.";
|
||||||
|
}
|
||||||
ss << "\n Actual: " << listener.str();
|
ss << "\n Actual: " << listener.str();
|
||||||
return AssertionFailure() << ss.str();
|
return AssertionFailure() << ss.str();
|
||||||
}
|
}
|
||||||
|
|
|
@ -291,7 +291,7 @@ void ReportUninterestingCall(CallReaction reaction, const std::string& msg) {
|
||||||
"call should not happen. Do not suppress it by blindly adding "
|
"call should not happen. Do not suppress it by blindly adding "
|
||||||
"an EXPECT_CALL() if you don't mean to enforce the call. "
|
"an EXPECT_CALL() if you don't mean to enforce the call. "
|
||||||
"See "
|
"See "
|
||||||
"https://github.com/abseil/googletest/blob/master/googlemock/"
|
"https://github.com/google/googletest/blob/master/googlemock/"
|
||||||
"docs/CookBook.md#"
|
"docs/CookBook.md#"
|
||||||
"knowing-when-to-expect for details.\n",
|
"knowing-when-to-expect for details.\n",
|
||||||
stack_frames_to_skip);
|
stack_frames_to_skip);
|
||||||
|
|
|
@ -32,6 +32,22 @@
|
||||||
#include "gmock/gmock.h"
|
#include "gmock/gmock.h"
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
#ifdef ARDUINO
|
||||||
|
void setup() {
|
||||||
|
// Since Arduino doesn't have a command line, fake out the argc/argv arguments
|
||||||
|
int argc = 1;
|
||||||
|
const auto arg0 = "PlatformIO";
|
||||||
|
char* argv0 = const_cast<char*>(arg0);
|
||||||
|
char** argv = &argv0;
|
||||||
|
|
||||||
|
// Since Google Mock depends on Google Test, InitGoogleMock() is
|
||||||
|
// also responsible for initializing Google Test. Therefore there's
|
||||||
|
// no need for calling testing::InitGoogleTest() separately.
|
||||||
|
testing::InitGoogleMock(&argc, argv);
|
||||||
|
}
|
||||||
|
void loop() { RUN_ALL_TESTS(); }
|
||||||
|
#else
|
||||||
|
|
||||||
// MS C++ compiler/linker has a bug on Windows (not on Windows CE), which
|
// MS C++ compiler/linker has a bug on Windows (not on Windows CE), which
|
||||||
// causes a link error when _tmain is defined in a static library and UNICODE
|
// causes a link error when _tmain is defined in a static library and UNICODE
|
||||||
// is enabled. For this reason instead of _tmain, main function is used on
|
// is enabled. For this reason instead of _tmain, main function is used on
|
||||||
|
@ -52,3 +68,4 @@ GTEST_API_ int main(int argc, char** argv) {
|
||||||
testing::InitGoogleMock(&argc, argv);
|
testing::InitGoogleMock(&argc, argv);
|
||||||
return RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -85,6 +85,7 @@ using std::pair;
|
||||||
using std::set;
|
using std::set;
|
||||||
using std::stringstream;
|
using std::stringstream;
|
||||||
using std::vector;
|
using std::vector;
|
||||||
|
using testing::_;
|
||||||
using testing::A;
|
using testing::A;
|
||||||
using testing::AllArgs;
|
using testing::AllArgs;
|
||||||
using testing::AllOf;
|
using testing::AllOf;
|
||||||
|
@ -110,12 +111,12 @@ using testing::Le;
|
||||||
using testing::Lt;
|
using testing::Lt;
|
||||||
using testing::MakeMatcher;
|
using testing::MakeMatcher;
|
||||||
using testing::MakePolymorphicMatcher;
|
using testing::MakePolymorphicMatcher;
|
||||||
using testing::MatchResultListener;
|
|
||||||
using testing::Matcher;
|
using testing::Matcher;
|
||||||
using testing::MatcherCast;
|
using testing::MatcherCast;
|
||||||
using testing::MatcherInterface;
|
using testing::MatcherInterface;
|
||||||
using testing::Matches;
|
using testing::Matches;
|
||||||
using testing::MatchesRegex;
|
using testing::MatchesRegex;
|
||||||
|
using testing::MatchResultListener;
|
||||||
using testing::NanSensitiveDoubleEq;
|
using testing::NanSensitiveDoubleEq;
|
||||||
using testing::NanSensitiveDoubleNear;
|
using testing::NanSensitiveDoubleNear;
|
||||||
using testing::NanSensitiveFloatEq;
|
using testing::NanSensitiveFloatEq;
|
||||||
|
@ -135,15 +136,14 @@ using testing::StartsWith;
|
||||||
using testing::StrCaseEq;
|
using testing::StrCaseEq;
|
||||||
using testing::StrCaseNe;
|
using testing::StrCaseNe;
|
||||||
using testing::StrEq;
|
using testing::StrEq;
|
||||||
using testing::StrNe;
|
|
||||||
using testing::StringMatchResultListener;
|
using testing::StringMatchResultListener;
|
||||||
|
using testing::StrNe;
|
||||||
using testing::Truly;
|
using testing::Truly;
|
||||||
using testing::TypedEq;
|
using testing::TypedEq;
|
||||||
using testing::UnorderedPointwise;
|
using testing::UnorderedPointwise;
|
||||||
using testing::Value;
|
using testing::Value;
|
||||||
using testing::WhenSorted;
|
using testing::WhenSorted;
|
||||||
using testing::WhenSortedBy;
|
using testing::WhenSortedBy;
|
||||||
using testing::_;
|
|
||||||
using testing::internal::DummyMatchResultListener;
|
using testing::internal::DummyMatchResultListener;
|
||||||
using testing::internal::ElementMatcherPair;
|
using testing::internal::ElementMatcherPair;
|
||||||
using testing::internal::ElementMatcherPairs;
|
using testing::internal::ElementMatcherPairs;
|
||||||
|
@ -152,10 +152,11 @@ using testing::internal::FloatingEqMatcher;
|
||||||
using testing::internal::FormatMatcherDescription;
|
using testing::internal::FormatMatcherDescription;
|
||||||
using testing::internal::IsReadableTypeName;
|
using testing::internal::IsReadableTypeName;
|
||||||
using testing::internal::MatchMatrix;
|
using testing::internal::MatchMatrix;
|
||||||
|
using testing::internal::PredicateFormatterFromMatcher;
|
||||||
using testing::internal::RE;
|
using testing::internal::RE;
|
||||||
using testing::internal::StreamMatchResultListener;
|
using testing::internal::StreamMatchResultListener;
|
||||||
using testing::internal::Strings;
|
|
||||||
using testing::internal::string;
|
using testing::internal::string;
|
||||||
|
using testing::internal::Strings;
|
||||||
|
|
||||||
// For testing ExplainMatchResultTo().
|
// For testing ExplainMatchResultTo().
|
||||||
class GreaterThanMatcher : public MatcherInterface<int> {
|
class GreaterThanMatcher : public MatcherInterface<int> {
|
||||||
|
@ -4932,7 +4933,7 @@ TYPED_TEST(ContainerEqTest, DuplicateDifference) {
|
||||||
}
|
}
|
||||||
#endif // GTEST_HAS_TYPED_TEST
|
#endif // GTEST_HAS_TYPED_TEST
|
||||||
|
|
||||||
// Tests that mutliple missing values are reported.
|
// Tests that multiple missing values are reported.
|
||||||
// Using just vector here, so order is predictable.
|
// Using just vector here, so order is predictable.
|
||||||
TEST(ContainerEqExtraTest, MultipleValuesMissing) {
|
TEST(ContainerEqExtraTest, MultipleValuesMissing) {
|
||||||
static const int vals[] = {1, 1, 2, 3, 5, 8};
|
static const int vals[] = {1, 1, 2, 3, 5, 8};
|
||||||
|
@ -6910,6 +6911,88 @@ TEST(ArgsTest, ExplainsMatchResultWithInnerExplanation) {
|
||||||
Explain(m, std::make_tuple('\0', 42, 43)));
|
Explain(m, std::make_tuple('\0', 42, 43)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PredicateFormatterFromMatcherTest : public ::testing::Test {
|
||||||
|
protected:
|
||||||
|
enum Behavior { kInitialSuccess, kAlwaysFail, kFlaky };
|
||||||
|
|
||||||
|
// A matcher that can return different results when used multiple times on the
|
||||||
|
// same input. No real matcher should do this; but this lets us test that we
|
||||||
|
// detect such behavior and fail appropriately.
|
||||||
|
class MockMatcher : public MatcherInterface<Behavior> {
|
||||||
|
public:
|
||||||
|
bool MatchAndExplain(Behavior behavior,
|
||||||
|
MatchResultListener* listener) const override {
|
||||||
|
*listener << "[MatchAndExplain]";
|
||||||
|
switch (behavior) {
|
||||||
|
case kInitialSuccess:
|
||||||
|
// The first call to MatchAndExplain should use a "not interested"
|
||||||
|
// listener; so this is expected to return |true|. There should be no
|
||||||
|
// subsequent calls.
|
||||||
|
return !listener->IsInterested();
|
||||||
|
|
||||||
|
case kAlwaysFail:
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case kFlaky:
|
||||||
|
// The first call to MatchAndExplain should use a "not interested"
|
||||||
|
// listener; so this will return |false|. Subsequent calls should have
|
||||||
|
// an "interested" listener; so this will return |true|, thus
|
||||||
|
// simulating a flaky matcher.
|
||||||
|
return listener->IsInterested();
|
||||||
|
}
|
||||||
|
|
||||||
|
GTEST_LOG_(FATAL) << "This should never be reached";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DescribeTo(ostream* os) const override { *os << "[DescribeTo]"; }
|
||||||
|
|
||||||
|
void DescribeNegationTo(ostream* os) const override {
|
||||||
|
*os << "[DescribeNegationTo]";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
AssertionResult RunPredicateFormatter(Behavior behavior) {
|
||||||
|
auto matcher = MakeMatcher(new MockMatcher);
|
||||||
|
PredicateFormatterFromMatcher<Matcher<Behavior>> predicate_formatter(
|
||||||
|
matcher);
|
||||||
|
return predicate_formatter("dummy-name", behavior);
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string kMatcherType =
|
||||||
|
"testing::gmock_matchers_test::PredicateFormatterFromMatcherTest::"
|
||||||
|
"Behavior";
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(PredicateFormatterFromMatcherTest, ShortCircuitOnSuccess) {
|
||||||
|
AssertionResult result = RunPredicateFormatter(kInitialSuccess);
|
||||||
|
EXPECT_TRUE(result); // Implicit cast to bool.
|
||||||
|
std::string expect;
|
||||||
|
EXPECT_EQ(expect, result.message());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(PredicateFormatterFromMatcherTest, NoShortCircuitOnFailure) {
|
||||||
|
AssertionResult result = RunPredicateFormatter(kAlwaysFail);
|
||||||
|
EXPECT_FALSE(result); // Implicit cast to bool.
|
||||||
|
std::string expect =
|
||||||
|
"Value of: dummy-name\nExpected: [DescribeTo]\n"
|
||||||
|
" Actual: 1" +
|
||||||
|
OfType(kMatcherType) + ", [MatchAndExplain]";
|
||||||
|
EXPECT_EQ(expect, result.message());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(PredicateFormatterFromMatcherTest, DetectsFlakyShortCircuit) {
|
||||||
|
AssertionResult result = RunPredicateFormatter(kFlaky);
|
||||||
|
EXPECT_FALSE(result); // Implicit cast to bool.
|
||||||
|
std::string expect =
|
||||||
|
"Value of: dummy-name\nExpected: [DescribeTo]\n"
|
||||||
|
" The matcher failed on the initial attempt; but passed when rerun to "
|
||||||
|
"generate the explanation.\n"
|
||||||
|
" Actual: 2" +
|
||||||
|
OfType(kMatcherType) + ", [MatchAndExplain]";
|
||||||
|
EXPECT_EQ(expect, result.message());
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace gmock_matchers_test
|
} // namespace gmock_matchers_test
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
|
|
||||||
|
|
|
@ -2176,7 +2176,7 @@ class GMockVerboseFlagTest : public VerboseFlagPreservingFixture {
|
||||||
"call should not happen. Do not suppress it by blindly adding "
|
"call should not happen. Do not suppress it by blindly adding "
|
||||||
"an EXPECT_CALL() if you don't mean to enforce the call. "
|
"an EXPECT_CALL() if you don't mean to enforce the call. "
|
||||||
"See "
|
"See "
|
||||||
"https://github.com/abseil/googletest/blob/master/googlemock/docs/"
|
"https://github.com/google/googletest/blob/master/googlemock/docs/"
|
||||||
"CookBook.md#"
|
"CookBook.md#"
|
||||||
"knowing-when-to-expect for details.";
|
"knowing-when-to-expect for details.";
|
||||||
|
|
||||||
|
|
|
@ -75,14 +75,14 @@ GMOCK WARNING:
|
||||||
Uninteresting mock function call - returning default value.
|
Uninteresting mock function call - returning default value.
|
||||||
Function call: Bar2(0, 1)
|
Function call: Bar2(0, 1)
|
||||||
Returns: false
|
Returns: false
|
||||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/abseil/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.
|
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.
|
||||||
[ OK ] GMockOutputTest.UninterestingCall
|
[ OK ] GMockOutputTest.UninterestingCall
|
||||||
[ RUN ] GMockOutputTest.UninterestingCallToVoidFunction
|
[ RUN ] GMockOutputTest.UninterestingCallToVoidFunction
|
||||||
|
|
||||||
GMOCK WARNING:
|
GMOCK WARNING:
|
||||||
Uninteresting mock function call - returning directly.
|
Uninteresting mock function call - returning directly.
|
||||||
Function call: Bar3(0, 1)
|
Function call: Bar3(0, 1)
|
||||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/abseil/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.
|
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.
|
||||||
[ OK ] GMockOutputTest.UninterestingCallToVoidFunction
|
[ OK ] GMockOutputTest.UninterestingCallToVoidFunction
|
||||||
[ RUN ] GMockOutputTest.RetiredExpectation
|
[ RUN ] GMockOutputTest.RetiredExpectation
|
||||||
unknown file: Failure
|
unknown file: Failure
|
||||||
|
@ -266,14 +266,14 @@ Uninteresting mock function call - taking default action specified at:
|
||||||
FILE:#:
|
FILE:#:
|
||||||
Function call: Bar2(2, 2)
|
Function call: Bar2(2, 2)
|
||||||
Returns: true
|
Returns: true
|
||||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/abseil/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.
|
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.
|
||||||
|
|
||||||
GMOCK WARNING:
|
GMOCK WARNING:
|
||||||
Uninteresting mock function call - taking default action specified at:
|
Uninteresting mock function call - taking default action specified at:
|
||||||
FILE:#:
|
FILE:#:
|
||||||
Function call: Bar2(1, 1)
|
Function call: Bar2(1, 1)
|
||||||
Returns: false
|
Returns: false
|
||||||
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/abseil/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.
|
NOTE: You can safely ignore the above warning unless this call should not happen. Do not suppress it by blindly adding an EXPECT_CALL() if you don't mean to enforce the call. See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#knowing-when-to-expect for details.
|
||||||
[ OK ] GMockOutputTest.UninterestingCallWithDefaultAction
|
[ OK ] GMockOutputTest.UninterestingCallWithDefaultAction
|
||||||
[ RUN ] GMockOutputTest.ExplicitActionsRunOutWithDefaultAction
|
[ RUN ] GMockOutputTest.ExplicitActionsRunOutWithDefaultAction
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,6 @@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
|
||||||
Name: gtest
|
Name: gtest
|
||||||
Description: GoogleTest (without main() function)
|
Description: GoogleTest (without main() function)
|
||||||
Version: @PROJECT_VERSION@
|
Version: @PROJECT_VERSION@
|
||||||
URL: https://github.com/abseil/googletest
|
URL: https://github.com/google/googletest
|
||||||
Libs: -L${libdir} -lgtest @CMAKE_THREAD_LIBS_INIT@
|
Libs: -L${libdir} -lgtest @CMAKE_THREAD_LIBS_INIT@
|
||||||
Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@
|
Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@
|
||||||
|
|
|
@ -5,7 +5,7 @@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
|
||||||
Name: gtest_main
|
Name: gtest_main
|
||||||
Description: GoogleTest (with main() function)
|
Description: GoogleTest (with main() function)
|
||||||
Version: @PROJECT_VERSION@
|
Version: @PROJECT_VERSION@
|
||||||
URL: https://github.com/abseil/googletest
|
URL: https://github.com/google/googletest
|
||||||
Requires: gtest
|
Requires: gtest
|
||||||
Libs: -L${libdir} -lgtest_main @CMAKE_THREAD_LIBS_INIT@
|
Libs: -L${libdir} -lgtest_main @CMAKE_THREAD_LIBS_INIT@
|
||||||
Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@
|
Cflags: -I${includedir} @GTEST_HAS_PTHREAD_MACRO@ @CMAKE_THREAD_LIBS_INIT@
|
||||||
|
|
|
@ -285,7 +285,7 @@
|
||||||
# define GTEST_FLAG_PREFIX_DASH_ "gtest-"
|
# define GTEST_FLAG_PREFIX_DASH_ "gtest-"
|
||||||
# define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
|
# define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
|
||||||
# define GTEST_NAME_ "Google Test"
|
# define GTEST_NAME_ "Google Test"
|
||||||
# define GTEST_PROJECT_URL_ "https://github.com/abseil/googletest/"
|
# define GTEST_PROJECT_URL_ "https://github.com/google/googletest/"
|
||||||
#endif // !defined(GTEST_DEV_EMAIL_)
|
#endif // !defined(GTEST_DEV_EMAIL_)
|
||||||
|
|
||||||
#if !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
|
#if !defined(GTEST_INIT_GOOGLE_TEST_NAME_)
|
||||||
|
@ -785,13 +785,17 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||||
# define GTEST_HAS_SEH 0
|
# define GTEST_HAS_SEH 0
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#define GTEST_IS_THREADSAFE \
|
|
||||||
(GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ \
|
|
||||||
|| (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) \
|
|
||||||
|| GTEST_HAS_PTHREAD)
|
|
||||||
|
|
||||||
#endif // GTEST_HAS_SEH
|
#endif // GTEST_HAS_SEH
|
||||||
|
|
||||||
|
#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)
|
||||||
|
|
||||||
|
#endif // GTEST_IS_THREADSAFE
|
||||||
|
|
||||||
// GTEST_API_ qualifies all symbols that must be exported. The definitions below
|
// GTEST_API_ qualifies all symbols that must be exported. The definitions below
|
||||||
// are guarded by #ifndef to give embedders a chance to define GTEST_API_ in
|
// are guarded by #ifndef to give embedders a chance to define GTEST_API_ in
|
||||||
// gtest/internal/custom/gtest-port.h
|
// gtest/internal/custom/gtest-port.h
|
||||||
|
|
|
@ -246,7 +246,7 @@ static std::string DeathTestThreadWarning(size_t thread_count) {
|
||||||
msg << "detected " << thread_count << " threads.";
|
msg << "detected " << thread_count << " threads.";
|
||||||
}
|
}
|
||||||
msg << " See "
|
msg << " See "
|
||||||
"https://github.com/abseil/googletest/blob/master/googletest/docs/"
|
"https://github.com/google/googletest/blob/master/googletest/docs/"
|
||||||
"advanced.md#death-tests-and-threads"
|
"advanced.md#death-tests-and-threads"
|
||||||
<< " for more explanation and suggested solutions, especially if"
|
<< " for more explanation and suggested solutions, especially if"
|
||||||
<< " this is the last message you see before your test times out.";
|
<< " this is the last message you see before your test times out.";
|
||||||
|
|
|
@ -3761,7 +3761,8 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputXmlAttribute(stream, kTestcase, "status",
|
OutputXmlAttribute(stream, kTestcase, "status",
|
||||||
test_info.should_run() ? "run" : "notrun");
|
result.Skipped() ? "skipped" :
|
||||||
|
test_info.should_run() ? "run" : "notrun");
|
||||||
OutputXmlAttribute(stream, kTestcase, "time",
|
OutputXmlAttribute(stream, kTestcase, "time",
|
||||||
FormatTimeInMillisAsSeconds(result.elapsed_time()));
|
FormatTimeInMillisAsSeconds(result.elapsed_time()));
|
||||||
OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
|
OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
|
||||||
|
@ -4126,6 +4127,7 @@ void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream,
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputJsonKey(stream, kTestcase, "status",
|
OutputJsonKey(stream, kTestcase, "status",
|
||||||
|
result.Skipped() ? "SKIPPED" :
|
||||||
test_info.should_run() ? "RUN" : "NOTRUN", kIndent);
|
test_info.should_run() ? "RUN" : "NOTRUN", kIndent);
|
||||||
OutputJsonKey(stream, kTestcase, "time",
|
OutputJsonKey(stream, kTestcase, "time",
|
||||||
FormatTimeInMillisAsDuration(result.elapsed_time()), kIndent);
|
FormatTimeInMillisAsDuration(result.elapsed_time()), kIndent);
|
||||||
|
@ -5363,7 +5365,7 @@ bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
|
||||||
// each TestCase and TestInfo object.
|
// each TestCase and TestInfo object.
|
||||||
// If shard_tests == true, further filters tests based on sharding
|
// If shard_tests == true, further filters tests based on sharding
|
||||||
// variables in the environment - see
|
// variables in the environment - see
|
||||||
// https://github.com/abseil/googletest/blob/master/googletest/docs/advanced.md
|
// https://github.com/google/googletest/blob/master/googletest/docs/advanced.md
|
||||||
// . Returns the number of tests that should run.
|
// . Returns the number of tests that should run.
|
||||||
int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
|
int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
|
||||||
const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
|
const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
|
||||||
|
|
|
@ -30,8 +30,24 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
#ifdef ARDUINO
|
||||||
|
void setup() {
|
||||||
|
// Since Arduino doesn't have a command line, fake out the argc/argv arguments
|
||||||
|
int argc = 1;
|
||||||
|
const auto arg0 = "PlatformIO";
|
||||||
|
char* argv0 = const_cast<char*>(arg0);
|
||||||
|
char** argv = &argv0;
|
||||||
|
|
||||||
|
testing::InitGoogleTest(&argc, argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() { RUN_ALL_TESTS(); }
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
GTEST_API_ int main(int argc, char **argv) {
|
GTEST_API_ int main(int argc, char **argv) {
|
||||||
printf("Running main() from %s\n", __FILE__);
|
printf("Running main() from %s\n", __FILE__);
|
||||||
testing::InitGoogleTest(&argc, argv);
|
testing::InitGoogleTest(&argc, argv);
|
||||||
return RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -57,7 +57,7 @@ else:
|
||||||
STACK_TRACE_TEMPLATE = ''
|
STACK_TRACE_TEMPLATE = ''
|
||||||
|
|
||||||
EXPECTED_NON_EMPTY = {
|
EXPECTED_NON_EMPTY = {
|
||||||
u'tests': 23,
|
u'tests': 24,
|
||||||
u'failures': 4,
|
u'failures': 4,
|
||||||
u'disabled': 2,
|
u'disabled': 2,
|
||||||
u'errors': 0,
|
u'errors': 0,
|
||||||
|
@ -123,6 +123,22 @@ EXPECTED_NON_EMPTY = {
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
u'name': u'SkippedTest',
|
||||||
|
u'tests': 1,
|
||||||
|
u'failures': 0,
|
||||||
|
u'disabled': 0,
|
||||||
|
u'errors': 0,
|
||||||
|
u'time': u'*',
|
||||||
|
u'testsuite': [
|
||||||
|
{
|
||||||
|
u'name': u'Skipped',
|
||||||
|
u'status': u'SKIPPED',
|
||||||
|
u'time': u'*',
|
||||||
|
u'classname': u'SkippedTest'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
u'name': u'MixedResultTest',
|
u'name': u'MixedResultTest',
|
||||||
u'tests': 3,
|
u'tests': 3,
|
||||||
|
|
|
@ -65,7 +65,7 @@ else:
|
||||||
sys.argv.remove(NO_STACKTRACE_SUPPORT_FLAG)
|
sys.argv.remove(NO_STACKTRACE_SUPPORT_FLAG)
|
||||||
|
|
||||||
EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<testsuites tests="23" failures="4" disabled="2" errors="0" time="*" timestamp="*" name="AllTests" ad_hoc_property="42">
|
<testsuites tests="24" failures="4" disabled="2" errors="0" time="*" timestamp="*" name="AllTests" ad_hoc_property="42">
|
||||||
<testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
<testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||||
<testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
|
<testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
|
@ -108,6 +108,9 @@ Invalid characters in brackets []%(stack)s]]></failure>
|
||||||
<testsuite name="DisabledTest" tests="1" failures="0" disabled="1" errors="0" time="*">
|
<testsuite name="DisabledTest" tests="1" failures="0" disabled="1" errors="0" time="*">
|
||||||
<testcase name="DISABLED_test_not_run" status="notrun" time="*" classname="DisabledTest"/>
|
<testcase name="DISABLED_test_not_run" status="notrun" time="*" classname="DisabledTest"/>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
|
<testsuite name="SkippedTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||||
|
<testcase name="Skipped" status="skipped" time="*" classname="SkippedTest"/>
|
||||||
|
</testsuite>
|
||||||
<testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*" SetUpTestCase="yes" TearDownTestCase="aye">
|
<testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*" SetUpTestCase="yes" TearDownTestCase="aye">
|
||||||
<testcase name="OneProperty" status="run" time="*" classname="PropertyRecordingTest">
|
<testcase name="OneProperty" status="run" time="*" classname="PropertyRecordingTest">
|
||||||
<properties>
|
<properties>
|
||||||
|
@ -183,15 +186,15 @@ EXPECTED_SHARDED_TEST_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
<testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||||
<testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
|
<testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
<testsuite name="NoFixtureTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
<testsuite name="PropertyRecordingTest" tests="1" failures="0" disabled="0" errors="0" time="*" SetUpTestCase="yes" TearDownTestCase="aye">
|
||||||
<testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest">
|
<testcase name="TwoValuesForOneKeyUsesLastValue" status="run" time="*" classname="PropertyRecordingTest">
|
||||||
<properties>
|
<properties>
|
||||||
<property name="key" value="1"/>
|
<property name="key_1" value="2"/>
|
||||||
</properties>
|
</properties>
|
||||||
</testcase>
|
</testcase>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
<testsuite name="Single/ValueParamTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
<testsuite name="Single/ValueParamTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||||
<testcase name="AnotherTestThatHasValueParamAttribute/1" value_param="42" status="run" time="*" classname="Single/ValueParamTest" />
|
<testcase name="AnotherTestThatHasValueParamAttribute/0" value_param="33" status="run" time="*" classname="Single/ValueParamTest" />
|
||||||
</testsuite>
|
</testsuite>
|
||||||
</testsuites>"""
|
</testsuites>"""
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,13 @@ TEST_F(DisabledTest, DISABLED_test_not_run) {
|
||||||
FAIL() << "Unexpected failure: Disabled test should not be run";
|
FAIL() << "Unexpected failure: Disabled test should not be run";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SkippedTest : public Test {
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(SkippedTest, Skipped) {
|
||||||
|
GTEST_SKIP();
|
||||||
|
}
|
||||||
|
|
||||||
TEST(MixedResultTest, Succeeds) {
|
TEST(MixedResultTest, Succeeds) {
|
||||||
EXPECT_EQ(1, 1);
|
EXPECT_EQ(1, 1);
|
||||||
ASSERT_EQ(1, 1);
|
ASSERT_EQ(1, 1);
|
||||||
|
|
51
library.json
Normal file
51
library.json
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
{
|
||||||
|
"name": "googletest",
|
||||||
|
"keywords": "unittest, unit, test, gtest, gmock",
|
||||||
|
"description": "googletest is a testing framework developed by the Testing Technology team with Google's specific requirements and constraints in mind. No matter whether you work on Linux, Windows, or a Mac, if you write C++ code, googletest can help you. And it supports any kind of tests, not just unit tests.",
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"homepage": "https://github.com/abseil/googletest/blob/master/README.md",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/abseil/googletest.git"
|
||||||
|
},
|
||||||
|
"version": "1.8.1",
|
||||||
|
"exclude": [
|
||||||
|
"ci",
|
||||||
|
"googlemock/build-aux",
|
||||||
|
"googlemock/cmake",
|
||||||
|
"googlemock/make",
|
||||||
|
"googlemock/msvc",
|
||||||
|
"googlemock/scripts",
|
||||||
|
"googlemock/test",
|
||||||
|
"googlemock/CMakeLists.txt",
|
||||||
|
"googlemock/Makefile.am",
|
||||||
|
"googlemock/configure.ac",
|
||||||
|
"googletest/cmake",
|
||||||
|
"googletest/codegear",
|
||||||
|
"googletest/m4",
|
||||||
|
"googletest/make",
|
||||||
|
"googletest/msvc",
|
||||||
|
"googletest/scripts",
|
||||||
|
"googletest/test",
|
||||||
|
"googletest/xcode",
|
||||||
|
"googletest/CMakeLists.txt",
|
||||||
|
"googletest/Makefile.am",
|
||||||
|
"googletest/configure.ac",
|
||||||
|
],
|
||||||
|
"frameworks": "arduino",
|
||||||
|
"platforms": [
|
||||||
|
"espressif32"
|
||||||
|
],
|
||||||
|
"export": {
|
||||||
|
"include": [
|
||||||
|
"googlemock/include/*",
|
||||||
|
"googletest/include/*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"build": {
|
||||||
|
"flags": [
|
||||||
|
"-I googlemock/include",
|
||||||
|
"-I googletest/include"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
31
platformio.ini
Normal file
31
platformio.ini
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
; PlatformIO Project Configuration File
|
||||||
|
;
|
||||||
|
; Build options: build flags, source filter
|
||||||
|
; Upload options: custom upload port, speed and extra flags
|
||||||
|
; Library options: dependencies, extra library storages
|
||||||
|
; Advanced options: extra scripting
|
||||||
|
;
|
||||||
|
; Please visit documentation for the other options and examples
|
||||||
|
; http://docs.platformio.org/page/projectconf.html
|
||||||
|
|
||||||
|
|
||||||
|
[platformio]
|
||||||
|
#src_dir = ./googlemock
|
||||||
|
#src_dir = ./googletest
|
||||||
|
src_dir = .
|
||||||
|
|
||||||
|
[env:googletest_esp32]
|
||||||
|
platform = espressif32
|
||||||
|
board = esp32dev
|
||||||
|
framework = arduino
|
||||||
|
build_flags = -I./googletest/include -I./googletest
|
||||||
|
src_filter = +<*> -<.git/> -<googlemock> -<googletest/codegear/> -<googletest/samples> -<googletest/test/> -<googletest/xcode> -<googletest/src> +<googletest/src/gtest-all.cc> +<googletest/src/gtest_main.cc>
|
||||||
|
upload_speed = 921600
|
||||||
|
|
||||||
|
[env:googlemock_esp32]
|
||||||
|
platform = espressif32
|
||||||
|
board = esp32dev
|
||||||
|
framework = arduino
|
||||||
|
build_flags = -I./googlemock/include -I./googletest/include -I./googletest -I./googlemock
|
||||||
|
src_filter = +<*> -<.git/> -<googletest> -<googlemock/test/> -<googlemock/src> +<googlemock/src/gmock-all.cc> +<googlemock/src/gmock_main.cc> +<googletest/src/gtest-all.cc>
|
||||||
|
upload_speed = 921600
|
Loading…
Reference in New Issue
Block a user