1 // Licensed to the Apache Software Foundation (ASF) under one
2 // or more contributor license agreements. See the NOTICE file
3 // distributed with this work for additional information
4 // regarding copyright ownership. The ASF licenses this file
5 // to you under the Apache License, Version 2.0 (the
6 // "License"); you may not use this file except in compliance
7 // with the License. You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing,
12 // software distributed under the License is distributed on an
13 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 // KIND, either express or implied. See the License for the
15 // specific language governing permissions and limitations
20 #include <gmock/gmock-matchers.h>
21 #include <gtest/gtest.h>
23 #include "arrow/status.h"
24 #include "arrow/testing/gtest_util.h"
25 #include "arrow/testing/matchers.h"
31 class TestStatusDetail
: public StatusDetail
{
33 const char* type_id() const override
{ return "type_id"; }
34 std::string
ToString() const override
{ return "a specific detail message"; }
39 TEST(StatusTest
, TestCodeAndMessage
) {
40 Status ok
= Status::OK();
41 ASSERT_EQ(StatusCode::OK
, ok
.code());
42 Status file_error
= Status::IOError("file error");
43 ASSERT_EQ(StatusCode::IOError
, file_error
.code());
44 ASSERT_EQ("file error", file_error
.message());
47 TEST(StatusTest
, TestToString
) {
48 Status file_error
= Status::IOError("file error");
49 ASSERT_EQ("IOError: file error", file_error
.ToString());
53 ASSERT_EQ(file_error
.ToString(), ss
.str());
56 TEST(StatusTest
, TestToStringWithDetail
) {
57 Status
status(StatusCode::IOError
, "summary", std::make_shared
<TestStatusDetail
>());
58 ASSERT_EQ("IOError: summary. Detail: a specific detail message", status
.ToString());
62 ASSERT_EQ(status
.ToString(), ss
.str());
65 TEST(StatusTest
, TestWithDetail
) {
66 Status
status(StatusCode::IOError
, "summary");
67 auto detail
= std::make_shared
<TestStatusDetail
>();
68 Status new_status
= status
.WithDetail(detail
);
70 ASSERT_EQ(new_status
.code(), status
.code());
71 ASSERT_EQ(new_status
.message(), status
.message());
72 ASSERT_EQ(new_status
.detail(), detail
);
75 TEST(StatusTest
, AndStatus
) {
76 Status a
= Status::OK();
77 Status b
= Status::OK();
78 Status c
= Status::Invalid("invalid value");
79 Status d
= Status::IOError("file error");
83 ASSERT_TRUE(res
.ok());
85 ASSERT_TRUE(res
.IsInvalid());
87 ASSERT_TRUE(res
.IsIOError());
91 ASSERT_TRUE(res
.IsInvalid());
93 ASSERT_TRUE(res
.IsInvalid());
96 res
= Status::OK() & Status::Invalid("foo");
97 ASSERT_TRUE(res
.IsInvalid());
98 res
= Status::Invalid("foo") & Status::OK();
99 ASSERT_TRUE(res
.IsInvalid());
100 res
= Status::Invalid("foo") & Status::IOError("bar");
101 ASSERT_TRUE(res
.IsInvalid());
105 ASSERT_TRUE(res
.ok());
106 res
&= Status::Invalid("foo");
107 ASSERT_TRUE(res
.IsInvalid());
108 res
&= Status::IOError("bar");
109 ASSERT_TRUE(res
.IsInvalid());
112 TEST(StatusTest
, TestEquality
) {
113 ASSERT_EQ(Status(), Status::OK());
114 ASSERT_EQ(Status::Invalid("error"), Status::Invalid("error"));
116 ASSERT_NE(Status::Invalid("error"), Status::OK());
117 ASSERT_NE(Status::Invalid("error"), Status::Invalid("other error"));
120 TEST(StatusTest
, MatcherExamples
) {
121 EXPECT_THAT(Status::Invalid("arbitrary error"), Raises(StatusCode::Invalid
));
123 EXPECT_THAT(Status::Invalid("arbitrary error"),
124 Raises(StatusCode::Invalid
, testing::HasSubstr("arbitrary")));
126 // message doesn't match, so no match
128 Status::Invalid("arbitrary error"),
129 testing::Not(Raises(StatusCode::Invalid
, testing::HasSubstr("reasonable"))));
131 // different error code, so no match
132 EXPECT_THAT(Status::TypeError("arbitrary error"),
133 testing::Not(Raises(StatusCode::Invalid
)));
135 // not an error, so no match
136 EXPECT_THAT(Status::OK(), testing::Not(Raises(StatusCode::Invalid
)));
139 TEST(StatusTest
, MatcherDescriptions
) {
140 testing::Matcher
<Status
> matcher
= Raises(StatusCode::Invalid
);
143 std::stringstream ss
;
144 matcher
.DescribeTo(&ss
);
145 EXPECT_THAT(ss
.str(), testing::StrEq("raises StatusCode::Invalid"));
149 std::stringstream ss
;
150 matcher
.DescribeNegationTo(&ss
);
151 EXPECT_THAT(ss
.str(), testing::StrEq("does not raise StatusCode::Invalid"));
155 TEST(StatusTest
, MessageMatcherDescriptions
) {
156 testing::Matcher
<Status
> matcher
=
157 Raises(StatusCode::Invalid
, testing::HasSubstr("arbitrary"));
160 std::stringstream ss
;
161 matcher
.DescribeTo(&ss
);
165 "raises StatusCode::Invalid and message has substring \"arbitrary\""));
169 std::stringstream ss
;
170 matcher
.DescribeNegationTo(&ss
);
171 EXPECT_THAT(ss
.str(), testing::StrEq("does not raise StatusCode::Invalid or message "
172 "has no substring \"arbitrary\""));
176 TEST(StatusTest
, MatcherExplanations
) {
177 testing::Matcher
<Status
> matcher
= Raises(StatusCode::Invalid
);
180 testing::StringMatchResultListener listener
;
181 EXPECT_TRUE(matcher
.MatchAndExplain(Status::Invalid("XXX"), &listener
));
182 EXPECT_THAT(listener
.str(), testing::StrEq("whose value \"Invalid: XXX\" matches"));
186 testing::StringMatchResultListener listener
;
187 EXPECT_FALSE(matcher
.MatchAndExplain(Status::OK(), &listener
));
188 EXPECT_THAT(listener
.str(), testing::StrEq("whose value \"OK\" doesn't match"));
192 testing::StringMatchResultListener listener
;
193 EXPECT_FALSE(matcher
.MatchAndExplain(Status::TypeError("XXX"), &listener
));
194 EXPECT_THAT(listener
.str(),
195 testing::StrEq("whose value \"Type error: XXX\" doesn't match"));
199 TEST(StatusTest
, TestDetailEquality
) {
200 const auto status_with_detail
=
201 arrow::Status(StatusCode::IOError
, "", std::make_shared
<TestStatusDetail
>());
202 const auto status_with_detail2
=
203 arrow::Status(StatusCode::IOError
, "", std::make_shared
<TestStatusDetail
>());
204 const auto status_without_detail
= arrow::Status::IOError("");
206 ASSERT_EQ(*status_with_detail
.detail(), *status_with_detail2
.detail());
207 ASSERT_EQ(status_with_detail
, status_with_detail2
);
208 ASSERT_NE(status_with_detail
, status_without_detail
);
209 ASSERT_NE(status_without_detail
, status_with_detail
);