• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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