Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / third_party / pigweed / repo / pw_status / status_test.cc
1 // Copyright 2020 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // 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, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 #include "pw_status/status.h"
16
17 #include "gtest/gtest.h"
18
19 namespace pw {
20 namespace {
21
22 constexpr Status::Code kInvalidCode = static_cast<Status::Code>(30);
23
24 TEST(Status, Default) {
25   constexpr Status status;
26   static_assert(status.ok());
27   static_assert(Status() == status);
28 }
29
30 TEST(Status, ConstructWithStatusCode) {
31   constexpr Status status(PW_STATUS_ABORTED);
32   static_assert(status.IsAborted());
33 }
34
35 TEST(Status, AssignFromStatusCode) {
36   Status status;
37   status = PW_STATUS_INTERNAL;
38   EXPECT_EQ(Status::Internal(), status);
39 }
40
41 TEST(Status, Ok_OkIsTrue) {
42   static_assert(Status().ok());
43   static_assert(Status(PW_STATUS_OK).ok());
44   static_assert(OkStatus().ok());
45 }
46
47 TEST(Status, NotOk_OkIsFalse) {
48   static_assert(!Status::DataLoss().ok());
49   static_assert(!Status(kInvalidCode).ok());
50 }
51
52 TEST(Status, Code) {
53   // clang-format off
54   static_assert(PW_STATUS_OK == Status().code());
55   static_assert(PW_STATUS_OK == OkStatus().code());
56   static_assert(PW_STATUS_CANCELLED == Status::Cancelled().code());
57   static_assert(PW_STATUS_UNKNOWN == Status::Unknown().code());
58   static_assert(PW_STATUS_INVALID_ARGUMENT == Status::InvalidArgument().code());
59   static_assert(PW_STATUS_DEADLINE_EXCEEDED == Status::DeadlineExceeded().code());
60   static_assert(PW_STATUS_NOT_FOUND == Status::NotFound().code());
61   static_assert(PW_STATUS_ALREADY_EXISTS == Status::AlreadyExists().code());
62   static_assert(PW_STATUS_PERMISSION_DENIED == Status::PermissionDenied().code());
63   static_assert(PW_STATUS_RESOURCE_EXHAUSTED == Status::ResourceExhausted().code());
64   static_assert(PW_STATUS_FAILED_PRECONDITION == Status::FailedPrecondition().code());
65   static_assert(PW_STATUS_ABORTED == Status::Aborted().code());
66   static_assert(PW_STATUS_OUT_OF_RANGE == Status::OutOfRange().code());
67   static_assert(PW_STATUS_UNIMPLEMENTED == Status::Unimplemented().code());
68   static_assert(PW_STATUS_INTERNAL == Status::Internal().code());
69   static_assert(PW_STATUS_UNAVAILABLE == Status::Unavailable().code());
70   static_assert(PW_STATUS_DATA_LOSS == Status::DataLoss().code());
71   static_assert(PW_STATUS_UNAUTHENTICATED == Status::Unauthenticated().code());
72   // clang-format on
73 }
74
75 TEST(Status, EqualCodes) {
76   static_assert(PW_STATUS_OK == Status());
77   static_assert(PW_STATUS_OK == OkStatus());
78   static_assert(PW_STATUS_CANCELLED == Status::Cancelled());
79   static_assert(PW_STATUS_UNKNOWN == Status::Unknown());
80   static_assert(PW_STATUS_INVALID_ARGUMENT == Status::InvalidArgument());
81   static_assert(PW_STATUS_DEADLINE_EXCEEDED == Status::DeadlineExceeded());
82   static_assert(PW_STATUS_NOT_FOUND == Status::NotFound());
83   static_assert(PW_STATUS_ALREADY_EXISTS == Status::AlreadyExists());
84   static_assert(PW_STATUS_PERMISSION_DENIED == Status::PermissionDenied());
85   static_assert(PW_STATUS_RESOURCE_EXHAUSTED == Status::ResourceExhausted());
86   static_assert(PW_STATUS_FAILED_PRECONDITION == Status::FailedPrecondition());
87   static_assert(PW_STATUS_ABORTED == Status::Aborted());
88   static_assert(PW_STATUS_OUT_OF_RANGE == Status::OutOfRange());
89   static_assert(PW_STATUS_UNIMPLEMENTED == Status::Unimplemented());
90   static_assert(PW_STATUS_INTERNAL == Status::Internal());
91   static_assert(PW_STATUS_UNAVAILABLE == Status::Unavailable());
92   static_assert(PW_STATUS_DATA_LOSS == Status::DataLoss());
93   static_assert(PW_STATUS_UNAUTHENTICATED == Status::Unauthenticated());
94 }
95
96 TEST(Status, IsError) {
97   static_assert(Status::Cancelled().IsCancelled());
98   static_assert(Status::Unknown().IsUnknown());
99   static_assert(Status::InvalidArgument().IsInvalidArgument());
100   static_assert(Status::DeadlineExceeded().IsDeadlineExceeded());
101   static_assert(Status::NotFound().IsNotFound());
102   static_assert(Status::AlreadyExists().IsAlreadyExists());
103   static_assert(Status::PermissionDenied().IsPermissionDenied());
104   static_assert(Status::ResourceExhausted().IsResourceExhausted());
105   static_assert(Status::FailedPrecondition().IsFailedPrecondition());
106   static_assert(Status::Aborted().IsAborted());
107   static_assert(Status::OutOfRange().IsOutOfRange());
108   static_assert(Status::Unimplemented().IsUnimplemented());
109   static_assert(Status::Internal().IsInternal());
110   static_assert(Status::Unavailable().IsUnavailable());
111   static_assert(Status::DataLoss().IsDataLoss());
112   static_assert(Status::Unauthenticated().IsUnauthenticated());
113 }
114
115 TEST(Status, IsNotError) {
116   static_assert(!OkStatus().IsCancelled());
117   static_assert(!OkStatus().IsUnknown());
118   static_assert(!OkStatus().IsInvalidArgument());
119   static_assert(!OkStatus().IsDeadlineExceeded());
120   static_assert(!OkStatus().IsNotFound());
121   static_assert(!OkStatus().IsAlreadyExists());
122   static_assert(!OkStatus().IsPermissionDenied());
123   static_assert(!OkStatus().IsUnauthenticated());
124   static_assert(!OkStatus().IsResourceExhausted());
125   static_assert(!OkStatus().IsFailedPrecondition());
126   static_assert(!OkStatus().IsAborted());
127   static_assert(!OkStatus().IsOutOfRange());
128   static_assert(!OkStatus().IsUnimplemented());
129   static_assert(!OkStatus().IsInternal());
130   static_assert(!OkStatus().IsUnavailable());
131   static_assert(!OkStatus().IsDataLoss());
132 }
133
134 TEST(Status, Strings) {
135   EXPECT_STREQ("OK", Status().str());
136   EXPECT_STREQ("OK", OkStatus().str());
137   EXPECT_STREQ("CANCELLED", Status::Cancelled().str());
138   EXPECT_STREQ("UNKNOWN", Status::Unknown().str());
139   EXPECT_STREQ("INVALID_ARGUMENT", Status::InvalidArgument().str());
140   EXPECT_STREQ("DEADLINE_EXCEEDED", Status::DeadlineExceeded().str());
141   EXPECT_STREQ("NOT_FOUND", Status::NotFound().str());
142   EXPECT_STREQ("ALREADY_EXISTS", Status::AlreadyExists().str());
143   EXPECT_STREQ("PERMISSION_DENIED", Status::PermissionDenied().str());
144   EXPECT_STREQ("RESOURCE_EXHAUSTED", Status::ResourceExhausted().str());
145   EXPECT_STREQ("FAILED_PRECONDITION", Status::FailedPrecondition().str());
146   EXPECT_STREQ("ABORTED", Status::Aborted().str());
147   EXPECT_STREQ("OUT_OF_RANGE", Status::OutOfRange().str());
148   EXPECT_STREQ("UNIMPLEMENTED", Status::Unimplemented().str());
149   EXPECT_STREQ("INTERNAL", Status::Internal().str());
150   EXPECT_STREQ("UNAVAILABLE", Status::Unavailable().str());
151   EXPECT_STREQ("DATA_LOSS", Status::DataLoss().str());
152   EXPECT_STREQ("UNAUTHENTICATED", Status::Unauthenticated().str());
153 }
154
155 TEST(Status, UnknownString) {
156   EXPECT_STREQ("INVALID STATUS", Status(kInvalidCode).str());
157 }
158
159 // Functions for executing the C pw_Status tests.
160 extern "C" {
161
162 Status::Code PassStatusFromC(Status status);
163
164 Status::Code PassStatusFromCpp(Status status) { return status.code(); }
165
166 int TestStatusFromC(void);
167
168 int TestStatusStringsFromC(void);
169
170 }  // extern "C"
171
172 TEST(StatusCLinkage, CallCFunctionWithStatus) {
173   EXPECT_EQ(Status::Aborted(), PassStatusFromC(PW_STATUS_ABORTED));
174   EXPECT_EQ(Status::Unknown(), PassStatusFromC(Status::Unknown()));
175
176   EXPECT_EQ(Status::NotFound(), PassStatusFromC(PW_STATUS_NOT_FOUND));
177   EXPECT_EQ(OkStatus(), PassStatusFromC(OkStatus()));
178 }
179
180 TEST(StatusCLinkage, TestStatusFromC) { EXPECT_EQ(0, TestStatusFromC()); }
181
182 TEST(StatusCLinkage, TestStatusStringsFromC) {
183   EXPECT_EQ(0, TestStatusStringsFromC());
184 }
185
186 }  // namespace
187 }  // namespace pw