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