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