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