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