xref: /aosp_15_r20/external/pigweed/pw_status/try_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker 
15*61c4878aSAndroid Build Coastguard Worker #include "pw_status/try.h"
16*61c4878aSAndroid Build Coastguard Worker 
17*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
18*61c4878aSAndroid Build Coastguard Worker 
19*61c4878aSAndroid Build Coastguard Worker namespace pw {
20*61c4878aSAndroid Build Coastguard Worker namespace {
21*61c4878aSAndroid Build Coastguard Worker 
ReturnStatus(Status status)22*61c4878aSAndroid Build Coastguard Worker Status ReturnStatus(Status status) { return status; }
ReturnStatusWithSize(StatusWithSize status)23*61c4878aSAndroid Build Coastguard Worker StatusWithSize ReturnStatusWithSize(StatusWithSize status) { return status; }
24*61c4878aSAndroid Build Coastguard Worker 
TryStatus(Status status)25*61c4878aSAndroid Build Coastguard Worker Status TryStatus(Status status) {
26*61c4878aSAndroid Build Coastguard Worker   PW_TRY(ReturnStatus(status));
27*61c4878aSAndroid Build Coastguard Worker 
28*61c4878aSAndroid Build Coastguard Worker   // Any status other than OK should have already returned.
29*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(status, OkStatus());
30*61c4878aSAndroid Build Coastguard Worker   return status;
31*61c4878aSAndroid Build Coastguard Worker }
32*61c4878aSAndroid Build Coastguard Worker 
TryStatus(StatusWithSize status)33*61c4878aSAndroid Build Coastguard Worker Status TryStatus(StatusWithSize status) {
34*61c4878aSAndroid Build Coastguard Worker   PW_TRY(ReturnStatusWithSize(status));
35*61c4878aSAndroid Build Coastguard Worker 
36*61c4878aSAndroid Build Coastguard Worker   // Any status other than OK should have already returned.
37*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(status.status(), OkStatus());
38*61c4878aSAndroid Build Coastguard Worker   return status.status();
39*61c4878aSAndroid Build Coastguard Worker }
40*61c4878aSAndroid Build Coastguard Worker 
TEST(Status,Try_Status)41*61c4878aSAndroid Build Coastguard Worker TEST(Status, Try_Status) {
42*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(TryStatus(OkStatus()), OkStatus());
43*61c4878aSAndroid Build Coastguard Worker 
44*61c4878aSAndroid Build Coastguard Worker   // Don't need all the status types, just pick a few not-ok ones.
45*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(TryStatus(Status::Cancelled()), Status::Cancelled());
46*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(TryStatus(Status::DataLoss()), Status::DataLoss());
47*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(TryStatus(Status::Unimplemented()), Status::Unimplemented());
48*61c4878aSAndroid Build Coastguard Worker }
49*61c4878aSAndroid Build Coastguard Worker 
TEST(Status,Try_StatusWithSizeOk)50*61c4878aSAndroid Build Coastguard Worker TEST(Status, Try_StatusWithSizeOk) {
51*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 32; ++i) {
52*61c4878aSAndroid Build Coastguard Worker     StatusWithSize val(OkStatus(), 0);
53*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(TryStatus(val), OkStatus());
54*61c4878aSAndroid Build Coastguard Worker   }
55*61c4878aSAndroid Build Coastguard Worker }
56*61c4878aSAndroid Build Coastguard Worker 
TEST(Status,Try_StatusWithSizeError)57*61c4878aSAndroid Build Coastguard Worker TEST(Status, Try_StatusWithSizeError) {
58*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 32; ++i) {
59*61c4878aSAndroid Build Coastguard Worker     StatusWithSize val(Status::DataLoss(), i);
60*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(TryStatus(val), Status::DataLoss());
61*61c4878aSAndroid Build Coastguard Worker   }
62*61c4878aSAndroid Build Coastguard Worker }
63*61c4878aSAndroid Build Coastguard Worker 
TEST(Status,Try_StatusWithSizeFromConstant)64*61c4878aSAndroid Build Coastguard Worker TEST(Status, Try_StatusWithSizeFromConstant) {
65*61c4878aSAndroid Build Coastguard Worker   // Don't need all the status types, just pick a few not-ok ones.
66*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(TryStatus(StatusWithSize::Cancelled()), Status::Cancelled());
67*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(TryStatus(StatusWithSize::DataLoss()), Status::DataLoss());
68*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(TryStatus(StatusWithSize::Unimplemented()),
69*61c4878aSAndroid Build Coastguard Worker             Status::Unimplemented());
70*61c4878aSAndroid Build Coastguard Worker }
71*61c4878aSAndroid Build Coastguard Worker 
TryStatusAssign(size_t & size_val,StatusWithSize status)72*61c4878aSAndroid Build Coastguard Worker Status TryStatusAssign(size_t& size_val, StatusWithSize status) {
73*61c4878aSAndroid Build Coastguard Worker   PW_TRY_ASSIGN(size_val, ReturnStatusWithSize(status));
74*61c4878aSAndroid Build Coastguard Worker 
75*61c4878aSAndroid Build Coastguard Worker   // Any status other than OK should have already returned.
76*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(status.status(), OkStatus());
77*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(size_val, status.size());
78*61c4878aSAndroid Build Coastguard Worker   return status.status();
79*61c4878aSAndroid Build Coastguard Worker }
80*61c4878aSAndroid Build Coastguard Worker 
TEST(Status,TryAssignOk)81*61c4878aSAndroid Build Coastguard Worker TEST(Status, TryAssignOk) {
82*61c4878aSAndroid Build Coastguard Worker   size_t size_val = 0;
83*61c4878aSAndroid Build Coastguard Worker 
84*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 1; i < 32; ++i) {
85*61c4878aSAndroid Build Coastguard Worker     StatusWithSize val(OkStatus(), i);
86*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(TryStatusAssign(size_val, val), OkStatus());
87*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(size_val, i);
88*61c4878aSAndroid Build Coastguard Worker   }
89*61c4878aSAndroid Build Coastguard Worker }
90*61c4878aSAndroid Build Coastguard Worker 
TEST(Status,TryAssignError)91*61c4878aSAndroid Build Coastguard Worker TEST(Status, TryAssignError) {
92*61c4878aSAndroid Build Coastguard Worker   size_t size_val = 0u;
93*61c4878aSAndroid Build Coastguard Worker 
94*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 1; i < 32; ++i) {
95*61c4878aSAndroid Build Coastguard Worker     StatusWithSize val(Status::OutOfRange(), i);
96*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(TryStatusAssign(size_val, val), Status::OutOfRange());
97*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(size_val, 0u);
98*61c4878aSAndroid Build Coastguard Worker   }
99*61c4878aSAndroid Build Coastguard Worker }
100*61c4878aSAndroid Build Coastguard Worker 
TryStatusWithSize(StatusWithSize status)101*61c4878aSAndroid Build Coastguard Worker StatusWithSize TryStatusWithSize(StatusWithSize status) {
102*61c4878aSAndroid Build Coastguard Worker   PW_TRY_WITH_SIZE(ReturnStatusWithSize(status));
103*61c4878aSAndroid Build Coastguard Worker 
104*61c4878aSAndroid Build Coastguard Worker   // Any status other than OK should have already returned.
105*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(status.ok());
106*61c4878aSAndroid Build Coastguard Worker   return status;
107*61c4878aSAndroid Build Coastguard Worker }
108*61c4878aSAndroid Build Coastguard Worker 
TryStatusWithSize(Status status)109*61c4878aSAndroid Build Coastguard Worker StatusWithSize TryStatusWithSize(Status status) {
110*61c4878aSAndroid Build Coastguard Worker   PW_TRY_WITH_SIZE(ReturnStatus(status));
111*61c4878aSAndroid Build Coastguard Worker 
112*61c4878aSAndroid Build Coastguard Worker   // Any status other than OK should have already returned.
113*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(status, OkStatus());
114*61c4878aSAndroid Build Coastguard Worker 
115*61c4878aSAndroid Build Coastguard Worker   StatusWithSize return_val(status, 0u);
116*61c4878aSAndroid Build Coastguard Worker   return return_val;
117*61c4878aSAndroid Build Coastguard Worker }
118*61c4878aSAndroid Build Coastguard Worker 
TEST(Status,TryWithSize_StatusOk)119*61c4878aSAndroid Build Coastguard Worker TEST(Status, TryWithSize_StatusOk) {
120*61c4878aSAndroid Build Coastguard Worker   StatusWithSize result = TryStatusWithSize(OkStatus());
121*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.status(), OkStatus());
122*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.size(), 0u);
123*61c4878aSAndroid Build Coastguard Worker }
124*61c4878aSAndroid Build Coastguard Worker 
TEST(Status,TryWithSize_StatusError)125*61c4878aSAndroid Build Coastguard Worker TEST(Status, TryWithSize_StatusError) {
126*61c4878aSAndroid Build Coastguard Worker   StatusWithSize result = TryStatusWithSize(Status::PermissionDenied());
127*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.status(), Status::PermissionDenied());
128*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.size(), 0u);
129*61c4878aSAndroid Build Coastguard Worker }
130*61c4878aSAndroid Build Coastguard Worker 
TEST(Status,TryWithSize_StatusWithSizeOk)131*61c4878aSAndroid Build Coastguard Worker TEST(Status, TryWithSize_StatusWithSizeOk) {
132*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 32; ++i) {
133*61c4878aSAndroid Build Coastguard Worker     StatusWithSize val(OkStatus(), i);
134*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(TryStatusWithSize(val).status(), OkStatus());
135*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(TryStatusWithSize(val).size(), i);
136*61c4878aSAndroid Build Coastguard Worker   }
137*61c4878aSAndroid Build Coastguard Worker }
138*61c4878aSAndroid Build Coastguard Worker 
TEST(Status,TryWithSize_StatusWithSizeError)139*61c4878aSAndroid Build Coastguard Worker TEST(Status, TryWithSize_StatusWithSizeError) {
140*61c4878aSAndroid Build Coastguard Worker   for (size_t i = 0; i < 32; ++i) {
141*61c4878aSAndroid Build Coastguard Worker     StatusWithSize val(Status::DataLoss(), i);
142*61c4878aSAndroid Build Coastguard Worker     StatusWithSize result = TryStatusWithSize(val);
143*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(result.status(), Status::DataLoss());
144*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(result.size(), i);
145*61c4878aSAndroid Build Coastguard Worker   }
146*61c4878aSAndroid Build Coastguard Worker }
147*61c4878aSAndroid Build Coastguard Worker 
TEST(Status,TryWithSize_StatusWithSizeConst)148*61c4878aSAndroid Build Coastguard Worker TEST(Status, TryWithSize_StatusWithSizeConst) {
149*61c4878aSAndroid Build Coastguard Worker   StatusWithSize result = TryStatusWithSize(StatusWithSize::DataLoss());
150*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.status(), Status::DataLoss());
151*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.size(), 0u);
152*61c4878aSAndroid Build Coastguard Worker 
153*61c4878aSAndroid Build Coastguard Worker   result = TryStatusWithSize(StatusWithSize::NotFound());
154*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.status(), Status::NotFound());
155*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.size(), 0u);
156*61c4878aSAndroid Build Coastguard Worker 
157*61c4878aSAndroid Build Coastguard Worker   result = TryStatusWithSize(StatusWithSize::Unimplemented());
158*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.status(), Status::Unimplemented());
159*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(result.size(), 0u);
160*61c4878aSAndroid Build Coastguard Worker }
161*61c4878aSAndroid Build Coastguard Worker 
162*61c4878aSAndroid Build Coastguard Worker }  // namespace
163*61c4878aSAndroid Build Coastguard Worker }  // namespace pw
164