1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "platform/base/error.h"
6
7 #include "gtest/gtest.h"
8
9 namespace {
10
11 class Dummy {
12 public:
13 Dummy() = default;
Dummy(const std::string & x)14 explicit Dummy(const std::string& x) : message(x) {}
15 ~Dummy() = default;
16
17 std::string message;
18 };
19
20 } // namespace
21
22 namespace openscreen {
23
TEST(ErrorTest,TestDefaultError)24 TEST(ErrorTest, TestDefaultError) {
25 const Error error;
26 EXPECT_EQ(error, Error::None());
27 EXPECT_EQ(error.message(), "");
28 }
29
TEST(ErrorTest,TestNonDefaultError)30 TEST(ErrorTest, TestNonDefaultError) {
31 const Error error(Error::Code::kCborParsing, "Parse error");
32 EXPECT_EQ(error.code(), Error::Code::kCborParsing);
33 EXPECT_EQ(error.message(), "Parse error");
34
35 const Error error2(error);
36 EXPECT_EQ(error2.code(), Error::Code::kCborParsing);
37 EXPECT_EQ(error2.message(), "Parse error");
38
39 const Error error3 = error2;
40 EXPECT_EQ(error, error2);
41 EXPECT_EQ(error, error3);
42 EXPECT_EQ(error2, error3);
43
44 const Error default_error;
45 EXPECT_FALSE(error == default_error);
46 EXPECT_FALSE(error2 == default_error);
47 EXPECT_FALSE(error3 == default_error);
48
49 const Error error4(std::move(error2));
50 const Error error5 = std::move(error3);
51 EXPECT_EQ(error, error4);
52 EXPECT_EQ(error, error5);
53 }
54
TEST(ErrorOrTest,ErrorToString)55 TEST(ErrorOrTest, ErrorToString) {
56 const Error error_none(Error::Code::kNone);
57 const Error error_none_with_msg(Error::Code::kNone, "Nothing to see here");
58 const Error error_transient(Error::Code::kAgain);
59 const Error error_transient_with_msg(Error::Code::kAgain,
60 "Try again later maybe?");
61 const Error error(Error::Code::kAddressInUse);
62 const Error error_with_msg(Error::Code::kAddressInUse,
63 "Somebody called dibs");
64
65 EXPECT_EQ("Success = \"\"", error_none.ToString());
66 EXPECT_EQ("Success = \"Nothing to see here\"",
67 error_none_with_msg.ToString());
68 EXPECT_EQ("Failure: Transient = \"\"", error_transient.ToString());
69 EXPECT_EQ("Failure: Transient = \"Try again later maybe?\"",
70 error_transient_with_msg.ToString());
71 EXPECT_EQ("Failure: AddressInUse = \"\"", error.ToString());
72 EXPECT_EQ("Failure: AddressInUse = \"Somebody called dibs\"",
73 error_with_msg.ToString());
74 }
75
TEST(ErrorOrTest,ErrorOrWithError)76 TEST(ErrorOrTest, ErrorOrWithError) {
77 ErrorOr<Dummy> error_or1(Error(Error::Code::kCborParsing, "Parse Error"));
78 const ErrorOr<Dummy> error_or2(Error::Code::kCborParsing);
79 ErrorOr<Dummy> error_or3(Error::Code::kCborParsing, "Parse Error Again");
80
81 EXPECT_FALSE(error_or1);
82 EXPECT_FALSE(error_or1.is_value());
83 EXPECT_TRUE(error_or1.is_error());
84 EXPECT_EQ(error_or1.error().code(), Error::Code::kCborParsing);
85 EXPECT_EQ(error_or1.error().message(), "Parse Error");
86
87 EXPECT_FALSE(error_or2);
88 EXPECT_FALSE(error_or2.is_value());
89 EXPECT_TRUE(error_or2.is_error());
90 EXPECT_EQ(error_or2.error().code(), Error::Code::kCborParsing);
91 EXPECT_EQ(error_or2.error().message(), "");
92
93 EXPECT_FALSE(error_or3);
94 EXPECT_FALSE(error_or3.is_value());
95 EXPECT_TRUE(error_or3.is_error());
96 EXPECT_EQ(error_or3.error().code(), Error::Code::kCborParsing);
97 EXPECT_EQ(error_or3.error().message(), "Parse Error Again");
98
99 const ErrorOr<Dummy> error_or4(std::move(error_or1));
100 const ErrorOr<Dummy> error_or5 = std::move(error_or3);
101
102 EXPECT_FALSE(error_or4);
103 EXPECT_FALSE(error_or4.is_value());
104 EXPECT_TRUE(error_or4.is_error());
105 EXPECT_EQ(error_or4.error().code(), Error::Code::kCborParsing);
106 EXPECT_EQ(error_or4.error().message(), "Parse Error");
107
108 EXPECT_FALSE(error_or5);
109 EXPECT_FALSE(error_or5.is_value());
110 EXPECT_TRUE(error_or5.is_error());
111 EXPECT_EQ(error_or5.error().code(), Error::Code::kCborParsing);
112 EXPECT_EQ(error_or5.error().message(), "Parse Error Again");
113 }
114
TEST(ErrorOrTest,ErrorOrWithPrimitiveValue)115 TEST(ErrorOrTest, ErrorOrWithPrimitiveValue) {
116 const ErrorOr<int> error_or_integer(1337);
117 EXPECT_TRUE(error_or_integer);
118 EXPECT_TRUE(error_or_integer.is_value());
119 EXPECT_FALSE(error_or_integer.is_error());
120 EXPECT_EQ(error_or_integer.value(), 1337);
121 }
122
TEST(ErrorOrTest,ErrorOrWithValue)123 TEST(ErrorOrTest, ErrorOrWithValue) {
124 ErrorOr<Dummy> error_or1(Dummy("Winterfell"));
125 ErrorOr<Dummy> error_or2(Dummy("Riverrun"));
126
127 EXPECT_TRUE(error_or1);
128 EXPECT_TRUE(error_or1.is_value());
129 EXPECT_FALSE(error_or1.is_error());
130 EXPECT_EQ(error_or1.value().message, "Winterfell");
131
132 EXPECT_TRUE(error_or2);
133 EXPECT_TRUE(error_or2.is_value());
134 EXPECT_FALSE(error_or2.is_error());
135 EXPECT_EQ(error_or2.value().message, "Riverrun");
136
137 const ErrorOr<Dummy> error_or3(std::move(error_or1));
138 ErrorOr<Dummy> error_or4 = std::move(error_or2);
139
140 EXPECT_TRUE(error_or3);
141 EXPECT_TRUE(error_or3.is_value());
142 EXPECT_FALSE(error_or3.is_error());
143 EXPECT_EQ(error_or3.value().message, "Winterfell");
144
145 EXPECT_TRUE(error_or4);
146 EXPECT_TRUE(error_or4.is_value());
147 EXPECT_FALSE(error_or4.is_error());
148 EXPECT_EQ(error_or4.value().message, "Riverrun");
149
150 Dummy value = std::move(error_or4.value());
151 EXPECT_EQ(value.message, "Riverrun");
152 }
153
TEST(ErrorOrTest,ComparisonTests)154 TEST(ErrorOrTest, ComparisonTests) {
155 const ErrorOr<int> e1(7);
156 const ErrorOr<int> e2(7);
157 const ErrorOr<int> e3(2);
158 const ErrorOr<int> e4(10);
159
160 const ErrorOr<int> e5(Error::Code::kAgain);
161 const ErrorOr<int> e6(Error::Code::kCborParsing);
162 const ErrorOr<int> e7(Error::Code::kCborEncoding);
163 const ErrorOr<int> e8(Error::Code::kCborEncoding);
164
165 const ErrorOr<int> e9(Error::Code::kAgain, "foo");
166 const ErrorOr<int> e10(Error::Code::kAgain, "bar");
167
168 EXPECT_EQ(e1, e2);
169 EXPECT_EQ(e7, e8);
170 EXPECT_LE(e1, e2);
171 EXPECT_GE(e7, e8);
172
173 EXPECT_NE(e1, e3);
174 EXPECT_NE(e1, e4);
175 EXPECT_NE(e1, e5);
176 EXPECT_NE(e1, e6);
177 EXPECT_NE(e1, e7);
178 EXPECT_NE(e5, e2);
179 EXPECT_NE(e5, e3);
180 EXPECT_NE(e5, e4);
181 EXPECT_NE(e5, e6);
182 EXPECT_NE(e5, e9);
183 EXPECT_NE(e5, e10);
184 EXPECT_NE(e9, e10);
185
186 EXPECT_LT(e3, e1);
187 EXPECT_GT(e4, e1);
188 EXPECT_LT(e5, e6);
189 EXPECT_LE(e5, e9);
190 EXPECT_LE(e5, e10);
191 EXPECT_LE(e9, e10);
192 EXPECT_GT(e7, e6);
193
194 EXPECT_GT(e1, e5);
195 EXPECT_GT(e2, e5);
196 EXPECT_GT(e3, e5);
197 EXPECT_GT(e4, e5);
198 EXPECT_GT(e1, e6);
199 EXPECT_GT(e2, e6);
200 EXPECT_GT(e3, e6);
201 EXPECT_GT(e4, e6);
202 EXPECT_GT(e1, e7);
203 EXPECT_GT(e2, e7);
204 EXPECT_GT(e3, e7);
205 EXPECT_GT(e4, e7);
206 }
207
208 } // namespace openscreen
209