15 #include "absl/status/statusor.h"
18 #include <initializer_list>
21 #include <type_traits>
24 #include "gmock/gmock.h"
25 #include "gtest/gtest.h"
26 #include "absl/base/casts.h"
27 #include "absl/memory/memory.h"
28 #include "absl/status/status.h"
29 #include "absl/strings/string_view.h"
30 #include "absl/types/any.h"
31 #include "absl/utility/utility.h"
36 using ::testing::AnyWith;
43 using ::testing::VariantWith;
45 #ifdef GTEST_HAS_STATUS_MATCHERS
47 using ::testing::status::IsOkAndHolds;
48 #else // GTEST_HAS_STATUS_MATCHERS
60 template <
typename StatusOrType>
61 class IsOkAndHoldsMatcherImpl
67 template <
typename InnerMatcher>
68 explicit IsOkAndHoldsMatcherImpl(InnerMatcher&& inner_matcher)
72 void DescribeTo(std::ostream* os)
const override {
73 *os <<
"is OK and has a value that ";
74 inner_matcher_.DescribeTo(os);
78 *os <<
"isn't OK or has a value that ";
79 inner_matcher_.DescribeNegationTo(os);
83 StatusOrType actual_value,
85 if (!actual_value.ok()) {
86 *result_listener <<
"which has status " << actual_value.status();
92 inner_matcher_.MatchAndExplain(*actual_value, &inner_listener);
94 if (!inner_explanation.empty()) {
95 *result_listener <<
"which contains value "
103 const ::testing::Matcher<const value_type&> inner_matcher_;
107 template <
typename InnerMatcher>
108 class IsOkAndHoldsMatcher {
110 explicit IsOkAndHoldsMatcher(InnerMatcher inner_matcher)
111 : inner_matcher_(
std::
move(inner_matcher)) {}
116 template <
typename StatusOrType>
117 operator ::testing::Matcher<StatusOrType>()
const {
118 return ::testing::Matcher<StatusOrType>(
119 new IsOkAndHoldsMatcherImpl<const StatusOrType&>(inner_matcher_));
123 const InnerMatcher inner_matcher_;
128 template <
typename T>
131 void DescribeTo(std::ostream* os)
const override { *os <<
"is OK"; }
137 return GetStatus(actual_value).ok();
144 template <
typename T>
145 operator ::testing::Matcher<T>()
const {
146 return ::testing::Matcher<T>(
new MonoIsOkMatcherImpl<T>());
152 #define EXPECT_OK(expression) EXPECT_THAT(expression, IsOk())
156 template <
typename InnerMatcher>
158 InnerMatcher&& inner_matcher) {
160 std::forward<InnerMatcher>(inner_matcher));
164 inline IsOkMatcher
IsOk() {
return IsOkMatcher(); }
165 #endif // GTEST_HAS_STATUS_MATCHERS
167 struct CopyDetector {
168 CopyDetector() =
default;
169 explicit CopyDetector(
int xx) :
x(xx) {}
170 CopyDetector(CopyDetector&&
d) noexcept
171 :
x(
d.x), copied(
false), moved(
true) {}
172 CopyDetector(
const CopyDetector&
d) :
x(
d.
x), copied(
true), moved(
false) {}
173 CopyDetector& operator=(
const CopyDetector&
c) {
179 CopyDetector& operator=(CopyDetector&&
c) noexcept {
192 Field(&CopyDetector::copied,
c));
207 class Derived :
public Base1,
public Base2 {
209 virtual ~Derived() {}
216 CopyNoAssign(
const CopyNoAssign& other) :
foo(other.
foo) {}
220 const CopyNoAssign& operator=(
const CopyNoAssign&);
225 return absl::make_unique<int>(0);
239 thing = ReturnUniquePtr();
256 TEST(
StatusOr, TestMoveOnlyInitializationFromTemporaryByValueOrDie) {
257 std::unique_ptr<int>
ptr(*ReturnUniquePtr());
261 TEST(
StatusOr, TestValueOrDieOverloadForConstTemporary) {
266 "value() for const temporaries should return const T&&");
275 const int* const_previous = const_thing->get();
276 const_thing = ReturnUniquePtr();
279 EXPECT_NE(const_previous, const_thing->get());
284 std::vector<absl::StatusOr<std::unique_ptr<int>>> vec;
285 vec.push_back(ReturnUniquePtr());
309 TEST(BadStatusOrAccessTest, CopyConstructionWhatOk) {
318 TEST(BadStatusOrAccessTest, CopyAssignmentWhatOk) {
328 TEST(BadStatusOrAccessTest, MoveConstructionWhatOk) {
336 TEST(BadStatusOrAccessTest, MoveAssignmentWhatOk) {
348 #ifdef ABSL_HAVE_EXCEPTIONS
349 #define EXPECT_DEATH_OR_THROW(statement, status_) \
354 } catch (const absl::BadStatusOrAccess& e) { \
355 EXPECT_EQ(e.status(), status_); \
356 EXPECT_THAT(e.what(), HasSubstr(e.status().ToString())); \
360 absl::BadStatusOrAccess);
361 #else // ABSL_HAVE_EXCEPTIONS
362 #define EXPECT_DEATH_OR_THROW(statement, status) \
363 EXPECT_DEATH_IF_SUPPORTED(statement, status.ToString());
364 #endif // ABSL_HAVE_EXCEPTIONS
366 TEST(StatusOrDeathTest, TestDefaultCtorValue) {
373 TEST(StatusOrDeathTest, TestValueNotOk) {
378 TEST(StatusOrDeathTest, TestValueNotOkConst) {
383 TEST(StatusOrDeathTest, TestPointerDefaultCtorValue) {
388 TEST(StatusOrDeathTest, TestPointerValueNotOk) {
393 TEST(StatusOrDeathTest, TestPointerValueNotOkConst) {
398 #if GTEST_HAS_DEATH_TEST
399 TEST(StatusOrDeathTest, TestStatusCtorStatusOk) {
409 "An OK status is not a valid constructor argument");
412 TEST(StatusOrDeathTest, TestPointerStatusCtorStatusOk) {
421 "An OK status is not a valid constructor argument");
426 const int kIntValue = 110;
435 IsOkAndHolds(CopyDetectorHas(kIntValue,
false,
false)));
436 CopyDetector copy_detector = status_or.value();
437 EXPECT_THAT(copy_detector, CopyDetectorHas(kIntValue,
false,
true));
438 copy_detector =
std::move(status_or).value();
439 EXPECT_THAT(copy_detector, CopyDetectorHas(kIntValue,
true,
false));
464 explicit Foo(
int y) :
x(
y) {}
472 struct InPlaceHelper {
473 InPlaceHelper(std::initializer_list<int> xs, std::unique_ptr<int> yy)
475 const std::vector<int>
x;
476 std::unique_ptr<int>
y;
481 absl::make_unique<int>(13));
489 status_or_foo.emplace(20);
494 EXPECT_EQ(status_or_foo.status().message(),
"msg");
495 status_or_foo.emplace(20);
501 absl::make_unique<int>(13));
502 status_or.
emplace({1, 2, 3}, absl::make_unique<int>(4));
509 EXPECT_EQ(status_or.status().message(),
"msg");
510 status_or.emplace({1, 2, 3}, absl::make_unique<int>(4));
532 CopyNoAssign
value(kI);
556 const auto p = std::make_shared<int>(17);
573 const auto p = std::make_shared<int>(17);
641 const auto p =
new int(17);
661 struct ImplicitConstructibleFromA {
664 ImplicitConstructibleFromA(
const A&
a)
666 ImplicitConstructibleFromA(
A&&
a)
675 Field(&ImplicitConstructibleFromA::moved,
true))));
680 Field(&ImplicitConstructibleFromA::moved,
false))));
683 struct ExplicitConstructibleFromA {
686 explicit ExplicitConstructibleFromA(
const A&
a) :
x(
a.
x), moved(
false) {}
687 explicit ExplicitConstructibleFromA(
A&&
a) :
x(
a.
x), moved(
true) {}
700 Field(&ExplicitConstructibleFromA::moved,
true))));
705 Field(&ExplicitConstructibleFromA::moved,
false))));
708 struct ImplicitConstructibleFromBool {
709 ImplicitConstructibleFromBool(
bool y) :
x(
y) {}
713 struct ConvertibleToBool {
714 explicit ConvertibleToBool(
bool y) :
x(
y) {}
715 operator bool()
const {
return x; }
719 TEST(
StatusOr, ImplicitBooleanConstructionWithImplicitCasts) {
723 IsOkAndHolds(
false));
737 IsOkAndHolds(
false));
763 IsOkAndHolds(
false));
769 IsOkAndHolds(
false));
772 IsOkAndHolds(
"foo"));
775 IsOkAndHolds(
"foo"));
779 std::make_shared<std::string>(
"foo"))),
787 IsOkAndHolds(
false));
791 IsOkAndHolds(
false));
794 struct ExplicitConstructibleFromInt {
796 explicit ExplicitConstructibleFromInt(
int y) :
x(
y) {}
807 absl::implicit_cast<absl::StatusOr<absl::variant<int, std::string>>>(10);
808 EXPECT_THAT(status_or, IsOkAndHolds(VariantWith<int>(10)));
811 TEST(
StatusOr, ImplicitConstructionFromInitliazerList) {
815 absl::implicit_cast<absl::StatusOr<std::vector<int>>>({{10, 20, 30}});
820 auto status_or = absl::implicit_cast<absl::StatusOr<std::unique_ptr<Base1>>>(
821 absl::make_unique<Derived>());
825 TEST(
StatusOr, NestedStatusOrCopyAndMoveConstructorTests) {
830 IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10,
true,
false))));
832 EXPECT_THAT(
a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10,
false,
true))));
838 EXPECT_THAT(
b, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10,
false,
true))));
844 EXPECT_THAT(
c, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10,
true,
false))));
855 EXPECT_THAT(
a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10,
false,
true))));
861 EXPECT_THAT(
a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10,
false,
true))));
866 EXPECT_THAT(
a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10,
true,
false))));
873 Copyable(
const Copyable&) {}
874 Copyable& operator=(
const Copyable&) {
return *
this; }
879 MoveOnly(MoveOnly&&) {}
880 MoveOnly& operator=(MoveOnly&&) {
return *
this; }
885 NonMovable(
const NonMovable&) =
delete;
886 NonMovable(NonMovable&&) =
delete;
887 NonMovable& operator=(
const NonMovable&) =
delete;
888 NonMovable& operator=(NonMovable&&) =
delete;
906 TEST(
StatusOr, StatusOrAnyCopyAndMoveConstructorTests) {
911 IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10,
true,
false))));
914 a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10,
false,
true))));
922 b, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10,
false,
true))));
930 c, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10,
true,
false))));
941 a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10,
false,
true))));
948 a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10,
false,
true))));
954 a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10,
true,
false))));
961 ASSERT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(10,
false,
false)));
963 EXPECT_THAT(
a, IsOkAndHolds(CopyDetectorHas(10,
false,
true)));
966 EXPECT_THAT(
b, IsOkAndHolds(CopyDetectorHas(10,
false,
true)));
968 EXPECT_THAT(
c, IsOkAndHolds(CopyDetectorHas(10,
true,
false)));
973 ASSERT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(10,
false,
false)));
976 EXPECT_THAT(
a, IsOkAndHolds(CopyDetectorHas(10,
false,
true)));
980 EXPECT_THAT(
b, IsOkAndHolds(CopyDetectorHas(10,
false,
true)));
983 EXPECT_THAT(
c, IsOkAndHolds(CopyDetectorHas(10,
true,
false)));
997 EXPECT_THAT(status_or, IsOkAndHolds(VariantWith<int>(10)));
1002 status_or = *status_or;
1013 status_or = absl::make_unique<Derived>();
1019 struct B :
public A {};
1020 struct C :
private A {};
1113 const auto raw =
new int(17);
1142 struct FromConstructibleAssignableLvalue {};
1143 struct FromConstructibleAssignableRvalue {};
1144 struct FromImplicitConstructibleOnly {};
1145 struct FromAssignableOnly {};
1153 MockValue(
const FromConstructibleAssignableLvalue&)
1156 MockValue(FromConstructibleAssignableRvalue&&)
1160 MockValue(
const FromImplicitConstructibleOnly&)
1163 MockValue& operator=(
const FromConstructibleAssignableLvalue&) {
1164 from_rvalue =
false;
1169 MockValue& operator=(FromConstructibleAssignableRvalue&&) {
1176 MockValue& operator=(
const FromAssignableOnly&) {
1177 from_rvalue =
false;
1188 constexpr
int kValue1 = 10, kValue2 = 20;
1190 CopyDetector lvalue(kValue1);
1192 EXPECT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(kValue1,
false,
true)));
1193 status_or = CopyDetector(kValue2);
1194 EXPECT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(kValue2,
true,
false)));
1199 const FromConstructibleAssignableLvalue&>::
value));
1201 FromConstructibleAssignableLvalue&&>::
value));
1204 const FromConstructibleAssignableRvalue&>::
value));
1206 FromConstructibleAssignableRvalue&&>::
value));
1209 const FromImplicitConstructibleOnly&>::
value));
1211 const FromAssignableOnly&>::
value));
1216 from_lvalue = FromConstructibleAssignableLvalue{};
1223 from_rvalue = FromConstructibleAssignableRvalue{};
1228 FromImplicitConstructibleOnly{});
1229 EXPECT_FALSE(from_implicit_constructible->from_rvalue);
1233 from_implicit_constructible = FromImplicitConstructibleOnly{};
1234 EXPECT_FALSE(from_implicit_constructible->from_rvalue);
1248 std::is_same<
const int&,
1250 "Unexpected ref-qualifiers");
1253 "Unexpected ref-qualifiers");
1255 std::is_same<
const int&&,
1257 "Unexpected ref-qualifiers");
1260 "Unexpected ref-qualifiers");
1284 "Unexpected qualifiers");
1288 "Unexpected qualifiers");
1293 "Unexpected qualifiers");
1297 "Unexpected qualifiers");
1320 EXPECT_EQ(so.status().message(),
"Status accessed after move.");
1368 const int*
const p =
nullptr;
1391 TEST(
StatusOr, TestPointerCopyCtorStatusOKConverting) {
1399 TEST(
StatusOr, TestPointerCopyCtorStatusNotOkConverting) {
1421 TEST(
StatusOr, TestPointerAssignmentStatusOKConverting) {
1430 TEST(
StatusOr, TestPointerAssignmentStatusNotOkConverting) {
1457 TEST(
StatusOr, StatusOrVectorOfUniquePointerCanReserveAndResize) {
1458 using EvilType = std::vector<std::unique_ptr<int>>;
1460 std::vector<::absl::StatusOr<EvilType>>
v(5);
1461 v.reserve(
v.capacity() + 10);
1462 v.resize(
v.capacity() + 10);
1486 using MapType = std::map<std::string, absl::StatusOr<std::unique_ptr<int>>>;
1509 .value_or(absl::make_unique<int>(-1)),
1515 .value_or(absl::make_unique<int>(-1)),
1521 TEST(
StatusOr, TestIgnoreError) { MakeStatus().IgnoreError(); }
1524 constexpr
int kNumCases = 4;
1525 std::array<absl::StatusOr<int>, kNumCases> group1 = {
1529 std::array<absl::StatusOr<int>, kNumCases> group2 = {
1533 for (
int i = 0;
i < kNumCases; ++
i) {
1534 for (
int j = 0;
j < kNumCases; ++
j) {
1547 bool operator==(
const MyType&)
const {
return true; }
1550 enum class ConvTraits {
kNone = 0, kImplicit = 1, kExplicit = 2 };
1554 template <
typename T, ConvTraits conv_traits = ConvTraits::kNone>
1555 struct StatusOrConversionBase {};
1557 template <
typename T>
1558 struct StatusOrConversionBase<
T, ConvTraits::kImplicit> {
1567 template <
typename T>
1568 struct StatusOrConversionBase<
T, ConvTraits::kExplicit> {
1579 template <
typename T, ConvTraits conv_traits = ConvTraits::kNone>
1580 struct ConversionBase {};
1582 template <
typename T>
1583 struct ConversionBase<
T, ConvTraits::kImplicit> {
1584 operator T()
const& {
return t; }
1589 template <
typename T>
1590 struct ConversionBase<
T, ConvTraits::kExplicit> {
1591 explicit operator T()
const& {
return t; }
1592 explicit operator T() && {
return std::move(t); }
1598 template <ConvTraits conv_traits = ConvTraits::kNone>
1599 struct StatusConversionBase {};
1602 struct StatusConversionBase<ConvTraits::kImplicit> {
1612 struct StatusConversionBase<ConvTraits::kExplicit> {
1621 static constexpr
int kConvToStatus = 1;
1622 static constexpr
int kConvToStatusOr = 2;
1623 static constexpr
int kConvToT = 4;
1624 static constexpr
int kConvExplicit = 8;
1626 constexpr ConvTraits GetConvTraits(
int bit,
int config) {
1627 return (
config & bit) == 0
1629 : ((
config & kConvExplicit) == 0 ? ConvTraits::kImplicit
1630 : ConvTraits::kExplicit);
1635 template <
typename T,
int config>
1637 : StatusOrConversionBase<T, GetConvTraits(kConvToStatusOr, config)>,
1638 ConversionBase<T, GetConvTraits(kConvToT, config)>,
1639 StatusConversionBase<GetConvTraits(kConvToStatus, config)> {};
1641 struct ConvertibleToAnyStatusOr {
1642 template <
typename T>
1658 ConvertibleToAnyStatusOr
v;
1663 ConvertibleToAnyStatusOr
v;
1670 CustomType<MyType, kConvToStatus | kConvExplicit>
v;
1676 CustomType<MyType, kConvToStatus | kConvExplicit>
v;
1686 CustomType<MyType, kConvToT | kConvExplicit>
v;
1691 CustomType<MyType, kConvToT>
v;
1699 TEST(
StatusOr, ConstructionFromTypeWithConversionOperatorToStatusOrT) {
1701 CustomType<MyType, kConvToStatusOr | kConvExplicit>
v;
1706 CustomType<MyType, kConvToT | kConvToStatusOr | kConvExplicit>
v;
1711 CustomType<MyType, kConvToStatusOr | kConvToStatus | kConvExplicit>
v;
1717 kConvToT | kConvToStatusOr | kConvToStatus | kConvExplicit>
1723 CustomType<MyType, kConvToStatusOr>
v;
1728 CustomType<MyType, kConvToT | kConvToStatusOr>
v;
1733 CustomType<MyType, kConvToStatusOr | kConvToStatus>
v;
1738 CustomType<MyType, kConvToT | kConvToStatusOr | kConvToStatus>
v;
1744 TEST(
StatusOr, ConstructionFromTypeConvertibleToStatus) {
1747 CustomType<MyType, kConvToStatus | kConvExplicit>
v;
1753 CustomType<MyType, kConvToT | kConvToStatus | kConvExplicit>
v;
1759 CustomType<MyType, kConvToStatus>
v;
1765 CustomType<MyType, kConvToT | kConvToStatus>
v;
1776 ConvertibleToAnyStatusOr
v;
1783 CustomType<MyType, kConvToStatus>
v;
1793 CustomType<MyType, kConvToT>
v;
1800 TEST(
StatusOr, AssignmentFromTypeWithConversionOperatortoStatusOrT) {
1804 CustomType<MyType, kConvToStatusOr>
v;
1810 CustomType<MyType, kConvToT | kConvToStatusOr>
v;
1816 CustomType<MyType, kConvToStatusOr | kConvToStatus>
v;
1822 CustomType<MyType, kConvToT | kConvToStatusOr | kConvToStatus>
v;
1829 TEST(
StatusOr, AssignmentFromTypeConvertibleToStatus) {
1832 CustomType<MyType, kConvToStatus>
v;
1839 CustomType<MyType, kConvToT | kConvToStatus>
v;