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/status.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
22*61c4878aSAndroid Build Coastguard Worker constexpr Status::Code kInvalidCode = static_cast<Status::Code>(30);
23*61c4878aSAndroid Build Coastguard Worker
TEST(Status,Default)24*61c4878aSAndroid Build Coastguard Worker TEST(Status, Default) {
25*61c4878aSAndroid Build Coastguard Worker constexpr Status status;
26*61c4878aSAndroid Build Coastguard Worker static_assert(status.ok());
27*61c4878aSAndroid Build Coastguard Worker static_assert(Status() == status);
28*61c4878aSAndroid Build Coastguard Worker }
29*61c4878aSAndroid Build Coastguard Worker
TEST(Status,ConstructWithStatusCode)30*61c4878aSAndroid Build Coastguard Worker TEST(Status, ConstructWithStatusCode) {
31*61c4878aSAndroid Build Coastguard Worker constexpr Status status(PW_STATUS_ABORTED);
32*61c4878aSAndroid Build Coastguard Worker static_assert(status.IsAborted());
33*61c4878aSAndroid Build Coastguard Worker }
34*61c4878aSAndroid Build Coastguard Worker
TEST(Status,AssignFromStatusCode)35*61c4878aSAndroid Build Coastguard Worker TEST(Status, AssignFromStatusCode) {
36*61c4878aSAndroid Build Coastguard Worker Status status;
37*61c4878aSAndroid Build Coastguard Worker status = PW_STATUS_INTERNAL;
38*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Status::Internal(), status);
39*61c4878aSAndroid Build Coastguard Worker }
40*61c4878aSAndroid Build Coastguard Worker
TEST(Status,Ok_OkIsTrue)41*61c4878aSAndroid Build Coastguard Worker TEST(Status, Ok_OkIsTrue) {
42*61c4878aSAndroid Build Coastguard Worker static_assert(Status().ok());
43*61c4878aSAndroid Build Coastguard Worker static_assert(Status(PW_STATUS_OK).ok());
44*61c4878aSAndroid Build Coastguard Worker static_assert(OkStatus().ok());
45*61c4878aSAndroid Build Coastguard Worker }
46*61c4878aSAndroid Build Coastguard Worker
TEST(Status,NotOk_OkIsFalse)47*61c4878aSAndroid Build Coastguard Worker TEST(Status, NotOk_OkIsFalse) {
48*61c4878aSAndroid Build Coastguard Worker static_assert(!Status::DataLoss().ok());
49*61c4878aSAndroid Build Coastguard Worker static_assert(!Status(kInvalidCode).ok());
50*61c4878aSAndroid Build Coastguard Worker }
51*61c4878aSAndroid Build Coastguard Worker
TEST(Status,Code)52*61c4878aSAndroid Build Coastguard Worker TEST(Status, Code) {
53*61c4878aSAndroid Build Coastguard Worker // clang-format off
54*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_OK == Status().code());
55*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_OK == OkStatus().code());
56*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_CANCELLED == Status::Cancelled().code());
57*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_UNKNOWN == Status::Unknown().code());
58*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_INVALID_ARGUMENT == Status::InvalidArgument().code());
59*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_DEADLINE_EXCEEDED == Status::DeadlineExceeded().code());
60*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_NOT_FOUND == Status::NotFound().code());
61*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_ALREADY_EXISTS == Status::AlreadyExists().code());
62*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_PERMISSION_DENIED == Status::PermissionDenied().code());
63*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_RESOURCE_EXHAUSTED == Status::ResourceExhausted().code());
64*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_FAILED_PRECONDITION == Status::FailedPrecondition().code());
65*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_ABORTED == Status::Aborted().code());
66*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_OUT_OF_RANGE == Status::OutOfRange().code());
67*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_UNIMPLEMENTED == Status::Unimplemented().code());
68*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_INTERNAL == Status::Internal().code());
69*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_UNAVAILABLE == Status::Unavailable().code());
70*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_DATA_LOSS == Status::DataLoss().code());
71*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_UNAUTHENTICATED == Status::Unauthenticated().code());
72*61c4878aSAndroid Build Coastguard Worker // clang-format on
73*61c4878aSAndroid Build Coastguard Worker }
74*61c4878aSAndroid Build Coastguard Worker
TEST(Status,EqualCodes)75*61c4878aSAndroid Build Coastguard Worker TEST(Status, EqualCodes) {
76*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_OK == Status());
77*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_OK == OkStatus());
78*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_CANCELLED == Status::Cancelled());
79*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_UNKNOWN == Status::Unknown());
80*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_INVALID_ARGUMENT == Status::InvalidArgument());
81*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_DEADLINE_EXCEEDED == Status::DeadlineExceeded());
82*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_NOT_FOUND == Status::NotFound());
83*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_ALREADY_EXISTS == Status::AlreadyExists());
84*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_PERMISSION_DENIED == Status::PermissionDenied());
85*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_RESOURCE_EXHAUSTED == Status::ResourceExhausted());
86*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_FAILED_PRECONDITION == Status::FailedPrecondition());
87*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_ABORTED == Status::Aborted());
88*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_OUT_OF_RANGE == Status::OutOfRange());
89*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_UNIMPLEMENTED == Status::Unimplemented());
90*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_INTERNAL == Status::Internal());
91*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_UNAVAILABLE == Status::Unavailable());
92*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_DATA_LOSS == Status::DataLoss());
93*61c4878aSAndroid Build Coastguard Worker static_assert(PW_STATUS_UNAUTHENTICATED == Status::Unauthenticated());
94*61c4878aSAndroid Build Coastguard Worker }
95*61c4878aSAndroid Build Coastguard Worker
TEST(Status,IsError)96*61c4878aSAndroid Build Coastguard Worker TEST(Status, IsError) {
97*61c4878aSAndroid Build Coastguard Worker static_assert(Status::Cancelled().IsCancelled());
98*61c4878aSAndroid Build Coastguard Worker static_assert(Status::Unknown().IsUnknown());
99*61c4878aSAndroid Build Coastguard Worker static_assert(Status::InvalidArgument().IsInvalidArgument());
100*61c4878aSAndroid Build Coastguard Worker static_assert(Status::DeadlineExceeded().IsDeadlineExceeded());
101*61c4878aSAndroid Build Coastguard Worker static_assert(Status::NotFound().IsNotFound());
102*61c4878aSAndroid Build Coastguard Worker static_assert(Status::AlreadyExists().IsAlreadyExists());
103*61c4878aSAndroid Build Coastguard Worker static_assert(Status::PermissionDenied().IsPermissionDenied());
104*61c4878aSAndroid Build Coastguard Worker static_assert(Status::ResourceExhausted().IsResourceExhausted());
105*61c4878aSAndroid Build Coastguard Worker static_assert(Status::FailedPrecondition().IsFailedPrecondition());
106*61c4878aSAndroid Build Coastguard Worker static_assert(Status::Aborted().IsAborted());
107*61c4878aSAndroid Build Coastguard Worker static_assert(Status::OutOfRange().IsOutOfRange());
108*61c4878aSAndroid Build Coastguard Worker static_assert(Status::Unimplemented().IsUnimplemented());
109*61c4878aSAndroid Build Coastguard Worker static_assert(Status::Internal().IsInternal());
110*61c4878aSAndroid Build Coastguard Worker static_assert(Status::Unavailable().IsUnavailable());
111*61c4878aSAndroid Build Coastguard Worker static_assert(Status::DataLoss().IsDataLoss());
112*61c4878aSAndroid Build Coastguard Worker static_assert(Status::Unauthenticated().IsUnauthenticated());
113*61c4878aSAndroid Build Coastguard Worker }
114*61c4878aSAndroid Build Coastguard Worker
TEST(Status,IsNotError)115*61c4878aSAndroid Build Coastguard Worker TEST(Status, IsNotError) {
116*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsCancelled());
117*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsUnknown());
118*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsInvalidArgument());
119*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsDeadlineExceeded());
120*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsNotFound());
121*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsAlreadyExists());
122*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsPermissionDenied());
123*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsUnauthenticated());
124*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsResourceExhausted());
125*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsFailedPrecondition());
126*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsAborted());
127*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsOutOfRange());
128*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsUnimplemented());
129*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsInternal());
130*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsUnavailable());
131*61c4878aSAndroid Build Coastguard Worker static_assert(!OkStatus().IsDataLoss());
132*61c4878aSAndroid Build Coastguard Worker }
133*61c4878aSAndroid Build Coastguard Worker
TEST(Status,Strings)134*61c4878aSAndroid Build Coastguard Worker TEST(Status, Strings) {
135*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("OK", Status().str());
136*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("OK", OkStatus().str());
137*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("CANCELLED", Status::Cancelled().str());
138*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("UNKNOWN", Status::Unknown().str());
139*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("INVALID_ARGUMENT", Status::InvalidArgument().str());
140*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("DEADLINE_EXCEEDED", Status::DeadlineExceeded().str());
141*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("NOT_FOUND", Status::NotFound().str());
142*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("ALREADY_EXISTS", Status::AlreadyExists().str());
143*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("PERMISSION_DENIED", Status::PermissionDenied().str());
144*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("RESOURCE_EXHAUSTED", Status::ResourceExhausted().str());
145*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("FAILED_PRECONDITION", Status::FailedPrecondition().str());
146*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("ABORTED", Status::Aborted().str());
147*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("OUT_OF_RANGE", Status::OutOfRange().str());
148*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("UNIMPLEMENTED", Status::Unimplemented().str());
149*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("INTERNAL", Status::Internal().str());
150*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("UNAVAILABLE", Status::Unavailable().str());
151*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("DATA_LOSS", Status::DataLoss().str());
152*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("UNAUTHENTICATED", Status::Unauthenticated().str());
153*61c4878aSAndroid Build Coastguard Worker }
154*61c4878aSAndroid Build Coastguard Worker
TEST(Status,UnknownString)155*61c4878aSAndroid Build Coastguard Worker TEST(Status, UnknownString) {
156*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ("INVALID STATUS", Status(kInvalidCode).str());
157*61c4878aSAndroid Build Coastguard Worker }
158*61c4878aSAndroid Build Coastguard Worker
TEST(Status,Update)159*61c4878aSAndroid Build Coastguard Worker TEST(Status, Update) {
160*61c4878aSAndroid Build Coastguard Worker Status status;
161*61c4878aSAndroid Build Coastguard Worker status.Update(Status::Cancelled());
162*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, Status::Cancelled());
163*61c4878aSAndroid Build Coastguard Worker status.Update(OkStatus());
164*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, Status::Cancelled());
165*61c4878aSAndroid Build Coastguard Worker status.Update(Status::NotFound());
166*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, Status::Cancelled());
167*61c4878aSAndroid Build Coastguard Worker }
168*61c4878aSAndroid Build Coastguard Worker
169*61c4878aSAndroid Build Coastguard Worker // Functions for executing the C pw_Status tests.
170*61c4878aSAndroid Build Coastguard Worker extern "C" {
171*61c4878aSAndroid Build Coastguard Worker
172*61c4878aSAndroid Build Coastguard Worker Status::Code PassStatusFromC(Status status);
173*61c4878aSAndroid Build Coastguard Worker
PassStatusFromCpp(Status status)174*61c4878aSAndroid Build Coastguard Worker Status::Code PassStatusFromCpp(Status status) { return status.code(); }
175*61c4878aSAndroid Build Coastguard Worker
176*61c4878aSAndroid Build Coastguard Worker int TestStatusFromC(void);
177*61c4878aSAndroid Build Coastguard Worker
178*61c4878aSAndroid Build Coastguard Worker int TestStatusStringsFromC(void);
179*61c4878aSAndroid Build Coastguard Worker
180*61c4878aSAndroid Build Coastguard Worker } // extern "C"
181*61c4878aSAndroid Build Coastguard Worker
TEST(StatusCLinkage,CallCFunctionWithStatus)182*61c4878aSAndroid Build Coastguard Worker TEST(StatusCLinkage, CallCFunctionWithStatus) {
183*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Status::Aborted(), PassStatusFromC(PW_STATUS_ABORTED));
184*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Status::Unknown(), PassStatusFromC(Status::Unknown()));
185*61c4878aSAndroid Build Coastguard Worker
186*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Status::NotFound(), PassStatusFromC(PW_STATUS_NOT_FOUND));
187*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(OkStatus(), PassStatusFromC(OkStatus()));
188*61c4878aSAndroid Build Coastguard Worker }
189*61c4878aSAndroid Build Coastguard Worker
TEST(StatusCLinkage,TestStatusFromC)190*61c4878aSAndroid Build Coastguard Worker TEST(StatusCLinkage, TestStatusFromC) { EXPECT_EQ(0, TestStatusFromC()); }
191*61c4878aSAndroid Build Coastguard Worker
TEST(StatusCLinkage,TestStatusStringsFromC)192*61c4878aSAndroid Build Coastguard Worker TEST(StatusCLinkage, TestStatusStringsFromC) {
193*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(0, TestStatusStringsFromC());
194*61c4878aSAndroid Build Coastguard Worker }
195*61c4878aSAndroid Build Coastguard Worker
196*61c4878aSAndroid Build Coastguard Worker } // namespace
197*61c4878aSAndroid Build Coastguard Worker } // namespace pw
198