xref: /aosp_15_r20/external/sandboxed-api/sandboxed_api/util/status_macros_test.cc (revision ec63e07ab9515d95e79c211197c445ef84cefa6a)
1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of 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,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "sandboxed_api/util/status_macros.h"
16 
17 #include <memory>
18 #include <string>
19 
20 #include "gmock/gmock.h"
21 #include "gtest/gtest.h"
22 #include "absl/status/status.h"
23 #include "absl/status/statusor.h"
24 #include "absl/strings/str_cat.h"
25 #include "absl/strings/string_view.h"
26 #include "sandboxed_api/util/status.h"
27 #include "sandboxed_api/util/status_matchers.h"
28 
29 namespace sapi {
30 namespace {
31 
TEST(ReturnIfError,ReturnsOnErrorStatus)32 TEST(ReturnIfError, ReturnsOnErrorStatus) {
33   auto func = []() -> absl::Status {
34     SAPI_RETURN_IF_ERROR(absl::OkStatus());
35     SAPI_RETURN_IF_ERROR(absl::OkStatus());
36     SAPI_RETURN_IF_ERROR(absl::UnknownError("EXPECTED"));
37     return absl::UnknownError("ERROR");
38   };
39 
40   EXPECT_THAT(func(), StatusIs(absl::StatusCode::kUnknown, "EXPECTED"));
41 }
42 
TEST(ReturnIfError,ReturnsOnErrorFromLambda)43 TEST(ReturnIfError, ReturnsOnErrorFromLambda) {
44   auto func = []() -> absl::Status {
45     SAPI_RETURN_IF_ERROR([] { return absl::OkStatus(); }());
46     SAPI_RETURN_IF_ERROR([] { return absl::UnknownError("EXPECTED"); }());
47     return absl::UnknownError("ERROR");
48   };
49 
50   EXPECT_THAT(func(), StatusIs(absl::StatusCode::kUnknown, "EXPECTED"));
51 }
52 
TEST(AssignOrReturn,AssignsMultipleVariablesInSequence)53 TEST(AssignOrReturn, AssignsMultipleVariablesInSequence) {
54   auto func = []() -> absl::Status {
55     int value1;
56     SAPI_ASSIGN_OR_RETURN(value1, absl::StatusOr<int>(1));
57     EXPECT_EQ(1, value1);
58     int value2;
59     SAPI_ASSIGN_OR_RETURN(value2, absl::StatusOr<int>(2));
60     EXPECT_EQ(2, value2);
61     int value3;
62     SAPI_ASSIGN_OR_RETURN(value3, absl::StatusOr<int>(3));
63     EXPECT_EQ(3, value3);
64     int value4;
65     SAPI_ASSIGN_OR_RETURN(value4,
66                           absl::StatusOr<int>(absl::UnknownError("EXPECTED")));
67     return absl::UnknownError(absl::StrCat("ERROR: assigned value ", value4));
68   };
69 
70   EXPECT_THAT(func(), StatusIs(absl::StatusCode::kUnknown, "EXPECTED"));
71 }
72 
TEST(AssignOrReturn,AssignsRepeatedlyToSingleVariable)73 TEST(AssignOrReturn, AssignsRepeatedlyToSingleVariable) {
74   auto func = []() -> absl::Status {
75     int value = 1;
76     SAPI_ASSIGN_OR_RETURN(value, absl::StatusOr<int>(2));
77     EXPECT_EQ(2, value);
78     SAPI_ASSIGN_OR_RETURN(value, absl::StatusOr<int>(3));
79     EXPECT_EQ(3, value);
80     SAPI_ASSIGN_OR_RETURN(value,
81                           absl::StatusOr<int>(absl::UnknownError("EXPECTED")));
82     return absl::UnknownError("ERROR");
83   };
84 
85   EXPECT_THAT(func(), StatusIs(absl::StatusCode::kUnknown, "EXPECTED"));
86 }
87 
TEST(AssignOrReturn,MovesUniquePtr)88 TEST(AssignOrReturn, MovesUniquePtr) {
89   auto func = []() -> absl::Status {
90     std::unique_ptr<int> ptr;
91     SAPI_ASSIGN_OR_RETURN(
92         ptr, absl::StatusOr<std::unique_ptr<int>>(std::make_unique<int>(1)));
93     EXPECT_EQ(*ptr, 1);
94     return absl::UnknownError("EXPECTED");
95   };
96 
97   EXPECT_THAT(func(), StatusIs(absl::StatusCode::kUnknown, "EXPECTED"));
98 }
99 
TEST(AssignOrReturn,DoesNotAssignUniquePtrOnErrorStatus)100 TEST(AssignOrReturn, DoesNotAssignUniquePtrOnErrorStatus) {
101   auto func = []() -> absl::Status {
102     std::unique_ptr<int> ptr;
103     SAPI_ASSIGN_OR_RETURN(ptr, absl::StatusOr<std::unique_ptr<int>>(
104                                    absl::UnknownError("EXPECTED")));
105     EXPECT_EQ(ptr, nullptr);
106     return absl::OkStatus();
107   };
108 
109   EXPECT_THAT(func(), StatusIs(absl::StatusCode::kUnknown, "EXPECTED"));
110 }
111 
TEST(AssignOrReturn,MovesUniquePtrRepeatedlyToSingleVariable)112 TEST(AssignOrReturn, MovesUniquePtrRepeatedlyToSingleVariable) {
113   auto func = []() -> absl::Status {
114     std::unique_ptr<int> ptr;
115     SAPI_ASSIGN_OR_RETURN(
116         ptr, absl::StatusOr<std::unique_ptr<int>>(std::make_unique<int>(1)));
117     EXPECT_EQ(*ptr, 1);
118     SAPI_ASSIGN_OR_RETURN(
119         ptr, absl::StatusOr<std::unique_ptr<int>>(std::make_unique<int>(2)));
120     EXPECT_EQ(*ptr, 2);
121     return absl::UnknownError("EXPECTED");
122   };
123 
124   EXPECT_THAT(func(), StatusIs(absl::StatusCode::kUnknown, "EXPECTED"));
125 }
126 
127 }  // namespace
128 }  // namespace sapi
129