1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright 2017 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "api/rtc_error.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <utility>
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
16*d9f75844SAndroid Build Coastguard Worker
17*d9f75844SAndroid Build Coastguard Worker namespace {
18*d9f75844SAndroid Build Coastguard Worker
19*d9f75844SAndroid Build Coastguard Worker const int kDefaultMoveOnlyIntValue = 0xbadf00d;
20*d9f75844SAndroid Build Coastguard Worker
21*d9f75844SAndroid Build Coastguard Worker // Class that has no copy constructor, ensuring that RTCErrorOr can
22*d9f75844SAndroid Build Coastguard Worker struct MoveOnlyInt {
MoveOnlyInt__anoncb5b3ecb0111::MoveOnlyInt23*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt() {}
MoveOnlyInt__anoncb5b3ecb0111::MoveOnlyInt24*d9f75844SAndroid Build Coastguard Worker explicit MoveOnlyInt(int value) : value(value) {}
25*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt(const MoveOnlyInt& other) = delete;
26*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt& operator=(const MoveOnlyInt& other) = delete;
MoveOnlyInt__anoncb5b3ecb0111::MoveOnlyInt27*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt(MoveOnlyInt&& other) : value(other.value) {}
operator =__anoncb5b3ecb0111::MoveOnlyInt28*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt& operator=(MoveOnlyInt&& other) {
29*d9f75844SAndroid Build Coastguard Worker value = other.value;
30*d9f75844SAndroid Build Coastguard Worker return *this;
31*d9f75844SAndroid Build Coastguard Worker }
32*d9f75844SAndroid Build Coastguard Worker
33*d9f75844SAndroid Build Coastguard Worker int value = kDefaultMoveOnlyIntValue;
34*d9f75844SAndroid Build Coastguard Worker };
35*d9f75844SAndroid Build Coastguard Worker
36*d9f75844SAndroid Build Coastguard Worker // Same as above. Used to test conversion from RTCErrorOr<A> to RTCErrorOr<B>
37*d9f75844SAndroid Build Coastguard Worker // when A can be converted to B.
38*d9f75844SAndroid Build Coastguard Worker struct MoveOnlyInt2 {
MoveOnlyInt2__anoncb5b3ecb0111::MoveOnlyInt239*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt2() {}
MoveOnlyInt2__anoncb5b3ecb0111::MoveOnlyInt240*d9f75844SAndroid Build Coastguard Worker explicit MoveOnlyInt2(int value) : value(value) {}
41*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt2(const MoveOnlyInt2& other) = delete;
42*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt2& operator=(const MoveOnlyInt2& other) = delete;
MoveOnlyInt2__anoncb5b3ecb0111::MoveOnlyInt243*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt2(MoveOnlyInt2&& other) : value(other.value) {}
operator =__anoncb5b3ecb0111::MoveOnlyInt244*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt2& operator=(MoveOnlyInt2&& other) {
45*d9f75844SAndroid Build Coastguard Worker value = other.value;
46*d9f75844SAndroid Build Coastguard Worker return *this;
47*d9f75844SAndroid Build Coastguard Worker }
48*d9f75844SAndroid Build Coastguard Worker
MoveOnlyInt2__anoncb5b3ecb0111::MoveOnlyInt249*d9f75844SAndroid Build Coastguard Worker explicit MoveOnlyInt2(MoveOnlyInt&& other) : value(other.value) {}
operator =__anoncb5b3ecb0111::MoveOnlyInt250*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt2& operator=(MoveOnlyInt&& other) {
51*d9f75844SAndroid Build Coastguard Worker value = other.value;
52*d9f75844SAndroid Build Coastguard Worker return *this;
53*d9f75844SAndroid Build Coastguard Worker }
54*d9f75844SAndroid Build Coastguard Worker
55*d9f75844SAndroid Build Coastguard Worker int value = kDefaultMoveOnlyIntValue;
56*d9f75844SAndroid Build Coastguard Worker };
57*d9f75844SAndroid Build Coastguard Worker
58*d9f75844SAndroid Build Coastguard Worker } // namespace
59*d9f75844SAndroid Build Coastguard Worker
60*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
61*d9f75844SAndroid Build Coastguard Worker
62*d9f75844SAndroid Build Coastguard Worker // Test that the default constructor creates a "no error" error.
TEST(RTCErrorTest,DefaultConstructor)63*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorTest, DefaultConstructor) {
64*d9f75844SAndroid Build Coastguard Worker RTCError e;
65*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::NONE, e.type());
66*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string(), e.message());
67*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(e.ok());
68*d9f75844SAndroid Build Coastguard Worker }
69*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorTest,NormalConstructors)70*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorTest, NormalConstructors) {
71*d9f75844SAndroid Build Coastguard Worker RTCError a(RTCErrorType::INVALID_PARAMETER);
72*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, a.type());
73*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string(), a.message());
74*d9f75844SAndroid Build Coastguard Worker
75*d9f75844SAndroid Build Coastguard Worker // Constructor that takes const char* message.
76*d9f75844SAndroid Build Coastguard Worker RTCError b(RTCErrorType::UNSUPPORTED_PARAMETER, "foobar");
77*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, b.type());
78*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("foobar"), b.message());
79*d9f75844SAndroid Build Coastguard Worker
80*d9f75844SAndroid Build Coastguard Worker // Constructor that takes std::string message.
81*d9f75844SAndroid Build Coastguard Worker RTCError c(RTCErrorType::INVALID_RANGE, std::string("new"));
82*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_RANGE, c.type());
83*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("new"), c.message());
84*d9f75844SAndroid Build Coastguard Worker }
85*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorTest,MoveConstructor)86*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorTest, MoveConstructor) {
87*d9f75844SAndroid Build Coastguard Worker // Static string.
88*d9f75844SAndroid Build Coastguard Worker RTCError a(RTCErrorType::INVALID_PARAMETER, "foo");
89*d9f75844SAndroid Build Coastguard Worker RTCError b(std::move(a));
90*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, b.type());
91*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("foo"), b.message());
92*d9f75844SAndroid Build Coastguard Worker
93*d9f75844SAndroid Build Coastguard Worker // Non-static string.
94*d9f75844SAndroid Build Coastguard Worker RTCError c(RTCErrorType::UNSUPPORTED_PARAMETER, std::string("bar"));
95*d9f75844SAndroid Build Coastguard Worker RTCError d(std::move(c));
96*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, d.type());
97*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("bar"), d.message());
98*d9f75844SAndroid Build Coastguard Worker }
99*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorTest,MoveAssignment)100*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorTest, MoveAssignment) {
101*d9f75844SAndroid Build Coastguard Worker // Try all combinations of "is static string"/"is non-static string" moves.
102*d9f75844SAndroid Build Coastguard Worker RTCError e(RTCErrorType::INVALID_PARAMETER, "foo");
103*d9f75844SAndroid Build Coastguard Worker
104*d9f75844SAndroid Build Coastguard Worker e = RTCError(RTCErrorType::UNSUPPORTED_PARAMETER, "bar");
105*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, e.type());
106*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("bar"), e.message());
107*d9f75844SAndroid Build Coastguard Worker
108*d9f75844SAndroid Build Coastguard Worker e = RTCError(RTCErrorType::SYNTAX_ERROR, std::string("baz"));
109*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("baz"), e.message());
110*d9f75844SAndroid Build Coastguard Worker
111*d9f75844SAndroid Build Coastguard Worker e = RTCError(RTCErrorType::SYNTAX_ERROR, std::string("another"));
112*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("another"), e.message());
113*d9f75844SAndroid Build Coastguard Worker
114*d9f75844SAndroid Build Coastguard Worker e = RTCError(RTCErrorType::SYNTAX_ERROR, "last");
115*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("last"), e.message());
116*d9f75844SAndroid Build Coastguard Worker }
117*d9f75844SAndroid Build Coastguard Worker
118*d9f75844SAndroid Build Coastguard Worker // Test that the error returned by RTCError::OK() is a "no error" error.
TEST(RTCErrorTest,OKConstant)119*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorTest, OKConstant) {
120*d9f75844SAndroid Build Coastguard Worker RTCError ok = RTCError::OK();
121*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::NONE, ok.type());
122*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string(), ok.message());
123*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(ok.ok());
124*d9f75844SAndroid Build Coastguard Worker }
125*d9f75844SAndroid Build Coastguard Worker
126*d9f75844SAndroid Build Coastguard Worker // Test that "error.ok()" behaves as expected.
TEST(RTCErrorTest,OkMethod)127*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorTest, OkMethod) {
128*d9f75844SAndroid Build Coastguard Worker RTCError success;
129*d9f75844SAndroid Build Coastguard Worker RTCError failure(RTCErrorType::INTERNAL_ERROR);
130*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(success.ok());
131*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(failure.ok());
132*d9f75844SAndroid Build Coastguard Worker }
133*d9f75844SAndroid Build Coastguard Worker
134*d9f75844SAndroid Build Coastguard Worker // Test that a message can be set using either static const strings or
135*d9f75844SAndroid Build Coastguard Worker // std::strings.
TEST(RTCErrorTest,SetMessage)136*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorTest, SetMessage) {
137*d9f75844SAndroid Build Coastguard Worker RTCError e;
138*d9f75844SAndroid Build Coastguard Worker // Try all combinations of "is static string"/"is non-static string" calls.
139*d9f75844SAndroid Build Coastguard Worker e.set_message("foo");
140*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("foo"), e.message());
141*d9f75844SAndroid Build Coastguard Worker
142*d9f75844SAndroid Build Coastguard Worker e.set_message("bar");
143*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("bar"), e.message());
144*d9f75844SAndroid Build Coastguard Worker
145*d9f75844SAndroid Build Coastguard Worker e.set_message(std::string("string"));
146*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("string"), e.message());
147*d9f75844SAndroid Build Coastguard Worker
148*d9f75844SAndroid Build Coastguard Worker e.set_message(std::string("more"));
149*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("more"), e.message());
150*d9f75844SAndroid Build Coastguard Worker
151*d9f75844SAndroid Build Coastguard Worker e.set_message("love to test");
152*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("love to test"), e.message());
153*d9f75844SAndroid Build Coastguard Worker }
154*d9f75844SAndroid Build Coastguard Worker
155*d9f75844SAndroid Build Coastguard Worker // Test that the default constructor creates an "INTERNAL_ERROR".
TEST(RTCErrorOrTest,DefaultConstructor)156*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrTest, DefaultConstructor) {
157*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt> e;
158*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::INTERNAL_ERROR, e.error().type());
159*d9f75844SAndroid Build Coastguard Worker }
160*d9f75844SAndroid Build Coastguard Worker
161*d9f75844SAndroid Build Coastguard Worker // Test that an RTCErrorOr can be implicitly constructed from a value.
TEST(RTCErrorOrTest,ImplicitValueConstructor)162*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrTest, ImplicitValueConstructor) {
163*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt> e = [] { return MoveOnlyInt(100); }();
164*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(100, e.value().value);
165*d9f75844SAndroid Build Coastguard Worker }
166*d9f75844SAndroid Build Coastguard Worker
167*d9f75844SAndroid Build Coastguard Worker // Test that an RTCErrorOr can be implicitly constructed from an RTCError.
TEST(RTCErrorOrTest,ImplicitErrorConstructor)168*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrTest, ImplicitErrorConstructor) {
169*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt> e = [] {
170*d9f75844SAndroid Build Coastguard Worker return RTCError(RTCErrorType::SYNTAX_ERROR);
171*d9f75844SAndroid Build Coastguard Worker }();
172*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::SYNTAX_ERROR, e.error().type());
173*d9f75844SAndroid Build Coastguard Worker }
174*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorOrTest,MoveConstructor)175*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrTest, MoveConstructor) {
176*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt> a(MoveOnlyInt(5));
177*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt> b(std::move(a));
178*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(5, b.value().value);
179*d9f75844SAndroid Build Coastguard Worker }
180*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorOrTest,MoveAssignment)181*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrTest, MoveAssignment) {
182*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt> a(MoveOnlyInt(5));
183*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt> b(MoveOnlyInt(10));
184*d9f75844SAndroid Build Coastguard Worker a = std::move(b);
185*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(10, a.value().value);
186*d9f75844SAndroid Build Coastguard Worker }
187*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorOrTest,ConversionConstructor)188*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrTest, ConversionConstructor) {
189*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt> a(MoveOnlyInt(1));
190*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt2> b(std::move(a));
191*d9f75844SAndroid Build Coastguard Worker }
192*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorOrTest,ConversionAssignment)193*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrTest, ConversionAssignment) {
194*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt> a(MoveOnlyInt(5));
195*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt2> b(MoveOnlyInt2(10));
196*d9f75844SAndroid Build Coastguard Worker b = std::move(a);
197*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(5, b.value().value);
198*d9f75844SAndroid Build Coastguard Worker }
199*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorOrTest,OkMethod)200*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrTest, OkMethod) {
201*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<int> success(1337);
202*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<int> error = RTCError(RTCErrorType::INTERNAL_ERROR);
203*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(success.ok());
204*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(error.ok());
205*d9f75844SAndroid Build Coastguard Worker }
206*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorOrTest,MoveError)207*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrTest, MoveError) {
208*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<int> e({RTCErrorType::SYNTAX_ERROR, "message"});
209*d9f75844SAndroid Build Coastguard Worker RTCError err = e.MoveError();
210*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(RTCErrorType::SYNTAX_ERROR, err.type());
211*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(std::string("message"), err.message());
212*d9f75844SAndroid Build Coastguard Worker }
213*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorOrTest,MoveValue)214*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrTest, MoveValue) {
215*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<MoveOnlyInt> e(MoveOnlyInt(88));
216*d9f75844SAndroid Build Coastguard Worker MoveOnlyInt value = e.MoveValue();
217*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(88, value.value);
218*d9f75844SAndroid Build Coastguard Worker }
219*d9f75844SAndroid Build Coastguard Worker
220*d9f75844SAndroid Build Coastguard Worker // Death tests.
221*d9f75844SAndroid Build Coastguard Worker // Disabled on Android because death tests misbehave on Android, see
222*d9f75844SAndroid Build Coastguard Worker // base/test/gtest_util.h.
223*d9f75844SAndroid Build Coastguard Worker #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
224*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorOrDeathTest,ConstructWithOkError)225*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrDeathTest, ConstructWithOkError) {
226*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<int> err;
227*d9f75844SAndroid Build Coastguard Worker EXPECT_DEATH(err = RTCError::OK(), "");
228*d9f75844SAndroid Build Coastguard Worker }
229*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorOrDeathTest,DereferenceErrorValue)230*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrDeathTest, DereferenceErrorValue) {
231*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<int> error = RTCError(RTCErrorType::INTERNAL_ERROR);
232*d9f75844SAndroid Build Coastguard Worker EXPECT_DEATH(error.value(), "");
233*d9f75844SAndroid Build Coastguard Worker }
234*d9f75844SAndroid Build Coastguard Worker
TEST(RTCErrorOrDeathTest,MoveErrorValue)235*d9f75844SAndroid Build Coastguard Worker TEST(RTCErrorOrDeathTest, MoveErrorValue) {
236*d9f75844SAndroid Build Coastguard Worker RTCErrorOr<int> error = RTCError(RTCErrorType::INTERNAL_ERROR);
237*d9f75844SAndroid Build Coastguard Worker EXPECT_DEATH(error.MoveValue(), "");
238*d9f75844SAndroid Build Coastguard Worker }
239*d9f75844SAndroid Build Coastguard Worker
240*d9f75844SAndroid Build Coastguard Worker #endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
241*d9f75844SAndroid Build Coastguard Worker
242*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
243