blob: b84258bef8d3e714012688625e20ed93af6a3ec0 [file] [log] [blame]
David Rogersb6b14b82020-09-11 16:27:27 -07001// 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/try.h"
16
17#include "gtest/gtest.h"
18
19namespace pw {
20namespace {
21
22Status ReturnStatus(Status status) { return status; }
23StatusWithSize ReturnStatusWithSize(StatusWithSize status) { return status; }
24
25Status TryStatus(Status status) {
David Rogersc4dc8642020-09-14 10:52:36 -070026 PW_TRY(ReturnStatus(status));
David Rogersb6b14b82020-09-11 16:27:27 -070027
28 // Any status other than OK should have already returned.
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070029 EXPECT_EQ(status, Status::Ok());
David Rogersb6b14b82020-09-11 16:27:27 -070030 return status;
31}
32
33Status TryStatus(StatusWithSize status) {
David Rogersc4dc8642020-09-14 10:52:36 -070034 PW_TRY(ReturnStatusWithSize(status));
David Rogersb6b14b82020-09-11 16:27:27 -070035
36 // Any status other than OK should have already returned.
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070037 EXPECT_EQ(status.status(), Status::Ok());
David Rogersb6b14b82020-09-11 16:27:27 -070038 return status.status();
39}
40
41TEST(Status, Try_Status) {
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070042 EXPECT_EQ(TryStatus(Status::Ok()), Status::Ok());
David Rogersb6b14b82020-09-11 16:27:27 -070043
44 // Don't need all the status types, just pick a few not-ok ones.
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070045 EXPECT_EQ(TryStatus(Status::Cancelled()), Status::Cancelled());
46 EXPECT_EQ(TryStatus(Status::DataLoss()), Status::DataLoss());
47 EXPECT_EQ(TryStatus(Status::Unimplemented()), Status::Unimplemented());
David Rogersb6b14b82020-09-11 16:27:27 -070048}
49
50TEST(Status, Try_StatusWithSizeOk) {
51 for (size_t i = 0; i < 32; ++i) {
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070052 StatusWithSize val(Status::Ok(), 0);
53 EXPECT_EQ(TryStatus(val), Status::Ok());
David Rogersb6b14b82020-09-11 16:27:27 -070054 }
55}
56
57TEST(Status, Try_StatusWithSizeError) {
58 for (size_t i = 0; i < 32; ++i) {
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070059 StatusWithSize val(Status::DataLoss(), i);
60 EXPECT_EQ(TryStatus(val), Status::DataLoss());
David Rogersb6b14b82020-09-11 16:27:27 -070061 }
62}
63
64TEST(Status, Try_StatusWithSizeFromConstant) {
65 // Don't need all the status types, just pick a few not-ok ones.
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070066 EXPECT_EQ(TryStatus(StatusWithSize::Cancelled()), Status::Cancelled());
67 EXPECT_EQ(TryStatus(StatusWithSize::DataLoss()), Status::DataLoss());
68 EXPECT_EQ(TryStatus(StatusWithSize::Unimplemented()),
69 Status::Unimplemented());
David Rogersb6b14b82020-09-11 16:27:27 -070070}
71
72Status TryStatusAssign(size_t& size_val, StatusWithSize status) {
73 PW_TRY_ASSIGN(size_val, ReturnStatusWithSize(status));
74
75 // Any status other than OK should have already returned.
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070076 EXPECT_EQ(status.status(), Status::Ok());
David Rogersb6b14b82020-09-11 16:27:27 -070077 EXPECT_EQ(size_val, status.size());
78 return status.status();
79}
80
81TEST(Status, TryAssignOk) {
82 size_t size_val = 0;
83
84 for (size_t i = 1; i < 32; ++i) {
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070085 StatusWithSize val(Status::Ok(), i);
86 EXPECT_EQ(TryStatusAssign(size_val, val), Status::Ok());
David Rogersb6b14b82020-09-11 16:27:27 -070087 EXPECT_EQ(size_val, i);
88 }
89}
90
91TEST(Status, TryAssignError) {
92 size_t size_val = 0u;
93
94 for (size_t i = 1; i < 32; ++i) {
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070095 StatusWithSize val(Status::OutOfRange(), i);
96 EXPECT_EQ(TryStatusAssign(size_val, val), Status::OutOfRange());
David Rogersb6b14b82020-09-11 16:27:27 -070097 EXPECT_EQ(size_val, 0u);
98 }
99}
100
101StatusWithSize TryStatusWithSize(StatusWithSize status) {
David Rogersc4dc8642020-09-14 10:52:36 -0700102 PW_TRY_WITH_SIZE(ReturnStatusWithSize(status));
David Rogersb6b14b82020-09-11 16:27:27 -0700103
104 // Any status other than OK should have already returned.
105 EXPECT_TRUE(status.ok());
106 return status;
107}
108
109StatusWithSize TryStatusWithSize(Status status) {
David Rogersc4dc8642020-09-14 10:52:36 -0700110 PW_TRY_WITH_SIZE(ReturnStatus(status));
David Rogersb6b14b82020-09-11 16:27:27 -0700111
112 // Any status other than OK should have already returned.
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700113 EXPECT_EQ(status, Status::Ok());
David Rogersb6b14b82020-09-11 16:27:27 -0700114
115 StatusWithSize return_val(status, 0u);
116 return return_val;
117}
118
119TEST(Status, TryWithSize_StatusOk) {
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700120 StatusWithSize result = TryStatusWithSize(Status::Ok());
121 EXPECT_EQ(result.status(), Status::Ok());
David Rogersb6b14b82020-09-11 16:27:27 -0700122 EXPECT_EQ(result.size(), 0u);
123}
124
125TEST(Status, TryWithSize_StatusError) {
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700126 StatusWithSize result = TryStatusWithSize(Status::PermissionDenied());
127 EXPECT_EQ(result.status(), Status::PermissionDenied());
David Rogersb6b14b82020-09-11 16:27:27 -0700128 EXPECT_EQ(result.size(), 0u);
129}
130
131TEST(Status, TryWithSize_StatusWithSizeOk) {
132 for (size_t i = 0; i < 32; ++i) {
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700133 StatusWithSize val(Status::Ok(), i);
134 EXPECT_EQ(TryStatusWithSize(val).status(), Status::Ok());
David Rogersb6b14b82020-09-11 16:27:27 -0700135 EXPECT_EQ(TryStatusWithSize(val).size(), i);
136 }
137}
138
139TEST(Status, TryWithSize_StatusWithSizeError) {
140 for (size_t i = 0; i < 32; ++i) {
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700141 StatusWithSize val(Status::DataLoss(), i);
David Rogersb6b14b82020-09-11 16:27:27 -0700142 StatusWithSize result = TryStatusWithSize(val);
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700143 EXPECT_EQ(result.status(), Status::DataLoss());
David Rogersb6b14b82020-09-11 16:27:27 -0700144 EXPECT_EQ(result.size(), i);
145 }
146}
147
148TEST(Status, TryWithSize_StatusWithSizeConst) {
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700149 StatusWithSize result = TryStatusWithSize(StatusWithSize::DataLoss());
150 EXPECT_EQ(result.status(), Status::DataLoss());
David Rogersb6b14b82020-09-11 16:27:27 -0700151 EXPECT_EQ(result.size(), 0u);
152
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700153 result = TryStatusWithSize(StatusWithSize::NotFound());
154 EXPECT_EQ(result.status(), Status::NotFound());
David Rogersb6b14b82020-09-11 16:27:27 -0700155 EXPECT_EQ(result.size(), 0u);
156
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700157 result = TryStatusWithSize(StatusWithSize::Unimplemented());
158 EXPECT_EQ(result.status(), Status::Unimplemented());
David Rogersb6b14b82020-09-11 16:27:27 -0700159 EXPECT_EQ(result.size(), 0u);
160}
161
162} // namespace
163} // namespace pw