1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // https://developers.google.com/protocol-buffers/ 4 // 5 // Redistribution and use in source and binary forms, with or without 6 // modification, are permitted provided that the following conditions are 7 // met: 8 // 9 // * Redistributions of source code must retain the above copyright 10 // notice, this list of conditions and the following disclaimer. 11 // * Redistributions in binary form must reproduce the above 12 // copyright notice, this list of conditions and the following disclaimer 13 // in the documentation and/or other materials provided with the 14 // distribution. 15 // * Neither the name of Google Inc. nor the names of its 16 // contributors may be used to endorse or promote products derived from 17 // this software without specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31 #include <google/protobuf/stubs/statusor.h> 32 33 #include <errno.h> 34 #include <memory> 35 36 #include <google/protobuf/testing/googletest.h> 37 #include <gtest/gtest.h> 38 39 namespace google { 40 namespace protobuf { 41 namespace util { 42 namespace { 43 44 class Base1 { 45 public: 46 virtual ~Base1() {} 47 int pad; 48 }; 49 50 class Base2 { 51 public: 52 virtual ~Base2() {} 53 int yetotherpad; 54 }; 55 56 class Derived : public Base1, public Base2 { 57 public: 58 virtual ~Derived() {} 59 int evenmorepad; 60 }; 61 62 class CopyNoAssign { 63 public: 64 explicit CopyNoAssign(int value) : foo(value) {} 65 CopyNoAssign(const CopyNoAssign& other) : foo(other.foo) {} 66 int foo; 67 private: 68 const CopyNoAssign& operator=(const CopyNoAssign&); 69 }; 70 71 TEST(StatusOr, TestDefaultCtor) { 72 StatusOr<int> thing; 73 EXPECT_FALSE(thing.ok()); 74 EXPECT_EQ(Status::UNKNOWN, thing.status()); 75 } 76 77 TEST(StatusOr, TestStatusCtor) { 78 StatusOr<int> thing(Status::CANCELLED); 79 EXPECT_FALSE(thing.ok()); 80 EXPECT_EQ(Status::CANCELLED, thing.status()); 81 } 82 83 TEST(StatusOr, TestValueCtor) { 84 const int kI = 4; 85 StatusOr<int> thing(kI); 86 EXPECT_TRUE(thing.ok()); 87 EXPECT_EQ(kI, thing.ValueOrDie()); 88 } 89 90 TEST(StatusOr, TestCopyCtorStatusOk) { 91 const int kI = 4; 92 StatusOr<int> original(kI); 93 StatusOr<int> copy(original); 94 EXPECT_EQ(original.status(), copy.status()); 95 EXPECT_EQ(original.ValueOrDie(), copy.ValueOrDie()); 96 } 97 98 TEST(StatusOr, TestCopyCtorStatusNotOk) { 99 StatusOr<int> original(Status::CANCELLED); 100 StatusOr<int> copy(original); 101 EXPECT_EQ(original.status(), copy.status()); 102 } 103 104 TEST(StatusOr, TestCopyCtorStatusOKConverting) { 105 const int kI = 4; 106 StatusOr<int> original(kI); 107 StatusOr<double> copy(original); 108 EXPECT_EQ(original.status(), copy.status()); 109 EXPECT_EQ(original.ValueOrDie(), copy.ValueOrDie()); 110 } 111 112 TEST(StatusOr, TestCopyCtorStatusNotOkConverting) { 113 StatusOr<int> original(Status::CANCELLED); 114 StatusOr<double> copy(original); 115 EXPECT_EQ(original.status(), copy.status()); 116 } 117 118 TEST(StatusOr, TestAssignmentStatusOk) { 119 const int kI = 4; 120 StatusOr<int> source(kI); 121 StatusOr<int> target; 122 target = source; 123 EXPECT_EQ(source.status(), target.status()); 124 EXPECT_EQ(source.ValueOrDie(), target.ValueOrDie()); 125 } 126 127 TEST(StatusOr, TestAssignmentStatusNotOk) { 128 StatusOr<int> source(Status::CANCELLED); 129 StatusOr<int> target; 130 target = source; 131 EXPECT_EQ(source.status(), target.status()); 132 } 133 134 TEST(StatusOr, TestAssignmentStatusOKConverting) { 135 const int kI = 4; 136 StatusOr<int> source(kI); 137 StatusOr<double> target; 138 target = source; 139 EXPECT_EQ(source.status(), target.status()); 140 EXPECT_DOUBLE_EQ(source.ValueOrDie(), target.ValueOrDie()); 141 } 142 143 TEST(StatusOr, TestAssignmentStatusNotOkConverting) { 144 StatusOr<int> source(Status::CANCELLED); 145 StatusOr<double> target; 146 target = source; 147 EXPECT_EQ(source.status(), target.status()); 148 } 149 150 TEST(StatusOr, TestStatus) { 151 StatusOr<int> good(4); 152 EXPECT_TRUE(good.ok()); 153 StatusOr<int> bad(Status::CANCELLED); 154 EXPECT_FALSE(bad.ok()); 155 EXPECT_EQ(Status::CANCELLED, bad.status()); 156 } 157 158 TEST(StatusOr, TestValue) { 159 const int kI = 4; 160 StatusOr<int> thing(kI); 161 EXPECT_EQ(kI, thing.ValueOrDie()); 162 } 163 164 TEST(StatusOr, TestValueConst) { 165 const int kI = 4; 166 const StatusOr<int> thing(kI); 167 EXPECT_EQ(kI, thing.ValueOrDie()); 168 } 169 170 TEST(StatusOr, TestPointerDefaultCtor) { 171 StatusOr<int*> thing; 172 EXPECT_FALSE(thing.ok()); 173 EXPECT_EQ(Status::UNKNOWN, thing.status()); 174 } 175 176 TEST(StatusOr, TestPointerStatusCtor) { 177 StatusOr<int*> thing(Status::CANCELLED); 178 EXPECT_FALSE(thing.ok()); 179 EXPECT_EQ(Status::CANCELLED, thing.status()); 180 } 181 182 TEST(StatusOr, TestPointerValueCtor) { 183 const int kI = 4; 184 StatusOr<const int*> thing(&kI); 185 EXPECT_TRUE(thing.ok()); 186 EXPECT_EQ(&kI, thing.ValueOrDie()); 187 } 188 189 TEST(StatusOr, TestPointerCopyCtorStatusOk) { 190 const int kI = 0; 191 StatusOr<const int*> original(&kI); 192 StatusOr<const int*> copy(original); 193 EXPECT_EQ(original.status(), copy.status()); 194 EXPECT_EQ(original.ValueOrDie(), copy.ValueOrDie()); 195 } 196 197 TEST(StatusOr, TestPointerCopyCtorStatusNotOk) { 198 StatusOr<int*> original(Status::CANCELLED); 199 StatusOr<int*> copy(original); 200 EXPECT_EQ(original.status(), copy.status()); 201 } 202 203 TEST(StatusOr, TestPointerCopyCtorStatusOKConverting) { 204 Derived derived; 205 StatusOr<Derived*> original(&derived); 206 StatusOr<Base2*> copy(original); 207 EXPECT_EQ(original.status(), copy.status()); 208 EXPECT_EQ(static_cast<const Base2*>(original.ValueOrDie()), 209 copy.ValueOrDie()); 210 } 211 212 TEST(StatusOr, TestPointerCopyCtorStatusNotOkConverting) { 213 StatusOr<Derived*> original(Status::CANCELLED); 214 StatusOr<Base2*> copy(original); 215 EXPECT_EQ(original.status(), copy.status()); 216 } 217 218 TEST(StatusOr, TestPointerAssignmentStatusOk) { 219 const int kI = 0; 220 StatusOr<const int*> source(&kI); 221 StatusOr<const int*> target; 222 target = source; 223 EXPECT_EQ(source.status(), target.status()); 224 EXPECT_EQ(source.ValueOrDie(), target.ValueOrDie()); 225 } 226 227 TEST(StatusOr, TestPointerAssignmentStatusNotOk) { 228 StatusOr<int*> source(Status::CANCELLED); 229 StatusOr<int*> target; 230 target = source; 231 EXPECT_EQ(source.status(), target.status()); 232 } 233 234 TEST(StatusOr, TestPointerAssignmentStatusOKConverting) { 235 Derived derived; 236 StatusOr<Derived*> source(&derived); 237 StatusOr<Base2*> target; 238 target = source; 239 EXPECT_EQ(source.status(), target.status()); 240 EXPECT_EQ(static_cast<const Base2*>(source.ValueOrDie()), 241 target.ValueOrDie()); 242 } 243 244 TEST(StatusOr, TestPointerAssignmentStatusNotOkConverting) { 245 StatusOr<Derived*> source(Status::CANCELLED); 246 StatusOr<Base2*> target; 247 target = source; 248 EXPECT_EQ(source.status(), target.status()); 249 } 250 251 TEST(StatusOr, TestPointerStatus) { 252 const int kI = 0; 253 StatusOr<const int*> good(&kI); 254 EXPECT_TRUE(good.ok()); 255 StatusOr<const int*> bad(Status::CANCELLED); 256 EXPECT_EQ(Status::CANCELLED, bad.status()); 257 } 258 259 TEST(StatusOr, TestPointerValue) { 260 const int kI = 0; 261 StatusOr<const int*> thing(&kI); 262 EXPECT_EQ(&kI, thing.ValueOrDie()); 263 } 264 265 TEST(StatusOr, TestPointerValueConst) { 266 const int kI = 0; 267 const StatusOr<const int*> thing(&kI); 268 EXPECT_EQ(&kI, thing.ValueOrDie()); 269 } 270 271 } // namespace 272 } // namespace util 273 } // namespace protobuf 274 } // namespace google 275