1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "netdutils/Status.h"
18 #include "netdutils/StatusOr.h"
19 
20 #include <sstream>
21 
22 #include <gtest/gtest.h>
23 
24 namespace android {
25 namespace netdutils {
26 namespace {
27 
TEST(StatusTest,valueSemantics)28 TEST(StatusTest, valueSemantics) {
29     // Default constructor
30     EXPECT_EQ(status::ok, Status());
31 
32     // Copy constructor
33     Status status1(1);
34     Status status2(status1);  // NOLINT(performance-unnecessary-copy-initialization)
35     EXPECT_EQ(1, status2.code());
36 
37     // Copy assignment
38     Status status3;
39     status3 = status2;
40     EXPECT_EQ(1, status3.code());
41 
42     // Same with const objects
43     const Status status4(4);
44     const Status status5(status4);  // NOLINT(performance-unnecessary-copy-initialization)
45     Status status6;
46     status6 = status5;
47     EXPECT_EQ(4, status6.code());
48 }
49 
TEST(StatusTest,errorMessages)50 TEST(StatusTest, errorMessages) {
51     Status s(42, "for tea too");
52     EXPECT_EQ(42, s.code());
53     EXPECT_FALSE(s.ok());
54     EXPECT_EQ(s.msg(), "for tea too");
55 }
56 
TEST(StatusOrTest,moveSemantics)57 TEST(StatusOrTest, moveSemantics) {
58     // Status objects should be cheaply movable.
59     EXPECT_TRUE(std::is_nothrow_move_constructible<Status>::value);
60     EXPECT_TRUE(std::is_nothrow_move_assignable<Status>::value);
61 
62     // Should move from a temporary Status (twice)
63     Status s(Status(Status(42, "move me")));
64     EXPECT_EQ(42, s.code());
65     EXPECT_EQ(s.msg(), "move me");
66 
67     Status s2(666, "EDAEMON");
68     EXPECT_NE(s, s2);
69     s = s2;  // Invokes the move-assignment operator.
70     EXPECT_EQ(666, s.code());
71     EXPECT_EQ(s.msg(), "EDAEMON");
72     EXPECT_EQ(s, s2);
73 
74     // A moved-from Status can be re-used.
75     s2 = s;
76 
77     // Now both objects are valid.
78     EXPECT_EQ(666, s.code());
79     EXPECT_EQ(s.msg(), "EDAEMON");
80     EXPECT_EQ(s, s2);
81 }
82 
TEST(StatusTest,ignoredStatus)83 TEST(StatusTest, ignoredStatus) {
84     statusFromErrno(ENOTTY, "Not a typewriter, what did you expect?").ignoreError();
85 }
86 
TEST(StatusOrTest,ostream)87 TEST(StatusOrTest, ostream) {
88     {
89       StatusOr<int> so(11);
90       std::stringstream ss;
91       ss << so;
92       // TODO: Fix StatusOr to optionally output "value:".
93       EXPECT_EQ("StatusOr[status: Status[code: 0, msg: \"\"]]", ss.str());
94     }
95     {
96       StatusOr<int> err(status::undefined);
97       std::stringstream ss;
98       ss << err;
99       EXPECT_EQ("StatusOr[status: Status[code: 2147483647, msg: \"undefined\"]]", ss.str());
100     }
101 }
102 
103 }  // namespace
104 }  // namespace netdutils
105 }  // namespace android
106