blob: 33102b7ea1eb1b6efafe46d688d8e5851aee92f3 [file] [log] [blame]
Wyatt Hepler421a8102020-01-13 11:30:58 -08001// Copyright 2020 The Pigweed Authors
Wyatt Heplerb6679282019-11-12 22:40:17 -08002//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
Wyatt Hepler1a960942019-11-26 14:13:38 -08004// use this file except in compliance with the License. You may obtain a copy of
5// the License at
Wyatt Heplerb6679282019-11-12 22:40:17 -08006//
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
Wyatt Hepler1a960942019-11-26 14:13:38 -080012// License for the specific language governing permissions and limitations under
13// the License.
Wyatt Heplerb6679282019-11-12 22:40:17 -080014
15#include "pw_status/status.h"
16
17#include "gtest/gtest.h"
18
Wyatt Hepler463359c2019-11-13 17:04:21 -080019namespace pw {
Wyatt Heplerb6679282019-11-12 22:40:17 -080020namespace {
21
22constexpr Status::Code kInvalidCode = static_cast<Status::Code>(30);
23
24TEST(Status, Default) {
Wyatt Hepler352fcbc2020-09-24 11:15:29 -070025 constexpr Status status;
26 static_assert(status.ok());
27 static_assert(Status() == status);
Wyatt Heplerb6679282019-11-12 22:40:17 -080028}
29
30TEST(Status, ConstructWithStatusCode) {
Wyatt Hepler352fcbc2020-09-24 11:15:29 -070031 constexpr Status status(PW_STATUS_ABORTED);
Wyatt Heplerf276c6b2020-11-11 21:13:38 -080032 static_assert(status.IsAborted());
Wyatt Heplerb6679282019-11-12 22:40:17 -080033}
34
35TEST(Status, AssignFromStatusCode) {
36 Status status;
Wyatt Hepler352fcbc2020-09-24 11:15:29 -070037 status = PW_STATUS_INTERNAL;
38 EXPECT_EQ(Status::Internal(), status);
Wyatt Heplerb6679282019-11-12 22:40:17 -080039}
40
41TEST(Status, Ok_OkIsTrue) {
Wyatt Hepler352fcbc2020-09-24 11:15:29 -070042 static_assert(Status().ok());
43 static_assert(Status(PW_STATUS_OK).ok());
Wyatt Hepler5a53dfd2021-01-08 08:34:27 -080044 static_assert(OkStatus().ok());
Wyatt Heplerb6679282019-11-12 22:40:17 -080045}
46
47TEST(Status, NotOk_OkIsFalse) {
Wyatt Hepler352fcbc2020-09-24 11:15:29 -070048 static_assert(!Status::DataLoss().ok());
49 static_assert(!Status(kInvalidCode).ok());
Wyatt Heplerb6679282019-11-12 22:40:17 -080050}
51
Wyatt Hepler1217abb2020-11-12 13:05:33 -080052TEST(Status, Code) {
53 // clang-format off
54 static_assert(PW_STATUS_OK == Status().code());
Wyatt Hepler5a53dfd2021-01-08 08:34:27 -080055 static_assert(PW_STATUS_OK == OkStatus().code());
Wyatt Hepler1217abb2020-11-12 13:05:33 -080056 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
Wyatt Hepler352fcbc2020-09-24 11:15:29 -070075TEST(Status, EqualCodes) {
76 static_assert(PW_STATUS_OK == Status());
Wyatt Hepler5a53dfd2021-01-08 08:34:27 -080077 static_assert(PW_STATUS_OK == OkStatus());
Wyatt Hepler352fcbc2020-09-24 11:15:29 -070078 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());
Wyatt Hepler352fcbc2020-09-24 11:15:29 -070085 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());
Wyatt Hepler2cbb3132020-09-30 11:28:46 -070093 static_assert(PW_STATUS_UNAUTHENTICATED == Status::Unauthenticated());
Wyatt Hepler352fcbc2020-09-24 11:15:29 -070094}
95
Wyatt Hepler50839072020-09-30 16:17:50 -070096TEST(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
115TEST(Status, IsNotError) {
Wyatt Hepler5a53dfd2021-01-08 08:34:27 -0800116 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());
Wyatt Hepler50839072020-09-30 16:17:50 -0700132}
133
Wyatt Hepler352fcbc2020-09-24 11:15:29 -0700134TEST(Status, Strings) {
135 EXPECT_STREQ("OK", Status().str());
Wyatt Hepler5a53dfd2021-01-08 08:34:27 -0800136 EXPECT_STREQ("OK", OkStatus().str());
Wyatt Hepler352fcbc2020-09-24 11:15:29 -0700137 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());
Wyatt Hepler352fcbc2020-09-24 11:15:29 -0700144 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());
Wyatt Hepler2cbb3132020-09-30 11:28:46 -0700152 EXPECT_STREQ("UNAUTHENTICATED", Status::Unauthenticated().str());
Wyatt Heplerb6679282019-11-12 22:40:17 -0800153}
154
155TEST(Status, UnknownString) {
Wyatt Hepler352fcbc2020-09-24 11:15:29 -0700156 EXPECT_STREQ("INVALID STATUS", Status(kInvalidCode).str());
157}
158
Armando Montanez99f33f52021-04-26 18:29:11 -0700159TEST(Status, Update) {
160 Status status;
161 status.Update(Status::Cancelled());
162 EXPECT_EQ(status, Status::Cancelled());
163 status.Update(OkStatus());
164 EXPECT_EQ(status, Status::Cancelled());
165 status.Update(Status::NotFound());
166 EXPECT_EQ(status, Status::Cancelled());
167}
168
Wyatt Hepler421a8102020-01-13 11:30:58 -0800169// Functions for executing the C pw_Status tests.
170extern "C" {
171
172Status::Code PassStatusFromC(Status status);
173
Wyatt Heplera17fbdd2020-11-12 11:28:05 -0800174Status::Code PassStatusFromCpp(Status status) { return status.code(); }
Wyatt Hepler421a8102020-01-13 11:30:58 -0800175
176int TestStatusFromC(void);
177
178int TestStatusStringsFromC(void);
179
180} // extern "C"
181
182TEST(StatusCLinkage, CallCFunctionWithStatus) {
Wyatt Hepler352fcbc2020-09-24 11:15:29 -0700183 EXPECT_EQ(Status::Aborted(), PassStatusFromC(PW_STATUS_ABORTED));
184 EXPECT_EQ(Status::Unknown(), PassStatusFromC(Status::Unknown()));
Wyatt Hepler421a8102020-01-13 11:30:58 -0800185
Wyatt Hepler352fcbc2020-09-24 11:15:29 -0700186 EXPECT_EQ(Status::NotFound(), PassStatusFromC(PW_STATUS_NOT_FOUND));
Wyatt Hepler5a53dfd2021-01-08 08:34:27 -0800187 EXPECT_EQ(OkStatus(), PassStatusFromC(OkStatus()));
Wyatt Hepler421a8102020-01-13 11:30:58 -0800188}
189
190TEST(StatusCLinkage, TestStatusFromC) { EXPECT_EQ(0, TestStatusFromC()); }
191
192TEST(StatusCLinkage, TestStatusStringsFromC) {
193 EXPECT_EQ(0, TestStatusStringsFromC());
194}
195
Wyatt Heplerb6679282019-11-12 22:40:17 -0800196} // namespace
Wyatt Hepler463359c2019-11-13 17:04:21 -0800197} // namespace pw