xref: /aosp_15_r20/external/abseil-cpp/absl/status/status_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2019 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker #include "absl/status/status.h"
16*9356374aSAndroid Build Coastguard Worker 
17*9356374aSAndroid Build Coastguard Worker #include <errno.h>
18*9356374aSAndroid Build Coastguard Worker 
19*9356374aSAndroid Build Coastguard Worker #include <array>
20*9356374aSAndroid Build Coastguard Worker #include <cstddef>
21*9356374aSAndroid Build Coastguard Worker #include <sstream>
22*9356374aSAndroid Build Coastguard Worker #include <utility>
23*9356374aSAndroid Build Coastguard Worker 
24*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
25*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
26*9356374aSAndroid Build Coastguard Worker #include "absl/strings/cord.h"
27*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_cat.h"
28*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_format.h"
29*9356374aSAndroid Build Coastguard Worker 
30*9356374aSAndroid Build Coastguard Worker namespace {
31*9356374aSAndroid Build Coastguard Worker 
32*9356374aSAndroid Build Coastguard Worker using ::testing::Eq;
33*9356374aSAndroid Build Coastguard Worker using ::testing::HasSubstr;
34*9356374aSAndroid Build Coastguard Worker using ::testing::Optional;
35*9356374aSAndroid Build Coastguard Worker using ::testing::UnorderedElementsAreArray;
36*9356374aSAndroid Build Coastguard Worker 
TEST(StatusCode,InsertionOperator)37*9356374aSAndroid Build Coastguard Worker TEST(StatusCode, InsertionOperator) {
38*9356374aSAndroid Build Coastguard Worker   const absl::StatusCode code = absl::StatusCode::kUnknown;
39*9356374aSAndroid Build Coastguard Worker   std::ostringstream oss;
40*9356374aSAndroid Build Coastguard Worker   oss << code;
41*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(oss.str(), absl::StatusCodeToString(code));
42*9356374aSAndroid Build Coastguard Worker }
43*9356374aSAndroid Build Coastguard Worker 
44*9356374aSAndroid Build Coastguard Worker // This structure holds the details for testing a single error code,
45*9356374aSAndroid Build Coastguard Worker // its creator, and its classifier.
46*9356374aSAndroid Build Coastguard Worker struct ErrorTest {
47*9356374aSAndroid Build Coastguard Worker   absl::StatusCode code;
48*9356374aSAndroid Build Coastguard Worker   using Creator = absl::Status (*)(
49*9356374aSAndroid Build Coastguard Worker       absl::string_view
50*9356374aSAndroid Build Coastguard Worker   );
51*9356374aSAndroid Build Coastguard Worker   using Classifier = bool (*)(const absl::Status&);
52*9356374aSAndroid Build Coastguard Worker   Creator creator;
53*9356374aSAndroid Build Coastguard Worker   Classifier classifier;
54*9356374aSAndroid Build Coastguard Worker };
55*9356374aSAndroid Build Coastguard Worker 
56*9356374aSAndroid Build Coastguard Worker constexpr ErrorTest kErrorTests[]{
57*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kCancelled, absl::CancelledError, absl::IsCancelled},
58*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kUnknown, absl::UnknownError, absl::IsUnknown},
59*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kInvalidArgument, absl::InvalidArgumentError,
60*9356374aSAndroid Build Coastguard Worker      absl::IsInvalidArgument},
61*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kDeadlineExceeded, absl::DeadlineExceededError,
62*9356374aSAndroid Build Coastguard Worker      absl::IsDeadlineExceeded},
63*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kNotFound, absl::NotFoundError, absl::IsNotFound},
64*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kAlreadyExists, absl::AlreadyExistsError,
65*9356374aSAndroid Build Coastguard Worker      absl::IsAlreadyExists},
66*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kPermissionDenied, absl::PermissionDeniedError,
67*9356374aSAndroid Build Coastguard Worker      absl::IsPermissionDenied},
68*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kResourceExhausted, absl::ResourceExhaustedError,
69*9356374aSAndroid Build Coastguard Worker      absl::IsResourceExhausted},
70*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kFailedPrecondition, absl::FailedPreconditionError,
71*9356374aSAndroid Build Coastguard Worker      absl::IsFailedPrecondition},
72*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kAborted, absl::AbortedError, absl::IsAborted},
73*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kOutOfRange, absl::OutOfRangeError, absl::IsOutOfRange},
74*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kUnimplemented, absl::UnimplementedError,
75*9356374aSAndroid Build Coastguard Worker      absl::IsUnimplemented},
76*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kInternal, absl::InternalError, absl::IsInternal},
77*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kUnavailable, absl::UnavailableError,
78*9356374aSAndroid Build Coastguard Worker      absl::IsUnavailable},
79*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kDataLoss, absl::DataLossError, absl::IsDataLoss},
80*9356374aSAndroid Build Coastguard Worker     {absl::StatusCode::kUnauthenticated, absl::UnauthenticatedError,
81*9356374aSAndroid Build Coastguard Worker      absl::IsUnauthenticated},
82*9356374aSAndroid Build Coastguard Worker };
83*9356374aSAndroid Build Coastguard Worker 
TEST(Status,CreateAndClassify)84*9356374aSAndroid Build Coastguard Worker TEST(Status, CreateAndClassify) {
85*9356374aSAndroid Build Coastguard Worker   for (const auto& test : kErrorTests) {
86*9356374aSAndroid Build Coastguard Worker     SCOPED_TRACE(absl::StatusCodeToString(test.code));
87*9356374aSAndroid Build Coastguard Worker 
88*9356374aSAndroid Build Coastguard Worker     // Ensure that the creator does, in fact, create status objects with the
89*9356374aSAndroid Build Coastguard Worker     // expected error code and message.
90*9356374aSAndroid Build Coastguard Worker     std::string message =
91*9356374aSAndroid Build Coastguard Worker         absl::StrCat("error code ", test.code, " test message");
92*9356374aSAndroid Build Coastguard Worker     absl::Status status = test.creator(
93*9356374aSAndroid Build Coastguard Worker         message
94*9356374aSAndroid Build Coastguard Worker     );
95*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test.code, status.code());
96*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(message, status.message());
97*9356374aSAndroid Build Coastguard Worker 
98*9356374aSAndroid Build Coastguard Worker     // Ensure that the classifier returns true for a status produced by the
99*9356374aSAndroid Build Coastguard Worker     // creator.
100*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(test.classifier(status));
101*9356374aSAndroid Build Coastguard Worker 
102*9356374aSAndroid Build Coastguard Worker     // Ensure that the classifier returns false for status with a different
103*9356374aSAndroid Build Coastguard Worker     // code.
104*9356374aSAndroid Build Coastguard Worker     for (const auto& other : kErrorTests) {
105*9356374aSAndroid Build Coastguard Worker       if (other.code != test.code) {
106*9356374aSAndroid Build Coastguard Worker         EXPECT_FALSE(test.classifier(absl::Status(other.code, "")))
107*9356374aSAndroid Build Coastguard Worker             << " other.code = " << other.code;
108*9356374aSAndroid Build Coastguard Worker       }
109*9356374aSAndroid Build Coastguard Worker     }
110*9356374aSAndroid Build Coastguard Worker   }
111*9356374aSAndroid Build Coastguard Worker }
112*9356374aSAndroid Build Coastguard Worker 
TEST(Status,DefaultConstructor)113*9356374aSAndroid Build Coastguard Worker TEST(Status, DefaultConstructor) {
114*9356374aSAndroid Build Coastguard Worker   absl::Status status;
115*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(status.ok());
116*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::StatusCode::kOk, status.code());
117*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("", status.message());
118*9356374aSAndroid Build Coastguard Worker }
119*9356374aSAndroid Build Coastguard Worker 
TEST(Status,OkStatus)120*9356374aSAndroid Build Coastguard Worker TEST(Status, OkStatus) {
121*9356374aSAndroid Build Coastguard Worker   absl::Status status = absl::OkStatus();
122*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(status.ok());
123*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::StatusCode::kOk, status.code());
124*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("", status.message());
125*9356374aSAndroid Build Coastguard Worker }
126*9356374aSAndroid Build Coastguard Worker 
TEST(Status,ConstructorWithCodeMessage)127*9356374aSAndroid Build Coastguard Worker TEST(Status, ConstructorWithCodeMessage) {
128*9356374aSAndroid Build Coastguard Worker   {
129*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kCancelled, "");
130*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(status.ok());
131*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::StatusCode::kCancelled, status.code());
132*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("", status.message());
133*9356374aSAndroid Build Coastguard Worker   }
134*9356374aSAndroid Build Coastguard Worker   {
135*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kInternal, "message");
136*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(status.ok());
137*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::StatusCode::kInternal, status.code());
138*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("message", status.message());
139*9356374aSAndroid Build Coastguard Worker   }
140*9356374aSAndroid Build Coastguard Worker }
141*9356374aSAndroid Build Coastguard Worker 
TEST(Status,StatusMessageCStringTest)142*9356374aSAndroid Build Coastguard Worker TEST(Status, StatusMessageCStringTest) {
143*9356374aSAndroid Build Coastguard Worker   {
144*9356374aSAndroid Build Coastguard Worker     absl::Status status = absl::OkStatus();
145*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(status.message(), "");
146*9356374aSAndroid Build Coastguard Worker     EXPECT_STREQ(absl::StatusMessageAsCStr(status), "");
147*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(status.message(), absl::StatusMessageAsCStr(status));
148*9356374aSAndroid Build Coastguard Worker     EXPECT_NE(absl::StatusMessageAsCStr(status), nullptr);
149*9356374aSAndroid Build Coastguard Worker   }
150*9356374aSAndroid Build Coastguard Worker   {
151*9356374aSAndroid Build Coastguard Worker     absl::Status status;
152*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(status.message(), "");
153*9356374aSAndroid Build Coastguard Worker     EXPECT_NE(absl::StatusMessageAsCStr(status), nullptr);
154*9356374aSAndroid Build Coastguard Worker     EXPECT_STREQ(absl::StatusMessageAsCStr(status), "");
155*9356374aSAndroid Build Coastguard Worker   }
156*9356374aSAndroid Build Coastguard Worker   {
157*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kInternal, "message");
158*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(status.ok());
159*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::StatusCode::kInternal, status.code());
160*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("message", status.message());
161*9356374aSAndroid Build Coastguard Worker     EXPECT_STREQ("message", absl::StatusMessageAsCStr(status));
162*9356374aSAndroid Build Coastguard Worker   }
163*9356374aSAndroid Build Coastguard Worker }
164*9356374aSAndroid Build Coastguard Worker 
TEST(Status,ConstructOutOfRangeCode)165*9356374aSAndroid Build Coastguard Worker TEST(Status, ConstructOutOfRangeCode) {
166*9356374aSAndroid Build Coastguard Worker   const int kRawCode = 9999;
167*9356374aSAndroid Build Coastguard Worker   absl::Status status(static_cast<absl::StatusCode>(kRawCode), "");
168*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::StatusCode::kUnknown, status.code());
169*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kRawCode, status.raw_code());
170*9356374aSAndroid Build Coastguard Worker }
171*9356374aSAndroid Build Coastguard Worker 
172*9356374aSAndroid Build Coastguard Worker constexpr char kUrl1[] = "url.payload.1";
173*9356374aSAndroid Build Coastguard Worker constexpr char kUrl2[] = "url.payload.2";
174*9356374aSAndroid Build Coastguard Worker constexpr char kUrl3[] = "url.payload.3";
175*9356374aSAndroid Build Coastguard Worker constexpr char kUrl4[] = "url.payload.xx";
176*9356374aSAndroid Build Coastguard Worker 
177*9356374aSAndroid Build Coastguard Worker constexpr char kPayload1[] = "aaaaa";
178*9356374aSAndroid Build Coastguard Worker constexpr char kPayload2[] = "bbbbb";
179*9356374aSAndroid Build Coastguard Worker constexpr char kPayload3[] = "ccccc";
180*9356374aSAndroid Build Coastguard Worker 
181*9356374aSAndroid Build Coastguard Worker using PayloadsVec = std::vector<std::pair<std::string, absl::Cord>>;
182*9356374aSAndroid Build Coastguard Worker 
TEST(Status,TestGetSetPayload)183*9356374aSAndroid Build Coastguard Worker TEST(Status, TestGetSetPayload) {
184*9356374aSAndroid Build Coastguard Worker   absl::Status ok_status = absl::OkStatus();
185*9356374aSAndroid Build Coastguard Worker   ok_status.SetPayload(kUrl1, absl::Cord(kPayload1));
186*9356374aSAndroid Build Coastguard Worker   ok_status.SetPayload(kUrl2, absl::Cord(kPayload2));
187*9356374aSAndroid Build Coastguard Worker 
188*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(ok_status.GetPayload(kUrl1));
189*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(ok_status.GetPayload(kUrl2));
190*9356374aSAndroid Build Coastguard Worker 
191*9356374aSAndroid Build Coastguard Worker   absl::Status bad_status(absl::StatusCode::kInternal, "fail");
192*9356374aSAndroid Build Coastguard Worker   bad_status.SetPayload(kUrl1, absl::Cord(kPayload1));
193*9356374aSAndroid Build Coastguard Worker   bad_status.SetPayload(kUrl2, absl::Cord(kPayload2));
194*9356374aSAndroid Build Coastguard Worker 
195*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(bad_status.GetPayload(kUrl1), Optional(Eq(kPayload1)));
196*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(bad_status.GetPayload(kUrl2), Optional(Eq(kPayload2)));
197*9356374aSAndroid Build Coastguard Worker 
198*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(bad_status.GetPayload(kUrl3));
199*9356374aSAndroid Build Coastguard Worker 
200*9356374aSAndroid Build Coastguard Worker   bad_status.SetPayload(kUrl1, absl::Cord(kPayload3));
201*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(bad_status.GetPayload(kUrl1), Optional(Eq(kPayload3)));
202*9356374aSAndroid Build Coastguard Worker 
203*9356374aSAndroid Build Coastguard Worker   // Testing dynamically generated type_url
204*9356374aSAndroid Build Coastguard Worker   bad_status.SetPayload(absl::StrCat(kUrl1, ".1"), absl::Cord(kPayload1));
205*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(bad_status.GetPayload(absl::StrCat(kUrl1, ".1")),
206*9356374aSAndroid Build Coastguard Worker               Optional(Eq(kPayload1)));
207*9356374aSAndroid Build Coastguard Worker }
208*9356374aSAndroid Build Coastguard Worker 
TEST(Status,TestErasePayload)209*9356374aSAndroid Build Coastguard Worker TEST(Status, TestErasePayload) {
210*9356374aSAndroid Build Coastguard Worker   absl::Status bad_status(absl::StatusCode::kInternal, "fail");
211*9356374aSAndroid Build Coastguard Worker   bad_status.SetPayload(kUrl1, absl::Cord(kPayload1));
212*9356374aSAndroid Build Coastguard Worker   bad_status.SetPayload(kUrl2, absl::Cord(kPayload2));
213*9356374aSAndroid Build Coastguard Worker   bad_status.SetPayload(kUrl3, absl::Cord(kPayload3));
214*9356374aSAndroid Build Coastguard Worker 
215*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(bad_status.ErasePayload(kUrl4));
216*9356374aSAndroid Build Coastguard Worker 
217*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(bad_status.GetPayload(kUrl2));
218*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(bad_status.ErasePayload(kUrl2));
219*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(bad_status.GetPayload(kUrl2));
220*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(bad_status.ErasePayload(kUrl2));
221*9356374aSAndroid Build Coastguard Worker 
222*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(bad_status.ErasePayload(kUrl1));
223*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(bad_status.ErasePayload(kUrl3));
224*9356374aSAndroid Build Coastguard Worker 
225*9356374aSAndroid Build Coastguard Worker   bad_status.SetPayload(kUrl1, absl::Cord(kPayload1));
226*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(bad_status.ErasePayload(kUrl1));
227*9356374aSAndroid Build Coastguard Worker }
228*9356374aSAndroid Build Coastguard Worker 
TEST(Status,TestComparePayloads)229*9356374aSAndroid Build Coastguard Worker TEST(Status, TestComparePayloads) {
230*9356374aSAndroid Build Coastguard Worker   absl::Status bad_status1(absl::StatusCode::kInternal, "fail");
231*9356374aSAndroid Build Coastguard Worker   bad_status1.SetPayload(kUrl1, absl::Cord(kPayload1));
232*9356374aSAndroid Build Coastguard Worker   bad_status1.SetPayload(kUrl2, absl::Cord(kPayload2));
233*9356374aSAndroid Build Coastguard Worker   bad_status1.SetPayload(kUrl3, absl::Cord(kPayload3));
234*9356374aSAndroid Build Coastguard Worker 
235*9356374aSAndroid Build Coastguard Worker   absl::Status bad_status2(absl::StatusCode::kInternal, "fail");
236*9356374aSAndroid Build Coastguard Worker   bad_status2.SetPayload(kUrl2, absl::Cord(kPayload2));
237*9356374aSAndroid Build Coastguard Worker   bad_status2.SetPayload(kUrl3, absl::Cord(kPayload3));
238*9356374aSAndroid Build Coastguard Worker   bad_status2.SetPayload(kUrl1, absl::Cord(kPayload1));
239*9356374aSAndroid Build Coastguard Worker 
240*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bad_status1, bad_status2);
241*9356374aSAndroid Build Coastguard Worker }
242*9356374aSAndroid Build Coastguard Worker 
TEST(Status,TestComparePayloadsAfterErase)243*9356374aSAndroid Build Coastguard Worker TEST(Status, TestComparePayloadsAfterErase) {
244*9356374aSAndroid Build Coastguard Worker   absl::Status payload_status(absl::StatusCode::kInternal, "");
245*9356374aSAndroid Build Coastguard Worker   payload_status.SetPayload(kUrl1, absl::Cord(kPayload1));
246*9356374aSAndroid Build Coastguard Worker   payload_status.SetPayload(kUrl2, absl::Cord(kPayload2));
247*9356374aSAndroid Build Coastguard Worker 
248*9356374aSAndroid Build Coastguard Worker   absl::Status empty_status(absl::StatusCode::kInternal, "");
249*9356374aSAndroid Build Coastguard Worker 
250*9356374aSAndroid Build Coastguard Worker   // Different payloads, not equal
251*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(payload_status, empty_status);
252*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(payload_status.ErasePayload(kUrl1));
253*9356374aSAndroid Build Coastguard Worker 
254*9356374aSAndroid Build Coastguard Worker   // Still Different payloads, still not equal.
255*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(payload_status, empty_status);
256*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(payload_status.ErasePayload(kUrl2));
257*9356374aSAndroid Build Coastguard Worker 
258*9356374aSAndroid Build Coastguard Worker   // Both empty payloads, should be equal
259*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(payload_status, empty_status);
260*9356374aSAndroid Build Coastguard Worker }
261*9356374aSAndroid Build Coastguard Worker 
AllVisitedPayloads(const absl::Status & s)262*9356374aSAndroid Build Coastguard Worker PayloadsVec AllVisitedPayloads(const absl::Status& s) {
263*9356374aSAndroid Build Coastguard Worker   PayloadsVec result;
264*9356374aSAndroid Build Coastguard Worker 
265*9356374aSAndroid Build Coastguard Worker   s.ForEachPayload([&](absl::string_view type_url, const absl::Cord& payload) {
266*9356374aSAndroid Build Coastguard Worker     result.push_back(std::make_pair(std::string(type_url), payload));
267*9356374aSAndroid Build Coastguard Worker   });
268*9356374aSAndroid Build Coastguard Worker 
269*9356374aSAndroid Build Coastguard Worker   return result;
270*9356374aSAndroid Build Coastguard Worker }
271*9356374aSAndroid Build Coastguard Worker 
TEST(Status,TestForEachPayload)272*9356374aSAndroid Build Coastguard Worker TEST(Status, TestForEachPayload) {
273*9356374aSAndroid Build Coastguard Worker   absl::Status bad_status(absl::StatusCode::kInternal, "fail");
274*9356374aSAndroid Build Coastguard Worker   bad_status.SetPayload(kUrl1, absl::Cord(kPayload1));
275*9356374aSAndroid Build Coastguard Worker   bad_status.SetPayload(kUrl2, absl::Cord(kPayload2));
276*9356374aSAndroid Build Coastguard Worker   bad_status.SetPayload(kUrl3, absl::Cord(kPayload3));
277*9356374aSAndroid Build Coastguard Worker 
278*9356374aSAndroid Build Coastguard Worker   int count = 0;
279*9356374aSAndroid Build Coastguard Worker 
280*9356374aSAndroid Build Coastguard Worker   bad_status.ForEachPayload(
281*9356374aSAndroid Build Coastguard Worker       [&count](absl::string_view, const absl::Cord&) { ++count; });
282*9356374aSAndroid Build Coastguard Worker 
283*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(count, 3);
284*9356374aSAndroid Build Coastguard Worker 
285*9356374aSAndroid Build Coastguard Worker   PayloadsVec expected_payloads = {{kUrl1, absl::Cord(kPayload1)},
286*9356374aSAndroid Build Coastguard Worker                                    {kUrl2, absl::Cord(kPayload2)},
287*9356374aSAndroid Build Coastguard Worker                                    {kUrl3, absl::Cord(kPayload3)}};
288*9356374aSAndroid Build Coastguard Worker 
289*9356374aSAndroid Build Coastguard Worker   // Test that we visit all the payloads in the status.
290*9356374aSAndroid Build Coastguard Worker   PayloadsVec visited_payloads = AllVisitedPayloads(bad_status);
291*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(visited_payloads, UnorderedElementsAreArray(expected_payloads));
292*9356374aSAndroid Build Coastguard Worker 
293*9356374aSAndroid Build Coastguard Worker   // Test that visitation order is not consistent between run.
294*9356374aSAndroid Build Coastguard Worker   std::vector<absl::Status> scratch;
295*9356374aSAndroid Build Coastguard Worker   while (true) {
296*9356374aSAndroid Build Coastguard Worker     scratch.emplace_back(absl::StatusCode::kInternal, "fail");
297*9356374aSAndroid Build Coastguard Worker 
298*9356374aSAndroid Build Coastguard Worker     scratch.back().SetPayload(kUrl1, absl::Cord(kPayload1));
299*9356374aSAndroid Build Coastguard Worker     scratch.back().SetPayload(kUrl2, absl::Cord(kPayload2));
300*9356374aSAndroid Build Coastguard Worker     scratch.back().SetPayload(kUrl3, absl::Cord(kPayload3));
301*9356374aSAndroid Build Coastguard Worker 
302*9356374aSAndroid Build Coastguard Worker     if (AllVisitedPayloads(scratch.back()) != visited_payloads) {
303*9356374aSAndroid Build Coastguard Worker       break;
304*9356374aSAndroid Build Coastguard Worker     }
305*9356374aSAndroid Build Coastguard Worker   }
306*9356374aSAndroid Build Coastguard Worker }
307*9356374aSAndroid Build Coastguard Worker 
TEST(Status,ToString)308*9356374aSAndroid Build Coastguard Worker TEST(Status, ToString) {
309*9356374aSAndroid Build Coastguard Worker   absl::Status status(absl::StatusCode::kInternal, "fail");
310*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("INTERNAL: fail", status.ToString());
311*9356374aSAndroid Build Coastguard Worker   status.SetPayload("foo", absl::Cord("bar"));
312*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("INTERNAL: fail [foo='bar']", status.ToString());
313*9356374aSAndroid Build Coastguard Worker   status.SetPayload("bar", absl::Cord("\377"));
314*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status.ToString(),
315*9356374aSAndroid Build Coastguard Worker               AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"),
316*9356374aSAndroid Build Coastguard Worker                     HasSubstr("[bar='\\xff']")));
317*9356374aSAndroid Build Coastguard Worker }
318*9356374aSAndroid Build Coastguard Worker 
TEST(Status,ToStringMode)319*9356374aSAndroid Build Coastguard Worker TEST(Status, ToStringMode) {
320*9356374aSAndroid Build Coastguard Worker   absl::Status status(absl::StatusCode::kInternal, "fail");
321*9356374aSAndroid Build Coastguard Worker   status.SetPayload("foo", absl::Cord("bar"));
322*9356374aSAndroid Build Coastguard Worker   status.SetPayload("bar", absl::Cord("\377"));
323*9356374aSAndroid Build Coastguard Worker 
324*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("INTERNAL: fail",
325*9356374aSAndroid Build Coastguard Worker             status.ToString(absl::StatusToStringMode::kWithNoExtraData));
326*9356374aSAndroid Build Coastguard Worker 
327*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status.ToString(absl::StatusToStringMode::kWithPayload),
328*9356374aSAndroid Build Coastguard Worker               AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"),
329*9356374aSAndroid Build Coastguard Worker                     HasSubstr("[bar='\\xff']")));
330*9356374aSAndroid Build Coastguard Worker 
331*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status.ToString(absl::StatusToStringMode::kWithEverything),
332*9356374aSAndroid Build Coastguard Worker               AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"),
333*9356374aSAndroid Build Coastguard Worker                     HasSubstr("[bar='\\xff']")));
334*9356374aSAndroid Build Coastguard Worker 
335*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(status.ToString(~absl::StatusToStringMode::kWithPayload),
336*9356374aSAndroid Build Coastguard Worker               AllOf(HasSubstr("INTERNAL: fail"), Not(HasSubstr("[foo='bar']")),
337*9356374aSAndroid Build Coastguard Worker                     Not(HasSubstr("[bar='\\xff']"))));
338*9356374aSAndroid Build Coastguard Worker }
339*9356374aSAndroid Build Coastguard Worker 
TEST(Status,OstreamOperator)340*9356374aSAndroid Build Coastguard Worker TEST(Status, OstreamOperator) {
341*9356374aSAndroid Build Coastguard Worker   absl::Status status(absl::StatusCode::kInternal, "fail");
342*9356374aSAndroid Build Coastguard Worker   { std::stringstream stream;
343*9356374aSAndroid Build Coastguard Worker     stream << status;
344*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("INTERNAL: fail", stream.str());
345*9356374aSAndroid Build Coastguard Worker   }
346*9356374aSAndroid Build Coastguard Worker   status.SetPayload("foo", absl::Cord("bar"));
347*9356374aSAndroid Build Coastguard Worker   { std::stringstream stream;
348*9356374aSAndroid Build Coastguard Worker     stream << status;
349*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ("INTERNAL: fail [foo='bar']", stream.str());
350*9356374aSAndroid Build Coastguard Worker   }
351*9356374aSAndroid Build Coastguard Worker   status.SetPayload("bar", absl::Cord("\377"));
352*9356374aSAndroid Build Coastguard Worker   { std::stringstream stream;
353*9356374aSAndroid Build Coastguard Worker     stream << status;
354*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(stream.str(),
355*9356374aSAndroid Build Coastguard Worker                 AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"),
356*9356374aSAndroid Build Coastguard Worker                       HasSubstr("[bar='\\xff']")));
357*9356374aSAndroid Build Coastguard Worker   }
358*9356374aSAndroid Build Coastguard Worker }
359*9356374aSAndroid Build Coastguard Worker 
TEST(Status,AbslStringify)360*9356374aSAndroid Build Coastguard Worker TEST(Status, AbslStringify) {
361*9356374aSAndroid Build Coastguard Worker   absl::Status status(absl::StatusCode::kInternal, "fail");
362*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("INTERNAL: fail", absl::StrCat(status));
363*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("INTERNAL: fail", absl::StrFormat("%v", status));
364*9356374aSAndroid Build Coastguard Worker   status.SetPayload("foo", absl::Cord("bar"));
365*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("INTERNAL: fail [foo='bar']", absl::StrCat(status));
366*9356374aSAndroid Build Coastguard Worker   status.SetPayload("bar", absl::Cord("\377"));
367*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(absl::StrCat(status),
368*9356374aSAndroid Build Coastguard Worker               AllOf(HasSubstr("INTERNAL: fail"), HasSubstr("[foo='bar']"),
369*9356374aSAndroid Build Coastguard Worker                     HasSubstr("[bar='\\xff']")));
370*9356374aSAndroid Build Coastguard Worker }
371*9356374aSAndroid Build Coastguard Worker 
TEST(Status,OstreamEqStringify)372*9356374aSAndroid Build Coastguard Worker TEST(Status, OstreamEqStringify) {
373*9356374aSAndroid Build Coastguard Worker   absl::Status status(absl::StatusCode::kUnknown, "fail");
374*9356374aSAndroid Build Coastguard Worker   status.SetPayload("foo", absl::Cord("bar"));
375*9356374aSAndroid Build Coastguard Worker   std::stringstream stream;
376*9356374aSAndroid Build Coastguard Worker   stream << status;
377*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(stream.str(), absl::StrCat(status));
378*9356374aSAndroid Build Coastguard Worker }
379*9356374aSAndroid Build Coastguard Worker 
EraseAndReturn(const absl::Status & base)380*9356374aSAndroid Build Coastguard Worker absl::Status EraseAndReturn(const absl::Status& base) {
381*9356374aSAndroid Build Coastguard Worker   absl::Status copy = base;
382*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(copy.ErasePayload(kUrl1));
383*9356374aSAndroid Build Coastguard Worker   return copy;
384*9356374aSAndroid Build Coastguard Worker }
385*9356374aSAndroid Build Coastguard Worker 
TEST(Status,CopyOnWriteForErasePayload)386*9356374aSAndroid Build Coastguard Worker TEST(Status, CopyOnWriteForErasePayload) {
387*9356374aSAndroid Build Coastguard Worker   {
388*9356374aSAndroid Build Coastguard Worker     absl::Status base(absl::StatusCode::kInvalidArgument, "fail");
389*9356374aSAndroid Build Coastguard Worker     base.SetPayload(kUrl1, absl::Cord(kPayload1));
390*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(base.GetPayload(kUrl1).has_value());
391*9356374aSAndroid Build Coastguard Worker     absl::Status copy = EraseAndReturn(base);
392*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(base.GetPayload(kUrl1).has_value());
393*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(copy.GetPayload(kUrl1).has_value());
394*9356374aSAndroid Build Coastguard Worker   }
395*9356374aSAndroid Build Coastguard Worker   {
396*9356374aSAndroid Build Coastguard Worker     absl::Status base(absl::StatusCode::kInvalidArgument, "fail");
397*9356374aSAndroid Build Coastguard Worker     base.SetPayload(kUrl1, absl::Cord(kPayload1));
398*9356374aSAndroid Build Coastguard Worker     absl::Status copy = base;
399*9356374aSAndroid Build Coastguard Worker 
400*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(base.GetPayload(kUrl1).has_value());
401*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(copy.GetPayload(kUrl1).has_value());
402*9356374aSAndroid Build Coastguard Worker 
403*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(base.ErasePayload(kUrl1));
404*9356374aSAndroid Build Coastguard Worker 
405*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(base.GetPayload(kUrl1).has_value());
406*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(copy.GetPayload(kUrl1).has_value());
407*9356374aSAndroid Build Coastguard Worker   }
408*9356374aSAndroid Build Coastguard Worker }
409*9356374aSAndroid Build Coastguard Worker 
TEST(Status,CopyConstructor)410*9356374aSAndroid Build Coastguard Worker TEST(Status, CopyConstructor) {
411*9356374aSAndroid Build Coastguard Worker   {
412*9356374aSAndroid Build Coastguard Worker     absl::Status status;
413*9356374aSAndroid Build Coastguard Worker     absl::Status copy(status);
414*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(copy, status);
415*9356374aSAndroid Build Coastguard Worker   }
416*9356374aSAndroid Build Coastguard Worker   {
417*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kInvalidArgument, "message");
418*9356374aSAndroid Build Coastguard Worker     absl::Status copy(status);
419*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(copy, status);
420*9356374aSAndroid Build Coastguard Worker   }
421*9356374aSAndroid Build Coastguard Worker   {
422*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kInvalidArgument, "message");
423*9356374aSAndroid Build Coastguard Worker     status.SetPayload(kUrl1, absl::Cord(kPayload1));
424*9356374aSAndroid Build Coastguard Worker     absl::Status copy(status);
425*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(copy, status);
426*9356374aSAndroid Build Coastguard Worker   }
427*9356374aSAndroid Build Coastguard Worker }
428*9356374aSAndroid Build Coastguard Worker 
TEST(Status,CopyAssignment)429*9356374aSAndroid Build Coastguard Worker TEST(Status, CopyAssignment) {
430*9356374aSAndroid Build Coastguard Worker   absl::Status assignee;
431*9356374aSAndroid Build Coastguard Worker   {
432*9356374aSAndroid Build Coastguard Worker     absl::Status status;
433*9356374aSAndroid Build Coastguard Worker     assignee = status;
434*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(assignee, status);
435*9356374aSAndroid Build Coastguard Worker   }
436*9356374aSAndroid Build Coastguard Worker   {
437*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kInvalidArgument, "message");
438*9356374aSAndroid Build Coastguard Worker     assignee = status;
439*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(assignee, status);
440*9356374aSAndroid Build Coastguard Worker   }
441*9356374aSAndroid Build Coastguard Worker   {
442*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kInvalidArgument, "message");
443*9356374aSAndroid Build Coastguard Worker     status.SetPayload(kUrl1, absl::Cord(kPayload1));
444*9356374aSAndroid Build Coastguard Worker     assignee = status;
445*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(assignee, status);
446*9356374aSAndroid Build Coastguard Worker   }
447*9356374aSAndroid Build Coastguard Worker }
448*9356374aSAndroid Build Coastguard Worker 
TEST(Status,CopyAssignmentIsNotRef)449*9356374aSAndroid Build Coastguard Worker TEST(Status, CopyAssignmentIsNotRef) {
450*9356374aSAndroid Build Coastguard Worker   const absl::Status status_orig(absl::StatusCode::kInvalidArgument, "message");
451*9356374aSAndroid Build Coastguard Worker   absl::Status status_copy = status_orig;
452*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(status_orig, status_copy);
453*9356374aSAndroid Build Coastguard Worker   status_copy.SetPayload(kUrl1, absl::Cord(kPayload1));
454*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(status_orig, status_copy);
455*9356374aSAndroid Build Coastguard Worker }
456*9356374aSAndroid Build Coastguard Worker 
TEST(Status,MoveConstructor)457*9356374aSAndroid Build Coastguard Worker TEST(Status, MoveConstructor) {
458*9356374aSAndroid Build Coastguard Worker   {
459*9356374aSAndroid Build Coastguard Worker     absl::Status status;
460*9356374aSAndroid Build Coastguard Worker     absl::Status copy(absl::Status{});
461*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(copy, status);
462*9356374aSAndroid Build Coastguard Worker   }
463*9356374aSAndroid Build Coastguard Worker   {
464*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kInvalidArgument, "message");
465*9356374aSAndroid Build Coastguard Worker     absl::Status copy(
466*9356374aSAndroid Build Coastguard Worker         absl::Status(absl::StatusCode::kInvalidArgument, "message"));
467*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(copy, status);
468*9356374aSAndroid Build Coastguard Worker   }
469*9356374aSAndroid Build Coastguard Worker   {
470*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kInvalidArgument, "message");
471*9356374aSAndroid Build Coastguard Worker     status.SetPayload(kUrl1, absl::Cord(kPayload1));
472*9356374aSAndroid Build Coastguard Worker     absl::Status copy1(status);
473*9356374aSAndroid Build Coastguard Worker     absl::Status copy2(std::move(status));
474*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(copy1, copy2);
475*9356374aSAndroid Build Coastguard Worker   }
476*9356374aSAndroid Build Coastguard Worker }
477*9356374aSAndroid Build Coastguard Worker 
TEST(Status,MoveAssignment)478*9356374aSAndroid Build Coastguard Worker TEST(Status, MoveAssignment) {
479*9356374aSAndroid Build Coastguard Worker   absl::Status assignee;
480*9356374aSAndroid Build Coastguard Worker   {
481*9356374aSAndroid Build Coastguard Worker     absl::Status status;
482*9356374aSAndroid Build Coastguard Worker     assignee = absl::Status();
483*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(assignee, status);
484*9356374aSAndroid Build Coastguard Worker   }
485*9356374aSAndroid Build Coastguard Worker   {
486*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kInvalidArgument, "message");
487*9356374aSAndroid Build Coastguard Worker     assignee = absl::Status(absl::StatusCode::kInvalidArgument, "message");
488*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(assignee, status);
489*9356374aSAndroid Build Coastguard Worker   }
490*9356374aSAndroid Build Coastguard Worker   {
491*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kInvalidArgument, "message");
492*9356374aSAndroid Build Coastguard Worker     status.SetPayload(kUrl1, absl::Cord(kPayload1));
493*9356374aSAndroid Build Coastguard Worker     absl::Status copy(status);
494*9356374aSAndroid Build Coastguard Worker     assignee = std::move(status);
495*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(assignee, copy);
496*9356374aSAndroid Build Coastguard Worker   }
497*9356374aSAndroid Build Coastguard Worker   {
498*9356374aSAndroid Build Coastguard Worker     absl::Status status(absl::StatusCode::kInvalidArgument, "message");
499*9356374aSAndroid Build Coastguard Worker     absl::Status copy(status);
500*9356374aSAndroid Build Coastguard Worker     assignee = static_cast<absl::Status&&>(status);
501*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(assignee, copy);
502*9356374aSAndroid Build Coastguard Worker   }
503*9356374aSAndroid Build Coastguard Worker }
504*9356374aSAndroid Build Coastguard Worker 
TEST(Status,Update)505*9356374aSAndroid Build Coastguard Worker TEST(Status, Update) {
506*9356374aSAndroid Build Coastguard Worker   absl::Status s;
507*9356374aSAndroid Build Coastguard Worker   s.Update(absl::OkStatus());
508*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(s.ok());
509*9356374aSAndroid Build Coastguard Worker   const absl::Status a(absl::StatusCode::kCancelled, "message");
510*9356374aSAndroid Build Coastguard Worker   s.Update(a);
511*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(s, a);
512*9356374aSAndroid Build Coastguard Worker   const absl::Status b(absl::StatusCode::kInternal, "other message");
513*9356374aSAndroid Build Coastguard Worker   s.Update(b);
514*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(s, a);
515*9356374aSAndroid Build Coastguard Worker   s.Update(absl::OkStatus());
516*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(s, a);
517*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(s.ok());
518*9356374aSAndroid Build Coastguard Worker }
519*9356374aSAndroid Build Coastguard Worker 
TEST(Status,Equality)520*9356374aSAndroid Build Coastguard Worker TEST(Status, Equality) {
521*9356374aSAndroid Build Coastguard Worker   absl::Status ok;
522*9356374aSAndroid Build Coastguard Worker   absl::Status no_payload = absl::CancelledError("no payload");
523*9356374aSAndroid Build Coastguard Worker   absl::Status one_payload = absl::InvalidArgumentError("one payload");
524*9356374aSAndroid Build Coastguard Worker   one_payload.SetPayload(kUrl1, absl::Cord(kPayload1));
525*9356374aSAndroid Build Coastguard Worker   absl::Status two_payloads = one_payload;
526*9356374aSAndroid Build Coastguard Worker   two_payloads.SetPayload(kUrl2, absl::Cord(kPayload2));
527*9356374aSAndroid Build Coastguard Worker   const std::array<absl::Status, 4> status_arr = {ok, no_payload, one_payload,
528*9356374aSAndroid Build Coastguard Worker                                                   two_payloads};
529*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < status_arr.size(); i++) {
530*9356374aSAndroid Build Coastguard Worker     for (int j = 0; j < status_arr.size(); j++) {
531*9356374aSAndroid Build Coastguard Worker       if (i == j) {
532*9356374aSAndroid Build Coastguard Worker         EXPECT_TRUE(status_arr[i] == status_arr[j]);
533*9356374aSAndroid Build Coastguard Worker         EXPECT_FALSE(status_arr[i] != status_arr[j]);
534*9356374aSAndroid Build Coastguard Worker       } else {
535*9356374aSAndroid Build Coastguard Worker         EXPECT_TRUE(status_arr[i] != status_arr[j]);
536*9356374aSAndroid Build Coastguard Worker         EXPECT_FALSE(status_arr[i] == status_arr[j]);
537*9356374aSAndroid Build Coastguard Worker       }
538*9356374aSAndroid Build Coastguard Worker     }
539*9356374aSAndroid Build Coastguard Worker   }
540*9356374aSAndroid Build Coastguard Worker }
541*9356374aSAndroid Build Coastguard Worker 
TEST(Status,Swap)542*9356374aSAndroid Build Coastguard Worker TEST(Status, Swap) {
543*9356374aSAndroid Build Coastguard Worker   auto test_swap = [](const absl::Status& s1, const absl::Status& s2) {
544*9356374aSAndroid Build Coastguard Worker     absl::Status copy1 = s1, copy2 = s2;
545*9356374aSAndroid Build Coastguard Worker     swap(copy1, copy2);
546*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(copy1, s2);
547*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(copy2, s1);
548*9356374aSAndroid Build Coastguard Worker   };
549*9356374aSAndroid Build Coastguard Worker   const absl::Status ok;
550*9356374aSAndroid Build Coastguard Worker   const absl::Status no_payload(absl::StatusCode::kAlreadyExists, "no payload");
551*9356374aSAndroid Build Coastguard Worker   absl::Status with_payload(absl::StatusCode::kInternal, "with payload");
552*9356374aSAndroid Build Coastguard Worker   with_payload.SetPayload(kUrl1, absl::Cord(kPayload1));
553*9356374aSAndroid Build Coastguard Worker   test_swap(ok, no_payload);
554*9356374aSAndroid Build Coastguard Worker   test_swap(no_payload, ok);
555*9356374aSAndroid Build Coastguard Worker   test_swap(ok, with_payload);
556*9356374aSAndroid Build Coastguard Worker   test_swap(with_payload, ok);
557*9356374aSAndroid Build Coastguard Worker   test_swap(no_payload, with_payload);
558*9356374aSAndroid Build Coastguard Worker   test_swap(with_payload, no_payload);
559*9356374aSAndroid Build Coastguard Worker }
560*9356374aSAndroid Build Coastguard Worker 
TEST(StatusErrno,ErrnoToStatusCode)561*9356374aSAndroid Build Coastguard Worker TEST(StatusErrno, ErrnoToStatusCode) {
562*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ErrnoToStatusCode(0), absl::StatusCode::kOk);
563*9356374aSAndroid Build Coastguard Worker 
564*9356374aSAndroid Build Coastguard Worker   // Spot-check a few errno values.
565*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ErrnoToStatusCode(EINVAL),
566*9356374aSAndroid Build Coastguard Worker             absl::StatusCode::kInvalidArgument);
567*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ErrnoToStatusCode(ENOENT), absl::StatusCode::kNotFound);
568*9356374aSAndroid Build Coastguard Worker 
569*9356374aSAndroid Build Coastguard Worker   // We'll pick a very large number so it hopefully doesn't collide to errno.
570*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ErrnoToStatusCode(19980927), absl::StatusCode::kUnknown);
571*9356374aSAndroid Build Coastguard Worker }
572*9356374aSAndroid Build Coastguard Worker 
TEST(StatusErrno,ErrnoToStatus)573*9356374aSAndroid Build Coastguard Worker TEST(StatusErrno, ErrnoToStatus) {
574*9356374aSAndroid Build Coastguard Worker   absl::Status status = absl::ErrnoToStatus(ENOENT, "Cannot open 'path'");
575*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(status.code(), absl::StatusCode::kNotFound);
576*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(status.message(), "Cannot open 'path': No such file or directory");
577*9356374aSAndroid Build Coastguard Worker }
578*9356374aSAndroid Build Coastguard Worker 
579*9356374aSAndroid Build Coastguard Worker }  // namespace
580