statusor_test.cc 59 KB

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