1 #include <pdx/status.h>
2 
3 #include <gtest/gtest.h>
4 
5 #include <memory>
6 
7 using android::pdx::ErrorStatus;
8 using android::pdx::Status;
9 
TEST(Status,DefaultInit)10 TEST(Status, DefaultInit) {
11   Status<int> status;
12   EXPECT_FALSE(status.ok());
13   EXPECT_TRUE(status.empty());
14   EXPECT_EQ(0, status.get());
15   EXPECT_EQ(0, status.error());
16 }
17 
TEST(Status,InitalizeSuccess)18 TEST(Status, InitalizeSuccess) {
19   Status<int> status_int{0};
20   EXPECT_FALSE(status_int.empty());
21   EXPECT_TRUE(status_int.ok());
22   EXPECT_EQ(0, status_int.get());
23   status_int = Status<int>(3);
24   EXPECT_FALSE(status_int.empty());
25   EXPECT_TRUE(status_int.ok());
26   EXPECT_EQ(3, status_int.get());
27   status_int = Status<int>(-3);
28   EXPECT_FALSE(status_int.empty());
29   EXPECT_TRUE(status_int.ok());
30   EXPECT_EQ(-3, status_int.get());
31 
32   Status<std::string> status_str{"foo"};
33   EXPECT_FALSE(status_str.empty());
34   EXPECT_TRUE(status_str.ok());
35   EXPECT_EQ("foo", status_str.get());
36 }
37 
TEST(Status,InitalizeError)38 TEST(Status, InitalizeError) {
39   Status<int> status_int = ErrorStatus(12);
40   EXPECT_FALSE(status_int.empty());
41   EXPECT_FALSE(status_int.ok());
42   EXPECT_EQ(0, status_int.get());
43   EXPECT_EQ(12, status_int.error());
44 
45   Status<std::string> status_str = ErrorStatus(EIO);
46   EXPECT_FALSE(status_str.empty());
47   EXPECT_FALSE(status_str.ok());
48   EXPECT_EQ(EIO, status_str.error());
49 }
50 
TEST(Status,ErrorMessage)51 TEST(Status, ErrorMessage) {
52   Status<int> status = ErrorStatus(EIO);
53   EXPECT_EQ(status.GetErrorMessage(), strerror(EIO));
54 
55   status = ErrorStatus(EINVAL);
56   EXPECT_EQ(status.GetErrorMessage(), strerror(EINVAL));
57 }
58 
TEST(Status,Copy)59 TEST(Status, Copy) {
60   Status<int> status1;
61   Status<int> status2;
62 
63   status1 = Status<int>{12};
64   status2 = ErrorStatus(13);
65   EXPECT_FALSE(status1.empty());
66   EXPECT_FALSE(status2.empty());
67   EXPECT_TRUE(status1.ok());
68   EXPECT_FALSE(status2.ok());
69   EXPECT_EQ(12, status1.get());
70   EXPECT_EQ(0, status1.error());
71   EXPECT_EQ(0, status2.get());
72   EXPECT_EQ(13, status2.error());
73 
74   status1 = status2;
75   EXPECT_FALSE(status1.empty());
76   EXPECT_FALSE(status2.empty());
77   EXPECT_FALSE(status1.ok());
78   EXPECT_FALSE(status2.ok());
79   EXPECT_EQ(0, status1.get());
80   EXPECT_EQ(13, status1.error());
81   EXPECT_EQ(0, status2.get());
82   EXPECT_EQ(13, status2.error());
83 }
84 
TEST(Status,Move)85 TEST(Status, Move) {
86   Status<std::unique_ptr<int>> status1;
87   Status<std::unique_ptr<int>> status2;
88 
89   status1 = Status<std::unique_ptr<int>>{std::make_unique<int>(int{11})};
90   status2 = Status<std::unique_ptr<int>>{std::make_unique<int>(int{12})};
91   EXPECT_FALSE(status1.empty());
92   EXPECT_FALSE(status2.empty());
93   EXPECT_TRUE(status1.ok());
94   EXPECT_TRUE(status2.ok());
95   EXPECT_EQ(11, *status1.get());
96   EXPECT_EQ(12, *status2.get());
97 
98   Status<std::unique_ptr<int>> status3 = std::move(status2);
99   EXPECT_FALSE(status1.empty());
100   EXPECT_TRUE(status2.empty());
101   EXPECT_FALSE(status3.empty());
102   EXPECT_TRUE(status1.ok());
103   EXPECT_FALSE(status2.ok());
104   EXPECT_TRUE(status3.ok());
105   EXPECT_EQ(11, *status1.get());
106   EXPECT_EQ(nullptr, status2.get());
107   EXPECT_EQ(12, *status3.get());
108 
109   std::swap(status1, status3);
110   EXPECT_EQ(12, *status1.get());
111   EXPECT_EQ(11, *status3.get());
112 
113   status3 = std::move(status1);
114   EXPECT_TRUE(status1.empty());
115   EXPECT_EQ(12, *status3.get());
116 }
117 
TEST(Status,Take)118 TEST(Status, Take) {
119   Status<std::unique_ptr<int>> status{std::make_unique<int>(int{123})};
120   EXPECT_FALSE(status.empty());
121   EXPECT_NE(nullptr, status.get());
122 
123   auto data = status.take();
124   EXPECT_TRUE(status.empty());
125   EXPECT_EQ(nullptr, status.get());
126   EXPECT_EQ(123, *data);
127 }
128