1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include <gtest/gtest.h> 17 18 #include <base/containers/refcnt_ptr.h> 19 #include <base/containers/unique_ptr.h> 20 21 using namespace BASE_NS; 22 using namespace testing::ext; 23 24 struct TestPtr { operator ()TestPtr25 void operator()(TestPtr* ptr) const 26 { 27 ptr->deleted = true; 28 } 29 operator ()TestPtr30 void operator()(const TestPtr* ptr) const {} 31 RefTestPtr32 void Ref() 33 { 34 ++ref; 35 } 36 UnrefTestPtr37 void Unref() 38 { 39 if (--ref == 0u) { 40 deleted = true; 41 } 42 } 43 44 bool deleted = false; 45 uint32_t ref = 0u; 46 }; 47 48 struct TestPtrD : TestPtr { operator +TestPtrD49 constexpr TestPtrD operator+(TestPtrD v) 50 { 51 v.value += value; 52 return v; 53 } 54 55 public: 56 uint32_t value = 1u; 57 }; 58 59 class PtrTest : public testing::Test { 60 public: SetUpTestSuite()61 static void SetUpTestSuite() {} TearDownTestSuite()62 static void TearDownTestSuite() {} SetUp()63 void SetUp() override {} TearDown()64 void TearDown() override {} 65 }; 66 67 // ToDo same tests for array 68 HWTEST_F(PtrTest, UniquePtr_destructor, TestSize.Level1) 69 { 70 // destructor calls deleter 71 { 72 TestPtr test; 73 { 74 auto ptr = unique_ptr<TestPtr, TestPtr>(&test, test); 75 } 76 EXPECT_TRUE(test.deleted); 77 } 78 // with other class destructor 79 } 80 81 HWTEST_F(PtrTest, UniquePtr_destructor001, TestSize.Level1) 82 { 83 { 84 TestPtr test; 85 TestPtrD testD; 86 { 87 auto ptr = unique_ptr<TestPtr, TestPtrD>(&test, testD); 88 } 89 EXPECT_TRUE(test.deleted); 90 { 91 auto ptr = unique_ptr<TestPtrD, TestPtrD>(&testD, testD); 92 } 93 EXPECT_TRUE(testD.deleted); 94 } 95 { 96 TestPtrD test1; 97 TestPtrD test2; 98 { 99 auto ptr = unique_ptr<TestPtrD, TestPtrD>(&test1, test1 + test2); 100 } 101 EXPECT_TRUE(test1.deleted); 102 } 103 { 104 TestPtrD test; 105 { 106 auto ptr = unique_ptr<TestPtrD&, TestPtrD&>(&test, test); 107 EXPECT_TRUE(test.deleted == ptr->deleted); // destructor not called yet 108 } 109 EXPECT_TRUE(test.deleted); 110 } 111 { 112 typedef unique_ptr<TestPtrD&, TestPtrD&> T; 113 TestPtrD test1; 114 TestPtrD test2; 115 { 116 auto ptrT1 = T(&test1, test1); 117 auto ptrT2 = T(&test2, test2); 118 { 119 auto ptr = T(static_cast<T&&>(ptrT1)); 120 } 121 EXPECT_TRUE(test1.deleted); // not destroyed 122 EXPECT_FALSE(test2.deleted); // destroyed 123 { 124 auto ptr = T(static_cast<T&&>(ptrT2)); 125 } 126 EXPECT_TRUE(test1.deleted); // released at ptr.opretator= 127 EXPECT_TRUE(test2.deleted); // released at ptr.opretator= 128 } 129 } 130 } 131 132 HWTEST_F(PtrTest, UniquePtr_destructor002, TestSize.Level1) 133 { 134 { 135 typedef unique_ptr<TestPtrD&, TestPtrD&> T; 136 TestPtrD test1; 137 TestPtrD test2; 138 { 139 auto ptrT1 = T(&test1, test1); 140 auto ptrT2 = T(&test2, test2); 141 { 142 auto ptr = T(static_cast<T&&>(ptrT2)); 143 test1.value = 10; 144 ptr.operator*().value = 20; // jsut reference, does not change value 145 test2.value = 30; 146 EXPECT_TRUE(ptr.operator*().value == test2.value); 147 ptr.operator=<TestPtrD&, TestPtrD&>(static_cast<T&&>(ptrT1)); 148 EXPECT_TRUE(ptr.operator*().value == test1.value); 149 } 150 EXPECT_TRUE(test1.deleted); // destroyed 151 EXPECT_FALSE(test2.deleted); // set by operator * 152 } 153 } 154 // const constructor which does nothing 155 { 156 TestPtrD test1; 157 TestPtrD test2; 158 { 159 auto ptr = unique_ptr<const TestPtrD&, const TestPtrD&>(&test1, test2); 160 } 161 EXPECT_FALSE(test1.deleted); 162 EXPECT_FALSE(test2.deleted); 163 } 164 } 165 166 HWTEST_F(PtrTest, UniquePtr_makeUnique, TestSize.Level1) 167 { 168 // make_unique 169 TestPtrD test; 170 test.value = 3u; 171 { 172 auto ptr = make_unique<TestPtrD>(test); 173 auto testPtr = ptr.get(); 174 EXPECT_EQ(test.value, testPtr->value); 175 EXPECT_FALSE(&test == testPtr); // it is a copy 176 } 177 EXPECT_FALSE(test.deleted); // it is a copy 178 } 179 180 HWTEST_F(PtrTest, UniquePtr_get, TestSize.Level1) 181 { 182 // get 183 TestPtr test; 184 { 185 auto ptr = unique_ptr<TestPtr, TestPtr>(&test, test); 186 auto testPtr = ptr.get(); 187 EXPECT_EQ(&test, testPtr); 188 } 189 EXPECT_TRUE(test.deleted); 190 } 191 192 HWTEST_F(PtrTest, UniquePtr_release, TestSize.Level1) 193 { 194 // release 195 TestPtr test; 196 { 197 auto ptr = unique_ptr<TestPtr, TestPtr>(&test, test); 198 auto testPtr = ptr.release(); 199 EXPECT_EQ(&test, testPtr); 200 } 201 EXPECT_FALSE(test.deleted); 202 } 203 204 HWTEST_F(PtrTest, UniquePtr_resetNull, TestSize.Level1) 205 { 206 // reset to null 207 TestPtr test; 208 { 209 auto ptr = unique_ptr<TestPtr, TestPtr>(&test, test); 210 EXPECT_TRUE(ptr); 211 ptr.reset(); 212 EXPECT_FALSE(ptr); 213 } 214 EXPECT_TRUE(test.deleted); 215 } 216 217 HWTEST_F(PtrTest, UniquePtr_resetNonNull, TestSize.Level1) 218 { 219 // reset to other value 220 TestPtr test; 221 TestPtr test2; 222 { 223 auto ptr = unique_ptr<TestPtr, TestPtr>(&test, test); 224 ptr.reset(&test2); 225 } 226 EXPECT_TRUE(test.deleted); 227 EXPECT_TRUE(test2.deleted); 228 } 229 230 HWTEST_F(PtrTest, UniquePtr_operatorBool, TestSize.Level1) 231 { 232 // operator bool 233 TestPtr test; 234 auto ptr = unique_ptr<TestPtr, TestPtr>(nullptr, test); 235 EXPECT_FALSE(ptr); 236 ptr.reset(&test); 237 EXPECT_TRUE(ptr); 238 } 239 240 HWTEST_F(PtrTest, UniquePtr_assignNull, TestSize.Level1) 241 { 242 // operator = 243 TestPtr test; 244 { 245 auto ptr = unique_ptr<TestPtr, TestPtr>(&test, test); 246 ptr = nullptr; 247 EXPECT_TRUE(test.deleted); 248 } 249 } 250 251 HWTEST_F(PtrTest, UniquePtr_assignNonNull, TestSize.Level1) 252 { 253 // operator = 254 TestPtr test; 255 { 256 auto ptr = unique_ptr<TestPtr, TestPtr>(nullptr, test); 257 { 258 auto ptr2 = unique_ptr<TestPtr, TestPtr>(&test, test); 259 ptr = move(ptr2); 260 EXPECT_FALSE(test.deleted); 261 } 262 EXPECT_FALSE(test.deleted); 263 } 264 EXPECT_TRUE(test.deleted); 265 } 266 267 HWTEST_F(PtrTest, UniquePtr_assignNonPointer, TestSize.Level1) 268 { 269 typedef unique_ptr<TestPtrD&, TestPtrD&> T; 270 { 271 TestPtrD test1; 272 TestPtrD test2; 273 { 274 auto ptrT1 = T(&test1, test1); 275 auto ptrT2 = T(&test2, test2); 276 { 277 auto ptr = T(static_cast<T&&>(ptrT2)); 278 ptr.operator=<TestPtrD&, TestPtrD&>(static_cast<T&&>(ptrT1)); 279 } 280 EXPECT_TRUE(test1.deleted); // destroyed 281 EXPECT_FALSE(test2.deleted); // released, not destroyed. It means, that it ptrT2 is NULL, and address of 282 // test2 cannot be recieved anymore 283 EXPECT_TRUE(ptrT1 == nullptr); 284 EXPECT_TRUE(ptrT2 == nullptr); 285 { 286 auto ptr = T(static_cast<T&&>(ptrT2)); 287 } 288 EXPECT_FALSE(test2.deleted); // NULL pointer delete instead of test2 289 } 290 EXPECT_FALSE(test2.deleted); // destruction of pointer to NULL does not help as well 291 } 292 { 293 TestPtrD test1; 294 TestPtrD test2; 295 { 296 auto ptrT1 = T(&test1, test1); 297 auto ptrT2 = T(&test2, test2); 298 { 299 auto ptr = T(static_cast<T&&>(ptrT2)); 300 ptr.operator=<TestPtrD&, TestPtrD&>(static_cast<T&&>(ptrT1)); 301 } 302 EXPECT_TRUE(test1.deleted); // destroyed 303 EXPECT_FALSE( 304 test2.deleted); // released, not destroyed. It means, that it points to NULL, and value cannot be read 305 { 306 auto ptr = T(static_cast<T&&>(ptrT2)); 307 ptr.operator=<TestPtrD&, TestPtrD&>(static_cast<T&&>(ptrT1)); 308 ptr.operator=<TestPtrD&, TestPtrD&>(static_cast<T&&>(ptrT2)); 309 ptr.operator=<TestPtrD&, TestPtrD&>(static_cast<T&&>(ptrT1)); 310 } 311 EXPECT_TRUE(test2.deleted); // However multiple calls of operator will set value to deleted because poiter 312 // ptrT2 has its deleter unchanged 313 } 314 } 315 } 316 317 HWTEST_F(PtrTest, UniquePtr_moveConstructor, TestSize.Level1) 318 { 319 // move constructor 320 TestPtr test; 321 { 322 auto ptr = unique_ptr<TestPtr, TestPtr>(&test, test); 323 EXPECT_TRUE(ptr); 324 auto ptr2 = unique_ptr(move(ptr)); 325 EXPECT_FALSE(ptr); 326 EXPECT_TRUE(ptr2); 327 EXPECT_FALSE(test.deleted); 328 } 329 EXPECT_TRUE(test.deleted); 330 } 331 332 HWTEST_F(PtrTest, UniquePtr_swap, TestSize.Level1) 333 { 334 // swap 335 TestPtr test; 336 TestPtr test2; 337 { 338 auto ptr = unique_ptr<TestPtr, TestPtr>(&test, test); 339 EXPECT_TRUE(ptr); 340 EXPECT_EQ(&test, ptr.get()); 341 { 342 auto ptr2 = unique_ptr<TestPtr, TestPtr>(&test2, test); 343 ASSERT_TRUE(ptr2); 344 EXPECT_EQ(&test2, ptr2.get()); 345 346 ptr.swap(ptr2); 347 EXPECT_EQ(&test, ptr2.get()); 348 EXPECT_EQ(&test2, ptr.get()); 349 } 350 EXPECT_TRUE(test.deleted); 351 EXPECT_FALSE(test2.deleted); 352 } 353 EXPECT_TRUE(test2.deleted); 354 } 355 356 HWTEST_F(PtrTest, UniquePtr_destructorArray, TestSize.Level1) 357 { 358 // destructor calls deleter 359 { 360 TestPtr* test(new TestPtr[3]); 361 { 362 auto ptr = unique_ptr<TestPtr[]>(test); 363 } 364 // default_deleter should have deallocated the memory so can't really verify. 365 } 366 { 367 TestPtr* test(new TestPtr[3]); 368 { 369 auto ptr = unique_ptr<TestPtr[], TestPtr>(test, TestPtr()); 370 } 371 // deleter from struct TestPtr 372 EXPECT_TRUE(test[0].deleted); 373 EXPECT_FALSE(test[1].deleted); 374 EXPECT_FALSE(test[2].deleted); 375 delete[] test; 376 } 377 { 378 TestPtr* test(new TestPtr[3]); 379 { 380 auto ptr = unique_ptr<TestPtr[], TestPtr>(test, test[1]); 381 } 382 // seleter by lvalue type 383 EXPECT_TRUE(test[0].deleted); 384 EXPECT_FALSE(test[1].deleted); 385 EXPECT_FALSE(test[2].deleted); 386 delete[] test; 387 } 388 { 389 TestPtr* test(new TestPtr[3]); 390 { 391 auto ptr = unique_ptr<TestPtr[], TestPtr&>(test, test[1]); 392 } 393 394 EXPECT_TRUE(test[0].deleted); 395 EXPECT_FALSE(test[1].deleted); 396 EXPECT_FALSE(test[2].deleted); 397 delete[] test; 398 } 399 } 400 401 HWTEST_F(PtrTest, UniquePtr_destructorArray001, TestSize.Level1) 402 { 403 { 404 TestPtr* test(new TestPtr[3]); 405 { 406 auto ptr = unique_ptr<TestPtr[], const TestPtr&>(test, test[1]); 407 } 408 409 EXPECT_TRUE(test[0].deleted); 410 EXPECT_FALSE(test[1].deleted); 411 EXPECT_FALSE(test[2].deleted); 412 413 delete[] test; 414 } 415 416 { 417 TestPtr* test(new TestPtr[3]); 418 auto p = unique_ptr<TestPtr[], TestPtr&>(test, test[1]); 419 { 420 auto ptr = unique_ptr<TestPtr[], TestPtr&>(static_cast<unique_ptr<TestPtr[], TestPtr&>&&>(p)); 421 } 422 423 EXPECT_TRUE(test[0].deleted); 424 EXPECT_FALSE(test[1].deleted); 425 EXPECT_FALSE(test[2].deleted); 426 427 delete[] test; 428 } 429 430 { 431 TestPtr* test(new TestPtr[3]); 432 auto p = unique_ptr<TestPtr[], TestPtr>(test, test[1]); 433 { 434 auto ptr = unique_ptr<TestPtr[], TestPtr>(static_cast<unique_ptr<TestPtr[], TestPtr>&&>(p)); 435 } 436 437 EXPECT_TRUE(test[0].deleted); 438 EXPECT_FALSE(test[1].deleted); 439 EXPECT_FALSE(test[2].deleted); 440 441 delete[] test; 442 } 443 } 444 445 HWTEST_F(PtrTest, UniquePtr_releaseArray, TestSize.Level1) 446 { 447 // release 448 TestPtr* test(new TestPtr[3]); 449 { 450 auto ptr = unique_ptr<TestPtr[], TestPtr>(test, test[1]); 451 auto testPtr = ptr.release(); 452 EXPECT_EQ(test, testPtr); 453 } 454 EXPECT_FALSE(test[0].deleted); 455 456 delete[] test; 457 } 458 459 HWTEST_F(PtrTest, UniquePtr_resetNullArray, TestSize.Level1) 460 { 461 // reset to null 462 TestPtr* test(new TestPtr[3]); 463 { 464 auto ptr = unique_ptr<TestPtr[], TestPtr>(test, test[1]); 465 EXPECT_TRUE(ptr); 466 ptr.reset(); 467 EXPECT_FALSE(ptr); 468 } 469 EXPECT_TRUE(test[0].deleted); 470 471 delete[] test; 472 } 473 474 HWTEST_F(PtrTest, UniquePtr_resetNonNullArray, TestSize.Level1) 475 { 476 // reset to other value 477 TestPtr* test1(new TestPtr[3]); 478 TestPtr* test2(new TestPtr[3]); 479 { 480 auto ptr = unique_ptr<TestPtr[], TestPtr>(test1, test1[1]); 481 ptr.reset(test2); 482 } 483 EXPECT_TRUE(test1[0].deleted); 484 EXPECT_TRUE(test2[0].deleted); 485 if (int(test1->ref) >= 0) { 486 delete[] test1; 487 } 488 if (int(test2->ref) >= 0) { 489 delete[] test2; 490 } 491 } 492 493 HWTEST_F(PtrTest, UniquePtr_getArray, TestSize.Level1) 494 { 495 // get 496 TestPtr* test(new TestPtr[3]); 497 { 498 auto ptr = unique_ptr<TestPtr[], TestPtr>(test, test[1]); 499 auto testPtr = ptr.get(); 500 EXPECT_EQ(test, testPtr); 501 } 502 EXPECT_TRUE(test[0].deleted); 503 504 delete[] test; 505 } 506 507 HWTEST_F(PtrTest, UniquePtr_operatorIndexArray, TestSize.Level1) 508 { 509 // operator bool 510 TestPtrD* test(new TestPtrD[3]); 511 test[0].value = 0u; 512 test[1].value = 1u; 513 test[2].value = 2u; 514 { 515 auto ptr = unique_ptr<TestPtrD[], TestPtrD>(test, test[0]); 516 EXPECT_EQ(ptr.operator[](0).value, test[0].value); 517 EXPECT_EQ(ptr.operator[](1).value, test[1].value); 518 EXPECT_EQ(ptr.operator[](2).value, test[2].value); 519 EXPECT_EQ(ptr[2].value, test[2].value); 520 } 521 delete[] test; 522 } 523 524 HWTEST_F(PtrTest, UniquePtr_operatorBoolArray, TestSize.Level1) 525 { 526 // operator bool 527 TestPtr* test(new TestPtr[3]); 528 { 529 auto ptr = unique_ptr<TestPtr[], TestPtr>(nullptr, test[0]); 530 EXPECT_FALSE(ptr); 531 ptr.reset(test); 532 EXPECT_TRUE(ptr); 533 } 534 delete[] test; 535 } 536 537 HWTEST_F(PtrTest, UniquePtr_assignNullArray, TestSize.Level1) 538 { 539 // operator = 540 // operatro == nullptr 541 TestPtr* test(new TestPtr[3]); 542 { 543 auto ptr = unique_ptr<TestPtr[], TestPtr>(test, test[1]); 544 ptr = nullptr; 545 EXPECT_TRUE(ptr == nullptr); 546 EXPECT_TRUE(nullptr == ptr); 547 EXPECT_TRUE(test[0].deleted); 548 EXPECT_FALSE(test[1].deleted); 549 } 550 551 delete[] test; 552 } 553 554 HWTEST_F(PtrTest, UniquePtr_assignNonNullArray, TestSize.Level1) 555 { 556 // operator = 557 // operator == 558 // operator != 559 TestPtr* test(new TestPtr[3]); 560 { 561 auto ptr = unique_ptr<TestPtr[], TestPtr>(nullptr, test[1]); 562 { 563 auto ptr2 = unique_ptr<TestPtr[], TestPtr>(test, test[1]); 564 EXPECT_TRUE(ptr != ptr2); 565 ptr = move(ptr2); 566 EXPECT_TRUE(ptr != nullptr); 567 EXPECT_TRUE(ptr != ptr2); // ptr2 NULL 568 EXPECT_TRUE(nullptr != ptr); 569 EXPECT_FALSE(test[0].deleted); 570 EXPECT_FALSE(test[1].deleted); 571 } 572 EXPECT_FALSE(test[0].deleted); 573 EXPECT_FALSE(test[1].deleted); 574 } 575 EXPECT_TRUE(test[0].deleted); 576 EXPECT_FALSE(test[1].deleted); 577 578 delete[] test; 579 } 580 581 HWTEST_F(PtrTest, UniquePtr_assignNonPointerArray, TestSize.Level1) 582 { 583 // operator == 584 TestPtr* test1(new TestPtr[2]); 585 TestPtr* test2(new TestPtr[2]); 586 typedef unique_ptr<TestPtr[], TestPtr&> T; 587 { 588 auto p1 = T(test1, test1[1]); 589 auto p2 = T(test2, test2[1]); 590 { 591 auto ptr = T(static_cast<T&&>(p1)); 592 auto ptr2 = T(static_cast<T&&>(p2)); 593 auto ptr3 = T(static_cast<T&&>(p2)); 594 EXPECT_TRUE(ptr == ptr); 595 EXPECT_FALSE(ptr2 == ptr3); // only 1 assigment at time 596 ptr.operator=<TestPtr[], TestPtr&>(T(static_cast<T&&>(p2))); 597 ptr2.operator=<TestPtr[], TestPtr&>(T(static_cast<T&&>(p1))); 598 EXPECT_TRUE(ptr == ptr2); // both reseted 599 } 600 EXPECT_TRUE(test1[0].deleted); // Static array as for pointer. No tricks with pointers to NULL anymore 601 EXPECT_FALSE(test1[1].deleted); 602 603 EXPECT_TRUE(test2[0].deleted); 604 EXPECT_FALSE(test2[1].deleted); 605 { 606 auto ptr = T(static_cast<T&&>(p2)); 607 } 608 EXPECT_TRUE(test2[0].deleted); 609 EXPECT_FALSE(test2[1].deleted); 610 } 611 EXPECT_TRUE(test2[0].deleted); 612 EXPECT_FALSE(test2[1].deleted); 613 614 delete[] test1; 615 delete[] test2; 616 } 617 618 HWTEST_F(PtrTest, UniquePtr_moveConstructorArray, TestSize.Level1) 619 { 620 // move constructor 621 TestPtr* test(new TestPtr[2]); 622 { 623 auto ptr = unique_ptr<TestPtr[], TestPtr>(test, test[1]); 624 EXPECT_TRUE(ptr); 625 auto ptr2 = unique_ptr(move(ptr)); 626 EXPECT_FALSE(ptr); 627 EXPECT_TRUE(ptr2); 628 EXPECT_FALSE(test[0].deleted); 629 } 630 EXPECT_TRUE(test[0].deleted); 631 632 delete[] test; 633 } 634 635 HWTEST_F(PtrTest, UniquePtr_swapArray, TestSize.Level1) 636 { 637 // swap 638 TestPtr* test1(new TestPtr[2]); 639 TestPtr* test2(new TestPtr[2]); 640 { 641 auto ptr = unique_ptr<TestPtr[], TestPtr>(test1, test1[1]); 642 EXPECT_TRUE(ptr); 643 EXPECT_EQ(test1, ptr.get()); 644 { 645 auto ptr2 = unique_ptr<TestPtr[], TestPtr>(test2, test1[1]); 646 ASSERT_TRUE(ptr2); 647 EXPECT_EQ(test2, ptr2.get()); 648 649 ptr.swap(ptr2); 650 EXPECT_EQ(test1, ptr2.get()); 651 EXPECT_EQ(test2, ptr.get()); 652 } 653 EXPECT_TRUE(test1[0].deleted); 654 EXPECT_FALSE(test2[0].deleted); 655 } 656 EXPECT_TRUE(test2[0].deleted); 657 658 delete[] test1; 659 delete[] test2; 660 } 661 662 HWTEST_F(PtrTest, RefCntPtr_destructor, TestSize.Level1) 663 { 664 // destructor calls deleter 665 TestPtr test; 666 { 667 auto ptr = refcnt_ptr<TestPtr>(&test); 668 EXPECT_EQ(1u, test.ref); 669 } 670 EXPECT_EQ(0u, test.ref); 671 { 672 const auto ptr = refcnt_ptr<TestPtr&>(&test); 673 EXPECT_EQ(1u, test.ref); 674 auto ptr2 = refcnt_ptr<TestPtr>(ptr); 675 EXPECT_EQ(2u, test.ref); 676 auto ptr3 = refcnt_ptr<TestPtrD>(static_cast<refcnt_ptr<TestPtr>&&>(ptr)); 677 EXPECT_EQ(3u, test.ref); 678 } 679 EXPECT_EQ(0u, test.ref); 680 } 681 682 HWTEST_F(PtrTest, RefCntPtr_get, TestSize.Level1) 683 { 684 // get 685 TestPtr test; 686 { 687 auto ptr = refcnt_ptr<TestPtr>(&test); 688 auto testPtr = ptr.get(); 689 EXPECT_EQ(&test, testPtr); 690 } 691 EXPECT_EQ(0u, test.ref); 692 } 693 694 HWTEST_F(PtrTest, RefCntPtr_release, TestSize.Level1) 695 { 696 // release 697 TestPtr test; 698 { 699 auto ptr = refcnt_ptr<TestPtr>(&test); 700 auto testPtr = ptr.release(); 701 EXPECT_EQ(&test, testPtr); 702 } 703 EXPECT_EQ(1u, test.ref); 704 } 705 706 HWTEST_F(PtrTest, RefCntPtr_resetNull, TestSize.Level1) 707 { 708 // reset to null 709 TestPtr test; 710 { 711 auto ptr = refcnt_ptr<TestPtr>(&test); 712 EXPECT_TRUE(ptr); 713 ptr.reset(); 714 EXPECT_FALSE(ptr); 715 } 716 EXPECT_EQ(0u, test.ref); 717 } 718 719 HWTEST_F(PtrTest, RefCntPtr_resetNonNull, TestSize.Level1) 720 { 721 // reset to other value 722 TestPtr test; 723 TestPtr test2; 724 { 725 auto ptr = refcnt_ptr<TestPtr>(&test); 726 ptr.reset(&test2); 727 } 728 EXPECT_EQ(0u, test.ref); 729 EXPECT_EQ(0u, test2.ref); 730 } 731 732 HWTEST_F(PtrTest, RefCntPtr_operatorBool, TestSize.Level1) 733 { 734 // operator bool 735 TestPtr test; 736 auto ptr = refcnt_ptr<TestPtr>(nullptr); 737 EXPECT_FALSE(ptr); 738 ptr.reset(&test); 739 EXPECT_TRUE(ptr); 740 } 741 742 HWTEST_F(PtrTest, RefCntPtr_assign, TestSize.Level1) 743 { 744 // operator = 745 // operator ==, != 746 TestPtr test; 747 { 748 auto ptr = refcnt_ptr<TestPtr>(&test); 749 EXPECT_TRUE(ptr != nullptr); 750 ptr = nullptr; 751 EXPECT_EQ(0u, test.ref); 752 EXPECT_TRUE(ptr == nullptr); 753 ptr.operator=<TestPtr>(nullptr); 754 EXPECT_TRUE(ptr == nullptr); 755 } 756 } 757 758 HWTEST_F(PtrTest, RefCntPtr_moveAssign, TestSize.Level1) 759 { 760 // move operator = 761 TestPtr test; 762 { 763 auto ptr = refcnt_ptr<TestPtr>(&test); 764 { 765 auto ptr2 = refcnt_ptr<TestPtr>(&test); 766 EXPECT_EQ(2u, test.ref); 767 ptr = move(ptr2); 768 EXPECT_EQ(1u, test.ref); 769 } 770 EXPECT_EQ(1u, test.ref); 771 } 772 EXPECT_EQ(0u, test.ref); 773 } 774 775 HWTEST_F(PtrTest, RefCntPtr_moveConstructor, TestSize.Level1) 776 { 777 // move constructor 778 TestPtr test; 779 { 780 auto ptr = refcnt_ptr<TestPtr>(&test); 781 EXPECT_TRUE(ptr); 782 auto ptr2 = refcnt_ptr(move(ptr)); 783 EXPECT_FALSE(ptr); 784 EXPECT_TRUE(ptr2); 785 EXPECT_EQ(1u, test.ref); 786 } 787 EXPECT_EQ(0u, test.ref); 788 } 789 790 HWTEST_F(PtrTest, RefCntPtr_copyConstructor, TestSize.Level1) 791 { 792 // copy constructor and operator = 793 // operator ==, !=, ->, * 794 TestPtr test; 795 { 796 auto ptr = refcnt_ptr<TestPtr>(&test); 797 { 798 auto ptr2 = refcnt_ptr(ptr); 799 EXPECT_EQ(2u, test.ref); 800 EXPECT_TRUE(ptr == ptr2); 801 ptr = ptr2; 802 EXPECT_EQ(2u, test.ref); 803 EXPECT_TRUE(ptr == ptr2); 804 EXPECT_TRUE(ptr->ref == ptr2->ref); 805 EXPECT_TRUE(ptr.operator*().ref == ptr2.operator*().ref); 806 ptr.operator=<TestPtr>(ptr2); 807 EXPECT_TRUE(ptr == ptr2); 808 } 809 EXPECT_EQ(1u, test.ref); 810 } 811 EXPECT_EQ(0u, test.ref); 812 } 813 814 HWTEST_F(PtrTest, RefCntPtr_swap, TestSize.Level1) 815 { 816 // swap 817 // operator != 818 819 TestPtr test; 820 TestPtr test2; 821 { 822 auto ptr = refcnt_ptr<TestPtr>(&test); 823 EXPECT_TRUE(ptr); 824 EXPECT_EQ(&test, ptr.get()); 825 { 826 auto ptr2 = refcnt_ptr<TestPtr>(&test2); 827 ASSERT_TRUE(ptr2); 828 EXPECT_TRUE(ptr != ptr2); 829 EXPECT_EQ(&test2, ptr2.get()); 830 831 ptr.swap(ptr2); 832 EXPECT_EQ(&test, ptr2.get()); 833 EXPECT_EQ(&test2, ptr.get()); 834 EXPECT_EQ(1u, test.ref); 835 EXPECT_EQ(1u, test2.ref); 836 } 837 EXPECT_EQ(0u, test.ref); 838 EXPECT_EQ(1u, test2.ref); 839 } 840 EXPECT_EQ(0u, test2.ref); 841 } 842