• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2020 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "absl/status/statusor.h"
16 
17 #include <array>
18 #include <cstddef>
19 #include <initializer_list>
20 #include <map>
21 #include <memory>
22 #include <ostream>
23 #include <sstream>
24 #include <string>
25 #include <type_traits>
26 #include <utility>
27 #include <vector>
28 
29 #include "gmock/gmock.h"
30 #include "gtest/gtest.h"
31 #include "absl/base/casts.h"
32 #include "absl/memory/memory.h"
33 #include "absl/status/status.h"
34 #include "absl/strings/str_cat.h"
35 #include "absl/strings/string_view.h"
36 #include "absl/types/any.h"
37 #include "absl/types/variant.h"
38 #include "absl/utility/utility.h"
39 
40 namespace {
41 
42 using ::testing::AllOf;
43 using ::testing::AnyOf;
44 using ::testing::AnyWith;
45 using ::testing::ElementsAre;
46 using ::testing::EndsWith;
47 using ::testing::Field;
48 using ::testing::HasSubstr;
49 using ::testing::Ne;
50 using ::testing::Not;
51 using ::testing::Pointee;
52 using ::testing::StartsWith;
53 using ::testing::VariantWith;
54 
55 #ifdef GTEST_HAS_STATUS_MATCHERS
56 using ::testing::status::IsOk;
57 using ::testing::status::IsOkAndHolds;
58 #else  // GTEST_HAS_STATUS_MATCHERS
GetStatus(const::absl::Status & status)59 inline const ::absl::Status& GetStatus(const ::absl::Status& status) {
60   return status;
61 }
62 
63 template <typename T>
GetStatus(const::absl::StatusOr<T> & status)64 inline const ::absl::Status& GetStatus(const ::absl::StatusOr<T>& status) {
65   return status.status();
66 }
67 
68 // Monomorphic implementation of matcher IsOkAndHolds(m).  StatusOrType is a
69 // reference to StatusOr<T>.
70 template <typename StatusOrType>
71 class IsOkAndHoldsMatcherImpl
72     : public ::testing::MatcherInterface<StatusOrType> {
73  public:
74   typedef
75       typename std::remove_reference<StatusOrType>::type::value_type value_type;
76 
77   template <typename InnerMatcher>
IsOkAndHoldsMatcherImpl(InnerMatcher && inner_matcher)78   explicit IsOkAndHoldsMatcherImpl(InnerMatcher&& inner_matcher)
79       : inner_matcher_(::testing::SafeMatcherCast<const value_type&>(
80             std::forward<InnerMatcher>(inner_matcher))) {}
81 
DescribeTo(std::ostream * os) const82   void DescribeTo(std::ostream* os) const override {
83     *os << "is OK and has a value that ";
84     inner_matcher_.DescribeTo(os);
85   }
86 
DescribeNegationTo(std::ostream * os) const87   void DescribeNegationTo(std::ostream* os) const override {
88     *os << "isn't OK or has a value that ";
89     inner_matcher_.DescribeNegationTo(os);
90   }
91 
MatchAndExplain(StatusOrType actual_value,::testing::MatchResultListener * result_listener) const92   bool MatchAndExplain(
93       StatusOrType actual_value,
94       ::testing::MatchResultListener* result_listener) const override {
95     if (!actual_value.ok()) {
96       *result_listener << "which has status " << actual_value.status();
97       return false;
98     }
99 
100     ::testing::StringMatchResultListener inner_listener;
101     const bool matches =
102         inner_matcher_.MatchAndExplain(*actual_value, &inner_listener);
103     const std::string inner_explanation = inner_listener.str();
104     if (!inner_explanation.empty()) {
105       *result_listener << "which contains value "
106                        << ::testing::PrintToString(*actual_value) << ", "
107                        << inner_explanation;
108     }
109     return matches;
110   }
111 
112  private:
113   const ::testing::Matcher<const value_type&> inner_matcher_;
114 };
115 
116 // Implements IsOkAndHolds(m) as a polymorphic matcher.
117 template <typename InnerMatcher>
118 class IsOkAndHoldsMatcher {
119  public:
IsOkAndHoldsMatcher(InnerMatcher inner_matcher)120   explicit IsOkAndHoldsMatcher(InnerMatcher inner_matcher)
121       : inner_matcher_(std::move(inner_matcher)) {}
122 
123   // Converts this polymorphic matcher to a monomorphic matcher of the
124   // given type.  StatusOrType can be either StatusOr<T> or a
125   // reference to StatusOr<T>.
126   template <typename StatusOrType>
operator ::testing::Matcher<StatusOrType>() const127   operator ::testing::Matcher<StatusOrType>() const {  // NOLINT
128     return ::testing::Matcher<StatusOrType>(
129         new IsOkAndHoldsMatcherImpl<const StatusOrType&>(inner_matcher_));
130   }
131 
132  private:
133   const InnerMatcher inner_matcher_;
134 };
135 
136 // Monomorphic implementation of matcher IsOk() for a given type T.
137 // T can be Status, StatusOr<>, or a reference to either of them.
138 template <typename T>
139 class MonoIsOkMatcherImpl : public ::testing::MatcherInterface<T> {
140  public:
DescribeTo(std::ostream * os) const141   void DescribeTo(std::ostream* os) const override { *os << "is OK"; }
DescribeNegationTo(std::ostream * os) const142   void DescribeNegationTo(std::ostream* os) const override {
143     *os << "is not OK";
144   }
MatchAndExplain(T actual_value,::testing::MatchResultListener *) const145   bool MatchAndExplain(T actual_value,
146                        ::testing::MatchResultListener*) const override {
147     return GetStatus(actual_value).ok();
148   }
149 };
150 
151 // Implements IsOk() as a polymorphic matcher.
152 class IsOkMatcher {
153  public:
154   template <typename T>
operator ::testing::Matcher<T>() const155   operator ::testing::Matcher<T>() const {  // NOLINT
156     return ::testing::Matcher<T>(new MonoIsOkMatcherImpl<T>());
157   }
158 };
159 
160 // Macros for testing the results of functions that return absl::Status or
161 // absl::StatusOr<T> (for any type T).
162 #define EXPECT_OK(expression) EXPECT_THAT(expression, IsOk())
163 
164 // Returns a gMock matcher that matches a StatusOr<> whose status is
165 // OK and whose value matches the inner matcher.
166 template <typename InnerMatcher>
IsOkAndHolds(InnerMatcher && inner_matcher)167 IsOkAndHoldsMatcher<typename std::decay<InnerMatcher>::type> IsOkAndHolds(
168     InnerMatcher&& inner_matcher) {
169   return IsOkAndHoldsMatcher<typename std::decay<InnerMatcher>::type>(
170       std::forward<InnerMatcher>(inner_matcher));
171 }
172 
173 // Returns a gMock matcher that matches a Status or StatusOr<> which is OK.
IsOk()174 inline IsOkMatcher IsOk() { return IsOkMatcher(); }
175 #endif  // GTEST_HAS_STATUS_MATCHERS
176 
177 struct CopyDetector {
178   CopyDetector() = default;
CopyDetector__anonc4b063700111::CopyDetector179   explicit CopyDetector(int xx) : x(xx) {}
CopyDetector__anonc4b063700111::CopyDetector180   CopyDetector(CopyDetector&& d) noexcept
181       : x(d.x), copied(false), moved(true) {}
CopyDetector__anonc4b063700111::CopyDetector182   CopyDetector(const CopyDetector& d) : x(d.x), copied(true), moved(false) {}
operator =__anonc4b063700111::CopyDetector183   CopyDetector& operator=(const CopyDetector& c) {
184     x = c.x;
185     copied = true;
186     moved = false;
187     return *this;
188   }
operator =__anonc4b063700111::CopyDetector189   CopyDetector& operator=(CopyDetector&& c) noexcept {
190     x = c.x;
191     copied = false;
192     moved = true;
193     return *this;
194   }
195   int x = 0;
196   bool copied = false;
197   bool moved = false;
198 };
199 
CopyDetectorHas(int a,bool b,bool c)200 testing::Matcher<const CopyDetector&> CopyDetectorHas(int a, bool b, bool c) {
201   return AllOf(Field(&CopyDetector::x, a), Field(&CopyDetector::moved, b),
202                Field(&CopyDetector::copied, c));
203 }
204 
205 class Base1 {
206  public:
~Base1()207   virtual ~Base1() {}
208   int pad;
209 };
210 
211 class Base2 {
212  public:
~Base2()213   virtual ~Base2() {}
214   int yetotherpad;
215 };
216 
217 class Derived : public Base1, public Base2 {
218  public:
~Derived()219   virtual ~Derived() {}
220   int evenmorepad;
221 };
222 
223 class CopyNoAssign {
224  public:
CopyNoAssign(int value)225   explicit CopyNoAssign(int value) : foo(value) {}
CopyNoAssign(const CopyNoAssign & other)226   CopyNoAssign(const CopyNoAssign& other) : foo(other.foo) {}
227   int foo;
228 
229  private:
230   const CopyNoAssign& operator=(const CopyNoAssign&);
231 };
232 
ReturnUniquePtr()233 absl::StatusOr<std::unique_ptr<int>> ReturnUniquePtr() {
234   // Uses implicit constructor from T&&
235   return absl::make_unique<int>(0);
236 }
237 
TEST(StatusOr,ElementType)238 TEST(StatusOr, ElementType) {
239   static_assert(std::is_same<absl::StatusOr<int>::value_type, int>(), "");
240   static_assert(std::is_same<absl::StatusOr<char>::value_type, char>(), "");
241 }
242 
TEST(StatusOr,TestMoveOnlyInitialization)243 TEST(StatusOr, TestMoveOnlyInitialization) {
244   absl::StatusOr<std::unique_ptr<int>> thing(ReturnUniquePtr());
245   ASSERT_TRUE(thing.ok());
246   EXPECT_EQ(0, **thing);
247   int* previous = thing->get();
248 
249   thing = ReturnUniquePtr();
250   EXPECT_TRUE(thing.ok());
251   EXPECT_EQ(0, **thing);
252   EXPECT_NE(previous, thing->get());
253 }
254 
TEST(StatusOr,TestMoveOnlyValueExtraction)255 TEST(StatusOr, TestMoveOnlyValueExtraction) {
256   absl::StatusOr<std::unique_ptr<int>> thing(ReturnUniquePtr());
257   ASSERT_TRUE(thing.ok());
258   std::unique_ptr<int> ptr = *std::move(thing);
259   EXPECT_EQ(0, *ptr);
260 
261   thing = std::move(ptr);
262   ptr = std::move(*thing);
263   EXPECT_EQ(0, *ptr);
264 }
265 
TEST(StatusOr,TestMoveOnlyInitializationFromTemporaryByValueOrDie)266 TEST(StatusOr, TestMoveOnlyInitializationFromTemporaryByValueOrDie) {
267   std::unique_ptr<int> ptr(*ReturnUniquePtr());
268   EXPECT_EQ(0, *ptr);
269 }
270 
TEST(StatusOr,TestValueOrDieOverloadForConstTemporary)271 TEST(StatusOr, TestValueOrDieOverloadForConstTemporary) {
272   static_assert(
273       std::is_same<
274           const int&&,
275           decltype(std::declval<const absl::StatusOr<int>&&>().value())>(),
276       "value() for const temporaries should return const T&&");
277 }
278 
TEST(StatusOr,TestMoveOnlyConversion)279 TEST(StatusOr, TestMoveOnlyConversion) {
280   absl::StatusOr<std::unique_ptr<const int>> const_thing(ReturnUniquePtr());
281   EXPECT_TRUE(const_thing.ok());
282   EXPECT_EQ(0, **const_thing);
283 
284   // Test rvalue converting assignment
285   const int* const_previous = const_thing->get();
286   const_thing = ReturnUniquePtr();
287   EXPECT_TRUE(const_thing.ok());
288   EXPECT_EQ(0, **const_thing);
289   EXPECT_NE(const_previous, const_thing->get());
290 }
291 
TEST(StatusOr,TestMoveOnlyVector)292 TEST(StatusOr, TestMoveOnlyVector) {
293   // Sanity check that absl::StatusOr<MoveOnly> works in vector.
294   std::vector<absl::StatusOr<std::unique_ptr<int>>> vec;
295   vec.push_back(ReturnUniquePtr());
296   vec.resize(2);
297   auto another_vec = std::move(vec);
298   EXPECT_EQ(0, **another_vec[0]);
299   EXPECT_EQ(absl::UnknownError(""), another_vec[1].status());
300 }
301 
TEST(StatusOr,TestDefaultCtor)302 TEST(StatusOr, TestDefaultCtor) {
303   absl::StatusOr<int> thing;
304   EXPECT_FALSE(thing.ok());
305   EXPECT_EQ(thing.status().code(), absl::StatusCode::kUnknown);
306 }
307 
TEST(StatusOr,StatusCtorForwards)308 TEST(StatusOr, StatusCtorForwards) {
309   absl::Status status(absl::StatusCode::kInternal, "Some error");
310 
311   EXPECT_EQ(absl::StatusOr<int>(status).status().message(), "Some error");
312   EXPECT_EQ(status.message(), "Some error");
313 
314   EXPECT_EQ(absl::StatusOr<int>(std::move(status)).status().message(),
315             "Some error");
316   EXPECT_NE(status.message(), "Some error");
317 }
318 
TEST(BadStatusOrAccessTest,CopyConstructionWhatOk)319 TEST(BadStatusOrAccessTest, CopyConstructionWhatOk) {
320   absl::Status error =
321       absl::InternalError("some arbitrary message too big for the sso buffer");
322   absl::BadStatusOrAccess e1{error};
323   absl::BadStatusOrAccess e2{e1};
324   EXPECT_THAT(e1.what(), HasSubstr(error.ToString()));
325   EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
326 }
327 
TEST(BadStatusOrAccessTest,CopyAssignmentWhatOk)328 TEST(BadStatusOrAccessTest, CopyAssignmentWhatOk) {
329   absl::Status error =
330       absl::InternalError("some arbitrary message too big for the sso buffer");
331   absl::BadStatusOrAccess e1{error};
332   absl::BadStatusOrAccess e2{absl::InternalError("other")};
333   e2 = e1;
334   EXPECT_THAT(e1.what(), HasSubstr(error.ToString()));
335   EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
336 }
337 
TEST(BadStatusOrAccessTest,MoveConstructionWhatOk)338 TEST(BadStatusOrAccessTest, MoveConstructionWhatOk) {
339   absl::Status error =
340       absl::InternalError("some arbitrary message too big for the sso buffer");
341   absl::BadStatusOrAccess e1{error};
342   absl::BadStatusOrAccess e2{std::move(e1)};
343   EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
344 }
345 
TEST(BadStatusOrAccessTest,MoveAssignmentWhatOk)346 TEST(BadStatusOrAccessTest, MoveAssignmentWhatOk) {
347   absl::Status error =
348       absl::InternalError("some arbitrary message too big for the sso buffer");
349   absl::BadStatusOrAccess e1{error};
350   absl::BadStatusOrAccess e2{absl::InternalError("other")};
351   e2 = std::move(e1);
352   EXPECT_THAT(e2.what(), HasSubstr(error.ToString()));
353 }
354 
355 // Define `EXPECT_DEATH_OR_THROW` to test the behavior of `StatusOr::value`,
356 // which either throws `BadStatusOrAccess` or `LOG(FATAL)` based on whether
357 // exceptions are enabled.
358 #ifdef ABSL_HAVE_EXCEPTIONS
359 #define EXPECT_DEATH_OR_THROW(statement, status_)                  \
360   EXPECT_THROW(                                                    \
361       {                                                            \
362         try {                                                      \
363           statement;                                               \
364         } catch (const absl::BadStatusOrAccess& e) {               \
365           EXPECT_EQ(e.status(), status_);                          \
366           EXPECT_THAT(e.what(), HasSubstr(e.status().ToString())); \
367           throw;                                                   \
368         }                                                          \
369       },                                                           \
370       absl::BadStatusOrAccess);
371 #else  // ABSL_HAVE_EXCEPTIONS
372 #define EXPECT_DEATH_OR_THROW(statement, status) \
373   EXPECT_DEATH_IF_SUPPORTED(statement, status.ToString());
374 #endif  // ABSL_HAVE_EXCEPTIONS
375 
TEST(StatusOrDeathTest,TestDefaultCtorValue)376 TEST(StatusOrDeathTest, TestDefaultCtorValue) {
377   absl::StatusOr<int> thing;
378   EXPECT_DEATH_OR_THROW(thing.value(), absl::UnknownError(""));
379   const absl::StatusOr<int> thing2;
380   EXPECT_DEATH_OR_THROW(thing2.value(), absl::UnknownError(""));
381 }
382 
TEST(StatusOrDeathTest,TestValueNotOk)383 TEST(StatusOrDeathTest, TestValueNotOk) {
384   absl::StatusOr<int> thing(absl::CancelledError());
385   EXPECT_DEATH_OR_THROW(thing.value(), absl::CancelledError());
386 }
387 
TEST(StatusOrDeathTest,TestValueNotOkConst)388 TEST(StatusOrDeathTest, TestValueNotOkConst) {
389   const absl::StatusOr<int> thing(absl::UnknownError(""));
390   EXPECT_DEATH_OR_THROW(thing.value(), absl::UnknownError(""));
391 }
392 
TEST(StatusOrDeathTest,TestPointerDefaultCtorValue)393 TEST(StatusOrDeathTest, TestPointerDefaultCtorValue) {
394   absl::StatusOr<int*> thing;
395   EXPECT_DEATH_OR_THROW(thing.value(), absl::UnknownError(""));
396 }
397 
TEST(StatusOrDeathTest,TestPointerValueNotOk)398 TEST(StatusOrDeathTest, TestPointerValueNotOk) {
399   absl::StatusOr<int*> thing(absl::CancelledError());
400   EXPECT_DEATH_OR_THROW(thing.value(), absl::CancelledError());
401 }
402 
TEST(StatusOrDeathTest,TestPointerValueNotOkConst)403 TEST(StatusOrDeathTest, TestPointerValueNotOkConst) {
404   const absl::StatusOr<int*> thing(absl::CancelledError());
405   EXPECT_DEATH_OR_THROW(thing.value(), absl::CancelledError());
406 }
407 
408 #if GTEST_HAS_DEATH_TEST
TEST(StatusOrDeathTest,TestStatusCtorStatusOk)409 TEST(StatusOrDeathTest, TestStatusCtorStatusOk) {
410   EXPECT_DEBUG_DEATH(
411       {
412         // This will DCHECK
413         absl::StatusOr<int> thing(absl::OkStatus());
414         // In optimized mode, we are actually going to get error::INTERNAL for
415         // status here, rather than crashing, so check that.
416         EXPECT_FALSE(thing.ok());
417         EXPECT_EQ(thing.status().code(), absl::StatusCode::kInternal);
418       },
419       "An OK status is not a valid constructor argument");
420 }
421 
TEST(StatusOrDeathTest,TestPointerStatusCtorStatusOk)422 TEST(StatusOrDeathTest, TestPointerStatusCtorStatusOk) {
423   EXPECT_DEBUG_DEATH(
424       {
425         absl::StatusOr<int*> thing(absl::OkStatus());
426         // In optimized mode, we are actually going to get error::INTERNAL for
427         // status here, rather than crashing, so check that.
428         EXPECT_FALSE(thing.ok());
429         EXPECT_EQ(thing.status().code(), absl::StatusCode::kInternal);
430       },
431       "An OK status is not a valid constructor argument");
432 }
433 #endif
434 
TEST(StatusOr,ValueAccessor)435 TEST(StatusOr, ValueAccessor) {
436   const int kIntValue = 110;
437   {
438     absl::StatusOr<int> status_or(kIntValue);
439     EXPECT_EQ(kIntValue, status_or.value());
440     EXPECT_EQ(kIntValue, std::move(status_or).value());
441   }
442   {
443     absl::StatusOr<CopyDetector> status_or(kIntValue);
444     EXPECT_THAT(status_or,
445                 IsOkAndHolds(CopyDetectorHas(kIntValue, false, false)));
446     CopyDetector copy_detector = status_or.value();
447     EXPECT_THAT(copy_detector, CopyDetectorHas(kIntValue, false, true));
448     copy_detector = std::move(status_or).value();
449     EXPECT_THAT(copy_detector, CopyDetectorHas(kIntValue, true, false));
450   }
451 }
452 
TEST(StatusOr,BadValueAccess)453 TEST(StatusOr, BadValueAccess) {
454   const absl::Status kError = absl::CancelledError("message");
455   absl::StatusOr<int> status_or(kError);
456   EXPECT_DEATH_OR_THROW(status_or.value(), kError);
457 }
458 
TEST(StatusOr,TestStatusCtor)459 TEST(StatusOr, TestStatusCtor) {
460   absl::StatusOr<int> thing(absl::CancelledError());
461   EXPECT_FALSE(thing.ok());
462   EXPECT_EQ(thing.status().code(), absl::StatusCode::kCancelled);
463 }
464 
TEST(StatusOr,TestValueCtor)465 TEST(StatusOr, TestValueCtor) {
466   const int kI = 4;
467   const absl::StatusOr<int> thing(kI);
468   EXPECT_TRUE(thing.ok());
469   EXPECT_EQ(kI, *thing);
470 }
471 
472 struct Foo {
473   const int x;
Foo__anonc4b063700111::Foo474   explicit Foo(int y) : x(y) {}
475 };
476 
TEST(StatusOr,InPlaceConstruction)477 TEST(StatusOr, InPlaceConstruction) {
478   EXPECT_THAT(absl::StatusOr<Foo>(absl::in_place, 10),
479               IsOkAndHolds(Field(&Foo::x, 10)));
480 }
481 
482 struct InPlaceHelper {
InPlaceHelper__anonc4b063700111::InPlaceHelper483   InPlaceHelper(std::initializer_list<int> xs, std::unique_ptr<int> yy)
484       : x(xs), y(std::move(yy)) {}
485   const std::vector<int> x;
486   std::unique_ptr<int> y;
487 };
488 
TEST(StatusOr,InPlaceInitListConstruction)489 TEST(StatusOr, InPlaceInitListConstruction) {
490   absl::StatusOr<InPlaceHelper> status_or(absl::in_place, {10, 11, 12},
491                                           absl::make_unique<int>(13));
492   EXPECT_THAT(status_or, IsOkAndHolds(AllOf(
493                              Field(&InPlaceHelper::x, ElementsAre(10, 11, 12)),
494                              Field(&InPlaceHelper::y, Pointee(13)))));
495 }
496 
TEST(StatusOr,Emplace)497 TEST(StatusOr, Emplace) {
498   absl::StatusOr<Foo> status_or_foo(10);
499   status_or_foo.emplace(20);
500   EXPECT_THAT(status_or_foo, IsOkAndHolds(Field(&Foo::x, 20)));
501   status_or_foo = absl::InvalidArgumentError("msg");
502   EXPECT_FALSE(status_or_foo.ok());
503   EXPECT_EQ(status_or_foo.status().code(), absl::StatusCode::kInvalidArgument);
504   EXPECT_EQ(status_or_foo.status().message(), "msg");
505   status_or_foo.emplace(20);
506   EXPECT_THAT(status_or_foo, IsOkAndHolds(Field(&Foo::x, 20)));
507 }
508 
TEST(StatusOr,EmplaceInitializerList)509 TEST(StatusOr, EmplaceInitializerList) {
510   absl::StatusOr<InPlaceHelper> status_or(absl::in_place, {10, 11, 12},
511                                           absl::make_unique<int>(13));
512   status_or.emplace({1, 2, 3}, absl::make_unique<int>(4));
513   EXPECT_THAT(status_or,
514               IsOkAndHolds(AllOf(Field(&InPlaceHelper::x, ElementsAre(1, 2, 3)),
515                                  Field(&InPlaceHelper::y, Pointee(4)))));
516   status_or = absl::InvalidArgumentError("msg");
517   EXPECT_FALSE(status_or.ok());
518   EXPECT_EQ(status_or.status().code(), absl::StatusCode::kInvalidArgument);
519   EXPECT_EQ(status_or.status().message(), "msg");
520   status_or.emplace({1, 2, 3}, absl::make_unique<int>(4));
521   EXPECT_THAT(status_or,
522               IsOkAndHolds(AllOf(Field(&InPlaceHelper::x, ElementsAre(1, 2, 3)),
523                                  Field(&InPlaceHelper::y, Pointee(4)))));
524 }
525 
TEST(StatusOr,TestCopyCtorStatusOk)526 TEST(StatusOr, TestCopyCtorStatusOk) {
527   const int kI = 4;
528   const absl::StatusOr<int> original(kI);
529   const absl::StatusOr<int> copy(original);
530   EXPECT_OK(copy.status());
531   EXPECT_EQ(*original, *copy);
532 }
533 
TEST(StatusOr,TestCopyCtorStatusNotOk)534 TEST(StatusOr, TestCopyCtorStatusNotOk) {
535   absl::StatusOr<int> original(absl::CancelledError());
536   absl::StatusOr<int> copy(original);
537   EXPECT_EQ(copy.status().code(), absl::StatusCode::kCancelled);
538 }
539 
TEST(StatusOr,TestCopyCtorNonAssignable)540 TEST(StatusOr, TestCopyCtorNonAssignable) {
541   const int kI = 4;
542   CopyNoAssign value(kI);
543   absl::StatusOr<CopyNoAssign> original(value);
544   absl::StatusOr<CopyNoAssign> copy(original);
545   EXPECT_OK(copy.status());
546   EXPECT_EQ(original->foo, copy->foo);
547 }
548 
TEST(StatusOr,TestCopyCtorStatusOKConverting)549 TEST(StatusOr, TestCopyCtorStatusOKConverting) {
550   const int kI = 4;
551   absl::StatusOr<int> original(kI);
552   absl::StatusOr<double> copy(original);
553   EXPECT_OK(copy.status());
554   EXPECT_DOUBLE_EQ(*original, *copy);
555 }
556 
TEST(StatusOr,TestCopyCtorStatusNotOkConverting)557 TEST(StatusOr, TestCopyCtorStatusNotOkConverting) {
558   absl::StatusOr<int> original(absl::CancelledError());
559   absl::StatusOr<double> copy(original);
560   EXPECT_EQ(copy.status(), original.status());
561 }
562 
TEST(StatusOr,TestAssignmentStatusOk)563 TEST(StatusOr, TestAssignmentStatusOk) {
564   // Copy assignmment
565   {
566     const auto p = std::make_shared<int>(17);
567     absl::StatusOr<std::shared_ptr<int>> source(p);
568 
569     absl::StatusOr<std::shared_ptr<int>> target;
570     target = source;
571 
572     ASSERT_TRUE(target.ok());
573     EXPECT_OK(target.status());
574     EXPECT_EQ(p, *target);
575 
576     ASSERT_TRUE(source.ok());
577     EXPECT_OK(source.status());
578     EXPECT_EQ(p, *source);
579   }
580 
581   // Move asssignment
582   {
583     const auto p = std::make_shared<int>(17);
584     absl::StatusOr<std::shared_ptr<int>> source(p);
585 
586     absl::StatusOr<std::shared_ptr<int>> target;
587     target = std::move(source);
588 
589     ASSERT_TRUE(target.ok());
590     EXPECT_OK(target.status());
591     EXPECT_EQ(p, *target);
592 
593     ASSERT_TRUE(source.ok());
594     EXPECT_OK(source.status());
595     EXPECT_EQ(nullptr, *source);
596   }
597 }
598 
TEST(StatusOr,TestAssignmentStatusNotOk)599 TEST(StatusOr, TestAssignmentStatusNotOk) {
600   // Copy assignment
601   {
602     const absl::Status expected = absl::CancelledError();
603     absl::StatusOr<int> source(expected);
604 
605     absl::StatusOr<int> target;
606     target = source;
607 
608     EXPECT_FALSE(target.ok());
609     EXPECT_EQ(expected, target.status());
610 
611     EXPECT_FALSE(source.ok());
612     EXPECT_EQ(expected, source.status());
613   }
614 
615   // Move assignment
616   {
617     const absl::Status expected = absl::CancelledError();
618     absl::StatusOr<int> source(expected);
619 
620     absl::StatusOr<int> target;
621     target = std::move(source);
622 
623     EXPECT_FALSE(target.ok());
624     EXPECT_EQ(expected, target.status());
625 
626     EXPECT_FALSE(source.ok());
627     EXPECT_EQ(source.status().code(), absl::StatusCode::kInternal);
628   }
629 }
630 
TEST(StatusOr,TestAssignmentStatusOKConverting)631 TEST(StatusOr, TestAssignmentStatusOKConverting) {
632   // Copy assignment
633   {
634     const int kI = 4;
635     absl::StatusOr<int> source(kI);
636 
637     absl::StatusOr<double> target;
638     target = source;
639 
640     ASSERT_TRUE(target.ok());
641     EXPECT_OK(target.status());
642     EXPECT_DOUBLE_EQ(kI, *target);
643 
644     ASSERT_TRUE(source.ok());
645     EXPECT_OK(source.status());
646     EXPECT_DOUBLE_EQ(kI, *source);
647   }
648 
649   // Move assignment
650   {
651     const auto p = new int(17);
652     absl::StatusOr<std::unique_ptr<int>> source(absl::WrapUnique(p));
653 
654     absl::StatusOr<std::shared_ptr<int>> target;
655     target = std::move(source);
656 
657     ASSERT_TRUE(target.ok());
658     EXPECT_OK(target.status());
659     EXPECT_EQ(p, target->get());
660 
661     ASSERT_TRUE(source.ok());
662     EXPECT_OK(source.status());
663     EXPECT_EQ(nullptr, source->get());
664   }
665 }
666 
667 struct A {
668   int x;
669 };
670 
671 struct ImplicitConstructibleFromA {
672   int x;
673   bool moved;
ImplicitConstructibleFromA__anonc4b063700111::ImplicitConstructibleFromA674   ImplicitConstructibleFromA(const A& a)  // NOLINT
675       : x(a.x), moved(false) {}
ImplicitConstructibleFromA__anonc4b063700111::ImplicitConstructibleFromA676   ImplicitConstructibleFromA(A&& a)  // NOLINT
677       : x(a.x), moved(true) {}
678 };
679 
TEST(StatusOr,ImplicitConvertingConstructor)680 TEST(StatusOr, ImplicitConvertingConstructor) {
681   EXPECT_THAT(
682       absl::implicit_cast<absl::StatusOr<ImplicitConstructibleFromA>>(
683           absl::StatusOr<A>(A{11})),
684       IsOkAndHolds(AllOf(Field(&ImplicitConstructibleFromA::x, 11),
685                          Field(&ImplicitConstructibleFromA::moved, true))));
686   absl::StatusOr<A> a(A{12});
687   EXPECT_THAT(
688       absl::implicit_cast<absl::StatusOr<ImplicitConstructibleFromA>>(a),
689       IsOkAndHolds(AllOf(Field(&ImplicitConstructibleFromA::x, 12),
690                          Field(&ImplicitConstructibleFromA::moved, false))));
691 }
692 
693 struct ExplicitConstructibleFromA {
694   int x;
695   bool moved;
ExplicitConstructibleFromA__anonc4b063700111::ExplicitConstructibleFromA696   explicit ExplicitConstructibleFromA(const A& a) : x(a.x), moved(false) {}
ExplicitConstructibleFromA__anonc4b063700111::ExplicitConstructibleFromA697   explicit ExplicitConstructibleFromA(A&& a) : x(a.x), moved(true) {}
698 };
699 
TEST(StatusOr,ExplicitConvertingConstructor)700 TEST(StatusOr, ExplicitConvertingConstructor) {
701   EXPECT_FALSE(
702       (std::is_convertible<const absl::StatusOr<A>&,
703                            absl::StatusOr<ExplicitConstructibleFromA>>::value));
704   EXPECT_FALSE(
705       (std::is_convertible<absl::StatusOr<A>&&,
706                            absl::StatusOr<ExplicitConstructibleFromA>>::value));
707   EXPECT_THAT(
708       absl::StatusOr<ExplicitConstructibleFromA>(absl::StatusOr<A>(A{11})),
709       IsOkAndHolds(AllOf(Field(&ExplicitConstructibleFromA::x, 11),
710                          Field(&ExplicitConstructibleFromA::moved, true))));
711   absl::StatusOr<A> a(A{12});
712   EXPECT_THAT(
713       absl::StatusOr<ExplicitConstructibleFromA>(a),
714       IsOkAndHolds(AllOf(Field(&ExplicitConstructibleFromA::x, 12),
715                          Field(&ExplicitConstructibleFromA::moved, false))));
716 }
717 
718 struct ImplicitConstructibleFromBool {
ImplicitConstructibleFromBool__anonc4b063700111::ImplicitConstructibleFromBool719   ImplicitConstructibleFromBool(bool y) : x(y) {}  // NOLINT
720   bool x = false;
721 };
722 
723 struct ConvertibleToBool {
ConvertibleToBool__anonc4b063700111::ConvertibleToBool724   explicit ConvertibleToBool(bool y) : x(y) {}
operator bool__anonc4b063700111::ConvertibleToBool725   operator bool() const { return x; }  // NOLINT
726   bool x = false;
727 };
728 
TEST(StatusOr,ImplicitBooleanConstructionWithImplicitCasts)729 TEST(StatusOr, ImplicitBooleanConstructionWithImplicitCasts) {
730   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<ConvertibleToBool>(true)),
731               IsOkAndHolds(true));
732   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<ConvertibleToBool>(false)),
733               IsOkAndHolds(false));
734   EXPECT_THAT(
735       absl::implicit_cast<absl::StatusOr<ImplicitConstructibleFromBool>>(
736           absl::StatusOr<bool>(false)),
737       IsOkAndHolds(Field(&ImplicitConstructibleFromBool::x, false)));
738   EXPECT_FALSE((std::is_convertible<
739                 absl::StatusOr<ConvertibleToBool>,
740                 absl::StatusOr<ImplicitConstructibleFromBool>>::value));
741 }
742 
TEST(StatusOr,BooleanConstructionWithImplicitCasts)743 TEST(StatusOr, BooleanConstructionWithImplicitCasts) {
744   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<ConvertibleToBool>(true)),
745               IsOkAndHolds(true));
746   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<ConvertibleToBool>(false)),
747               IsOkAndHolds(false));
748   EXPECT_THAT(
749       absl::StatusOr<ImplicitConstructibleFromBool>{
750           absl::StatusOr<bool>(false)},
751       IsOkAndHolds(Field(&ImplicitConstructibleFromBool::x, false)));
752   EXPECT_THAT(
753       absl::StatusOr<ImplicitConstructibleFromBool>{
754           absl::StatusOr<bool>(absl::InvalidArgumentError(""))},
755       Not(IsOk()));
756 
757   EXPECT_THAT(
758       absl::StatusOr<ImplicitConstructibleFromBool>{
759           absl::StatusOr<ConvertibleToBool>(ConvertibleToBool{false})},
760       IsOkAndHolds(Field(&ImplicitConstructibleFromBool::x, false)));
761   EXPECT_THAT(
762       absl::StatusOr<ImplicitConstructibleFromBool>{
763           absl::StatusOr<ConvertibleToBool>(absl::InvalidArgumentError(""))},
764       Not(IsOk()));
765 }
766 
TEST(StatusOr,ConstImplicitCast)767 TEST(StatusOr, ConstImplicitCast) {
768   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<bool>>(
769                   absl::StatusOr<const bool>(true)),
770               IsOkAndHolds(true));
771   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<bool>>(
772                   absl::StatusOr<const bool>(false)),
773               IsOkAndHolds(false));
774   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<const bool>>(
775                   absl::StatusOr<bool>(true)),
776               IsOkAndHolds(true));
777   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<const bool>>(
778                   absl::StatusOr<bool>(false)),
779               IsOkAndHolds(false));
780   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<const std::string>>(
781                   absl::StatusOr<std::string>("foo")),
782               IsOkAndHolds("foo"));
783   EXPECT_THAT(absl::implicit_cast<absl::StatusOr<std::string>>(
784                   absl::StatusOr<const std::string>("foo")),
785               IsOkAndHolds("foo"));
786   EXPECT_THAT(
787       absl::implicit_cast<absl::StatusOr<std::shared_ptr<const std::string>>>(
788           absl::StatusOr<std::shared_ptr<std::string>>(
789               std::make_shared<std::string>("foo"))),
790       IsOkAndHolds(Pointee(std::string("foo"))));
791 }
792 
TEST(StatusOr,ConstExplicitConstruction)793 TEST(StatusOr, ConstExplicitConstruction) {
794   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<const bool>(true)),
795               IsOkAndHolds(true));
796   EXPECT_THAT(absl::StatusOr<bool>(absl::StatusOr<const bool>(false)),
797               IsOkAndHolds(false));
798   EXPECT_THAT(absl::StatusOr<const bool>(absl::StatusOr<bool>(true)),
799               IsOkAndHolds(true));
800   EXPECT_THAT(absl::StatusOr<const bool>(absl::StatusOr<bool>(false)),
801               IsOkAndHolds(false));
802 }
803 
804 struct ExplicitConstructibleFromInt {
805   int x;
ExplicitConstructibleFromInt__anonc4b063700111::ExplicitConstructibleFromInt806   explicit ExplicitConstructibleFromInt(int y) : x(y) {}
807 };
808 
TEST(StatusOr,ExplicitConstruction)809 TEST(StatusOr, ExplicitConstruction) {
810   EXPECT_THAT(absl::StatusOr<ExplicitConstructibleFromInt>(10),
811               IsOkAndHolds(Field(&ExplicitConstructibleFromInt::x, 10)));
812 }
813 
TEST(StatusOr,ImplicitConstruction)814 TEST(StatusOr, ImplicitConstruction) {
815   // Check implicit casting works.
816   auto status_or =
817       absl::implicit_cast<absl::StatusOr<absl::variant<int, std::string>>>(10);
818   EXPECT_THAT(status_or, IsOkAndHolds(VariantWith<int>(10)));
819 }
820 
TEST(StatusOr,ImplicitConstructionFromInitliazerList)821 TEST(StatusOr, ImplicitConstructionFromInitliazerList) {
822   // Note: dropping the explicit std::initializer_list<int> is not supported
823   // by absl::StatusOr or absl::optional.
824   auto status_or =
825       absl::implicit_cast<absl::StatusOr<std::vector<int>>>({{10, 20, 30}});
826   EXPECT_THAT(status_or, IsOkAndHolds(ElementsAre(10, 20, 30)));
827 }
828 
TEST(StatusOr,UniquePtrImplicitConstruction)829 TEST(StatusOr, UniquePtrImplicitConstruction) {
830   auto status_or = absl::implicit_cast<absl::StatusOr<std::unique_ptr<Base1>>>(
831       absl::make_unique<Derived>());
832   EXPECT_THAT(status_or, IsOkAndHolds(Ne(nullptr)));
833 }
834 
TEST(StatusOr,NestedStatusOrCopyAndMoveConstructorTests)835 TEST(StatusOr, NestedStatusOrCopyAndMoveConstructorTests) {
836   absl::StatusOr<absl::StatusOr<CopyDetector>> status_or = CopyDetector(10);
837   absl::StatusOr<absl::StatusOr<CopyDetector>> status_error =
838       absl::InvalidArgumentError("foo");
839   EXPECT_THAT(status_or,
840               IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, true, false))));
841   absl::StatusOr<absl::StatusOr<CopyDetector>> a = status_or;
842   EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true))));
843   absl::StatusOr<absl::StatusOr<CopyDetector>> a_err = status_error;
844   EXPECT_THAT(a_err, Not(IsOk()));
845 
846   const absl::StatusOr<absl::StatusOr<CopyDetector>>& cref = status_or;
847   absl::StatusOr<absl::StatusOr<CopyDetector>> b = cref;  // NOLINT
848   EXPECT_THAT(b, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true))));
849   const absl::StatusOr<absl::StatusOr<CopyDetector>>& cref_err = status_error;
850   absl::StatusOr<absl::StatusOr<CopyDetector>> b_err = cref_err;  // NOLINT
851   EXPECT_THAT(b_err, Not(IsOk()));
852 
853   absl::StatusOr<absl::StatusOr<CopyDetector>> c = std::move(status_or);
854   EXPECT_THAT(c, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, true, false))));
855   absl::StatusOr<absl::StatusOr<CopyDetector>> c_err = std::move(status_error);
856   EXPECT_THAT(c_err, Not(IsOk()));
857 }
858 
TEST(StatusOr,NestedStatusOrCopyAndMoveAssignment)859 TEST(StatusOr, NestedStatusOrCopyAndMoveAssignment) {
860   absl::StatusOr<absl::StatusOr<CopyDetector>> status_or = CopyDetector(10);
861   absl::StatusOr<absl::StatusOr<CopyDetector>> status_error =
862       absl::InvalidArgumentError("foo");
863   absl::StatusOr<absl::StatusOr<CopyDetector>> a;
864   a = status_or;
865   EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true))));
866   a = status_error;
867   EXPECT_THAT(a, Not(IsOk()));
868 
869   const absl::StatusOr<absl::StatusOr<CopyDetector>>& cref = status_or;
870   a = cref;
871   EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, false, true))));
872   const absl::StatusOr<absl::StatusOr<CopyDetector>>& cref_err = status_error;
873   a = cref_err;
874   EXPECT_THAT(a, Not(IsOk()));
875   a = std::move(status_or);
876   EXPECT_THAT(a, IsOkAndHolds(IsOkAndHolds(CopyDetectorHas(10, true, false))));
877   a = std::move(status_error);
878   EXPECT_THAT(a, Not(IsOk()));
879 }
880 
881 struct Copyable {
Copyable__anonc4b063700111::Copyable882   Copyable() {}
Copyable__anonc4b063700111::Copyable883   Copyable(const Copyable&) {}
operator =__anonc4b063700111::Copyable884   Copyable& operator=(const Copyable&) { return *this; }
885 };
886 
887 struct MoveOnly {
MoveOnly__anonc4b063700111::MoveOnly888   MoveOnly() {}
MoveOnly__anonc4b063700111::MoveOnly889   MoveOnly(MoveOnly&&) {}
operator =__anonc4b063700111::MoveOnly890   MoveOnly& operator=(MoveOnly&&) { return *this; }
891 };
892 
893 struct NonMovable {
NonMovable__anonc4b063700111::NonMovable894   NonMovable() {}
895   NonMovable(const NonMovable&) = delete;
896   NonMovable(NonMovable&&) = delete;
897   NonMovable& operator=(const NonMovable&) = delete;
898   NonMovable& operator=(NonMovable&&) = delete;
899 };
900 
TEST(StatusOr,CopyAndMoveAbility)901 TEST(StatusOr, CopyAndMoveAbility) {
902   EXPECT_TRUE(std::is_copy_constructible<Copyable>::value);
903   EXPECT_TRUE(std::is_copy_assignable<Copyable>::value);
904   EXPECT_TRUE(std::is_move_constructible<Copyable>::value);
905   EXPECT_TRUE(std::is_move_assignable<Copyable>::value);
906   EXPECT_FALSE(std::is_copy_constructible<MoveOnly>::value);
907   EXPECT_FALSE(std::is_copy_assignable<MoveOnly>::value);
908   EXPECT_TRUE(std::is_move_constructible<MoveOnly>::value);
909   EXPECT_TRUE(std::is_move_assignable<MoveOnly>::value);
910   EXPECT_FALSE(std::is_copy_constructible<NonMovable>::value);
911   EXPECT_FALSE(std::is_copy_assignable<NonMovable>::value);
912   EXPECT_FALSE(std::is_move_constructible<NonMovable>::value);
913   EXPECT_FALSE(std::is_move_assignable<NonMovable>::value);
914 }
915 
TEST(StatusOr,StatusOrAnyCopyAndMoveConstructorTests)916 TEST(StatusOr, StatusOrAnyCopyAndMoveConstructorTests) {
917   absl::StatusOr<absl::any> status_or = CopyDetector(10);
918   absl::StatusOr<absl::any> status_error = absl::InvalidArgumentError("foo");
919   EXPECT_THAT(
920       status_or,
921       IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, true, false))));
922   absl::StatusOr<absl::any> a = status_or;
923   EXPECT_THAT(
924       a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, false, true))));
925   absl::StatusOr<absl::any> a_err = status_error;
926   EXPECT_THAT(a_err, Not(IsOk()));
927 
928   const absl::StatusOr<absl::any>& cref = status_or;
929   // No lint for no-change copy.
930   absl::StatusOr<absl::any> b = cref;  // NOLINT
931   EXPECT_THAT(
932       b, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, false, true))));
933   const absl::StatusOr<absl::any>& cref_err = status_error;
934   // No lint for no-change copy.
935   absl::StatusOr<absl::any> b_err = cref_err;  // NOLINT
936   EXPECT_THAT(b_err, Not(IsOk()));
937 
938   absl::StatusOr<absl::any> c = std::move(status_or);
939   EXPECT_THAT(
940       c, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, true, false))));
941   absl::StatusOr<absl::any> c_err = std::move(status_error);
942   EXPECT_THAT(c_err, Not(IsOk()));
943 }
944 
TEST(StatusOr,StatusOrAnyCopyAndMoveAssignment)945 TEST(StatusOr, StatusOrAnyCopyAndMoveAssignment) {
946   absl::StatusOr<absl::any> status_or = CopyDetector(10);
947   absl::StatusOr<absl::any> status_error = absl::InvalidArgumentError("foo");
948   absl::StatusOr<absl::any> a;
949   a = status_or;
950   EXPECT_THAT(
951       a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, false, true))));
952   a = status_error;
953   EXPECT_THAT(a, Not(IsOk()));
954 
955   const absl::StatusOr<absl::any>& cref = status_or;
956   a = cref;
957   EXPECT_THAT(
958       a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, false, true))));
959   const absl::StatusOr<absl::any>& cref_err = status_error;
960   a = cref_err;
961   EXPECT_THAT(a, Not(IsOk()));
962   a = std::move(status_or);
963   EXPECT_THAT(
964       a, IsOkAndHolds(AnyWith<CopyDetector>(CopyDetectorHas(10, true, false))));
965   a = std::move(status_error);
966   EXPECT_THAT(a, Not(IsOk()));
967 }
968 
TEST(StatusOr,StatusOrCopyAndMoveTestsConstructor)969 TEST(StatusOr, StatusOrCopyAndMoveTestsConstructor) {
970   absl::StatusOr<CopyDetector> status_or(10);
971   ASSERT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(10, false, false)));
972   absl::StatusOr<CopyDetector> a(status_or);
973   EXPECT_THAT(a, IsOkAndHolds(CopyDetectorHas(10, false, true)));
974   const absl::StatusOr<CopyDetector>& cref = status_or;
975   absl::StatusOr<CopyDetector> b(cref);  // NOLINT
976   EXPECT_THAT(b, IsOkAndHolds(CopyDetectorHas(10, false, true)));
977   absl::StatusOr<CopyDetector> c(std::move(status_or));
978   EXPECT_THAT(c, IsOkAndHolds(CopyDetectorHas(10, true, false)));
979 }
980 
TEST(StatusOr,StatusOrCopyAndMoveTestsAssignment)981 TEST(StatusOr, StatusOrCopyAndMoveTestsAssignment) {
982   absl::StatusOr<CopyDetector> status_or(10);
983   ASSERT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(10, false, false)));
984   absl::StatusOr<CopyDetector> a;
985   a = status_or;
986   EXPECT_THAT(a, IsOkAndHolds(CopyDetectorHas(10, false, true)));
987   const absl::StatusOr<CopyDetector>& cref = status_or;
988   absl::StatusOr<CopyDetector> b;
989   b = cref;
990   EXPECT_THAT(b, IsOkAndHolds(CopyDetectorHas(10, false, true)));
991   absl::StatusOr<CopyDetector> c;
992   c = std::move(status_or);
993   EXPECT_THAT(c, IsOkAndHolds(CopyDetectorHas(10, true, false)));
994 }
995 
TEST(StatusOr,AbslAnyAssignment)996 TEST(StatusOr, AbslAnyAssignment) {
997   EXPECT_FALSE((std::is_assignable<absl::StatusOr<absl::any>,
998                                    absl::StatusOr<int>>::value));
999   absl::StatusOr<absl::any> status_or;
1000   status_or = absl::InvalidArgumentError("foo");
1001   EXPECT_THAT(status_or, Not(IsOk()));
1002 }
1003 
TEST(StatusOr,ImplicitAssignment)1004 TEST(StatusOr, ImplicitAssignment) {
1005   absl::StatusOr<absl::variant<int, std::string>> status_or;
1006   status_or = 10;
1007   EXPECT_THAT(status_or, IsOkAndHolds(VariantWith<int>(10)));
1008 }
1009 
TEST(StatusOr,SelfDirectInitAssignment)1010 TEST(StatusOr, SelfDirectInitAssignment) {
1011   absl::StatusOr<std::vector<int>> status_or = {{10, 20, 30}};
1012   status_or = *status_or;
1013   EXPECT_THAT(status_or, IsOkAndHolds(ElementsAre(10, 20, 30)));
1014 }
1015 
TEST(StatusOr,ImplicitCastFromInitializerList)1016 TEST(StatusOr, ImplicitCastFromInitializerList) {
1017   absl::StatusOr<std::vector<int>> status_or = {{10, 20, 30}};
1018   EXPECT_THAT(status_or, IsOkAndHolds(ElementsAre(10, 20, 30)));
1019 }
1020 
TEST(StatusOr,UniquePtrImplicitAssignment)1021 TEST(StatusOr, UniquePtrImplicitAssignment) {
1022   absl::StatusOr<std::unique_ptr<Base1>> status_or;
1023   status_or = absl::make_unique<Derived>();
1024   EXPECT_THAT(status_or, IsOkAndHolds(Ne(nullptr)));
1025 }
1026 
TEST(StatusOr,Pointer)1027 TEST(StatusOr, Pointer) {
1028   struct A {};
1029   struct B : public A {};
1030   struct C : private A {};
1031 
1032   EXPECT_TRUE((std::is_constructible<absl::StatusOr<A*>, B*>::value));
1033   EXPECT_TRUE((std::is_convertible<B*, absl::StatusOr<A*>>::value));
1034   EXPECT_FALSE((std::is_constructible<absl::StatusOr<A*>, C*>::value));
1035   EXPECT_FALSE((std::is_convertible<C*, absl::StatusOr<A*>>::value));
1036 }
1037 
TEST(StatusOr,TestAssignmentStatusNotOkConverting)1038 TEST(StatusOr, TestAssignmentStatusNotOkConverting) {
1039   // Copy assignment
1040   {
1041     const absl::Status expected = absl::CancelledError();
1042     absl::StatusOr<int> source(expected);
1043 
1044     absl::StatusOr<double> target;
1045     target = source;
1046 
1047     EXPECT_FALSE(target.ok());
1048     EXPECT_EQ(expected, target.status());
1049 
1050     EXPECT_FALSE(source.ok());
1051     EXPECT_EQ(expected, source.status());
1052   }
1053 
1054   // Move assignment
1055   {
1056     const absl::Status expected = absl::CancelledError();
1057     absl::StatusOr<int> source(expected);
1058 
1059     absl::StatusOr<double> target;
1060     target = std::move(source);
1061 
1062     EXPECT_FALSE(target.ok());
1063     EXPECT_EQ(expected, target.status());
1064 
1065     EXPECT_FALSE(source.ok());
1066     EXPECT_EQ(source.status().code(), absl::StatusCode::kInternal);
1067   }
1068 }
1069 
TEST(StatusOr,SelfAssignment)1070 TEST(StatusOr, SelfAssignment) {
1071   // Copy-assignment, status OK
1072   {
1073     // A string long enough that it's likely to defeat any inline representation
1074     // optimization.
1075     const std::string long_str(128, 'a');
1076 
1077     absl::StatusOr<std::string> so = long_str;
1078     so = *&so;
1079 
1080     ASSERT_TRUE(so.ok());
1081     EXPECT_OK(so.status());
1082     EXPECT_EQ(long_str, *so);
1083   }
1084 
1085   // Copy-assignment, error status
1086   {
1087     absl::StatusOr<int> so = absl::NotFoundError("taco");
1088     so = *&so;
1089 
1090     EXPECT_FALSE(so.ok());
1091     EXPECT_EQ(so.status().code(), absl::StatusCode::kNotFound);
1092     EXPECT_EQ(so.status().message(), "taco");
1093   }
1094 
1095   // Move-assignment with copyable type, status OK
1096   {
1097     absl::StatusOr<int> so = 17;
1098 
1099     // Fool the compiler, which otherwise complains.
1100     auto& same = so;
1101     so = std::move(same);
1102 
1103     ASSERT_TRUE(so.ok());
1104     EXPECT_OK(so.status());
1105     EXPECT_EQ(17, *so);
1106   }
1107 
1108   // Move-assignment with copyable type, error status
1109   {
1110     absl::StatusOr<int> so = absl::NotFoundError("taco");
1111 
1112     // Fool the compiler, which otherwise complains.
1113     auto& same = so;
1114     so = std::move(same);
1115 
1116     EXPECT_FALSE(so.ok());
1117     EXPECT_EQ(so.status().code(), absl::StatusCode::kNotFound);
1118     EXPECT_EQ(so.status().message(), "taco");
1119   }
1120 
1121   // Move-assignment with non-copyable type, status OK
1122   {
1123     const auto raw = new int(17);
1124     absl::StatusOr<std::unique_ptr<int>> so = absl::WrapUnique(raw);
1125 
1126     // Fool the compiler, which otherwise complains.
1127     auto& same = so;
1128     so = std::move(same);
1129 
1130     ASSERT_TRUE(so.ok());
1131     EXPECT_OK(so.status());
1132     EXPECT_EQ(raw, so->get());
1133   }
1134 
1135   // Move-assignment with non-copyable type, error status
1136   {
1137     absl::StatusOr<std::unique_ptr<int>> so = absl::NotFoundError("taco");
1138 
1139     // Fool the compiler, which otherwise complains.
1140     auto& same = so;
1141     so = std::move(same);
1142 
1143     EXPECT_FALSE(so.ok());
1144     EXPECT_EQ(so.status().code(), absl::StatusCode::kNotFound);
1145     EXPECT_EQ(so.status().message(), "taco");
1146   }
1147 }
1148 
1149 // These types form the overload sets of the constructors and the assignment
1150 // operators of `MockValue`. They distinguish construction from assignment,
1151 // lvalue from rvalue.
1152 struct FromConstructibleAssignableLvalue {};
1153 struct FromConstructibleAssignableRvalue {};
1154 struct FromImplicitConstructibleOnly {};
1155 struct FromAssignableOnly {};
1156 
1157 // This class is for testing the forwarding value assignments of `StatusOr`.
1158 // `from_rvalue` indicates whether the constructor or the assignment taking
1159 // rvalue reference is called. `from_assignment` indicates whether any
1160 // assignment is called.
1161 struct MockValue {
1162   // Constructs `MockValue` from `FromConstructibleAssignableLvalue`.
MockValue__anonc4b063700111::MockValue1163   MockValue(const FromConstructibleAssignableLvalue&)  // NOLINT
1164       : from_rvalue(false), assigned(false) {}
1165   // Constructs `MockValue` from `FromConstructibleAssignableRvalue`.
MockValue__anonc4b063700111::MockValue1166   MockValue(FromConstructibleAssignableRvalue&&)  // NOLINT
1167       : from_rvalue(true), assigned(false) {}
1168   // Constructs `MockValue` from `FromImplicitConstructibleOnly`.
1169   // `MockValue` is not assignable from `FromImplicitConstructibleOnly`.
MockValue__anonc4b063700111::MockValue1170   MockValue(const FromImplicitConstructibleOnly&)  // NOLINT
1171       : from_rvalue(false), assigned(false) {}
1172   // Assigns `FromConstructibleAssignableLvalue`.
operator =__anonc4b063700111::MockValue1173   MockValue& operator=(const FromConstructibleAssignableLvalue&) {
1174     from_rvalue = false;
1175     assigned = true;
1176     return *this;
1177   }
1178   // Assigns `FromConstructibleAssignableRvalue` (rvalue only).
operator =__anonc4b063700111::MockValue1179   MockValue& operator=(FromConstructibleAssignableRvalue&&) {
1180     from_rvalue = true;
1181     assigned = true;
1182     return *this;
1183   }
1184   // Assigns `FromAssignableOnly`, but not constructible from
1185   // `FromAssignableOnly`.
operator =__anonc4b063700111::MockValue1186   MockValue& operator=(const FromAssignableOnly&) {
1187     from_rvalue = false;
1188     assigned = true;
1189     return *this;
1190   }
1191   bool from_rvalue;
1192   bool assigned;
1193 };
1194 
1195 // operator=(U&&)
TEST(StatusOr,PerfectForwardingAssignment)1196 TEST(StatusOr, PerfectForwardingAssignment) {
1197   // U == T
1198   constexpr int kValue1 = 10, kValue2 = 20;
1199   absl::StatusOr<CopyDetector> status_or;
1200   CopyDetector lvalue(kValue1);
1201   status_or = lvalue;
1202   EXPECT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(kValue1, false, true)));
1203   status_or = CopyDetector(kValue2);
1204   EXPECT_THAT(status_or, IsOkAndHolds(CopyDetectorHas(kValue2, true, false)));
1205 
1206   // U != T
1207   EXPECT_TRUE(
1208       (std::is_assignable<absl::StatusOr<MockValue>&,
1209                           const FromConstructibleAssignableLvalue&>::value));
1210   EXPECT_TRUE((std::is_assignable<absl::StatusOr<MockValue>&,
1211                                   FromConstructibleAssignableLvalue&&>::value));
1212   EXPECT_FALSE(
1213       (std::is_assignable<absl::StatusOr<MockValue>&,
1214                           const FromConstructibleAssignableRvalue&>::value));
1215   EXPECT_TRUE((std::is_assignable<absl::StatusOr<MockValue>&,
1216                                   FromConstructibleAssignableRvalue&&>::value));
1217   EXPECT_TRUE(
1218       (std::is_assignable<absl::StatusOr<MockValue>&,
1219                           const FromImplicitConstructibleOnly&>::value));
1220   EXPECT_FALSE((std::is_assignable<absl::StatusOr<MockValue>&,
1221                                    const FromAssignableOnly&>::value));
1222 
1223   absl::StatusOr<MockValue> from_lvalue(FromConstructibleAssignableLvalue{});
1224   EXPECT_FALSE(from_lvalue->from_rvalue);
1225   EXPECT_FALSE(from_lvalue->assigned);
1226   from_lvalue = FromConstructibleAssignableLvalue{};
1227   EXPECT_FALSE(from_lvalue->from_rvalue);
1228   EXPECT_TRUE(from_lvalue->assigned);
1229 
1230   absl::StatusOr<MockValue> from_rvalue(FromConstructibleAssignableRvalue{});
1231   EXPECT_TRUE(from_rvalue->from_rvalue);
1232   EXPECT_FALSE(from_rvalue->assigned);
1233   from_rvalue = FromConstructibleAssignableRvalue{};
1234   EXPECT_TRUE(from_rvalue->from_rvalue);
1235   EXPECT_TRUE(from_rvalue->assigned);
1236 
1237   absl::StatusOr<MockValue> from_implicit_constructible(
1238       FromImplicitConstructibleOnly{});
1239   EXPECT_FALSE(from_implicit_constructible->from_rvalue);
1240   EXPECT_FALSE(from_implicit_constructible->assigned);
1241   // construct a temporary `StatusOr` object and invoke the `StatusOr` move
1242   // assignment operator.
1243   from_implicit_constructible = FromImplicitConstructibleOnly{};
1244   EXPECT_FALSE(from_implicit_constructible->from_rvalue);
1245   EXPECT_FALSE(from_implicit_constructible->assigned);
1246 }
1247 
TEST(StatusOr,TestStatus)1248 TEST(StatusOr, TestStatus) {
1249   absl::StatusOr<int> good(4);
1250   EXPECT_TRUE(good.ok());
1251   absl::StatusOr<int> bad(absl::CancelledError());
1252   EXPECT_FALSE(bad.ok());
1253   EXPECT_EQ(bad.status().code(), absl::StatusCode::kCancelled);
1254 }
1255 
TEST(StatusOr,OperatorStarRefQualifiers)1256 TEST(StatusOr, OperatorStarRefQualifiers) {
1257   static_assert(
1258       std::is_same<const int&,
1259                    decltype(*std::declval<const absl::StatusOr<int>&>())>(),
1260       "Unexpected ref-qualifiers");
1261   static_assert(
1262       std::is_same<int&, decltype(*std::declval<absl::StatusOr<int>&>())>(),
1263       "Unexpected ref-qualifiers");
1264   static_assert(
1265       std::is_same<const int&&,
1266                    decltype(*std::declval<const absl::StatusOr<int>&&>())>(),
1267       "Unexpected ref-qualifiers");
1268   static_assert(
1269       std::is_same<int&&, decltype(*std::declval<absl::StatusOr<int>&&>())>(),
1270       "Unexpected ref-qualifiers");
1271 }
1272 
TEST(StatusOr,OperatorStar)1273 TEST(StatusOr, OperatorStar) {
1274   const absl::StatusOr<std::string> const_lvalue("hello");
1275   EXPECT_EQ("hello", *const_lvalue);
1276 
1277   absl::StatusOr<std::string> lvalue("hello");
1278   EXPECT_EQ("hello", *lvalue);
1279 
1280   // Note: Recall that std::move() is equivalent to a static_cast to an rvalue
1281   // reference type.
1282   const absl::StatusOr<std::string> const_rvalue("hello");
1283   EXPECT_EQ("hello", *std::move(const_rvalue));  // NOLINT
1284 
1285   absl::StatusOr<std::string> rvalue("hello");
1286   EXPECT_EQ("hello", *std::move(rvalue));
1287 }
1288 
TEST(StatusOr,OperatorArrowQualifiers)1289 TEST(StatusOr, OperatorArrowQualifiers) {
1290   static_assert(
1291       std::is_same<
1292           const int*,
1293           decltype(std::declval<const absl::StatusOr<int>&>().operator->())>(),
1294       "Unexpected qualifiers");
1295   static_assert(
1296       std::is_same<
1297           int*, decltype(std::declval<absl::StatusOr<int>&>().operator->())>(),
1298       "Unexpected qualifiers");
1299   static_assert(
1300       std::is_same<
1301           const int*,
1302           decltype(std::declval<const absl::StatusOr<int>&&>().operator->())>(),
1303       "Unexpected qualifiers");
1304   static_assert(
1305       std::is_same<
1306           int*, decltype(std::declval<absl::StatusOr<int>&&>().operator->())>(),
1307       "Unexpected qualifiers");
1308 }
1309 
TEST(StatusOr,OperatorArrow)1310 TEST(StatusOr, OperatorArrow) {
1311   const absl::StatusOr<std::string> const_lvalue("hello");
1312   EXPECT_EQ(std::string("hello"), const_lvalue->c_str());
1313 
1314   absl::StatusOr<std::string> lvalue("hello");
1315   EXPECT_EQ(std::string("hello"), lvalue->c_str());
1316 }
1317 
TEST(StatusOr,RValueStatus)1318 TEST(StatusOr, RValueStatus) {
1319   absl::StatusOr<int> so(absl::NotFoundError("taco"));
1320   const absl::Status s = std::move(so).status();
1321 
1322   EXPECT_EQ(s.code(), absl::StatusCode::kNotFound);
1323   EXPECT_EQ(s.message(), "taco");
1324 
1325   // Check that !ok() still implies !status().ok(), even after moving out of the
1326   // object. See the note on the rvalue ref-qualified status method.
1327   EXPECT_FALSE(so.ok());  // NOLINT
1328   EXPECT_FALSE(so.status().ok());
1329   EXPECT_EQ(so.status().code(), absl::StatusCode::kInternal);
1330   EXPECT_EQ(so.status().message(), "Status accessed after move.");
1331 }
1332 
TEST(StatusOr,TestValue)1333 TEST(StatusOr, TestValue) {
1334   const int kI = 4;
1335   absl::StatusOr<int> thing(kI);
1336   EXPECT_EQ(kI, *thing);
1337 }
1338 
TEST(StatusOr,TestValueConst)1339 TEST(StatusOr, TestValueConst) {
1340   const int kI = 4;
1341   const absl::StatusOr<int> thing(kI);
1342   EXPECT_EQ(kI, *thing);
1343 }
1344 
TEST(StatusOr,TestPointerDefaultCtor)1345 TEST(StatusOr, TestPointerDefaultCtor) {
1346   absl::StatusOr<int*> thing;
1347   EXPECT_FALSE(thing.ok());
1348   EXPECT_EQ(thing.status().code(), absl::StatusCode::kUnknown);
1349 }
1350 
TEST(StatusOr,TestPointerStatusCtor)1351 TEST(StatusOr, TestPointerStatusCtor) {
1352   absl::StatusOr<int*> thing(absl::CancelledError());
1353   EXPECT_FALSE(thing.ok());
1354   EXPECT_EQ(thing.status().code(), absl::StatusCode::kCancelled);
1355 }
1356 
TEST(StatusOr,TestPointerValueCtor)1357 TEST(StatusOr, TestPointerValueCtor) {
1358   const int kI = 4;
1359 
1360   // Construction from a non-null pointer
1361   {
1362     absl::StatusOr<const int*> so(&kI);
1363     EXPECT_TRUE(so.ok());
1364     EXPECT_OK(so.status());
1365     EXPECT_EQ(&kI, *so);
1366   }
1367 
1368   // Construction from a null pointer constant
1369   {
1370     absl::StatusOr<const int*> so(nullptr);
1371     EXPECT_TRUE(so.ok());
1372     EXPECT_OK(so.status());
1373     EXPECT_EQ(nullptr, *so);
1374   }
1375 
1376   // Construction from a non-literal null pointer
1377   {
1378     const int* const p = nullptr;
1379 
1380     absl::StatusOr<const int*> so(p);
1381     EXPECT_TRUE(so.ok());
1382     EXPECT_OK(so.status());
1383     EXPECT_EQ(nullptr, *so);
1384   }
1385 }
1386 
TEST(StatusOr,TestPointerCopyCtorStatusOk)1387 TEST(StatusOr, TestPointerCopyCtorStatusOk) {
1388   const int kI = 0;
1389   absl::StatusOr<const int*> original(&kI);
1390   absl::StatusOr<const int*> copy(original);
1391   EXPECT_OK(copy.status());
1392   EXPECT_EQ(*original, *copy);
1393 }
1394 
TEST(StatusOr,TestPointerCopyCtorStatusNotOk)1395 TEST(StatusOr, TestPointerCopyCtorStatusNotOk) {
1396   absl::StatusOr<int*> original(absl::CancelledError());
1397   absl::StatusOr<int*> copy(original);
1398   EXPECT_EQ(copy.status().code(), absl::StatusCode::kCancelled);
1399 }
1400 
TEST(StatusOr,TestPointerCopyCtorStatusOKConverting)1401 TEST(StatusOr, TestPointerCopyCtorStatusOKConverting) {
1402   Derived derived;
1403   absl::StatusOr<Derived*> original(&derived);
1404   absl::StatusOr<Base2*> copy(original);
1405   EXPECT_OK(copy.status());
1406   EXPECT_EQ(static_cast<const Base2*>(*original), *copy);
1407 }
1408 
TEST(StatusOr,TestPointerCopyCtorStatusNotOkConverting)1409 TEST(StatusOr, TestPointerCopyCtorStatusNotOkConverting) {
1410   absl::StatusOr<Derived*> original(absl::CancelledError());
1411   absl::StatusOr<Base2*> copy(original);
1412   EXPECT_EQ(copy.status().code(), absl::StatusCode::kCancelled);
1413 }
1414 
TEST(StatusOr,TestPointerAssignmentStatusOk)1415 TEST(StatusOr, TestPointerAssignmentStatusOk) {
1416   const int kI = 0;
1417   absl::StatusOr<const int*> source(&kI);
1418   absl::StatusOr<const int*> target;
1419   target = source;
1420   EXPECT_OK(target.status());
1421   EXPECT_EQ(*source, *target);
1422 }
1423 
TEST(StatusOr,TestPointerAssignmentStatusNotOk)1424 TEST(StatusOr, TestPointerAssignmentStatusNotOk) {
1425   absl::StatusOr<int*> source(absl::CancelledError());
1426   absl::StatusOr<int*> target;
1427   target = source;
1428   EXPECT_EQ(target.status().code(), absl::StatusCode::kCancelled);
1429 }
1430 
TEST(StatusOr,TestPointerAssignmentStatusOKConverting)1431 TEST(StatusOr, TestPointerAssignmentStatusOKConverting) {
1432   Derived derived;
1433   absl::StatusOr<Derived*> source(&derived);
1434   absl::StatusOr<Base2*> target;
1435   target = source;
1436   EXPECT_OK(target.status());
1437   EXPECT_EQ(static_cast<const Base2*>(*source), *target);
1438 }
1439 
TEST(StatusOr,TestPointerAssignmentStatusNotOkConverting)1440 TEST(StatusOr, TestPointerAssignmentStatusNotOkConverting) {
1441   absl::StatusOr<Derived*> source(absl::CancelledError());
1442   absl::StatusOr<Base2*> target;
1443   target = source;
1444   EXPECT_EQ(target.status(), source.status());
1445 }
1446 
TEST(StatusOr,TestPointerStatus)1447 TEST(StatusOr, TestPointerStatus) {
1448   const int kI = 0;
1449   absl::StatusOr<const int*> good(&kI);
1450   EXPECT_TRUE(good.ok());
1451   absl::StatusOr<const int*> bad(absl::CancelledError());
1452   EXPECT_EQ(bad.status().code(), absl::StatusCode::kCancelled);
1453 }
1454 
TEST(StatusOr,TestPointerValue)1455 TEST(StatusOr, TestPointerValue) {
1456   const int kI = 0;
1457   absl::StatusOr<const int*> thing(&kI);
1458   EXPECT_EQ(&kI, *thing);
1459 }
1460 
TEST(StatusOr,TestPointerValueConst)1461 TEST(StatusOr, TestPointerValueConst) {
1462   const int kI = 0;
1463   const absl::StatusOr<const int*> thing(&kI);
1464   EXPECT_EQ(&kI, *thing);
1465 }
1466 
TEST(StatusOr,StatusOrVectorOfUniquePointerCanReserveAndResize)1467 TEST(StatusOr, StatusOrVectorOfUniquePointerCanReserveAndResize) {
1468   using EvilType = std::vector<std::unique_ptr<int>>;
1469   static_assert(std::is_copy_constructible<EvilType>::value, "");
1470   std::vector<::absl::StatusOr<EvilType>> v(5);
1471   v.reserve(v.capacity() + 10);
1472   v.resize(v.capacity() + 10);
1473 }
1474 
TEST(StatusOr,ConstPayload)1475 TEST(StatusOr, ConstPayload) {
1476   // A reduced version of a problematic type found in the wild. All of the
1477   // operations below should compile.
1478   absl::StatusOr<const int> a;
1479 
1480   // Copy-construction
1481   absl::StatusOr<const int> b(a);
1482 
1483   // Copy-assignment
1484   EXPECT_FALSE(std::is_copy_assignable<absl::StatusOr<const int>>::value);
1485 
1486   // Move-construction
1487   absl::StatusOr<const int> c(std::move(a));
1488 
1489   // Move-assignment
1490   EXPECT_FALSE(std::is_move_assignable<absl::StatusOr<const int>>::value);
1491 }
1492 
TEST(StatusOr,MapToStatusOrUniquePtr)1493 TEST(StatusOr, MapToStatusOrUniquePtr) {
1494   // A reduced version of a problematic type found in the wild. All of the
1495   // operations below should compile.
1496   using MapType = std::map<std::string, absl::StatusOr<std::unique_ptr<int>>>;
1497 
1498   MapType a;
1499 
1500   // Move-construction
1501   MapType b(std::move(a));
1502 
1503   // Move-assignment
1504   a = std::move(b);
1505 }
1506 
TEST(StatusOr,ValueOrOk)1507 TEST(StatusOr, ValueOrOk) {
1508   const absl::StatusOr<int> status_or = 0;
1509   EXPECT_EQ(status_or.value_or(-1), 0);
1510 }
1511 
TEST(StatusOr,ValueOrDefault)1512 TEST(StatusOr, ValueOrDefault) {
1513   const absl::StatusOr<int> status_or = absl::CancelledError();
1514   EXPECT_EQ(status_or.value_or(-1), -1);
1515 }
1516 
TEST(StatusOr,MoveOnlyValueOrOk)1517 TEST(StatusOr, MoveOnlyValueOrOk) {
1518   EXPECT_THAT(absl::StatusOr<std::unique_ptr<int>>(absl::make_unique<int>(0))
1519                   .value_or(absl::make_unique<int>(-1)),
1520               Pointee(0));
1521 }
1522 
TEST(StatusOr,MoveOnlyValueOrDefault)1523 TEST(StatusOr, MoveOnlyValueOrDefault) {
1524   EXPECT_THAT(absl::StatusOr<std::unique_ptr<int>>(absl::CancelledError())
1525                   .value_or(absl::make_unique<int>(-1)),
1526               Pointee(-1));
1527 }
1528 
MakeStatus()1529 static absl::StatusOr<int> MakeStatus() { return 100; }
1530 
TEST(StatusOr,TestIgnoreError)1531 TEST(StatusOr, TestIgnoreError) { MakeStatus().IgnoreError(); }
1532 
TEST(StatusOr,EqualityOperator)1533 TEST(StatusOr, EqualityOperator) {
1534   constexpr size_t kNumCases = 4;
1535   std::array<absl::StatusOr<int>, kNumCases> group1 = {
1536       absl::StatusOr<int>(1), absl::StatusOr<int>(2),
1537       absl::StatusOr<int>(absl::InvalidArgumentError("msg")),
1538       absl::StatusOr<int>(absl::InternalError("msg"))};
1539   std::array<absl::StatusOr<int>, kNumCases> group2 = {
1540       absl::StatusOr<int>(1), absl::StatusOr<int>(2),
1541       absl::StatusOr<int>(absl::InvalidArgumentError("msg")),
1542       absl::StatusOr<int>(absl::InternalError("msg"))};
1543   for (size_t i = 0; i < kNumCases; ++i) {
1544     for (size_t j = 0; j < kNumCases; ++j) {
1545       if (i == j) {
1546         EXPECT_TRUE(group1[i] == group2[j]);
1547         EXPECT_FALSE(group1[i] != group2[j]);
1548       } else {
1549         EXPECT_FALSE(group1[i] == group2[j]);
1550         EXPECT_TRUE(group1[i] != group2[j]);
1551       }
1552     }
1553   }
1554 }
1555 
1556 struct MyType {
operator ==__anonc4b063700111::MyType1557   bool operator==(const MyType&) const { return true; }
1558 };
1559 
1560 enum class ConvTraits { kNone = 0, kImplicit = 1, kExplicit = 2 };
1561 
1562 // This class has conversion operator to `StatusOr<T>` based on value of
1563 // `conv_traits`.
1564 template <typename T, ConvTraits conv_traits = ConvTraits::kNone>
1565 struct StatusOrConversionBase {};
1566 
1567 template <typename T>
1568 struct StatusOrConversionBase<T, ConvTraits::kImplicit> {
operator absl::StatusOr<T>__anonc4b063700111::StatusOrConversionBase1569   operator absl::StatusOr<T>() const& {  // NOLINT
1570     return absl::InvalidArgumentError("conversion to absl::StatusOr");
1571   }
operator absl::StatusOr<T>__anonc4b063700111::StatusOrConversionBase1572   operator absl::StatusOr<T>() && {  // NOLINT
1573     return absl::InvalidArgumentError("conversion to absl::StatusOr");
1574   }
1575 };
1576 
1577 template <typename T>
1578 struct StatusOrConversionBase<T, ConvTraits::kExplicit> {
operator absl::StatusOr<T>__anonc4b063700111::StatusOrConversionBase1579   explicit operator absl::StatusOr<T>() const& {
1580     return absl::InvalidArgumentError("conversion to absl::StatusOr");
1581   }
operator absl::StatusOr<T>__anonc4b063700111::StatusOrConversionBase1582   explicit operator absl::StatusOr<T>() && {
1583     return absl::InvalidArgumentError("conversion to absl::StatusOr");
1584   }
1585 };
1586 
1587 // This class has conversion operator to `T` based on the value of
1588 // `conv_traits`.
1589 template <typename T, ConvTraits conv_traits = ConvTraits::kNone>
1590 struct ConversionBase {};
1591 
1592 template <typename T>
1593 struct ConversionBase<T, ConvTraits::kImplicit> {
operator T__anonc4b063700111::ConversionBase1594   operator T() const& { return t; }         // NOLINT
operator T__anonc4b063700111::ConversionBase1595   operator T() && { return std::move(t); }  // NOLINT
1596   T t;
1597 };
1598 
1599 template <typename T>
1600 struct ConversionBase<T, ConvTraits::kExplicit> {
operator T__anonc4b063700111::ConversionBase1601   explicit operator T() const& { return t; }
operator T__anonc4b063700111::ConversionBase1602   explicit operator T() && { return std::move(t); }
1603   T t;
1604 };
1605 
1606 // This class has conversion operator to `absl::Status` based on the value of
1607 // `conv_traits`.
1608 template <ConvTraits conv_traits = ConvTraits::kNone>
1609 struct StatusConversionBase {};
1610 
1611 template <>
1612 struct StatusConversionBase<ConvTraits::kImplicit> {
operator absl::Status__anonc4b063700111::StatusConversionBase1613   operator absl::Status() const& {  // NOLINT
1614     return absl::InternalError("conversion to Status");
1615   }
operator absl::Status__anonc4b063700111::StatusConversionBase1616   operator absl::Status() && {  // NOLINT
1617     return absl::InternalError("conversion to Status");
1618   }
1619 };
1620 
1621 template <>
1622 struct StatusConversionBase<ConvTraits::kExplicit> {
operator absl::Status__anonc4b063700111::StatusConversionBase1623   explicit operator absl::Status() const& {  // NOLINT
1624     return absl::InternalError("conversion to Status");
1625   }
operator absl::Status__anonc4b063700111::StatusConversionBase1626   explicit operator absl::Status() && {  // NOLINT
1627     return absl::InternalError("conversion to Status");
1628   }
1629 };
1630 
1631 static constexpr int kConvToStatus = 1;
1632 static constexpr int kConvToStatusOr = 2;
1633 static constexpr int kConvToT = 4;
1634 static constexpr int kConvExplicit = 8;
1635 
GetConvTraits(int bit,int config)1636 constexpr ConvTraits GetConvTraits(int bit, int config) {
1637   return (config & bit) == 0
1638              ? ConvTraits::kNone
1639              : ((config & kConvExplicit) == 0 ? ConvTraits::kImplicit
1640                                               : ConvTraits::kExplicit);
1641 }
1642 
1643 // This class conditionally has conversion operator to `absl::Status`, `T`,
1644 // `StatusOr<T>`, based on values of the template parameters.
1645 template <typename T, int config>
1646 struct CustomType
1647     : StatusOrConversionBase<T, GetConvTraits(kConvToStatusOr, config)>,
1648       ConversionBase<T, GetConvTraits(kConvToT, config)>,
1649       StatusConversionBase<GetConvTraits(kConvToStatus, config)> {};
1650 
1651 struct ConvertibleToAnyStatusOr {
1652   template <typename T>
operator absl::StatusOr<T>__anonc4b063700111::ConvertibleToAnyStatusOr1653   operator absl::StatusOr<T>() const {  // NOLINT
1654     return absl::InvalidArgumentError("Conversion to absl::StatusOr");
1655   }
1656 };
1657 
1658 // Test the rank of overload resolution for `StatusOr<T>` constructor and
1659 // assignment, from highest to lowest:
1660 // 1. T/Status
1661 // 2. U that has conversion operator to absl::StatusOr<T>
1662 // 3. U that is convertible to Status
1663 // 4. U that is convertible to T
TEST(StatusOr,ConstructionFromT)1664 TEST(StatusOr, ConstructionFromT) {
1665   // Construct absl::StatusOr<T> from T when T is convertible to
1666   // absl::StatusOr<T>
1667   {
1668     ConvertibleToAnyStatusOr v;
1669     absl::StatusOr<ConvertibleToAnyStatusOr> statusor(v);
1670     EXPECT_TRUE(statusor.ok());
1671   }
1672   {
1673     ConvertibleToAnyStatusOr v;
1674     absl::StatusOr<ConvertibleToAnyStatusOr> statusor = v;
1675     EXPECT_TRUE(statusor.ok());
1676   }
1677   // Construct absl::StatusOr<T> from T when T is explicitly convertible to
1678   // Status
1679   {
1680     CustomType<MyType, kConvToStatus | kConvExplicit> v;
1681     absl::StatusOr<CustomType<MyType, kConvToStatus | kConvExplicit>> statusor(
1682         v);
1683     EXPECT_TRUE(statusor.ok());
1684   }
1685   {
1686     CustomType<MyType, kConvToStatus | kConvExplicit> v;
1687     absl::StatusOr<CustomType<MyType, kConvToStatus | kConvExplicit>> statusor =
1688         v;
1689     EXPECT_TRUE(statusor.ok());
1690   }
1691 }
1692 
1693 // Construct absl::StatusOr<T> from U when U is explicitly convertible to T
TEST(StatusOr,ConstructionFromTypeConvertibleToT)1694 TEST(StatusOr, ConstructionFromTypeConvertibleToT) {
1695   {
1696     CustomType<MyType, kConvToT | kConvExplicit> v;
1697     absl::StatusOr<MyType> statusor(v);
1698     EXPECT_TRUE(statusor.ok());
1699   }
1700   {
1701     CustomType<MyType, kConvToT> v;
1702     absl::StatusOr<MyType> statusor = v;
1703     EXPECT_TRUE(statusor.ok());
1704   }
1705 }
1706 
1707 // Construct absl::StatusOr<T> from U when U has explicit conversion operator to
1708 // absl::StatusOr<T>
TEST(StatusOr,ConstructionFromTypeWithConversionOperatorToStatusOrT)1709 TEST(StatusOr, ConstructionFromTypeWithConversionOperatorToStatusOrT) {
1710   {
1711     CustomType<MyType, kConvToStatusOr | kConvExplicit> v;
1712     absl::StatusOr<MyType> statusor(v);
1713     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1714   }
1715   {
1716     CustomType<MyType, kConvToT | kConvToStatusOr | kConvExplicit> v;
1717     absl::StatusOr<MyType> statusor(v);
1718     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1719   }
1720   {
1721     CustomType<MyType, kConvToStatusOr | kConvToStatus | kConvExplicit> v;
1722     absl::StatusOr<MyType> statusor(v);
1723     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1724   }
1725   {
1726     CustomType<MyType,
1727                kConvToT | kConvToStatusOr | kConvToStatus | kConvExplicit>
1728         v;
1729     absl::StatusOr<MyType> statusor(v);
1730     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1731   }
1732   {
1733     CustomType<MyType, kConvToStatusOr> v;
1734     absl::StatusOr<MyType> statusor = v;
1735     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1736   }
1737   {
1738     CustomType<MyType, kConvToT | kConvToStatusOr> v;
1739     absl::StatusOr<MyType> statusor = v;
1740     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1741   }
1742   {
1743     CustomType<MyType, kConvToStatusOr | kConvToStatus> v;
1744     absl::StatusOr<MyType> statusor = v;
1745     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1746   }
1747   {
1748     CustomType<MyType, kConvToT | kConvToStatusOr | kConvToStatus> v;
1749     absl::StatusOr<MyType> statusor = v;
1750     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1751   }
1752 }
1753 
TEST(StatusOr,ConstructionFromTypeConvertibleToStatus)1754 TEST(StatusOr, ConstructionFromTypeConvertibleToStatus) {
1755   // Construction fails because conversion to `Status` is explicit.
1756   {
1757     CustomType<MyType, kConvToStatus | kConvExplicit> v;
1758     absl::StatusOr<MyType> statusor(v);
1759     EXPECT_FALSE(statusor.ok());
1760     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1761   }
1762   {
1763     CustomType<MyType, kConvToT | kConvToStatus | kConvExplicit> v;
1764     absl::StatusOr<MyType> statusor(v);
1765     EXPECT_FALSE(statusor.ok());
1766     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1767   }
1768   {
1769     CustomType<MyType, kConvToStatus> v;
1770     absl::StatusOr<MyType> statusor = v;
1771     EXPECT_FALSE(statusor.ok());
1772     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1773   }
1774   {
1775     CustomType<MyType, kConvToT | kConvToStatus> v;
1776     absl::StatusOr<MyType> statusor = v;
1777     EXPECT_FALSE(statusor.ok());
1778     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1779   }
1780 }
1781 
TEST(StatusOr,AssignmentFromT)1782 TEST(StatusOr, AssignmentFromT) {
1783   // Assign to absl::StatusOr<T> from T when T is convertible to
1784   // absl::StatusOr<T>
1785   {
1786     ConvertibleToAnyStatusOr v;
1787     absl::StatusOr<ConvertibleToAnyStatusOr> statusor;
1788     statusor = v;
1789     EXPECT_TRUE(statusor.ok());
1790   }
1791   // Assign to absl::StatusOr<T> from T when T is convertible to Status
1792   {
1793     CustomType<MyType, kConvToStatus> v;
1794     absl::StatusOr<CustomType<MyType, kConvToStatus>> statusor;
1795     statusor = v;
1796     EXPECT_TRUE(statusor.ok());
1797   }
1798 }
1799 
TEST(StatusOr,AssignmentFromTypeConvertibleToT)1800 TEST(StatusOr, AssignmentFromTypeConvertibleToT) {
1801   // Assign to absl::StatusOr<T> from U when U is convertible to T
1802   {
1803     CustomType<MyType, kConvToT> v;
1804     absl::StatusOr<MyType> statusor;
1805     statusor = v;
1806     EXPECT_TRUE(statusor.ok());
1807   }
1808 }
1809 
TEST(StatusOr,AssignmentFromTypeWithConversionOperatortoStatusOrT)1810 TEST(StatusOr, AssignmentFromTypeWithConversionOperatortoStatusOrT) {
1811   // Assign to absl::StatusOr<T> from U when U has conversion operator to
1812   // absl::StatusOr<T>
1813   {
1814     CustomType<MyType, kConvToStatusOr> v;
1815     absl::StatusOr<MyType> statusor;
1816     statusor = v;
1817     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1818   }
1819   {
1820     CustomType<MyType, kConvToT | kConvToStatusOr> v;
1821     absl::StatusOr<MyType> statusor;
1822     statusor = v;
1823     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1824   }
1825   {
1826     CustomType<MyType, kConvToStatusOr | kConvToStatus> v;
1827     absl::StatusOr<MyType> statusor;
1828     statusor = v;
1829     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1830   }
1831   {
1832     CustomType<MyType, kConvToT | kConvToStatusOr | kConvToStatus> v;
1833     absl::StatusOr<MyType> statusor;
1834     statusor = v;
1835     EXPECT_EQ(statusor, v.operator absl::StatusOr<MyType>());
1836   }
1837 }
1838 
TEST(StatusOr,AssignmentFromTypeConvertibleToStatus)1839 TEST(StatusOr, AssignmentFromTypeConvertibleToStatus) {
1840   // Assign to absl::StatusOr<T> from U when U is convertible to Status
1841   {
1842     CustomType<MyType, kConvToStatus> v;
1843     absl::StatusOr<MyType> statusor;
1844     statusor = v;
1845     EXPECT_FALSE(statusor.ok());
1846     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1847   }
1848   {
1849     CustomType<MyType, kConvToT | kConvToStatus> v;
1850     absl::StatusOr<MyType> statusor;
1851     statusor = v;
1852     EXPECT_FALSE(statusor.ok());
1853     EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1854   }
1855 }
1856 
TEST(StatusOr,StatusAssignmentFromStatusError)1857 TEST(StatusOr, StatusAssignmentFromStatusError) {
1858   absl::StatusOr<absl::Status> statusor;
1859   statusor.AssignStatus(absl::CancelledError());
1860 
1861   EXPECT_FALSE(statusor.ok());
1862   EXPECT_EQ(statusor.status(), absl::CancelledError());
1863 }
1864 
1865 #if GTEST_HAS_DEATH_TEST
TEST(StatusOr,StatusAssignmentFromStatusOk)1866 TEST(StatusOr, StatusAssignmentFromStatusOk) {
1867   EXPECT_DEBUG_DEATH(
1868       {
1869         absl::StatusOr<absl::Status> statusor;
1870         // This will DCHECK.
1871         statusor.AssignStatus(absl::OkStatus());
1872         // In optimized mode, we are actually going to get error::INTERNAL for
1873         // status here, rather than crashing, so check that.
1874         EXPECT_FALSE(statusor.ok());
1875         EXPECT_EQ(statusor.status().code(), absl::StatusCode::kInternal);
1876       },
1877       "An OK status is not a valid constructor argument to StatusOr<T>");
1878 }
1879 #endif
1880 
TEST(StatusOr,StatusAssignmentFromTypeConvertibleToStatus)1881 TEST(StatusOr, StatusAssignmentFromTypeConvertibleToStatus) {
1882   CustomType<MyType, kConvToStatus> v;
1883   absl::StatusOr<MyType> statusor;
1884   statusor.AssignStatus(v);
1885 
1886   EXPECT_FALSE(statusor.ok());
1887   EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
1888 }
1889 
1890 struct PrintTestStruct {
operator <<(std::ostream & os,const PrintTestStruct &)1891   friend std::ostream& operator<<(std::ostream& os, const PrintTestStruct&) {
1892     return os << "ostream";
1893   }
1894 
1895   template <typename Sink>
AbslStringify(Sink & sink,const PrintTestStruct &)1896   friend void AbslStringify(Sink& sink, const PrintTestStruct&) {
1897     sink.Append("stringify");
1898   }
1899 };
1900 
TEST(StatusOr,OkPrinting)1901 TEST(StatusOr, OkPrinting) {
1902   absl::StatusOr<PrintTestStruct> print_me = PrintTestStruct{};
1903   std::stringstream stream;
1904   stream << print_me;
1905   EXPECT_EQ(stream.str(), "ostream");
1906   EXPECT_EQ(absl::StrCat(print_me), "stringify");
1907 }
1908 
TEST(StatusOr,ErrorPrinting)1909 TEST(StatusOr, ErrorPrinting) {
1910   absl::StatusOr<PrintTestStruct> print_me = absl::UnknownError("error");
1911   std::stringstream stream;
1912   stream << print_me;
1913   const auto error_matcher =
1914       AllOf(HasSubstr("UNKNOWN"), HasSubstr("error"),
1915             AnyOf(AllOf(StartsWith("("), EndsWith(")")),
1916                   AllOf(StartsWith("["), EndsWith("]"))));
1917   EXPECT_THAT(stream.str(), error_matcher);
1918   EXPECT_THAT(absl::StrCat(print_me), error_matcher);
1919 }
1920 
1921 }  // namespace
1922