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