1 /*
2  * Copyright (c) 2021 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 #include <gtest/gtest.h>
16 #include <algorithm>
17 #include <fstream>
18 #include <iostream>
19 #include <vector>
20 #include <thread>
21 #include <map>
22 #include <mutex>
23 #include "refbase.h"
24 #include "singleton.h"
25 
26 #include <future>
27 using namespace testing::ext;
28 using namespace std;
29 
30 namespace OHOS {
31 namespace {
32 static constexpr int FLAG_OF_CONS = 1;
33 static constexpr int FLAG_OF_DEST = 2;
34 static int g_sptrCount = 0;
35 static int g_wptrCount = 0;
36 static int g_refbaseflag = 0;
37 static int g_freeFlag = 0;
38 
39 class UtilsRefbaseTest : public testing::Test {
40 public:
41     static void SetUpTestCase(void);
42 };
43 
SetUpTestCase(void)44 void UtilsRefbaseTest::SetUpTestCase(void)
45 {
46     g_sptrCount = 0;
47     g_wptrCount = 0;
48     g_refbaseflag = 0;
49 }
50 
51 class RefBaseTest : public RefBase {
52 public:
RefBaseTest()53     RefBaseTest()
54     {
55         g_refbaseflag = FLAG_OF_CONS;
56         isgetrefptr_ = false;
57     }
~RefBaseTest()58     ~RefBaseTest()
59     {
60         g_refbaseflag = FLAG_OF_DEST;
61     }
62 
63     void OnLastStrongRef(const void *objectId) override
64     {
65         g_freeFlag = 1;
66     }
67 
68     void OnLastWeakRef(const void *objectIda) override
69     {
70     }
71 
SetRefPtr()72     void SetRefPtr()
73     {
74         isgetrefptr_ = true;
75     }
GetTestRefPtrFlag()76     bool GetTestRefPtrFlag()
77     {
78         return isgetrefptr_;
79     }
80 
81 private:
82     bool isgetrefptr_;
83 };
84 
85 class IRemoteObject : public virtual RefBase {
86 public:
IRemoteObject()87     IRemoteObject() { ExtendObjectLifetime(); }
88     virtual bool IsProxyObject() = 0;
~IRemoteObject()89     ~IRemoteObject() {}
90 };
91 
92 class RefBaseTestTracker : public RefBase {
93 public:
RefBaseTestTracker(int value)94     explicit RefBaseTestTracker(int value) : value_(value)
95     {
96         checkCount_++;
97     }
98     RefBaseTestTracker() = default;
~RefBaseTestTracker()99     ~RefBaseTestTracker()
100     {
101         checkCount_--;
102     }
103 
RefBaseTestTracker(const RefBaseTestTracker &testTracker)104     RefBaseTestTracker(const RefBaseTestTracker &testTracker)
105     {
106         checkCount_++;
107         value_ = testTracker.value_;
108     }
109 
operator =(const RefBaseTestTracker &testTracker)110     RefBaseTestTracker &operator=(const RefBaseTestTracker &testTracker)
111     {
112         checkCount_++;
113         value_ = testTracker.value_;
114         return *this;
115     }
116 
RefBaseTestTracker(RefBaseTestTracker &&testTracker)117     RefBaseTestTracker(RefBaseTestTracker &&testTracker)
118     {
119         checkCount_++;
120         value_ = testTracker.value_;
121     }
122 
operator =(RefBaseTestTracker &&testTracker)123     RefBaseTestTracker &operator=(RefBaseTestTracker &&testTracker)
124     {
125         checkCount_++;
126         value_ = testTracker.value_;
127         return *this;
128     }
129 
GetInstance()130     static RefBaseTestTracker *GetInstance()
131     {
132         static RefBaseTestTracker instance;
133         return &instance;
134     }
135 
InitTracker()136     void InitTracker()
137     {
138         checkCount_ = 0;
139         freeCount_ = 0;
140         firstRefCount_ = 0;
141         lastRefCount_ = 0;
142     }
143 
TrackObject(IRemoteObject *object)144     void TrackObject(IRemoteObject *object)
145     {
146         std::lock_guard<std::mutex> lockGuard(objectMutex_);
147         trackObjects_.emplace_back(object);
148     }
149 
TrackNewObject(IRemoteObject *object)150     void TrackNewObject(IRemoteObject *object)
151     {
152         std::lock_guard<std::mutex> lockGuard(objectOnfirstMutex_);
153         RefBaseTestTracker::firstRefCount_++;
154     }
155 
UntrackObject(IRemoteObject *object)156     void UntrackObject(IRemoteObject *object)
157     {
158         std::lock_guard<std::mutex> lockGuard(objectMutex_);
159         auto iter = find(trackObjects_.begin(), trackObjects_.end(), object);
160         if (iter != trackObjects_.end()) {
161             trackObjects_.erase(iter);
162         }
163     }
164 
TrackFreeObject(IRemoteObject *object)165     void TrackFreeObject(IRemoteObject *object)
166     {
167         std::lock_guard<std::mutex> lockGuard(objectOnfreeMutex_);
168         RefBaseTestTracker::freeCount_++;
169     }
170 
PrintTrackResults()171     void PrintTrackResults()
172     {
173         std::lock_guard<std::mutex> lockGuard(objectMutex_);
174         if (!trackObjects_.empty()) {
175             for (auto o : trackObjects_) {
176                 std::cout << "object: " << o <<"strong: " << o->GetSptrRefCount() << ", weak:" << o->GetWptrRefCount() << std::endl;
177             }
178         }
179         std::cout << "firstRefCount_: " << RefBaseTestTracker::firstRefCount_ << std::endl;
180         std::cout << "lastRefCount_: " << RefBaseTestTracker::lastRefCount_ << std::endl;
181         std::cout << "freeCount_: " << RefBaseTestTracker::freeCount_ << std::endl;
182     }
183 
184 public:
185     int checkCount_ = 0;
186     int freeCount_ = 0;
187     int firstRefCount_ = 0;
188     int lastRefCount_ = 0;
189 
190 private:
191 
192     std::vector<IRemoteObject *> trackObjects_;
193     std::mutex objectMutex_;
194     std::mutex objectOnfirstMutex_;
195     std::mutex objectOnfreeMutex_;
196     int value_;
197 };
198 
199 
200 class IPCObjectProxy : public IRemoteObject
201 {
202 public:
203     bool IsProxyObject() override { return 0; }
204     string descriptor_;
IPCObjectProxy(const string &descriptor)205     IPCObjectProxy(const string &descriptor)
206     {
207         descriptor_ = descriptor;
208         RefBaseTestTracker *tracker = RefBaseTestTracker::GetInstance();
209         tracker->TrackObject(this);
210         tracker->TrackNewObject(this);
211     };
~IPCObjectProxy()212     ~IPCObjectProxy() {}
213     void RefPtrCallback() override;
214     void OnLastStrongRef(const void *objectId) override;
215     void OnFirstStrongRef(const void *objectId) override;
216     std::mutex mutexLast_;
217 };
218 
219 class IPCProcessSkeleton : public virtual RefBase, public Singleton<IPCProcessSkeleton>
220 {
221     friend class Singleton<IPCProcessSkeleton>;
222 
223 private:
224     IPCProcessSkeleton() = default;
225 
226 public:
227     ~IPCProcessSkeleton() override = default;
228 
229     std::mutex mutex_;
230     std::map<string, wptr<IRemoteObject>> objects1_;
231 
DumpMapObjects()232     void DumpMapObjects()
233     {
234         if (!objects1_.empty()) {
235             for (auto &o : objects1_) {
236                 std::cout << "strong: " << o.second->GetSptrRefCount() << "weak:" << o.second->GetWptrRefCount() << std::endl;
237             }
238         }
239     }
QueryObjectInner(const string &descriptor)240     IRemoteObject *QueryObjectInner(const string &descriptor)
241     {
242         auto it = objects1_.find(descriptor);
243         if (it != objects1_.end())
244         {
245             it->second->AttemptAcquire(this);
246             std::this_thread::sleep_for(std::chrono::milliseconds(1));
247             return it->second.GetRefPtr();
248         }
249 
250         return nullptr;
251     }
252 
FindOrNewObject(int handle)253     IRemoteObject *FindOrNewObject(int handle)
254     {
255         std::lock_guard<std::mutex> lockGuard(mutex_);
256         IRemoteObject *remoteObject = QueryObjectInner(to_string(handle));
257         if (remoteObject != nullptr)
258         {
259             std::this_thread::sleep_for(std::chrono::milliseconds(1));
260             return remoteObject;
261         }
262 
263         remoteObject = new IPCObjectProxy(to_string(handle));
264         remoteObject->AttemptAcquire(this);
265         objects1_.insert(std::pair<string, wptr<IRemoteObject>>(to_string(handle), remoteObject));
266         return remoteObject;
267     }
268 
DetachObject(IRemoteObject *object, string descriptor)269     bool DetachObject(IRemoteObject *object, string descriptor)
270     {
271         std::lock_guard<std::mutex> lockGuard(mutex_);
272         if (object->GetSptrRefCount())
273         {
274             return false;
275         }
276         return (objects1_.erase(descriptor) > 0);
277     }
278 };
279 
OnLastStrongRef(const void *objectId)280 void IPCObjectProxy::OnLastStrongRef(const void *objectId)
281 {
282     std::lock_guard<std::mutex> lock(mutexLast_);
283     (void)IPCProcessSkeleton::GetInstance().DetachObject(this, descriptor_);
284     RefBaseTestTracker *tracker = RefBaseTestTracker::GetInstance();
285     tracker->lastRefCount_++;
286     std::this_thread::sleep_for(std::chrono::nanoseconds(10));
287 }
288 
OnFirstStrongRef(const void *objectId)289 void IPCObjectProxy::OnFirstStrongRef(const void *objectId)
290 {
291     std::this_thread::sleep_for(std::chrono::nanoseconds(10));
292 }
293 
RefPtrCallback()294 void IPCObjectProxy::RefPtrCallback()
295 {
296     RefBaseTestTracker *tracker = RefBaseTestTracker::GetInstance();
297     tracker->UntrackObject(this);
298     tracker->TrackFreeObject(this);
299     RefBase::RefPtrCallback();
300 }
301 
302 constexpr int CYCLE_NUM1 = 100;
303 constexpr int CYCLE_NUM2 = 100;
304 
RegisterEventThread()305 int RegisterEventThread()
306 {
307     auto &ipc = IPCProcessSkeleton::GetInstance();
308     int handle = 10;
309     for (int i = 0; i < CYCLE_NUM2; i++) {
310         sptr<IRemoteObject> remote = ipc.FindOrNewObject(handle);
311         remote->CheckIsAttemptAcquireSet(remote);
312         if (remote) {
313             remote->IsProxyObject();
314         }
315     }
316     return 0;
317 }
318 
319 /*
320  * @tc.name: testRefbaseOperateThreads001
321  * @tc.desc: Refbase for threads
322  */
HWTEST_F(UtilsRefbaseTest, testRefbaseOperateThreads001, TestSize.Level0)323 HWTEST_F(UtilsRefbaseTest, testRefbaseOperateThreads001, TestSize.Level0)
324 {
325     RefBaseTestTracker *tracker = RefBaseTestTracker::GetInstance();
326     tracker->InitTracker();
327     for (int n = 0; n < 1; n++) {
328         std::vector<std::future<int>> threads;
329         for (int i = 0; i < CYCLE_NUM1; i++) {
330             threads.emplace_back(std::async(RegisterEventThread));
331         }
332 
333         for (auto &f : threads) {
334             f.get();
335         }
336     }
337     auto &ipc = IPCProcessSkeleton::GetInstance();
338     ipc.DumpMapObjects();
339     EXPECT_EQ(tracker->firstRefCount_, tracker->freeCount_);
340 }
341 
342 /*
343  * @tc.name: testRefbaseOperateNull001
344  * @tc.desc: Refbase for null
345  */
HWTEST_F(UtilsRefbaseTest, testRefbaseOperateNull001, TestSize.Level0)346 HWTEST_F(UtilsRefbaseTest, testRefbaseOperateNull001, TestSize.Level0)
347 {
348     RefBaseTestTracker *tracker = RefBaseTestTracker::GetInstance();
349     tracker->InitTracker();
350 
351     auto remoteObject = new IPCObjectProxy("ss");
352     remoteObject->AttemptAcquire(this);
353 
354     remoteObject->IncWeakRef(nullptr);
355     remoteObject->IncStrongRef(nullptr);
356     remoteObject->CheckIsAttemptAcquireSet(nullptr);
357     remoteObject->DecStrongRef(nullptr);
358     remoteObject->AttemptAcquire(this);
359 
360     remoteObject->IncStrongRef(nullptr);
361     remoteObject->CheckIsAttemptAcquireSet(nullptr);
362     remoteObject->DecStrongRef(nullptr);
363 
364     remoteObject->DecWeakRef(nullptr);
365     EXPECT_EQ(tracker->firstRefCount_, tracker->freeCount_);
366 }
367 
368 class RefBaseMemTest : public RefBase {
369 public:
RefBaseMemTest(int value)370     explicit RefBaseMemTest(int value): value_(value)
371     {
372         g_checkCount++;
373     }
374 
~RefBaseMemTest()375     ~RefBaseMemTest()
376     {
377         g_checkCount--;
378     }
379 
RefBaseMemTest(const RefBaseMemTest &testRefbaseMem)380     RefBaseMemTest(const RefBaseMemTest &testRefbaseMem)
381     {
382         g_checkCount++;
383         value_ = testRefbaseMem.value_;
384     }
385 
operator =(const RefBaseMemTest &testRefbaseMem)386     RefBaseMemTest &operator=(const RefBaseMemTest &testRefbaseMem)
387     {
388         g_checkCount++;
389         value_ = testRefbaseMem.value_;
390         return *this;
391     }
392 
RefBaseMemTest(RefBaseMemTest &&testRefbaseMem)393     RefBaseMemTest(RefBaseMemTest &&testRefbaseMem)
394     {
395         g_checkCount++;
396         value_ = testRefbaseMem.value_;
397     }
398 
operator =(RefBaseMemTest &&testRefbaseMem)399     RefBaseMemTest &operator=(RefBaseMemTest &&testRefbaseMem)
400     {
401         g_checkCount++;
402         value_ = testRefbaseMem.value_;
403         return *this;
404     }
405 
406 public:
407     static inline int g_checkCount = 0;
408 
409 private:
410     int value_;
411 };
412 
413 /*
414  * @tc.name: testRefbaseOperateLeftValue001
415  * @tc.desc: Refbase
416  */
HWTEST_F(UtilsRefbaseTest, testRefbaseOperateLeftValue001, TestSize.Level0)417 HWTEST_F(UtilsRefbaseTest, testRefbaseOperateLeftValue001, TestSize.Level0)
418 {
419     RefBaseMemTest::g_checkCount = 0;
420     {
421         vector<RefBaseMemTest> refMemTestArray;
422         sptr<RefBaseMemTest>refMemTestObj1 = new RefBaseMemTest(1);
423         sptr<RefBaseMemTest>refMemTestObj2 = new RefBaseMemTest(2);
424         refMemTestArray.push_back(*refMemTestObj1);
425         refMemTestArray.push_back(*refMemTestObj2);
426     }
427     EXPECT_EQ(RefBaseMemTest::g_checkCount, 0);
428 
429     {
430         vector<RefBaseMemTest> refMemTestArray;
431         RefBaseMemTest refMemTestObj1(1);
432         RefBaseMemTest refMemTestObj2(2);
433         refMemTestArray.push_back(refMemTestObj1);
434         refMemTestArray.push_back(refMemTestObj2);
435     }
436     EXPECT_EQ(RefBaseMemTest::g_checkCount, 0);
437 }
438 
439 /*
440  * @tc.name: testRefbaseOperateRightValue001
441  * @tc.desc: Refbase
442  */
HWTEST_F(UtilsRefbaseTest, testRefbaseOperateRightValue001, TestSize.Level0)443 HWTEST_F(UtilsRefbaseTest, testRefbaseOperateRightValue001, TestSize.Level0)
444 {
445     RefBaseMemTest::g_checkCount = 0;
446     {
447         vector<RefBaseMemTest> refMemTestArray;
448         sptr<RefBaseMemTest>refMemTestObj1 = new RefBaseMemTest(1);
449         sptr<RefBaseMemTest>refMemTestObj2 = new RefBaseMemTest(2);
450         refMemTestArray.emplace_back(*refMemTestObj1);
451         refMemTestArray.emplace_back(*refMemTestObj2);
452     }
453     EXPECT_EQ(RefBaseMemTest::g_checkCount, 0);
454 
455     {
456         vector<RefBaseMemTest> refMemTestArray;
457         RefBaseMemTest refMemTestObj1(1);
458         RefBaseMemTest refMemTestObj2(2);
459         refMemTestArray.emplace_back(refMemTestObj1);
460         refMemTestArray.emplace_back(refMemTestObj2);
461     }
462     EXPECT_EQ(RefBaseMemTest::g_checkCount, 0);
463 }
464 
465 /*
466  * @tc.name: testRefbaseAcquire001
467  * @tc.desc: Refbase
468  */
HWTEST_F(UtilsRefbaseTest, testRefbaseAcquire001, TestSize.Level0)469 HWTEST_F(UtilsRefbaseTest, testRefbaseAcquire001, TestSize.Level0)
470 {
471     RefBaseTest* testobject = new RefBaseTest();
472     testobject->AttemptAcquire(this);
473 
474     g_freeFlag = 0;
475     EXPECT_EQ(testobject->GetSptrRefCount(), 1);
476     {
477         EXPECT_TRUE(testobject->IsAttemptAcquireSet());
478         testobject->CheckIsAttemptAcquireSet(this);
479         sptr<RefBaseTest> sptrRef = testobject;
480         EXPECT_EQ(sptrRef->GetSptrRefCount(), 1);
481         EXPECT_FALSE(testobject->IsAttemptAcquireSet());
482     }
483 
484     EXPECT_EQ(g_freeFlag, 1);
485 }
486 
487 /*
488  * @tc.name: testSptrefbase001
489  * @tc.desc: Refbase
490  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase001, TestSize.Level0)491 HWTEST_F(UtilsRefbaseTest, testSptrefbase001, TestSize.Level0)
492 {
493     sptr<RefBaseTest> testobject = new RefBaseTest();
494     testobject->ExtendObjectLifetime();
495     EXPECT_TRUE(testobject->IsExtendLifeTimeSet());
496     EXPECT_EQ(g_refbaseflag, 1);
497     wptr<RefBaseTest> weakObject(testobject);
498     int count = testobject->GetWptrRefCount();
499     EXPECT_EQ(count, 2);
500     testobject = nullptr;
501 
502     sptr<RefBaseTest> strongObject = weakObject.promote();
503     EXPECT_EQ(strongObject->GetSptrRefCount(), 1);
504 }
505 
506 /*
507  * @tc.name: testSptrefbaseRealease001
508  * @tc.desc: Refbase
509  */
HWTEST_F(UtilsRefbaseTest, testSptrefbaseRealease001, TestSize.Level0)510 HWTEST_F(UtilsRefbaseTest, testSptrefbaseRealease001, TestSize.Level0)
511 {
512     sptr<RefBaseTest> testObject = new RefBaseTest();
513     EXPECT_EQ(g_refbaseflag, 1);
514     wptr<RefBaseTest> weakObject(testObject);
515     testObject = nullptr;
516     EXPECT_EQ(g_refbaseflag, FLAG_OF_DEST);
517 }
518 
519 /*
520  * @tc.name: testSptrefbaseRealease002
521  * @tc.desc: Refbase
522  */
HWTEST_F(UtilsRefbaseTest, testSptrefbaseRealease002, TestSize.Level0)523 HWTEST_F(UtilsRefbaseTest, testSptrefbaseRealease002, TestSize.Level0)
524 {
525     wptr<RefBaseTest> testObject = new RefBaseTest();
526     EXPECT_EQ(g_refbaseflag, 1);
527     testObject = nullptr;
528     EXPECT_EQ(g_refbaseflag, FLAG_OF_DEST);
529 }
530 
531 /*
532  * @tc.name: testSptrefbase002
533  * @tc.desc: Refbase
534  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase002, TestSize.Level0)535 HWTEST_F(UtilsRefbaseTest, testSptrefbase002, TestSize.Level0)
536 {
537     {
538         sptr<RefBaseTest> testObject(new RefBaseTest());
539         EXPECT_EQ(g_refbaseflag, 1);
540     }
541     EXPECT_EQ(g_refbaseflag, 2);
542 }
543 
544 /*
545  * @tc.name: testSptrefbase003
546  * @tc.desc: Refbase
547  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase003, TestSize.Level0)548 HWTEST_F(UtilsRefbaseTest, testSptrefbase003, TestSize.Level0)
549 {
550     sptr<RefBaseTest> testObject1(new RefBaseTest());
551     sptr<RefBaseTest> testObject2 = testObject1.GetRefPtr();
552     testObject2->SetRefPtr();
553     EXPECT_TRUE(testObject1->GetTestRefPtrFlag());
554 
555     sptr<RefBaseTest> testObject3(testObject1);
556     EXPECT_TRUE(testObject3->GetTestRefPtrFlag());
557 
558     sptr<RefBaseTest> testObject4 = testObject1;
559     EXPECT_TRUE(testObject3->GetTestRefPtrFlag());
560 
561     bool ret = (testObject3 == testObject4);
562     EXPECT_TRUE(ret);
563 
564     int refcount = testObject1->GetSptrRefCount();
565     EXPECT_EQ(refcount, 4);
566 
567     sptr<RefBaseTest> testObject5(new RefBaseTest());
568     ret = (testObject5 != testObject1);
569     EXPECT_TRUE(ret);
570 }
571 
572 /*
573  * @tc.name: testSptrefbase004
574  * @tc.desc: Refbase
575  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase004, TestSize.Level0)576 HWTEST_F(UtilsRefbaseTest, testSptrefbase004, TestSize.Level0)
577 {
578     sptr<RefBaseTest> testObject1(new RefBaseTest());
579     testObject1->SetRefPtr();
580     RefBaseTest testObject2 = *testObject1;
581     EXPECT_TRUE(testObject2.GetTestRefPtrFlag());
582 
583     auto testObject3 = testObject1;
584     testObject1 = nullptr;
585     testObject3 = nullptr;
586     EXPECT_EQ(g_refbaseflag, 2);
587 }
588 
589 /*
590  * @tc.name: testSptrefbase005
591  * @tc.desc: Refbase
592  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase005, TestSize.Level0)593 HWTEST_F(UtilsRefbaseTest, testSptrefbase005, TestSize.Level0)
594 {
595     sptr<RefBaseTest> testObject1(new RefBaseTest());
596     wptr<RefBaseTest> testObject2 = testObject1;
597     EXPECT_EQ(testObject1->GetSptrRefCount(), 1);
598     EXPECT_EQ(testObject1->GetWptrRefCount(), 2);
599 }
600 
601 /*
602  * @tc.name: testSptrefbase006
603  * @tc.desc: Refbase
604  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase006, TestSize.Level0)605 HWTEST_F(UtilsRefbaseTest, testSptrefbase006, TestSize.Level0)
606 {
607     sptr<RefBaseTest> testObject1;
608     EXPECT_EQ(testObject1.GetRefPtr(), nullptr);
609     testObject1 = new RefBaseTest();
610     sptr<RefBaseTest> testObject2(testObject1);
611     EXPECT_EQ(testObject1->GetSptrRefCount(), 2);
612 }
613 
614 /*
615  * @tc.name: testSptrefbase007
616  * @tc.desc: Refbase
617  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase007, TestSize.Level0)618 HWTEST_F(UtilsRefbaseTest, testSptrefbase007, TestSize.Level0)
619 {
620     const sptr<RefBaseTest> &testObject1 = new RefBaseTest();
621     sptr<RefBaseTest> testObject2(testObject1);
622     EXPECT_EQ(testObject1->GetSptrRefCount(), 2);
623 }
624 
625 /*
626  * @tc.name: testSptrefbase008
627  * @tc.desc: Refbase
628  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase008, TestSize.Level0)629 HWTEST_F(UtilsRefbaseTest, testSptrefbase008, TestSize.Level0)
630 {
631     sptr<RefBaseTest> testObject1;
632     sptr<RefBaseTest> testObject2(testObject1);
633     EXPECT_EQ(testObject2, nullptr);
634 }
635 
636 /*
637  * @tc.name: testSptrefbase009
638  * @tc.desc: Refbase
639  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase009, TestSize.Level0)640 HWTEST_F(UtilsRefbaseTest, testSptrefbase009, TestSize.Level0)
641 {
642     sptr<RefBaseTest> testObject0 = new RefBaseTest();
643     sptr<RefBaseTest> testObject1 = move(testObject0);
644     sptr<RefBaseTest> testObject2(testObject1);
645     EXPECT_EQ(testObject0.GetRefPtr(), nullptr);
646     EXPECT_EQ(testObject2.GetRefPtr(), testObject1.GetRefPtr());
647 }
648 
649 /*
650  * @tc.name: testSptrefbase010
651  * @tc.desc: Refbase
652  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase010, TestSize.Level0)653 HWTEST_F(UtilsRefbaseTest, testSptrefbase010, TestSize.Level0)
654 {
655     sptr<RefBaseTest> testObject1 = new RefBaseTest();
656     sptr<RefBaseTest> testObject3(new RefBaseTest());
657     sptr<RefBaseTest> &testObject2 = testObject3;
658     testObject2 = testObject1;
659     EXPECT_EQ(testObject2.GetRefPtr(), testObject1.GetRefPtr());
660 
661     const sptr<RefBaseTest> &testObject4 = new RefBaseTest();
662     EXPECT_EQ(testObject1->GetSptrRefCount(), 2);
663     testObject2 = testObject4;
664     EXPECT_EQ(testObject2.GetRefPtr(), testObject4.GetRefPtr());
665     EXPECT_EQ(testObject4->GetSptrRefCount(), 2);
666     EXPECT_EQ(testObject1->GetSptrRefCount(), 1);
667 }
668 
669 /*
670  * @tc.name: testSptrefbase011
671  * @tc.desc: Refbase
672  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase011, TestSize.Level0)673 HWTEST_F(UtilsRefbaseTest, testSptrefbase011, TestSize.Level0)
674 {
675     sptr<RefBaseTest> testobject = sptr<RefBaseTest>::MakeSptr();
676     testobject->ExtendObjectLifetime();
677     EXPECT_TRUE(testobject->IsExtendLifeTimeSet());
678     EXPECT_EQ(g_refbaseflag, 1);
679     wptr<RefBaseTest> weakObject(testobject);
680     int count = testobject->GetWptrRefCount();
681     EXPECT_EQ(count, 2);
682     testobject = nullptr;
683 
684     sptr<RefBaseTest> strongObject = weakObject.promote();
685     EXPECT_EQ(strongObject->GetSptrRefCount(), 1);
686 }
687 
688 /*
689  * @tc.name: testSptrefbase012
690  * @tc.desc: Refbase
691  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase012, TestSize.Level0)692 HWTEST_F(UtilsRefbaseTest, testSptrefbase012, TestSize.Level0)
693 {
694     // test clear
695     sptr<RefBaseTest> testObject1 = new RefBaseTest();
696     testObject1.clear();
697     ASSERT_EQ(testObject1.GetRefPtr(), nullptr);
698 }
699 
700 /*
701  * @tc.name: testSptrefbase013
702  * @tc.desc: Refbase
703  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase013, TestSize.Level0)704 HWTEST_F(UtilsRefbaseTest, testSptrefbase013, TestSize.Level0)
705 {
706     sptr<RefBaseTest> testObject1;
707     wptr<RefBaseTest> testObject2 = new RefBaseTest();
708     testObject1 = testObject2;
709     ASSERT_EQ(testObject2->GetWptrRefCount(), 2);
710     ASSERT_EQ(testObject1->GetSptrRefCount(), 1);
711 }
712 
713 /*
714  * @tc.name: testSptrefbase014
715  * @tc.desc: Refbase
716  */
HWTEST_F(UtilsRefbaseTest, testSptrefbase014, TestSize.Level0)717 HWTEST_F(UtilsRefbaseTest, testSptrefbase014, TestSize.Level0)
718 {
719     sptr<RefBaseTest> testObject1(new RefBaseTest());
720     const RefBaseTest *rawPointer = testObject1.GetRefPtr();
721     ASSERT_TRUE(testObject1 == rawPointer);
722 
723     wptr<RefBaseTest> testObject2(new RefBaseTest());
724     ASSERT_FALSE(testObject1 == testObject2);
725 }
726 
727 class SptrTest : public RefBase {
728 public:
SptrTest()729     SptrTest()
730     {
731         g_sptrCount++;
732     }
~SptrTest()733     ~SptrTest()
734     {
735         g_sptrCount--;
736     }
CreateSptr()737     void CreateSptr()
738     {
739         test1 = new SptrTest();
740     }
741 
742 private:
743     sptr<SptrTest> test1;
744 };
745 
746 /*
747  * @tc.name: testRefbase005
748  * @tc.desc: Refbase
749  */
HWTEST_F(UtilsRefbaseTest, testRefbase005, TestSize.Level0)750 HWTEST_F(UtilsRefbaseTest, testRefbase005, TestSize.Level0)
751 {
752     {
753         sptr<SptrTest> testObject1(new SptrTest());
754         testObject1->CreateSptr();
755     }
756     EXPECT_EQ(g_sptrCount, 0);
757 }
758 
759 class SptrTest1;
760 class SptrTest2;
761 class SptrTest2 : public RefBase {
762 public:
SptrTest2()763     SptrTest2()
764     {
765         g_sptrCount++;
766     }
~SptrTest2()767     ~SptrTest2()
768     {
769         g_sptrCount--;
770     }
771 
772 private:
773     sptr<SptrTest1> test;
774 };
775 
776 class SptrTest1 : public RefBase {
777 public:
SptrTest1()778     SptrTest1()
779     {
780         g_sptrCount++;
781     }
~SptrTest1()782     ~SptrTest1()
783     {
784         g_sptrCount--;
785     }
786 
787 private:
788     sptr<SptrTest2> test;
789 };
790 
791 /*
792  * @tc.name: testRefbase006
793  * @tc.desc: Refbase
794  */
HWTEST_F(UtilsRefbaseTest, testRefbase006, TestSize.Level0)795 HWTEST_F(UtilsRefbaseTest, testRefbase006, TestSize.Level0)
796 {
797     {
798         sptr<SptrTest1> testObject1(new SptrTest1());
799         sptr<SptrTest2> testObject2(new SptrTest2());
800         EXPECT_EQ(g_sptrCount, 2);
801     }
802     EXPECT_EQ(g_sptrCount, 0);
803 }
804 
805 /*
806  * @tc.name: testRefbase007
807  * @tc.desc: test count of refcounter.
808  */
HWTEST_F(UtilsRefbaseTest, testRefbase007, TestSize.Level0)809 HWTEST_F(UtilsRefbaseTest, testRefbase007, TestSize.Level0)
810 {
811     sptr<RefBase> testObject1(new RefBase());
812     EXPECT_EQ(testObject1->GetRefCounter()->GetRefCount(), 1);
813     wptr<RefBase> testObject2(testObject1);
814     EXPECT_EQ(testObject1->GetRefCounter()->GetRefCount(), 2); // 2: Refbase and WeakRefCounter
815 }
816 
817 /*
818  * @tc.name: testRefbase008
819  * @tc.desc: test move constructor.
820  */
HWTEST_F(UtilsRefbaseTest, testRefbase008, TestSize.Level0)821 HWTEST_F(UtilsRefbaseTest, testRefbase008, TestSize.Level0)
822 {
823     RefBase baseObject1{};
824     EXPECT_EQ(baseObject1.GetRefCounter()->GetRefCount(), 1);
825 
826     RefBase baseObject2{};
827     EXPECT_EQ(baseObject2.GetRefCounter()->GetRefCount(), 1);
828     baseObject2 = std::move(baseObject1);
829     EXPECT_EQ(baseObject2.GetRefCounter()->GetRefCount(), 1);
830     EXPECT_EQ(baseObject1.GetRefCounter(), nullptr);
831     EXPECT_EQ(baseObject1.GetSptrRefCount(), 0);
832     EXPECT_EQ(baseObject1.GetWptrRefCount(), 0);
833 
834     RefBase baseObject3{};
835     EXPECT_EQ(baseObject3.GetRefCounter()->GetRefCount(), 1);
836     baseObject3 = std::move(baseObject2);
837     EXPECT_EQ(baseObject3.GetRefCounter()->GetRefCount(), 1);
838     EXPECT_EQ(baseObject2.GetRefCounter(), nullptr);
839     EXPECT_EQ(baseObject2.GetSptrRefCount(), 0);
840     EXPECT_EQ(baseObject2.GetWptrRefCount(), 0);
841 
842     baseObject2 = std::move(baseObject1);
843     EXPECT_EQ(baseObject1.GetRefCounter(), baseObject2.GetRefCounter());
844 }
845 
846 class WptrTest : public RefBase {
847 public:
WptrTest()848     WptrTest()
849     {
850         g_sptrCount++;
851     }
~WptrTest()852     ~WptrTest()
853     {
854         g_sptrCount--;
855     }
856 };
857 
858 class WptrTest2 : public RefBase {
859 public:
WptrTest2()860     WptrTest2()
861     {
862         g_sptrCount++;
863         flag_ = 0;
864     }
~WptrTest2()865     ~WptrTest2()
866     {
867         g_sptrCount--;
868     }
869 
870 private:
871     int flag_;
872 };
873 
874 /*
875  * @tc.name: testWptrefbase001
876  * @tc.desc: Copy constructor with same managed class type.
877  */
HWTEST_F(UtilsRefbaseTest, testWptrefbase001, TestSize.Level0)878 HWTEST_F(UtilsRefbaseTest, testWptrefbase001, TestSize.Level0)
879 {
880     // test wptr<T>::wptr(const wptr<T>&)
881     wptr<WptrTest> testOrigWptrObject(new WptrTest());
882     EXPECT_EQ(testOrigWptrObject->GetWptrRefCount(), 1);
883 
884     wptr<WptrTest> testTargetWptrObject1(testOrigWptrObject);
885 
886     EXPECT_EQ(testOrigWptrObject.GetRefPtr(), testTargetWptrObject1.GetRefPtr());
887     EXPECT_EQ(&(*testOrigWptrObject), &(*testTargetWptrObject1));
888     EXPECT_EQ(testTargetWptrObject1->GetWptrRefCount(), testOrigWptrObject->GetWptrRefCount());
889     EXPECT_EQ(testTargetWptrObject1.GetWeakRefCount(), testOrigWptrObject.GetWeakRefCount());
890 
891     EXPECT_EQ(testTargetWptrObject1->GetWptrRefCount(), 1);
892     EXPECT_EQ(testTargetWptrObject1.GetWeakRefCount(), 2);
893 
894     // test wptr<T>::operator=(const wptr<T>&)
895     wptr<WptrTest> testTargetWptrObject2(new WptrTest());
896     EXPECT_EQ(testTargetWptrObject2->GetWptrRefCount(), 1);
897 
898     testTargetWptrObject2 = testOrigWptrObject;
899 
900     EXPECT_EQ(testOrigWptrObject.GetRefPtr(), testTargetWptrObject2.GetRefPtr());
901     EXPECT_EQ(&(*testOrigWptrObject), &(*testTargetWptrObject2));
902     EXPECT_EQ(testTargetWptrObject2->GetWptrRefCount(), testOrigWptrObject->GetWptrRefCount());
903     EXPECT_EQ(testTargetWptrObject2.GetWeakRefCount(), testOrigWptrObject.GetWeakRefCount());
904 
905     EXPECT_EQ(testTargetWptrObject2->GetWptrRefCount(), 1);
906     EXPECT_EQ(testTargetWptrObject2.GetWeakRefCount(), 3);
907 
908     // test wptr<T>::wptr(const sptr<T>&)
909     sptr<WptrTest> testOrigSptrObject(new WptrTest());
910     EXPECT_EQ(testOrigSptrObject->GetSptrRefCount(), 1);
911 
912     wptr<WptrTest> testTargetWptrObject3(testOrigSptrObject);
913 
914     EXPECT_EQ(testOrigSptrObject.GetRefPtr(), testTargetWptrObject3.GetRefPtr());
915     EXPECT_EQ(&(*testOrigSptrObject), &(*testTargetWptrObject3));
916     EXPECT_EQ(testTargetWptrObject3->GetSptrRefCount(), testOrigSptrObject->GetSptrRefCount());
917     EXPECT_EQ(testTargetWptrObject3->GetWptrRefCount(), testOrigSptrObject->GetWptrRefCount());
918 
919     EXPECT_EQ(testTargetWptrObject3->GetSptrRefCount(), 1);
920     EXPECT_EQ(testTargetWptrObject3->GetWptrRefCount(), 2);
921     EXPECT_EQ(testTargetWptrObject3.GetWeakRefCount(), 1);
922 
923     // test wptr<T>::operator=(const sptr<T>&)
924     wptr<WptrTest> testTargetWptrObject4(new WptrTest());
925     EXPECT_EQ(testTargetWptrObject4->GetWptrRefCount(), 1);
926 
927     testTargetWptrObject4 = testOrigSptrObject;
928 
929     EXPECT_EQ(testOrigSptrObject.GetRefPtr(), testTargetWptrObject4.GetRefPtr());
930     EXPECT_EQ(&(*testOrigSptrObject), &(*testTargetWptrObject4));
931     EXPECT_EQ(testTargetWptrObject4->GetSptrRefCount(), testOrigSptrObject->GetSptrRefCount());
932     EXPECT_EQ(testTargetWptrObject4->GetWptrRefCount(), testOrigSptrObject->GetWptrRefCount());
933 
934     EXPECT_EQ(testTargetWptrObject4->GetSptrRefCount(), 1);
935     EXPECT_EQ(testTargetWptrObject4->GetWptrRefCount(), 3);
936     EXPECT_EQ(testTargetWptrObject4.GetWeakRefCount(), 1);
937 }
938 
939 /*
940  * @tc.name: testWptrefbase002
941  * @tc.desc: Copy constructor with different managed class type.
942  */
HWTEST_F(UtilsRefbaseTest, testWptrefbase002, TestSize.Level0)943 HWTEST_F(UtilsRefbaseTest, testWptrefbase002, TestSize.Level0)
944 {
945     // test wptr<T>::wptr(const wptr<O>&)
946     wptr<WptrTest2> testOrigWptrObject(new WptrTest2());
947     EXPECT_EQ(testOrigWptrObject->GetWptrRefCount(), 1);
948 
949     wptr<WptrTest> testTargetWptrObject1(testOrigWptrObject);
950 
951     EXPECT_EQ(static_cast<void *>(testOrigWptrObject.GetRefPtr()),
952               static_cast<void *>(testTargetWptrObject1.GetRefPtr()));
953     EXPECT_EQ(static_cast<void *>(&(*testOrigWptrObject)),
954               static_cast<void *>(&(*testTargetWptrObject1)));
955     EXPECT_EQ(testTargetWptrObject1->GetWptrRefCount(), testOrigWptrObject->GetWptrRefCount());
956     EXPECT_EQ(testTargetWptrObject1.GetWeakRefCount(), testOrigWptrObject.GetWeakRefCount());
957 
958     EXPECT_EQ(testTargetWptrObject1->GetWptrRefCount(), 1);
959     EXPECT_EQ(testTargetWptrObject1.GetWeakRefCount(), 2);
960 
961     // test wptr<T>::operator=(const wptr<O>&)
962     wptr<WptrTest> testTargetWptrObject2(new WptrTest());
963     EXPECT_EQ(testTargetWptrObject2->GetWptrRefCount(), 1);
964 
965     testTargetWptrObject2 = testOrigWptrObject;
966 
967     EXPECT_EQ(static_cast<void *>(testOrigWptrObject.GetRefPtr()),
968               static_cast<void *>(testTargetWptrObject2.GetRefPtr()));
969     EXPECT_EQ(static_cast<void *>(&(*testOrigWptrObject)),
970               static_cast<void *>(&(*testTargetWptrObject2)));
971     EXPECT_EQ(testTargetWptrObject2->GetWptrRefCount(), testOrigWptrObject->GetWptrRefCount());
972     EXPECT_EQ(testTargetWptrObject2.GetWeakRefCount(), testOrigWptrObject.GetWeakRefCount());
973 
974     EXPECT_EQ(testTargetWptrObject2->GetWptrRefCount(), 1);
975     EXPECT_EQ(testTargetWptrObject2.GetWeakRefCount(), 3);
976 
977     // test wptr<T>::wptr(const sptr<O>&)
978     sptr<WptrTest2> testOrigSptrObject(new WptrTest2());
979     EXPECT_EQ(testOrigSptrObject->GetSptrRefCount(), 1);
980 
981     wptr<WptrTest> testTargetWptrObject3(testOrigSptrObject);
982 
983     EXPECT_EQ(static_cast<void *>(testOrigSptrObject.GetRefPtr()),
984               static_cast<void *>(testTargetWptrObject3.GetRefPtr()));
985     EXPECT_EQ(static_cast<void *>(&(*testOrigSptrObject)), static_cast<void *>(&(*testTargetWptrObject3)));
986     EXPECT_EQ(testTargetWptrObject3->GetSptrRefCount(), testOrigSptrObject->GetSptrRefCount());
987     EXPECT_EQ(testTargetWptrObject3->GetWptrRefCount(), testOrigSptrObject->GetWptrRefCount());
988 
989     EXPECT_EQ(testTargetWptrObject3->GetSptrRefCount(), 1);
990     EXPECT_EQ(testTargetWptrObject3->GetWptrRefCount(), 2);
991     EXPECT_EQ(testTargetWptrObject3.GetWeakRefCount(), 1);
992 
993     // test wptr<T>::operator=(const sptr<O>&)
994     wptr<WptrTest> testTargetWptrObject4(new WptrTest());
995     EXPECT_EQ(testTargetWptrObject4->GetWptrRefCount(), 1);
996 
997     testTargetWptrObject4 = testOrigSptrObject;
998 
999     EXPECT_EQ(static_cast<void *>(testOrigSptrObject.GetRefPtr()),
1000               static_cast<void *>(testTargetWptrObject4.GetRefPtr()));
1001     EXPECT_EQ(static_cast<void *>(&(*testOrigSptrObject)), static_cast<void *>(&(*testTargetWptrObject4)));
1002     EXPECT_EQ(testTargetWptrObject4->GetSptrRefCount(), testOrigSptrObject->GetSptrRefCount());
1003     EXPECT_EQ(testTargetWptrObject4->GetWptrRefCount(), testOrigSptrObject->GetWptrRefCount());
1004 
1005     EXPECT_EQ(testTargetWptrObject4->GetSptrRefCount(), 1);
1006     EXPECT_EQ(testTargetWptrObject4->GetWptrRefCount(), 3);
1007     EXPECT_EQ(testTargetWptrObject4.GetWeakRefCount(), 1);
1008 }
1009 
1010 /*
1011  * @tc.name: testWptrefbase003
1012  * @tc.desc: Refbase
1013  */
HWTEST_F(UtilsRefbaseTest, testWptrefbase003, TestSize.Level0)1014 HWTEST_F(UtilsRefbaseTest, testWptrefbase003, TestSize.Level0)
1015 {
1016     const wptr<WptrTest> &testObject1(new WptrTest());
1017     wptr<WptrTest> testObject2(testObject1);
1018     EXPECT_EQ(testObject1.GetRefPtr(), testObject2.GetRefPtr());
1019     EXPECT_EQ(testObject1->GetWptrRefCount(), 1);
1020     EXPECT_EQ(testObject2->GetWptrRefCount(), 1);
1021     EXPECT_EQ(testObject1.GetRefPtr(), testObject2.GetRefPtr());
1022 }
1023 
1024 /*
1025  * @tc.name: testWptrefbase004
1026  * @tc.desc: Refbase
1027  */
HWTEST_F(UtilsRefbaseTest, testWptrefbase004, TestSize.Level0)1028 HWTEST_F(UtilsRefbaseTest, testWptrefbase004, TestSize.Level0)
1029 {
1030     const sptr<WptrTest2> &testObject1(new WptrTest2());
1031     EXPECT_NE(testObject1, nullptr);
1032     wptr<WptrTest> testObject2 = testObject1;
1033     EXPECT_EQ(testObject1->GetWptrRefCount(), 2);
1034 }
1035 
1036 /*
1037  * @tc.name: testWptrefbase005
1038  * @tc.desc: wptr without managed object
1039  */
HWTEST_F(UtilsRefbaseTest, testWptrefbase005, TestSize.Level0)1040 HWTEST_F(UtilsRefbaseTest, testWptrefbase005, TestSize.Level0)
1041 {
1042     wptr<WptrTest> testObject3;
1043     EXPECT_EQ(testObject3.GetRefPtr(), nullptr);
1044 }
1045 
1046 /*
1047  * @tc.name: testWptrefbase006
1048  * @tc.desc: Refbase
1049  */
HWTEST_F(UtilsRefbaseTest, testWptrefbase006, TestSize.Level0)1050 HWTEST_F(UtilsRefbaseTest, testWptrefbase006, TestSize.Level0)
1051 {
1052     wptr<WptrTest> testObject1 = new WptrTest();
1053     wptr<WptrTest> &testObject2 = testObject1;
1054     EXPECT_EQ(testObject2->GetWptrRefCount(), 1);
1055 }
1056 
1057 /*
1058  * @tc.name: testWptrefbase007
1059  * @tc.desc: Refbase
1060  */
HWTEST_F(UtilsRefbaseTest, testWptrefbase007, TestSize.Level0)1061 HWTEST_F(UtilsRefbaseTest, testWptrefbase007, TestSize.Level0)
1062 {
1063     wptr<WptrTest2> testObject1 = new WptrTest2();
1064     wptr<WptrTest2> testObject2 = testObject1.GetRefPtr();
1065     EXPECT_EQ(testObject1->GetWptrRefCount(), 2);
1066 }
1067 
1068 /*
1069  * @tc.name: testWptrefbase008
1070  * @tc.desc: Refbase
1071  */
HWTEST_F(UtilsRefbaseTest, testWptrefbase008, TestSize.Level0)1072 HWTEST_F(UtilsRefbaseTest, testWptrefbase008, TestSize.Level0)
1073 {
1074     wptr<WptrTest> testObject1 = new WptrTest();
1075     wptr<WptrTest2> testObject2;
1076     testObject2 = testObject1.GetRefPtr();
1077     EXPECT_EQ(testObject1->GetWptrRefCount(), 2);
1078 }
1079 
1080 /*
1081  * @tc.name: testWptrefbase008
1082  * @tc.desc: Refbase
1083  */
HWTEST_F(UtilsRefbaseTest, testWptrefbase009, TestSize.Level0)1084 HWTEST_F(UtilsRefbaseTest, testWptrefbase009, TestSize.Level0)
1085 {
1086     // test bool operator==(const T *)
1087     wptr<WptrTest> testObject1 = new WptrTest();
1088     const WptrTest *rawPointer = testObject1.GetRefPtr();
1089     ASSERT_TRUE(testObject1 == rawPointer);
1090 
1091     // test bool operator==(const wptr &)
1092     wptr<WptrTest> testObject2 = testObject1;
1093     ASSERT_TRUE(testObject2 == testObject1);
1094 
1095     // test operator==(const sptr &)
1096     sptr<WptrTest> testObject3 = new WptrTest();
1097     ASSERT_FALSE(testObject2 == testObject3);
1098 }
1099 
1100 /*
1101  * @tc.name: testSptrWptrefbase001
1102  * @tc.desc: test interaction between sptr and wptr.
1103  */
HWTEST_F(UtilsRefbaseTest, testSptrWptrefbase001, TestSize.Level0)1104 HWTEST_F(UtilsRefbaseTest, testSptrWptrefbase001, TestSize.Level0)
1105 {
1106     wptr<RefBase> testObject1(new RefBase());
1107     EXPECT_EQ(testObject1->GetWptrRefCount(), 1);
1108     {
1109         sptr<RefBase> testObject2{};
1110         testObject2 = testObject1;
1111         EXPECT_EQ(testObject2->GetSptrRefCount(), 1);
1112         EXPECT_EQ(testObject2->GetWptrRefCount(), 2); // 2: sptr and WeakRefCounter
1113 
1114         sptr<RefBase> testObject3 = testObject1.promote();
1115         EXPECT_EQ(testObject2->GetSptrRefCount(), 2); // 2: 2 sptrs
1116         EXPECT_EQ(testObject2->GetWptrRefCount(), 3); // 3: 2 sptrs and WeakRefCounter
1117         testObject2->ExtendObjectLifetime();
1118     }
1119     EXPECT_EQ(testObject1->GetWptrRefCount(), 1);
1120 }
1121 
1122 /*
1123  * @tc.name: testRefbaseDebug001
1124  * @tc.desc: Test for single thread. Tracker can be enabled after construction
1125  *           of sptr.
1126  */
HWTEST_F(UtilsRefbaseTest, testRefbaseDebug001, TestSize.Level1)1127 HWTEST_F(UtilsRefbaseTest, testRefbaseDebug001, TestSize.Level1)
1128 {
1129     sptr<RefBase> testObject1(new RefBase());
1130     testObject1->EnableTracker();
1131     sptr<RefBase> testObject2(testObject1);
1132     EXPECT_EQ(testObject2->GetSptrRefCount(), 2);
1133     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1134     wptr<RefBase> testObject3(testObject2);
1135     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1136     wptr<RefBase> testObject4(testObject3);
1137     EXPECT_EQ(testObject4->GetWptrRefCount(), 3);
1138     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1139 }
1140 
1141 /*
1142  * @tc.name: testRefbaseDebug002
1143  * @tc.desc: Test for single thread. Tracker can be enabled after construction
1144  *           of wptr.
1145  */
HWTEST_F(UtilsRefbaseTest, testRefbaseDebug002, TestSize.Level1)1146 HWTEST_F(UtilsRefbaseTest, testRefbaseDebug002, TestSize.Level1)
1147 {
1148     wptr<RefBase> testObject1(new RefBase());
1149     testObject1->EnableTracker();
1150     sptr<RefBase> testObject2 = testObject1.promote();
1151     EXPECT_EQ(testObject2->GetSptrRefCount(), 1);
1152     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1153     wptr<RefBase> testObject3(testObject2);
1154     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1155     wptr<RefBase> testObject4(testObject3);
1156     EXPECT_EQ(testObject4->GetWptrRefCount(), 3);
1157     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1158 }
1159 
1160 // This is a class which can be tracked when implemented.
1161 class TestDebug : public RefBase {
1162 public:
TestDebug()1163     TestDebug()
1164     {
1165         EnableTracker();
1166     }
1167 };
1168 
1169 /*
1170  * @tc.name: testRefbaseDebug003
1171  * @tc.desc: Test for single thread. Tracker can be enabled with construction
1172  *           of sptr.
1173  */
HWTEST_F(UtilsRefbaseTest, testRefbaseDebug003, TestSize.Level1)1174 HWTEST_F(UtilsRefbaseTest, testRefbaseDebug003, TestSize.Level1)
1175 {
1176     sptr<TestDebug> testObject1(new TestDebug());
1177     sptr<TestDebug> testObject2(testObject1);
1178     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1179     sptr<TestDebug> testObject3;
1180     EXPECT_EQ(testObject2->GetSptrRefCount(), 2);
1181     testObject3 = testObject2;
1182     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1183     wptr<TestDebug> testObject4(testObject3);
1184     EXPECT_EQ(testObject4->GetWptrRefCount(), 4);
1185     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1186 }
1187 
1188 /*
1189  * @tc.name: testRefbaseDebug004
1190  * @tc.desc: Test for mult-thread.
1191  */
HWTEST_F(UtilsRefbaseTest, testRefbaseDebug004, TestSize.Level1)1192 HWTEST_F(UtilsRefbaseTest, testRefbaseDebug004, TestSize.Level1)
1193 {
1194     sptr<TestDebug> testObject1(new TestDebug());
1195     std::thread subThread {[&testObject1]() {
1196         sptr<TestDebug> subTestObject1(testObject1);
1197         EXPECT_EQ(testObject1->GetSptrRefCount(), 2);
1198         std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1199         wptr<TestDebug> subTestObject2(subTestObject1);
1200         std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1201         wptr<TestDebug> subTestObject3(subTestObject2);
1202         std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1203     }};
1204     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1205     wptr<TestDebug> testObject2(testObject1);
1206     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1207     wptr<TestDebug> testObject3(testObject2);
1208     std::this_thread::sleep_for(std::chrono::milliseconds(1000));
1209     subThread.join();
1210     EXPECT_EQ(testObject3->GetWptrRefCount(), 2);
1211 }
1212 }  // namespace
1213 }  // namespace OHOS
1214