1 /*
2  * Copyright (c) 2023 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 <benchmark/benchmark.h>
17 #include <string>
18 #include <vector>
19 #include <algorithm>
20 #include <fstream>
21 #include <iostream>
22 #include <thread>
23 #include <map>
24 #include <mutex>
25 #include "refbase.h"
26 #include "singleton.h"
27 #include "benchmark_log.h"
28 #include "benchmark_assert.h"
29 #include <future>
30 using namespace std;
31 
32 namespace OHOS {
33 namespace {
34 
35 class BenchmarkRefbaseTest : public benchmark::Fixture {
36     public:
BenchmarkRefbaseTest()37         BenchmarkRefbaseTest()
38         {
39             Iterations(iterations);
40             Repetitions(repetitions);
41             ReportAggregatesOnly();
42         }
43 
44         ~BenchmarkRefbaseTest() override = default;
45 
SetUp(const::benchmark::State & state)46         void SetUp(const ::benchmark::State &state) override
47         {
48         }
49 
TearDown(const::benchmark::State & state)50         void TearDown(const ::benchmark::State &state) override
51         {
52         }
53 
54     protected:
55     const int32_t repetitions = 3;
56     const int32_t iterations = 1000;
57 };
58 
59 static constexpr int FLAG_OF_CONS = 1;
60 static constexpr int FLAG_OF_DEST = 2;
61 static int g_sptrCount = 0;
62 static int g_refbaseflag = 0;
63 static int g_freeFlag = 0;
64 constexpr int EXPECTED_REF_COUNT_ZERO = 0;
65 constexpr int EXPECTED_REF_COUNT_ONE = 1;
66 constexpr int EXPECTED_REF_COUNT_TWO = 2;
67 constexpr int EXPECTED_REF_COUNT_THREE = 3;
68 constexpr int EXPECTED_REF_COUNT_FOUR = 4;
69 
70 class RefBaseTest : public RefBase {
71 public:
RefBaseTest()72     RefBaseTest()
73     {
74         g_refbaseflag = FLAG_OF_CONS;
75         isgetrefptr_ = false;
76     }
~RefBaseTest()77     ~RefBaseTest()
78     {
79         g_refbaseflag = FLAG_OF_DEST;
80     }
81 
OnLastStrongRef(const void * objectId)82     void OnLastStrongRef(const void *objectId) override
83     {
84         g_freeFlag = 1;
85     }
86 
SetRefPtr()87     void SetRefPtr()
88     {
89         isgetrefptr_ = true;
90     }
GetTestRefPtrFlag()91     bool GetTestRefPtrFlag()
92     {
93         return isgetrefptr_;
94     }
95 
96 private:
97     bool isgetrefptr_;
98 };
99 
100 class IRemoteObject : public virtual RefBase {
101 public:
IRemoteObject()102     IRemoteObject()
103     {
104         ExtendObjectLifetime();
105     }
106     virtual bool IsProxyObject() = 0;
~IRemoteObject()107     ~IRemoteObject() {}
108 };
109 
110 class RefBaseTestTracker : public RefBase {
111 public:
RefBaseTestTracker(int value)112     explicit RefBaseTestTracker(int value) : value_(value)
113     {
114         checkCount_++;
115     }
116     RefBaseTestTracker() = default;
~RefBaseTestTracker()117     ~RefBaseTestTracker()
118     {
119         BENCHMARK_LOGD("RefbaseTest ~RefBaseTestTracker() is called.");
120         checkCount_--;
121     }
122 
RefBaseTestTracker(const RefBaseTestTracker & testTracker)123     RefBaseTestTracker(const RefBaseTestTracker &testTracker)
124     {
125         BENCHMARK_LOGD("RefbaseTest RefBaseTestTracker(const RefBaseTestTracker &testTracker) is called.");
126         checkCount_++;
127         value_ = testTracker.value_;
128     }
129 
operator =(const RefBaseTestTracker & testTracker)130     RefBaseTestTracker &operator=(const RefBaseTestTracker &testTracker)
131     {
132         BENCHMARK_LOGD("RefbaseTest RefBaseTestTracker &operator=(const RefBaseTestTracker &testTracker) is called.");
133         checkCount_++;
134         value_ = testTracker.value_;
135         return *this;
136     }
137 
RefBaseTestTracker(RefBaseTestTracker && testTracker)138     RefBaseTestTracker(RefBaseTestTracker &&testTracker)
139     {
140         BENCHMARK_LOGD("RefbaseTest RefBaseTestTracker(RefBaseTestTracker &&testTracker) is called.");
141         checkCount_++;
142         value_ = testTracker.value_;
143     }
144 
operator =(RefBaseTestTracker && testTracker)145     RefBaseTestTracker &operator=(RefBaseTestTracker &&testTracker)
146     {
147         BENCHMARK_LOGD("RefbaseTest RefBaseTestTracker &operator=(RefBaseTestTracker &&testTracker) is called.");
148         checkCount_++;
149         value_ = testTracker.value_;
150         return *this;
151     }
152 
GetInstance()153     static RefBaseTestTracker *GetInstance()
154     {
155         BENCHMARK_LOGD("RefbaseTest static RefBaseTestTracker *GetInstance() is called.");
156         static RefBaseTestTracker instance;
157         return &instance;
158     }
159 
InitTracker()160     void InitTracker()
161     {
162         BENCHMARK_LOGD("RefbaseTest void InitTracker() is called.");
163         checkCount_ = 0;
164         freeCount_ = 0;
165         firstRefCount_ = 0;
166         lastRefCount_ = 0;
167     }
168 
TrackObject(IRemoteObject * object)169     void TrackObject(IRemoteObject *object)
170     {
171         BENCHMARK_LOGD("RefbaseTest void TrackObject(IRemoteObject *object) is called.");
172         std::lock_guard<std::mutex> lockGuard(objectMutex_);
173         trackObjects_.emplace_back(object);
174     }
175 
TrackNewObject(IRemoteObject * object)176     void TrackNewObject(IRemoteObject *object)
177     {
178         BENCHMARK_LOGD("RefbaseTest void TrackNewObject(IRemoteObject *object) is called.");
179         std::lock_guard<std::mutex> lockGuard(objectOnfirstMutex_);
180         RefBaseTestTracker::firstRefCount_++;
181     }
182 
UntrackObject(IRemoteObject * object)183     void UntrackObject(IRemoteObject *object)
184     {
185         BENCHMARK_LOGD("RefbaseTest void UntrackObject(IRemoteObject *object) is called.");
186         std::lock_guard<std::mutex> lockGuard(objectMutex_);
187         auto iter = find(trackObjects_.begin(), trackObjects_.end(), object);
188         if (iter != trackObjects_.end()) {
189             trackObjects_.erase(iter);
190         }
191     }
192 
TrackFreeObject(IRemoteObject * object)193     void TrackFreeObject(IRemoteObject *object)
194     {
195         BENCHMARK_LOGD("RefbaseTest void TrackFreeObject(IRemoteObject *object) is called.");
196         std::lock_guard<std::mutex> lockGuard(objectOnfreeMutex_);
197         RefBaseTestTracker::freeCount_++;
198     }
199 
PrintTrackResults()200     void PrintTrackResults()
201     {
202         BENCHMARK_LOGD("RefbaseTest void PrintTrackResults() is called.");
203         std::lock_guard<std::mutex> lockGuard(objectMutex_);
204         if (!trackObjects_.empty()) {
205             for (auto o : trackObjects_) {
206                 BENCHMARK_LOGD("object: %{public}p, strong: %{public}d, weak: %{public}d",
207                     static_cast<void*>(o), o->GetSptrRefCount(), o->GetWptrRefCount());
208             }
209         }
210         BENCHMARK_LOGD("firstRefCount_: %{public}d", RefBaseTestTracker::firstRefCount_);
211         BENCHMARK_LOGD("lastRefCount_: %{public}d", RefBaseTestTracker::lastRefCount_);
212         BENCHMARK_LOGD("freeCount_: %{public}d", RefBaseTestTracker::freeCount_);
213     }
214 
215 public:
216     int checkCount_ = 0;
217     int freeCount_ = 0;
218     int firstRefCount_ = 0;
219     int lastRefCount_ = 0;
220 
221 private:
222 
223     std::vector<IRemoteObject *> trackObjects_;
224     std::mutex objectMutex_;
225     std::mutex objectOnfirstMutex_;
226     std::mutex objectOnfreeMutex_;
227     int value_;
228 };
229 
230 class IPCObjectProxy : public IRemoteObject {
231 public:
IsProxyObject()232     bool IsProxyObject() override
233     {
234         return 0;
235     }
236     string descriptor_;
IPCObjectProxy(const string & descriptor)237     explicit IPCObjectProxy(const string &descriptor)
238     {
239         descriptor_ = descriptor;
240         RefBaseTestTracker *tracker = RefBaseTestTracker::GetInstance();
241         tracker->TrackObject(this);
242         tracker->TrackNewObject(this);
243     };
~IPCObjectProxy()244     ~IPCObjectProxy() {}
245     void RefPtrCallback() override;
246     void OnLastStrongRef(const void *objectId) override;
247     void OnFirstStrongRef(const void *objectId) override;
248     std::mutex mutexLast_;
249 };
250 
251 const int SLEEP_FOR_ONE_MILLISECOND = 1;
252 
253 class IPCProcessSkeleton : public virtual RefBase, public Singleton<IPCProcessSkeleton> {
254     friend class Singleton<IPCProcessSkeleton>;
255 
256 private:
257     IPCProcessSkeleton() = default;
258 
259 public:
260     ~IPCProcessSkeleton() override = default;
261 
262     std::mutex mutex_;
263     std::map<string, wptr<IRemoteObject>> objects1_;
264 
DumpMapObjects()265     void DumpMapObjects()
266     {
267         BENCHMARK_LOGD("RefbaseTest void DumpMapObjects() is called.");
268         if (!objects1_.empty()) {
269             for (auto &o : objects1_) {
270                 BENCHMARK_LOGD("strong: %{public}d, weak: %{public}d",
271                     o.second->GetSptrRefCount(), o.second->GetWptrRefCount());
272             }
273         }
274     }
QueryObjectInner(const string & descriptor)275     IRemoteObject *QueryObjectInner(const string &descriptor)
276     {
277         BENCHMARK_LOGD("RefbaseTest IRemoteObject *QueryObjectInner(const string &descriptor) is called.");
278         auto it = objects1_.find(descriptor);
279         if (it != objects1_.end()) {
280             it->second->AttemptAcquire(this);
281             std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_FOR_ONE_MILLISECOND));
282             return it->second.GetRefPtr();
283         }
284 
285         return nullptr;
286     }
287 
FindOrNewObject(int handle)288     IRemoteObject *FindOrNewObject(int handle)
289     {
290         BENCHMARK_LOGD("RefbaseTest IRemoteObject *FindOrNewObject(int handle) is called.");
291         std::lock_guard<std::mutex> lockGuard(mutex_);
292         IRemoteObject *remoteObject = QueryObjectInner(to_string(handle));
293         if (remoteObject != nullptr) {
294             std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_FOR_ONE_MILLISECOND));
295             return remoteObject;
296         }
297 
298         remoteObject = new IPCObjectProxy(to_string(handle));
299         remoteObject->AttemptAcquire(this);
300         objects1_.insert(std::pair<string, wptr<IRemoteObject>>(to_string(handle), remoteObject));
301         return remoteObject;
302     }
303 
DetachObject(IRemoteObject * object,string descriptor)304     bool DetachObject(IRemoteObject *object, string descriptor)
305     {
306         BENCHMARK_LOGD("RefbaseTest bool DetachObject(IRemoteObject *object, string descriptor) is called.");
307         std::lock_guard<std::mutex> lockGuard(mutex_);
308         if (object->GetSptrRefCount()) {
309             return false;
310         }
311         return (objects1_.erase(descriptor) > 0);
312     }
313 };
314 
315 const int SLEEP_FOR_TEN_NANOSECONDS = 10;
316 
OnLastStrongRef(const void * objectId)317 void IPCObjectProxy::OnLastStrongRef(const void *objectId)
318 {
319     BENCHMARK_LOGD("RefbaseTest void IPCObjectProxy::OnLastStrongRef(const void *objectId) is called.");
320     std::lock_guard<std::mutex> lock(mutexLast_);
321     (void)IPCProcessSkeleton::GetInstance().DetachObject(this, descriptor_);
322     RefBaseTestTracker *tracker = RefBaseTestTracker::GetInstance();
323     tracker->lastRefCount_++;
324     std::this_thread::sleep_for(std::chrono::nanoseconds(SLEEP_FOR_TEN_NANOSECONDS));
325 }
326 
OnFirstStrongRef(const void * objectId)327 void IPCObjectProxy::OnFirstStrongRef(const void *objectId)
328 {
329     BENCHMARK_LOGD("RefbaseTest void IPCObjectProxy::OnFirstStrongRef(const void *objectId) is called.");
330     std::this_thread::sleep_for(std::chrono::nanoseconds(SLEEP_FOR_TEN_NANOSECONDS));
331 }
332 
RefPtrCallback()333 void IPCObjectProxy::RefPtrCallback()
334 {
335     BENCHMARK_LOGD("RefbaseTest void IPCObjectProxy::RefPtrCallback() is called.");
336     RefBaseTestTracker *tracker = RefBaseTestTracker::GetInstance();
337     tracker->UntrackObject(this);
338     tracker->TrackFreeObject(this);
339     RefBase::RefPtrCallback();
340 }
341 
342 constexpr int CYCLE_NUM1 = 2;
343 constexpr int CYCLE_NUM2 = 2;
344 
RegisterEventThread()345 int RegisterEventThread()
346 {
347     BENCHMARK_LOGD("RefbaseTest int RegisterEventThread() is called.");
348     auto &ipc = IPCProcessSkeleton::GetInstance();
349     int handle = 10;
350     for (int i = 0; i < CYCLE_NUM2; i++) {
351         sptr<IRemoteObject> remote = ipc.FindOrNewObject(handle);
352         remote->CheckIsAttemptAcquireSet(remote);
353         if (remote) {
354             remote->IsProxyObject();
355         }
356     }
357     return 0;
358 }
359 
360 class SptrTest : public RefBase {
361 public:
SptrTest()362     SptrTest()
363     {
364         g_sptrCount++;
365     }
~SptrTest()366     ~SptrTest()
367     {
368         g_sptrCount--;
369     }
CreateSptr()370     void CreateSptr()
371     {
372         test1 = new SptrTest();
373     }
374 
375 private:
376     sptr<SptrTest> test1;
377 };
378 
379 class SptrTest1;
380 class SptrTest2;
381 class SptrTest2 : public RefBase {
382 public:
SptrTest2()383     SptrTest2()
384     {
385         BENCHMARK_LOGD("RefbaseTest SptrTest2() is called.");
386         g_sptrCount++;
387     }
~SptrTest2()388     ~SptrTest2()
389     {
390         BENCHMARK_LOGD("RefbaseTest ~SptrTest2() is called.");
391         g_sptrCount--;
392     }
393 
394 private:
395     sptr<SptrTest1> test;
396 };
397 
398 class SptrTest1 : public RefBase {
399 public:
SptrTest1()400     SptrTest1()
401     {
402         BENCHMARK_LOGD("RefbaseTest SptrTest1() is called.");
403         g_sptrCount++;
404     }
~SptrTest1()405     ~SptrTest1()
406     {
407         BENCHMARK_LOGD("RefbaseTest ~SptrTest1() is called.");
408         g_sptrCount--;
409     }
410 
411 private:
412     sptr<SptrTest2> test;
413 };
414 
415 class WptrTest : public RefBase {
416 public:
WptrTest()417     WptrTest()
418     {
419         g_sptrCount++;
420     }
~WptrTest()421     ~WptrTest()
422     {
423         g_sptrCount--;
424     }
425 };
426 
427 class WptrTest2 : public RefBase {
428 public:
WptrTest2()429     WptrTest2()
430     {
431         g_sptrCount++;
432         flag_ = 0;
433     }
~WptrTest2()434     ~WptrTest2()
435     {
436         g_sptrCount--;
437     }
438 
439 private:
440     int flag_;
441 };
442 
443 class RefBaseMemTest : public RefBase {
444 public:
RefBaseMemTest(int value)445     explicit RefBaseMemTest(int value): value_(value)
446     {
447         BENCHMARK_LOGD("RefbaseTest explicit RefBaseMemTest(int value): value_(value) is called.");
448         checkCount_++;
449     }
450 
~RefBaseMemTest()451     ~RefBaseMemTest()
452     {
453         BENCHMARK_LOGD("RefbaseTest ~RefBaseMemTest() is called.");
454         checkCount_--;
455     }
456 
RefBaseMemTest(const RefBaseMemTest & testRefbaseMem)457     RefBaseMemTest(const RefBaseMemTest &testRefbaseMem)
458     {
459         BENCHMARK_LOGD("RefbaseTest RefBaseMemTest(const RefBaseMemTest &testRefbaseMem) is called.");
460         checkCount_++;
461         value_ = testRefbaseMem.value_;
462     }
463 
operator =(const RefBaseMemTest & testRefbaseMem)464     RefBaseMemTest &operator=(const RefBaseMemTest &testRefbaseMem)
465     {
466         BENCHMARK_LOGD("RefbaseTest RefBaseMemTest &operator=(const RefBaseMemTest &testRefbaseMem) is called.");
467         checkCount_++;
468         value_ = testRefbaseMem.value_;
469         return *this;
470     }
471 
RefBaseMemTest(RefBaseMemTest && testRefbaseMem)472     RefBaseMemTest(RefBaseMemTest &&testRefbaseMem)
473     {
474         BENCHMARK_LOGD("RefbaseTest RefBaseMemTest(RefBaseMemTest &&testRefbaseMem) is called.");
475         checkCount_++;
476         value_ = testRefbaseMem.value_;
477     }
478 
operator =(RefBaseMemTest && testRefbaseMem)479     RefBaseMemTest &operator=(RefBaseMemTest &&testRefbaseMem)
480     {
481         BENCHMARK_LOGD("RefbaseTest RefBaseMemTest &operator=(RefBaseMemTest &&testRefbaseMem) is called.");
482         checkCount_++;
483         value_ = testRefbaseMem.value_;
484         return *this;
485     }
486 
487 public:
488     static inline int checkCount_ = 0;
489 
490 private:
491     int value_;
492 };
493 
494 // This is a class which can be tracked when implemented.
495 class TestDebug : public RefBase {
496 public:
TestDebug()497     TestDebug()
498     {
499         EnableTracker();
500     }
501 };
502 
503 /*
504  * @tc.name: testRefbaseOperateThreads001
505  * @tc.desc: Refbase for threads
506  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbaseOperateThreads001)507 BENCHMARK_F(BenchmarkRefbaseTest, testRefbaseOperateThreads001)(benchmark::State &state)
508 {
509     BENCHMARK_LOGD("RefbaseTest testRefbaseOperateThreads001 start.");
510     constexpr int cycleNum = 1;
511     while (state.KeepRunning()) {
512         RefBaseTestTracker *tracker = RefBaseTestTracker::GetInstance();
513         tracker->InitTracker();
514         for (int n = 0; n < cycleNum; n++) {
515             std::vector<std::future<int>> threads;
516             for (int i = 0; i < CYCLE_NUM1; i++) {
517                 threads.emplace_back(std::async(RegisterEventThread));
518             }
519 
520             for (auto &f : threads) {
521                 f.get();
522             }
523         }
524         auto &ipc = IPCProcessSkeleton::GetInstance();
525         ipc.DumpMapObjects();
526         AssertEqual(tracker->firstRefCount_, tracker->freeCount_,
527             "tracker->firstRefCount_ and tracker->freeCount_ are not equal", state);
528     }
529     BENCHMARK_LOGD("RefbaseTest testRefbaseOperateThreads001 end.");
530 }
531 
532 /*
533  * @tc.name: testRefbaseOperate001
534  * @tc.desc: test AttemptAcquire, IncWeakRef, DecWeakRef, IncStrongRef, DecStrongRef of Refbase
535  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbaseOperate001)536 BENCHMARK_F(BenchmarkRefbaseTest, testRefbaseOperate001)(benchmark::State& state)
537 {
538     BENCHMARK_LOGD("RefbaseTest testRefbaseOperate001 start.");
539     while (state.KeepRunning()) {
540         RefBaseTestTracker *tracker = RefBaseTestTracker::GetInstance();
541         tracker->InitTracker();
542 
543         auto remoteObject = new IPCObjectProxy("ss");
544         remoteObject->AttemptAcquire(this);
545         remoteObject->IncWeakRef(this);
546         remoteObject->IncStrongRef(this);
547         remoteObject->CheckIsAttemptAcquireSet(this);
548         remoteObject->DecStrongRef(this);
549         remoteObject->AttemptAcquire(this);
550 
551         remoteObject->IncStrongRef(this);
552         remoteObject->CheckIsAttemptAcquireSet(this);
553         remoteObject->DecStrongRef(this);
554 
555         remoteObject->DecWeakRef(this);
556         AssertEqual(tracker->firstRefCount_, tracker->freeCount_,
557             "tracker->firstRefCount_ and tracker->freeCount_ are not equal", state);
558     }
559     BENCHMARK_LOGD("RefbaseTest testRefbaseOperate001 end.");
560 }
561 
562 constexpr int REF_MEM_TEST_OBJ_1_PARAM = 1;
563 constexpr int REF_MEM_TEST_OBJ_2_PARAM = 2;
564 
565 /*
566  * @tc.name: testRefbaseOperateLeftValue001
567  * @tc.desc: Refbase
568  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbaseOperateLeftValue001)569 BENCHMARK_F(BenchmarkRefbaseTest, testRefbaseOperateLeftValue001)(benchmark::State& state)
570 {
571     BENCHMARK_LOGD("RefbaseTest testRefbaseOperateLeftValue001 start.");
572     while (state.KeepRunning()) {
573         RefBaseMemTest::checkCount_ = 0;
574         {
575             vector<RefBaseMemTest> refMemTestArray;
576             sptr<RefBaseMemTest>refMemTestObj1 = new RefBaseMemTest(REF_MEM_TEST_OBJ_1_PARAM);
577             sptr<RefBaseMemTest>refMemTestObj2 = new RefBaseMemTest(REF_MEM_TEST_OBJ_2_PARAM);
578             refMemTestArray.push_back(*refMemTestObj1);
579             refMemTestArray.push_back(*refMemTestObj2);
580         }
581         AssertEqual(RefBaseMemTest::checkCount_, 0, "RefBaseMemTest::checkCount_ did not equal 0", state);
582 
583         {
584             vector<RefBaseMemTest> refMemTestArray;
585             RefBaseMemTest refMemTestObj1(REF_MEM_TEST_OBJ_1_PARAM);
586             RefBaseMemTest refMemTestObj2(REF_MEM_TEST_OBJ_2_PARAM);
587             refMemTestArray.push_back(refMemTestObj1);
588             refMemTestArray.push_back(refMemTestObj2);
589         }
590         AssertEqual(RefBaseMemTest::checkCount_, 0, "RefBaseMemTest::checkCount_ did not equal 0", state);
591     }
592     BENCHMARK_LOGD("RefbaseTest testRefbaseOperateLeftValue001 end.");
593 }
594 
595 /*
596  * @tc.name: testRefbaseOperateRightValue001
597  * @tc.desc: Refbase
598  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbaseOperateRightValue001)599 BENCHMARK_F(BenchmarkRefbaseTest, testRefbaseOperateRightValue001)(benchmark::State& state)
600 {
601     BENCHMARK_LOGD("RefbaseTest testRefbaseOperateRightValue001 start.");
602     while (state.KeepRunning()) {
603         RefBaseMemTest::checkCount_ = 0;
604         {
605             vector<RefBaseMemTest> refMemTestArray;
606             sptr<RefBaseMemTest>refMemTestObj1 = new RefBaseMemTest(REF_MEM_TEST_OBJ_1_PARAM);
607             sptr<RefBaseMemTest>refMemTestObj2 = new RefBaseMemTest(REF_MEM_TEST_OBJ_2_PARAM);
608             refMemTestArray.emplace_back(*refMemTestObj1);
609             refMemTestArray.emplace_back(*refMemTestObj2);
610         }
611         AssertEqual(RefBaseMemTest::checkCount_, 0, "RefBaseMemTest::checkCount_ did not equal 0", state);
612 
613         {
614             vector<RefBaseMemTest> refMemTestArray;
615             RefBaseMemTest refMemTestObj1(REF_MEM_TEST_OBJ_1_PARAM);
616             RefBaseMemTest refMemTestObj2(REF_MEM_TEST_OBJ_2_PARAM);
617             refMemTestArray.emplace_back(refMemTestObj1);
618             refMemTestArray.emplace_back(refMemTestObj2);
619         }
620         AssertEqual(RefBaseMemTest::checkCount_, 0, "RefBaseMemTest::checkCount_ did not equal 0", state);
621     }
622     BENCHMARK_LOGD("RefbaseTest testRefbaseOperateRightValue001 end.");
623 }
624 
625 /*
626  * @tc.name: testRefbaseAcquire001
627  * @tc.desc: Refbase
628  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbaseAcquire001)629 BENCHMARK_F(BenchmarkRefbaseTest, testRefbaseAcquire001)(benchmark::State& state)
630 {
631     BENCHMARK_LOGD("RefbaseTest testRefbaseAcquire001 start.");
632     while (state.KeepRunning()) {
633         RefBaseTest* testobject = new RefBaseTest();
634         testobject->AttemptAcquire(this);
635 
636         g_freeFlag = 0;
637         AssertEqual(testobject->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
638             "testobject->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
639 
640         {
641             AssertTrue(testobject->IsAttemptAcquireSet(),
642                 "testobject->IsAttemptAcquireSet() did not equal true", state);
643             testobject->CheckIsAttemptAcquireSet(this);
644             sptr<RefBaseTest> sptrRef = testobject;
645             AssertEqual(sptrRef->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
646                 "sptrRef->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
647             AssertFalse(testobject->IsAttemptAcquireSet(),
648                 "testobject->IsAttemptAcquireSet() did not equal false", state);
649         }
650 
651         AssertEqual(g_freeFlag, EXPECTED_REF_COUNT_ONE, "g_freeFlag did not equal EXPECTED_REF_COUNT_ONE", state);
652     }
653     BENCHMARK_LOGD("RefbaseTest testRefbaseAcquire001 end.");
654 }
655 
656 /*
657  * @tc.name: testSptrefbase001
658  * @tc.desc: Refbase
659  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase001)660 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase001)(benchmark::State& state)
661 {
662     BENCHMARK_LOGD("RefbaseTest testSptrefbase001 start.");
663     while (state.KeepRunning()) {
664         sptr<RefBaseTest> testobject = new RefBaseTest();
665         testobject->ExtendObjectLifetime();
666         AssertTrue(testobject->IsExtendLifeTimeSet(), "testobject->IsExtendLifeTimeSet() did not equal true", state);
667         AssertEqual(g_refbaseflag, EXPECTED_REF_COUNT_ONE,
668             "g_refbaseflag did not equal EXPECTED_REF_COUNT_ONE", state);
669         wptr<RefBaseTest> weakObject(testobject);
670         int count = testobject->GetWptrRefCount();
671         AssertEqual(count, EXPECTED_REF_COUNT_TWO, "count did not equal EXPECTED_REF_COUNT_TWO", state);
672         testobject = nullptr;
673 
674         sptr<RefBaseTest> strongObject = weakObject.promote();
675         AssertEqual(strongObject->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
676             "GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
677     }
678     BENCHMARK_LOGD("RefbaseTest testSptrefbase001 end.");
679 }
680 
681 /*
682  * @tc.name: testSptrefbaseRealease001
683  * @tc.desc: Refbase
684  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbaseRealease001)685 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbaseRealease001)(benchmark::State& state)
686 {
687     BENCHMARK_LOGD("RefbaseTest testSptrefbaseRealease001 start.");
688     constexpr int expectedFlag = 1;
689     while (state.KeepRunning()) {
690         sptr<RefBaseTest> testObject = new RefBaseTest();
691         AssertEqual(g_refbaseflag, expectedFlag, "g_refbaseflag did not equal expectedFlag", state);
692         wptr<RefBaseTest> weakObject(testObject);
693         testObject = nullptr;
694         AssertEqual(g_refbaseflag, FLAG_OF_DEST, "g_refbaseflag did not equal FLAG_OF_DEST", state);
695     }
696     BENCHMARK_LOGD("RefbaseTest testSptrefbaseRealease001 end.");
697 }
698 
699 /*
700  * @tc.name: testSptrefbaseRealease002
701  * @tc.desc: Refbase
702  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbaseRealease002)703 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbaseRealease002)(benchmark::State& state)
704 {
705     BENCHMARK_LOGD("RefbaseTest testSptrefbaseRealease002 start.");
706     constexpr int expectedFlag = 1;
707     while (state.KeepRunning()) {
708         wptr<RefBaseTest> testObject = new RefBaseTest();
709         AssertEqual(g_refbaseflag, expectedFlag, "g_refbaseflag did not equal expectedFlag", state);
710         testObject = nullptr;
711         AssertEqual(g_refbaseflag, FLAG_OF_DEST, "g_refbaseflag did not equal FLAG_OF_DEST", state);
712     }
713     BENCHMARK_LOGD("RefbaseTest testSptrefbaseRealease002 end.");
714 }
715 
716 /*
717  * @tc.name: testSptrefbase002
718  * @tc.desc: Refbase
719  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase002)720 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase002)(benchmark::State& state)
721 {
722     BENCHMARK_LOGD("RefbaseTest testSptrefbase002 start.");
723     constexpr int expectedRefbaseFlag1 = 1;
724     constexpr int expectedRefbaseFlag2 = 2;
725     while (state.KeepRunning()) {
726         {
727             sptr<RefBaseTest> testObject(new RefBaseTest());
728             AssertEqual(g_refbaseflag, expectedRefbaseFlag1, "g_refbaseflag did not equal expectedRefbaseFlag1", state);
729         }
730         AssertEqual(g_refbaseflag, expectedRefbaseFlag2,
731             "g_refbaseflag did not equal expectedRefbaseFlag2", state);
732     }
733     BENCHMARK_LOGD("RefbaseTest testSptrefbase002 end.");
734 }
735 
736 /*
737  * @tc.name: testSptrefbase003
738  * @tc.desc: Refbase
739  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase003)740 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase003)(benchmark::State& state)
741 {
742     BENCHMARK_LOGD("RefbaseTest testSptrefbase003 start.");
743     while (state.KeepRunning()) {
744         sptr<RefBaseTest> testObject1(new RefBaseTest());
745         sptr<RefBaseTest> testObject2 = testObject1.GetRefPtr();
746         testObject2->SetRefPtr();
747         AssertTrue(testObject1->GetTestRefPtrFlag(), "testObject1->GetTestRefPtrFlag() did not equal true", state);
748 
749         sptr<RefBaseTest> testObject3(testObject1);
750         AssertTrue(testObject3->GetTestRefPtrFlag(), "testObject3->GetTestRefPtrFlag() did not equal true", state);
751 
752         sptr<RefBaseTest> testObject4 = testObject1;
753         AssertTrue(testObject3->GetTestRefPtrFlag(), "testObject3->GetTestRefPtrFlag() did not equal true", state);
754 
755         bool ret = (testObject3 == testObject4);
756         AssertTrue(ret, "ret did not equal true", state);
757 
758         int refcount = testObject1->GetSptrRefCount();
759         AssertEqual(refcount, EXPECTED_REF_COUNT_FOUR, "refcount did not equal EXPECTED_REF_COUNT_FOUR", state);
760 
761         sptr<RefBaseTest> testObject5(new RefBaseTest());
762         ret = (testObject5 != testObject1);
763         AssertTrue(ret, "ret did not equal true", state);
764     }
765     BENCHMARK_LOGD("RefbaseTest testSptrefbase003 end.");
766 }
767 
768 /*
769  * @tc.name: testSptrefbase004
770  * @tc.desc: Refbase
771  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase004)772 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase004)(benchmark::State& state)
773 {
774     BENCHMARK_LOGD("RefbaseTest testSptrefbase004 start.");
775     constexpr int expectedRefbaseFlag = 2;
776     while (state.KeepRunning()) {
777         sptr<RefBaseTest> testObject1(new RefBaseTest());
778         testObject1->SetRefPtr();
779         RefBaseTest testObject2 = *testObject1;
780         AssertTrue(testObject2.GetTestRefPtrFlag(), "testObject2.GetTestRefPtrFlag() did not equal true", state);
781 
782         auto testObject3 = testObject1;
783         testObject1 = nullptr;
784         testObject3 = nullptr;
785         AssertEqual(g_refbaseflag, expectedRefbaseFlag, "g_refbaseflag did not equal expectedRefbaseFlag", state);
786     }
787     BENCHMARK_LOGD("RefbaseTest testSptrefbase004 end.");
788 }
789 
790 /*
791  * @tc.name: testSptrefbase005
792  * @tc.desc: Refbase
793  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase005)794 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase005)(benchmark::State& state)
795 {
796     BENCHMARK_LOGD("RefbaseTest testSptrefbase005 start.");
797     while (state.KeepRunning()) {
798         sptr<RefBaseTest> testObject1(new RefBaseTest());
799         wptr<RefBaseTest> testObject2 = testObject1;
800         AssertEqual(testObject1->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
801             "testObject1->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
802         AssertEqual(testObject1->GetWptrRefCount(), EXPECTED_REF_COUNT_TWO,
803             "testObject1->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
804     }
805     BENCHMARK_LOGD("RefbaseTest testSptrefbase005 end.");
806 }
807 
808 /*
809  * @tc.name: testSptrefbase006
810  * @tc.desc: Refbase
811  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase006)812 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase006)(benchmark::State& state)
813 {
814     BENCHMARK_LOGD("RefbaseTest testSptrefbase006 start.");
815     while (state.KeepRunning()) {
816         sptr<RefBaseTest> testObject1;
817         AssertEqual(testObject1.GetRefPtr(), nullptr, "testObject1.GetRefPtr() did not equal nullptr", state);
818         testObject1 = new RefBaseTest();
819         sptr<RefBaseTest> testObject2(testObject1);
820         AssertEqual(testObject1->GetSptrRefCount(), EXPECTED_REF_COUNT_TWO,
821             "testObject1->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
822     }
823     BENCHMARK_LOGD("RefbaseTest testSptrefbase006 end.");
824 }
825 
826 /*
827  * @tc.name: testSptrefbase007
828  * @tc.desc: Refbase
829  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase007)830 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase007)(benchmark::State& state)
831 {
832     BENCHMARK_LOGD("RefbaseTest testSptrefbase007 start.");
833     while (state.KeepRunning()) {
834         const sptr<RefBaseTest> &testObject1 = new RefBaseTest();
835         sptr<RefBaseTest> testObject2(testObject1);
836         AssertEqual(testObject1->GetSptrRefCount(), EXPECTED_REF_COUNT_TWO,
837             "testObject1->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
838     }
839     BENCHMARK_LOGD("RefbaseTest testSptrefbase007 end.");
840 }
841 
842 /*
843  * @tc.name: testSptrefbase008
844  * @tc.desc: Refbase
845  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase008)846 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase008)(benchmark::State& state)
847 {
848     BENCHMARK_LOGD("RefbaseTest testSptrefbase008 start.");
849     while (state.KeepRunning()) {
850         sptr<RefBaseTest> testObject1;
851         sptr<RefBaseTest> testObject2(testObject1);
852         AssertEqual(testObject2, nullptr, "testObject2 did not equal nullptr", state);
853     }
854     BENCHMARK_LOGD("RefbaseTest testSptrefbase008 end.");
855 }
856 
857 /*
858  * @tc.name: testSptrefbase009
859  * @tc.desc: Refbase
860  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase009)861 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase009)(benchmark::State& state)
862 {
863     BENCHMARK_LOGD("RefbaseTest testSptrefbase009 start.");
864     while (state.KeepRunning()) {
865         sptr<RefBaseTest> testObject0 = new RefBaseTest();
866         sptr<RefBaseTest> testObject1 = move(testObject0);
867         sptr<RefBaseTest> testObject2(testObject1);
868         AssertEqual(testObject0.GetRefPtr(), nullptr, "testObject0.GetRefPtr() did not equal nullptr", state);
869         AssertEqual(testObject2.GetRefPtr(), testObject1.GetRefPtr(),
870             "testObject2.GetRefPtr() did not equal testObject1.GetRefPtr()", state);
871     }
872     BENCHMARK_LOGD("RefbaseTest testSptrefbase009 end.");
873 }
874 
875 /*
876  * @tc.name: testSptrefbase010
877  * @tc.desc: Refbase
878  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase010)879 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase010)(benchmark::State& state)
880 {
881     BENCHMARK_LOGD("RefbaseTest testSptrefbase010 start.");
882     while (state.KeepRunning()) {
883         sptr<RefBaseTest> testObject1 = new RefBaseTest();
884         sptr<RefBaseTest> testObject3(new RefBaseTest());
885         sptr<RefBaseTest> &testObject2 = testObject3;
886         testObject2 = testObject1;
887         AssertEqual(testObject2.GetRefPtr(), testObject1.GetRefPtr(),
888             "testObject2.GetRefPtr() did not equal testObject1.GetRefPtr()", state);
889 
890         const sptr<RefBaseTest> &testObject4 = new RefBaseTest();
891         AssertEqual(testObject1->GetSptrRefCount(), EXPECTED_REF_COUNT_TWO,
892             "testObject1->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
893         testObject2 = testObject4;
894         AssertEqual(testObject2.GetRefPtr(), testObject4.GetRefPtr(),
895             "testObject2.GetRefPtr() did not equal testObject4.GetRefPtr()", state);
896         AssertEqual(testObject4->GetSptrRefCount(), EXPECTED_REF_COUNT_TWO,
897             "testObject4->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
898         AssertEqual(testObject1->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
899             "testObject1->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
900     }
901     BENCHMARK_LOGD("RefbaseTest testSptrefbase010 end.");
902 }
903 
904 /*
905  * @tc.name: testSptrefbase011
906  * @tc.desc: test MakeSptr of sptr
907  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase011)908 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase011)(benchmark::State& state)
909 {
910     BENCHMARK_LOGD("RefbaseTest testSptrefbase011 start.");
911     while (state.KeepRunning()) {
912         RefBase ref;
913         sptr<RefBase> baseObject = sptr<RefBase>::MakeSptr(ref);
914         AssertEqual(baseObject.GetRefPtr()->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
915             "baseObject.GetRefPtr()->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
916     }
917     BENCHMARK_LOGD("RefbaseTest testSptrefbase011 end.");
918 }
919 
920 /*
921  * @tc.name: testSptrefbase012
922  * @tc.desc: test move assignment operator of sptr
923  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase012)924 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase012)(benchmark::State& state)
925 {
926     BENCHMARK_LOGD("RefbaseTest testSptrefbase012 start.");
927     while (state.KeepRunning()) {
928         sptr<RefBase> baseObject1(new RefBase());
929         sptr<RefBase> baseObject2;
930         baseObject2 = std::move(baseObject1);
931         AssertEqual(baseObject1.GetRefPtr(), nullptr, "baseObject1.GetRefPtr() did not equal nullptr", state);
932         AssertEqual(baseObject2.GetRefPtr()->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
933             "baseObject2.GetRefPtr()->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
934         sptr<RefBase> baseObject3(new RefBase());
935         baseObject3 = std::move(baseObject2);
936         AssertEqual(baseObject2.GetRefPtr(), nullptr, "baseObject2.GetRefPtr() did not equal nullptr", state);
937         AssertEqual(baseObject3.GetRefPtr()->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
938             "baseObject3.GetRefPtr()->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
939     }
940     BENCHMARK_LOGD("RefbaseTest testSptrefbase012 end.");
941 }
942 
943 /*
944  * @tc.name: testSptrefbase013
945  * @tc.desc: test copy Constructor for sptr with the managed class type (O)
946  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase013)947 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase013)(benchmark::State& state)
948 {
949     BENCHMARK_LOGD("RefbaseTest testSptrefbase013 start.");
950     while (state.KeepRunning()) {
951         sptr<RefBaseTest> baseObject1(new RefBaseTest());
952         sptr<RefBase> baseObject2(baseObject1);
953         AssertEqual(baseObject1.GetRefPtr(), baseObject2.GetRefPtr(),
954             "baseObject1.GetRefPtr() did not equal baseObject2.GetRefPtr()", state);
955         AssertEqual(baseObject2.GetRefPtr()->GetSptrRefCount(), EXPECTED_REF_COUNT_TWO,
956             "baseObject2.GetRefPtr()->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
957     }
958     BENCHMARK_LOGD("RefbaseTest testSptrefbase013 end.");
959 }
960 
961 /*
962  * @tc.name: testSptrefbase014
963  * @tc.desc: test clear of sptr
964  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase014)965 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase014)(benchmark::State& state)
966 {
967     BENCHMARK_LOGD("RefbaseTest testSptrefbase014 start.");
968     while (state.KeepRunning()) {
969         sptr<RefBaseTest> baseObject(new RefBaseTest());
970         baseObject.clear();
971         AssertEqual(baseObject.GetRefPtr(), nullptr, "baseObject.GetRefPtr() did not equal nullptr", state);
972     }
973     BENCHMARK_LOGD("RefbaseTest testSptrefbase014 end.");
974 }
975 
976 /*
977  * @tc.name: testSptrefbase015
978  * @tc.desc: test boolean conversion operator of sptr
979  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase015)980 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase015)(benchmark::State& state)
981 {
982     BENCHMARK_LOGD("RefbaseTest testSptrefbase015 start.");
983     while (state.KeepRunning()) {
984         sptr<RefBaseTest> baseObject1;
985         AssertFalse(baseObject1, "baseObject1 did not equal false", state);
986         sptr<RefBaseTest> baseObject2(new RefBaseTest());
987         AssertTrue(baseObject2, "baseObject2 did not equal true", state);
988     }
989     BENCHMARK_LOGD("RefbaseTest testSptrefbase015 end.");
990 }
991 
992 /*
993  * @tc.name: testSptrefbase016
994  * @tc.desc: test Copy assignment operator for sptr with
995  * a different managed class type (O)
996  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase016)997 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase016)(benchmark::State& state)
998 {
999     BENCHMARK_LOGD("RefbaseTest testSptrefbase016 start.");
1000     while (state.KeepRunning()) {
1001         sptr<RefBase> testObject0(new RefBase());
1002         sptr<RefBaseTest> testObject1(new RefBaseTest());
1003         testObject0 = testObject1;
1004         AssertEqual(testObject1->GetSptrRefCount(), EXPECTED_REF_COUNT_TWO,
1005             "GetSptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1006     }
1007     BENCHMARK_LOGD("RefbaseTest testSptrefbase016 end.");
1008 }
1009 
1010 /*
1011  * @tc.name: testSptrefbase017
1012  * @tc.desc: test Equal-to operator between the sptr and wptr
1013  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase017)1014 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase017)(benchmark::State& state)
1015 {
1016     BENCHMARK_LOGD("RefbaseTest testSptrefbase017 start.");
1017     while (state.KeepRunning()) {
1018         sptr<RefBase> testObject0(new RefBase());
1019         wptr<RefBase> testObject1(new RefBase());
1020         AssertUnequal(testObject0, testObject1, "testObject0 did not unequal testObject1", state);
1021     }
1022     BENCHMARK_LOGD("RefbaseTest testSptrefbase017 end.");
1023 }
1024 
1025 /*
1026  * @tc.name: testSptrefbase018
1027  * @tc.desc: test Not-equal-to operator between the sptr and wptr
1028  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase018)1029 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase018)(benchmark::State& state)
1030 {
1031     BENCHMARK_LOGD("RefbaseTest testSptrefbase018 start.");
1032     while (state.KeepRunning()) {
1033         sptr<RefBase> testObject0(new RefBase());
1034         wptr<RefBase> testObject1(new RefBase());
1035         AssertUnequal(testObject0, testObject1, "testObject0 did not unequal testObject1", state);
1036     }
1037     BENCHMARK_LOGD("RefbaseTest testSptrefbase018 end.");
1038 }
1039 
1040 /*
1041  * @tc.name: testSptrefbase019
1042  * @tc.desc: test ForceSetRefPtr of sptr
1043  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrefbase019)1044 BENCHMARK_F(BenchmarkRefbaseTest, testSptrefbase019)(benchmark::State& state)
1045 {
1046     BENCHMARK_LOGD("RefbaseTest testSptrefbase019 start.");
1047     while (state.KeepRunning()) {
1048         sptr<RefBase> testObject;
1049         AssertEqual(testObject.GetRefPtr(), nullptr, "testObject.GetRefPtr() did not equal nullptr", state);
1050         RefBase baseObject;
1051         testObject.ForceSetRefPtr(&baseObject);
1052         AssertEqual(testObject.GetRefPtr(), &baseObject, "testObject.GetRefPtr() did not equal &baseObject", state);
1053     }
1054     BENCHMARK_LOGD("RefbaseTest testSptrefbase019 end.");
1055 }
1056 
1057 /*
1058  * @tc.name: testRefbase001
1059  * @tc.desc: test copy of Refbase.
1060  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbase001)1061 BENCHMARK_F(BenchmarkRefbaseTest, testRefbase001)(benchmark::State& state)
1062 {
1063     BENCHMARK_LOGD("RefbaseTest testRefbase001 start.");
1064     while (state.KeepRunning()) {
1065         RefBase baseObject1{};
1066         AssertEqual(baseObject1.GetRefCounter()->GetRefCount(), EXPECTED_REF_COUNT_ONE,
1067             "refs->GetRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1068         RefBase baseObject2(baseObject1);
1069         AssertEqual(baseObject1.GetRefCounter()->GetRefCount(), EXPECTED_REF_COUNT_ONE,
1070             "refs->GetRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1071         RefBase baseObject3;
1072         baseObject3 = baseObject2;
1073         AssertEqual(baseObject1.GetRefCounter()->GetRefCount(), EXPECTED_REF_COUNT_ONE,
1074             "refs->GetRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1075     }
1076     BENCHMARK_LOGD("RefbaseTest testRefbase001 end.");
1077 }
1078 
1079 /*
1080  * @tc.name: testRefbase002
1081  * @tc.desc: test AttemptIncStrong of RefBase.
1082  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbase002)1083 BENCHMARK_F(BenchmarkRefbaseTest, testRefbase002)(benchmark::State& state)
1084 {
1085     BENCHMARK_LOGD("RefbaseTest testRefbase002 start.");
1086     while (state.KeepRunning()) {
1087         RefBase *baseObject = new RefBase();
1088         baseObject->AttemptIncStrong(this);
1089         AssertTrue(baseObject->IsAttemptAcquireSet(), "baseObject->IsAttemptAcquireSet() did not equal true", state);
1090         delete baseObject;
1091     }
1092     BENCHMARK_LOGD("RefbaseTest testRefbase002 end.");
1093 }
1094 
1095 /*
1096  * @tc.name: testRefbase003
1097  * @tc.desc: test AttemptIncStrongRef of RefBase.
1098  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbase003)1099 BENCHMARK_F(BenchmarkRefbaseTest, testRefbase003)(benchmark::State& state)
1100 {
1101     BENCHMARK_LOGD("RefbaseTest testRefbase003 start.");
1102     while (state.KeepRunning()) {
1103         RefBase *baseObject = new RefBase();
1104         baseObject->AttemptIncStrongRef(this);
1105         AssertEqual(baseObject->GetRefCounter()->GetRefCount(), 1, "refs->GetRefCount() did not equal 1", state);
1106         delete baseObject;
1107     }
1108     BENCHMARK_LOGD("RefbaseTest testRefbase003 end.");
1109 }
1110 
1111 /*
1112  * @tc.name: testRefbase004
1113  * @tc.desc: Refbase
1114  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbase004)1115 BENCHMARK_F(BenchmarkRefbaseTest, testRefbase004)(benchmark::State& state)
1116 {
1117     BENCHMARK_LOGD("RefbaseTest testRefbase004 start.");
1118     while (state.KeepRunning()) {
1119         {
1120             sptr<SptrTest> testObject1(new SptrTest());
1121             testObject1->CreateSptr();
1122         }
1123         AssertEqual(g_sptrCount, EXPECTED_REF_COUNT_ZERO, "g_sptrCount did not equal EXPECTED_REF_COUNT_ZERO", state);
1124     }
1125     BENCHMARK_LOGD("RefbaseTest testRefbase004 end.");
1126 }
1127 
1128 /*
1129  * @tc.name: testRefbase005
1130  * @tc.desc: Refbase
1131  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbase005)1132 BENCHMARK_F(BenchmarkRefbaseTest, testRefbase005)(benchmark::State& state)
1133 {
1134     BENCHMARK_LOGD("RefbaseTest testRefbase005 start.");
1135     while (state.KeepRunning()) {
1136         {
1137             sptr<SptrTest1> testObject1(new SptrTest1());
1138             sptr<SptrTest2> testObject2(new SptrTest2());
1139             AssertEqual(g_sptrCount, EXPECTED_REF_COUNT_TWO,
1140                 "g_sptrCount did not equal EXPECTED_REF_COUNT_TWO", state);
1141         }
1142         AssertEqual(g_sptrCount, EXPECTED_REF_COUNT_ZERO, "g_sptrCount did not equal EXPECTED_REF_COUNT_ZERO", state);
1143     }
1144     BENCHMARK_LOGD("RefbaseTest testRefbase005 end.");
1145 }
1146 
1147 /*
1148  * @tc.name: testRefbase006
1149  * @tc.desc: test count of refcounter.
1150  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbase006)1151 BENCHMARK_F(BenchmarkRefbaseTest, testRefbase006)(benchmark::State& state)
1152 {
1153     BENCHMARK_LOGD("RefbaseTest testRefbase006 start.");
1154     while (state.KeepRunning()) {
1155         sptr<RefBase> testObject1(new RefBase());
1156         AssertEqual(testObject1->GetRefCounter()->GetRefCount(), EXPECTED_REF_COUNT_ONE,
1157             "testObject1->GetRefCounter()->GetRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1158         wptr<RefBase> testObject2(testObject1);
1159         AssertEqual(testObject1->GetRefCounter()->GetRefCount(), EXPECTED_REF_COUNT_TWO,
1160             "testObject1->GetRefCounter()->GetRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1161     }
1162     BENCHMARK_LOGD("RefbaseTest testRefbase006 end.");
1163 }
1164 
1165 /*
1166  * @tc.name: testRefbase007
1167  * @tc.desc: test move constructor.
1168  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbase007)1169 BENCHMARK_F(BenchmarkRefbaseTest, testRefbase007)(benchmark::State& state)
1170 {
1171     BENCHMARK_LOGD("RefbaseTest testRefbase007 start.");
1172     while (state.KeepRunning()) {
1173         RefBase baseObject1{};
1174         AssertEqual(baseObject1.GetRefCounter()->GetRefCount(), EXPECTED_REF_COUNT_ONE,
1175             "baseObject1.GetRefCounter()->GetRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1176 
1177         RefBase baseObject2{};
1178         AssertEqual(baseObject2.GetRefCounter()->GetRefCount(), EXPECTED_REF_COUNT_ONE,
1179             "baseObject2.GetRefCounter()->GetRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1180         baseObject2 = std::move(baseObject1);
1181         AssertEqual(baseObject2.GetRefCounter()->GetRefCount(), EXPECTED_REF_COUNT_ONE,
1182             "baseObject2.GetRefCounter()->GetRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1183         AssertEqual(baseObject1.GetRefCounter(), nullptr, "baseObject1.GetRefCounter() did not equal nullptr", state);
1184         AssertEqual(baseObject1.GetSptrRefCount(), EXPECTED_REF_COUNT_ZERO,
1185             "baseObject1.GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ZERO", state);
1186         AssertEqual(baseObject1.GetWptrRefCount(), EXPECTED_REF_COUNT_ZERO,
1187             "baseObject1.GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ZERO", state);
1188 
1189         RefBase baseObject3{};
1190         AssertEqual(baseObject3.GetRefCounter()->GetRefCount(), EXPECTED_REF_COUNT_ONE,
1191             "baseObject3.GetRefCounter()->GetRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1192         baseObject3 = std::move(baseObject2);
1193         AssertEqual(baseObject3.GetRefCounter()->GetRefCount(), EXPECTED_REF_COUNT_ONE,
1194             "baseObject3.GetRefCounter()->GetRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1195         AssertEqual(baseObject2.GetRefCounter(), nullptr, "baseObject2.GetRefCounter() did not equal nullptr", state);
1196         AssertEqual(baseObject2.GetSptrRefCount(), EXPECTED_REF_COUNT_ZERO,
1197             "baseObject2.GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ZERO", state);
1198         AssertEqual(baseObject2.GetWptrRefCount(), EXPECTED_REF_COUNT_ZERO,
1199             "baseObject2.GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ZERO", state);
1200 
1201         baseObject2 = std::move(baseObject1);
1202         AssertEqual(baseObject1.GetRefCounter(), baseObject2.GetRefCounter(),
1203             "baseObject1.GetRefCounter() did not equal baseObject2.GetRefCounter()", state);
1204 
1205         RefBase baseObject4(std::move(baseObject3));
1206         AssertEqual(baseObject4.GetRefCounter()->GetRefCount(), EXPECTED_REF_COUNT_ONE,
1207             "refs->GetRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1208     }
1209     BENCHMARK_LOGD("RefbaseTest testRefbase007 end.");
1210 }
1211 
1212 const int ONE_REF_COUNT = 1;
1213 const int TWO_REF_COUNT = 2;
1214 const int THREE_REF_COUNT = 3;
1215 
1216 template <typename T1, typename T2>
CompOrigWptrAndTarWptr001(const wptr<T1> & origWptr,const wptr<T2> & tarWptr,int value,benchmark::State & state)1217 void CompOrigWptrAndTarWptr001(const wptr<T1> &origWptr, const wptr<T2> &tarWptr, int value, benchmark::State& state)
1218 {
1219     AssertEqual(static_cast<void *>(origWptr.GetRefPtr()), static_cast<void *>(tarWptr.GetRefPtr()),
1220         "testOrigWptrObject.GetRefPtr() did not equal tarWptr.GetRefPtr()", state);
1221 
1222     AssertEqual(static_cast<void *>(&(*origWptr)), static_cast<void *>(&(*tarWptr)),
1223         "&(*testOrigWptrObject) did not equal &(*tarWptr)", state);
1224 
1225     AssertEqual(tarWptr->GetWptrRefCount(), origWptr->GetWptrRefCount(),
1226         "tarWptr->GetWptrRefCount() did not equal testOrigWptrObject->GetWptrRefCount()", state);
1227 
1228     AssertEqual(tarWptr.GetWeakRefCount(), origWptr.GetWeakRefCount(),
1229         "tarWptr.GetWeakRefCount() did not equal testOrigWptrObject.GetWeakRefCount()", state);
1230 
1231     AssertEqual(tarWptr->GetWptrRefCount(), ONE_REF_COUNT,
1232         "tarWptr->GetWptrRefCount() did not equal ONE_REF_COUNT", state);
1233 
1234     if (value == TWO_REF_COUNT) {
1235         AssertEqual(tarWptr.GetWeakRefCount(), TWO_REF_COUNT,
1236             "tarWptr.GetWeakRefCount() did not equal TWO_REF_COUNT", state);
1237     }
1238 
1239     if (value == THREE_REF_COUNT) {
1240         AssertEqual(tarWptr.GetWeakRefCount(), THREE_REF_COUNT,
1241             "tarWptr.GetWeakRefCount() did not equal THREE_REF_COUNT", state);
1242     }
1243 }
1244 
1245 template <typename T1, typename T2>
CompOrigSptrAndTarWptr002(const sptr<T1> & origSptr,const wptr<T2> & tarWptr,int value,benchmark::State & state)1246 void CompOrigSptrAndTarWptr002(const sptr<T1> &origSptr, const wptr<T2> &tarWptr, int value, benchmark::State& state)
1247 {
1248     AssertEqual(static_cast<void *>(origSptr.GetRefPtr()), static_cast<void *>(tarWptr.GetRefPtr()),
1249         "origSptr.GetRefPtr() did not equal tarWptr.GetRefPtr()", state);
1250 
1251     AssertEqual(static_cast<void *>(&(*origSptr)), static_cast<void *>(&(*tarWptr)),
1252         "&(*origSptr) did not equal &(*tarWptr)", state);
1253 
1254     AssertEqual(tarWptr->GetSptrRefCount(), origSptr->GetSptrRefCount(),
1255         "tarWptr->GetSptrRefCount() did not equal origSptr->GetSptrRefCount()", state);
1256 
1257     AssertEqual(tarWptr->GetWptrRefCount(), origSptr->GetWptrRefCount(),
1258         "tarWptr->GetWptrRefCount() did not equal origSptr->GetWptrRefCount()", state);
1259 
1260     AssertEqual(tarWptr->GetSptrRefCount(), ONE_REF_COUNT,
1261         "tarWptr->GetSptrRefCount() did not equal ONE_REF_COUNT", state);
1262 
1263     if (value == TWO_REF_COUNT) {
1264         AssertEqual(tarWptr->GetWptrRefCount(), TWO_REF_COUNT,
1265             "tarWptr->GetWptrRefCount() did not equal TWO_REF_COUNT", state);
1266     }
1267 
1268     if (value == THREE_REF_COUNT) {
1269         AssertEqual(tarWptr->GetWptrRefCount(), THREE_REF_COUNT,
1270             "tarWptr->GetWptrRefCount() did not equal THREE_REF_COUNT", state);
1271     }
1272 
1273     AssertEqual(tarWptr.GetWeakRefCount(), ONE_REF_COUNT,
1274         "tarWptr.GetWeakRefCount() did not equal ONE_REF_COUNT", state);
1275 }
1276 
1277 /*
1278  * @tc.name: testWptrefbase001
1279  * @tc.desc: Copy constructor with same managed class type.
1280  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase001)1281 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase001)(benchmark::State& state)
1282 {
1283     BENCHMARK_LOGD("RefbaseTest testWptrefbase001 start.");
1284     while (state.KeepRunning()) {
1285         // test wptr<T>::wptr(const wptr<T>&)
1286         wptr<WptrTest> testOrigWptrObject(new WptrTest());
1287         AssertEqual(testOrigWptrObject->GetWptrRefCount(), EXPECTED_REF_COUNT_ONE,
1288             "testOrigWptrObject->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1289 
1290         wptr<WptrTest> testTargetWptrObject1(testOrigWptrObject);
1291         CompOrigWptrAndTarWptr001(testOrigWptrObject, testTargetWptrObject1, EXPECTED_REF_COUNT_TWO, state);
1292 
1293         // test wptr<T>::operator=(const wptr<T>&)
1294         wptr<WptrTest> testTargetWptrObject2(new WptrTest());
1295         AssertEqual(testTargetWptrObject2->GetWptrRefCount(), EXPECTED_REF_COUNT_ONE,
1296             "testTargetWptrObject2->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1297 
1298         testTargetWptrObject2 = testOrigWptrObject;
1299         CompOrigWptrAndTarWptr001(testOrigWptrObject, testTargetWptrObject2, EXPECTED_REF_COUNT_THREE, state);
1300 
1301         // test wptr<T>::wptr(const sptr<T>&)
1302         sptr<WptrTest> testOrigSptrObject(new WptrTest());
1303         AssertEqual(testOrigSptrObject->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
1304             "testOrigSptrObject->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE as expected.", state);
1305 
1306         wptr<WptrTest> testTargetWptrObject3(testOrigSptrObject);
1307         CompOrigSptrAndTarWptr002(testOrigSptrObject, testTargetWptrObject3, EXPECTED_REF_COUNT_TWO, state);
1308 
1309         // test wptr<T>::operator=(const sptr<T>&)
1310         wptr<WptrTest> testTargetWptrObject4(new WptrTest());
1311         AssertEqual(testTargetWptrObject4->GetWptrRefCount(), EXPECTED_REF_COUNT_ONE,
1312             "testTargetWptrObject4->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ONE as expected.", state);
1313 
1314         testTargetWptrObject4 = testOrigSptrObject;
1315         CompOrigSptrAndTarWptr002(testOrigSptrObject, testTargetWptrObject4, EXPECTED_REF_COUNT_THREE, state);
1316     }
1317     BENCHMARK_LOGD("RefbaseTest testWptrefbase001 end.");
1318 }
1319 
1320 /*
1321  * @tc.name: testWptrefbase002
1322  * @tc.desc: Copy constructor with different managed class type.
1323  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase002)1324 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase002)(benchmark::State& state)
1325 {
1326     BENCHMARK_LOGD("RefbaseTest testWptrefbase002 start.");
1327     while (state.KeepRunning()) {
1328         // test wptr<T>::wptr(const wptr<O>&)
1329         wptr<WptrTest2> testOrigWptrObject(new WptrTest2());
1330         AssertEqual(testOrigWptrObject->GetWptrRefCount(), EXPECTED_REF_COUNT_ONE,
1331             "testOrigWptrObject->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1332 
1333         wptr<WptrTest> testTargetWptrObject1(testOrigWptrObject);
1334         CompOrigWptrAndTarWptr001(testOrigWptrObject, testTargetWptrObject1, EXPECTED_REF_COUNT_TWO, state);
1335 
1336         // test wptr<T>::operator=(const wptr<O>&)
1337         wptr<WptrTest> testTargetWptrObject2(new WptrTest());
1338         AssertEqual(testTargetWptrObject2->GetWptrRefCount(), EXPECTED_REF_COUNT_ONE,
1339             "testTargetWptrObject2->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1340 
1341         testTargetWptrObject2 = testOrigWptrObject;
1342         CompOrigWptrAndTarWptr001(testOrigWptrObject, testTargetWptrObject2, EXPECTED_REF_COUNT_THREE, state);
1343 
1344         // test wptr<T>::wptr(const sptr<O>&)
1345         sptr<WptrTest2> testOrigSptrObject(new WptrTest2());
1346         AssertEqual(testOrigSptrObject->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
1347             "testOrigSptrObject->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1348 
1349         wptr<WptrTest> testTargetWptrObject3(testOrigSptrObject);
1350         CompOrigSptrAndTarWptr002(testOrigSptrObject, testTargetWptrObject3, EXPECTED_REF_COUNT_TWO, state);
1351 
1352         // test wptr<T>::operator=(const sptr<O>&)
1353         wptr<WptrTest> testTargetWptrObject4(new WptrTest());
1354         AssertEqual(testTargetWptrObject4->GetWptrRefCount(), EXPECTED_REF_COUNT_ONE,
1355             "testTargetWptrObject4->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1356 
1357         testTargetWptrObject4 = testOrigSptrObject;
1358         CompOrigSptrAndTarWptr002(testOrigSptrObject, testTargetWptrObject4, EXPECTED_REF_COUNT_THREE, state);
1359     }
1360     BENCHMARK_LOGD("RefbaseTest testWptrefbase002 end.");
1361 }
1362 
1363 /*
1364  * @tc.name: testWptrefbase003
1365  * @tc.desc: Refbase
1366  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase003)1367 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase003)(benchmark::State& state)
1368 {
1369     BENCHMARK_LOGD("RefbaseTest testWptrefbase003 start.");
1370     while (state.KeepRunning()) {
1371         const wptr<WptrTest> &testObject1(new WptrTest());
1372         wptr<WptrTest> testObject2(testObject1);
1373         AssertEqual(testObject1.GetRefPtr(), testObject2.GetRefPtr(),
1374             "testObject1.GetRefPtr() did not equal testObject2.GetRefPtr()", state);
1375         AssertEqual(testObject1->GetWptrRefCount(), EXPECTED_REF_COUNT_ONE,
1376             "testObject1->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1377         AssertEqual(testObject2->GetWptrRefCount(), EXPECTED_REF_COUNT_ONE,
1378             "testObject2->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1379         AssertEqual(testObject1.GetRefPtr(), testObject2.GetRefPtr(),
1380             "testObject1.GetRefPtr() did not equal testObject2.GetRefPtr()", state);
1381     }
1382     BENCHMARK_LOGD("RefbaseTest testWptrefbase003 end.");
1383 }
1384 
1385 /*
1386  * @tc.name: testWptrefbase004
1387  * @tc.desc: Refbase
1388  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase004)1389 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase004)(benchmark::State& state)
1390 {
1391     BENCHMARK_LOGD("RefbaseTest testWptrefbase004 start.");
1392     while (state.KeepRunning()) {
1393         const sptr<WptrTest2> &testObject1(new WptrTest2());
1394         AssertUnequal(testObject1, nullptr, "testObject1 was not different from nullptr", state);
1395         wptr<WptrTest> testObject2 = testObject1;
1396         AssertEqual(testObject1->GetWptrRefCount(), 2, "testObject1->GetWptrRefCount() did not equal 2", state);
1397     }
1398     BENCHMARK_LOGD("RefbaseTest testWptrefbase004 end.");
1399 }
1400 
1401 /*
1402  * @tc.name: testWptrefbase005
1403  * @tc.desc: wptr without managed object
1404  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase005)1405 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase005)(benchmark::State& state)
1406 {
1407     BENCHMARK_LOGD("RefbaseTest testWptrefbase005 start.");
1408     while (state.KeepRunning()) {
1409         wptr<WptrTest> testObject3;
1410         AssertEqual(testObject3.GetRefPtr(), nullptr, "testObject3.GetRefPtr() did not equal nullptr", state);
1411     }
1412     BENCHMARK_LOGD("RefbaseTest testWptrefbase005 end.");
1413 }
1414 
1415 /*
1416  * @tc.name: testWptrefbase006
1417  * @tc.desc: Refbase
1418  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase006)1419 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase006)(benchmark::State& state)
1420 {
1421     BENCHMARK_LOGD("RefbaseTest testWptrefbase006 start.");
1422     while (state.KeepRunning()) {
1423         wptr<WptrTest> testObject1 = new WptrTest();
1424         wptr<WptrTest> &testObject2 = testObject1;
1425         AssertEqual(testObject2->GetWptrRefCount(), EXPECTED_REF_COUNT_ONE,
1426             "testObject2->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1427     }
1428     BENCHMARK_LOGD("RefbaseTest testWptrefbase006 end.");
1429 }
1430 
1431 /*
1432  * @tc.name: testWptrefbase007
1433  * @tc.desc: Refbase
1434  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase007)1435 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase007)(benchmark::State& state)
1436 {
1437     BENCHMARK_LOGD("RefbaseTest testWptrefbase007 start.");
1438     while (state.KeepRunning()) {
1439         wptr<WptrTest2> testObject1 = new WptrTest2();
1440         wptr<WptrTest2> testObject2 = testObject1.GetRefPtr();
1441         AssertEqual(testObject1->GetWptrRefCount(), EXPECTED_REF_COUNT_TWO,
1442             "testObject1->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1443     }
1444     BENCHMARK_LOGD("RefbaseTest testWptrefbase007 end.");
1445 }
1446 
1447 /*
1448  * @tc.name: testWptrefbase008
1449  * @tc.desc: Refbase
1450  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase008)1451 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase008)(benchmark::State& state)
1452 {
1453     BENCHMARK_LOGD("RefbaseTest testWptrefbase008 start.");
1454     while (state.KeepRunning()) {
1455         wptr<WptrTest> testObject1 = new WptrTest();
1456         wptr<WptrTest2> testObject2;
1457         testObject2 = testObject1.GetRefPtr();
1458         AssertEqual(testObject1->GetWptrRefCount(), EXPECTED_REF_COUNT_TWO,
1459             "testObject1->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1460     }
1461     BENCHMARK_LOGD("RefbaseTest testWptrefbase008 end.");
1462 }
1463 
1464 /*
1465  * @tc.name: testWptrefbase009
1466  * @tc.desc: test Equal-to operator between two wptrs
1467  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase009)1468 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase009)(benchmark::State& state)
1469 {
1470     BENCHMARK_LOGD("RefbaseTest testWptrefbase009 start.");
1471     while (state.KeepRunning()) {
1472         wptr<RefBase> testObject0(new RefBase());
1473         wptr<RefBase> testObject1(new RefBase());
1474         AssertUnequal(testObject0, testObject1, "testObject0 did not unequal testObject1", state);
1475     }
1476     BENCHMARK_LOGD("RefbaseTest testWptrefbase009 end.");
1477 }
1478 
1479 /*
1480  * @tc.name: testWptrefbase010
1481  * @tc.desc: test Not-equal-to operator between two wptrs
1482  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase010)1483 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase010)(benchmark::State& state)
1484 {
1485     BENCHMARK_LOGD("RefbaseTest testWptrefbase010 start.");
1486     while (state.KeepRunning()) {
1487         wptr<RefBase> testObject0(new RefBase());
1488         wptr<RefBase> testObject1(new RefBase());
1489         AssertUnequal(testObject0, testObject1, "testObject0 did not unequal testObject1", state);
1490     }
1491     BENCHMARK_LOGD("RefbaseTest testWptrefbase010 end.");
1492 }
1493 
1494 /*
1495  * @tc.name: testWptrefbase011
1496  * @tc.desc: test Equal-to operator between the wptr and input sptr object
1497  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase011)1498 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase011)(benchmark::State& state)
1499 {
1500     BENCHMARK_LOGD("RefbaseTest testWptrefbase011 start.");
1501     while (state.KeepRunning()) {
1502         wptr<RefBase> testObject0(new RefBase());
1503         sptr<RefBase> testObject1(new RefBase());
1504         AssertUnequal(testObject0, testObject1, "testObject0 did not unequal testObject1", state);
1505         AssertEqual(testObject1->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
1506             "GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1507     }
1508     BENCHMARK_LOGD("RefbaseTest testWptrefbase011 end.");
1509 }
1510 
1511 /*
1512  * @tc.name: testWptrefbase012
1513  * @tc.desc: test Not-equal-to operator between the wptr and input sptr object
1514  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase012)1515 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase012)(benchmark::State& state)
1516 {
1517     BENCHMARK_LOGD("RefbaseTest testWptrefbase012 start.");
1518     while (state.KeepRunning()) {
1519         wptr<RefBase> testObject0(new RefBase());
1520         sptr<RefBase> testObject1(new RefBase());
1521         AssertUnequal(testObject0, testObject1, "testObject0 did not unequal testObject1", state);
1522         AssertEqual(testObject1->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
1523             "GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1524     }
1525     BENCHMARK_LOGD("RefbaseTest testWptrefbase012 end.");
1526 }
1527 
1528 /*
1529  * @tc.name: testWptrefbase013
1530  * @tc.desc: test AttemptIncStrongRef of wptr
1531  */
BENCHMARK_F(BenchmarkRefbaseTest,testWptrefbase013)1532 BENCHMARK_F(BenchmarkRefbaseTest, testWptrefbase013)(benchmark::State& state)
1533 {
1534     BENCHMARK_LOGD("RefbaseTest testWptrefbase013 start.");
1535     while (state.KeepRunning()) {
1536         RefBase *baseObject = new RefBase();
1537         wptr<RefBase> testObject(baseObject);
1538         testObject.AttemptIncStrongRef(this);
1539         AssertEqual(baseObject->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
1540             "baseObject->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1541     }
1542     BENCHMARK_LOGD("RefbaseTest testWptrefbase013 end.");
1543 }
1544 
1545 /*
1546  * @tc.name: testSptrWptrefbase001
1547  * @tc.desc: test interaction between sptr and wptr.
1548  */
BENCHMARK_F(BenchmarkRefbaseTest,testSptrWptrefbase001)1549 BENCHMARK_F(BenchmarkRefbaseTest, testSptrWptrefbase001)(benchmark::State& state)
1550 {
1551     BENCHMARK_LOGD("RefbaseTest testSptrWptrefbase001 start.");
1552     while (state.KeepRunning()) {
1553         wptr<RefBase> testObject1(new RefBase());
1554         AssertEqual(testObject1->GetWptrRefCount(), EXPECTED_REF_COUNT_ONE,
1555             "testObject1->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1556         {
1557             sptr<RefBase> testObject2{};
1558             testObject2 = testObject1;
1559             AssertEqual(testObject2->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
1560             "testObject2->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1561             AssertEqual(testObject2->GetWptrRefCount(), EXPECTED_REF_COUNT_TWO,
1562             "testObject2->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1563 
1564             sptr<RefBase> testObject3 = testObject1.promote();
1565             AssertEqual(testObject2->GetSptrRefCount(), EXPECTED_REF_COUNT_TWO,
1566             "testObject2->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1567             AssertEqual(testObject2->GetWptrRefCount(), EXPECTED_REF_COUNT_THREE,
1568             "testObject2->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_THREE", state);
1569             testObject2->ExtendObjectLifetime();
1570         }
1571         AssertEqual(testObject1->GetWptrRefCount(), EXPECTED_REF_COUNT_ONE,
1572             "testObject1->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1573     }
1574     BENCHMARK_LOGD("RefbaseTest testSptrWptrefbase001 end.");
1575 }
1576 
1577 /*
1578  * @tc.name: testRefbaseDebug001
1579  * @tc.desc: Test for single thread. Tracker can be enabled after construction
1580  *           of sptr.
1581  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbaseDebug001)1582 BENCHMARK_F(BenchmarkRefbaseTest, testRefbaseDebug001)(benchmark::State& state)
1583 {
1584     BENCHMARK_LOGD("RefbaseTest testRefbaseDebug001 start.");
1585     while (state.KeepRunning()) {
1586         sptr<RefBase> testObject1(new RefBase());
1587         testObject1->EnableTracker();
1588         sptr<RefBase> testObject2(testObject1);
1589         AssertEqual(testObject2->GetSptrRefCount(), EXPECTED_REF_COUNT_TWO,
1590             "testObject2->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1591         wptr<RefBase> testObject3(testObject2);
1592         wptr<RefBase> testObject4(testObject3);
1593         AssertEqual(testObject4->GetWptrRefCount(), EXPECTED_REF_COUNT_THREE,
1594             "testObject4->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_THREE", state);
1595     }
1596     BENCHMARK_LOGD("RefbaseTest testRefbaseDebug001 end.");
1597 }
1598 
1599 /*
1600  * @tc.name: testRefbaseDebug002
1601  * @tc.desc: Test for single thread. Tracker can be enabled after construction
1602  *           of wptr.
1603  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbaseDebug002)1604 BENCHMARK_F(BenchmarkRefbaseTest, testRefbaseDebug002)(benchmark::State& state)
1605 {
1606     BENCHMARK_LOGD("RefbaseTest testRefbaseDebug002 start.");
1607     while (state.KeepRunning()) {
1608         wptr<RefBase> testObject1(new RefBase());
1609         testObject1->EnableTracker();
1610         sptr<RefBase> testObject2 = testObject1.promote();
1611         AssertEqual(testObject2->GetSptrRefCount(), EXPECTED_REF_COUNT_ONE,
1612             "testObject2->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1613         wptr<RefBase> testObject3(testObject2);
1614         wptr<RefBase> testObject4(testObject3);
1615         AssertEqual(testObject4->GetWptrRefCount(), EXPECTED_REF_COUNT_THREE,
1616             "testObject4->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_THREE", state);
1617     }
1618     BENCHMARK_LOGD("RefbaseTest testRefbaseDebug002 end.");
1619 }
1620 
1621 /*
1622  * @tc.name: testRefbaseDebug003
1623  * @tc.desc: Test for single thread. Tracker can be enabled with construction
1624  *           of sptr.
1625  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbaseDebug003)1626 BENCHMARK_F(BenchmarkRefbaseTest, testRefbaseDebug003)(benchmark::State& state)
1627 {
1628     BENCHMARK_LOGD("RefbaseTest testRefbaseDebug003 start.");
1629     while (state.KeepRunning()) {
1630         sptr<TestDebug> testObject1(new TestDebug());
1631         sptr<TestDebug> testObject2(testObject1);
1632         sptr<TestDebug> testObject3;
1633         AssertEqual(testObject2->GetSptrRefCount(), EXPECTED_REF_COUNT_TWO,
1634             "testObject2->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1635         testObject3 = testObject2;
1636         wptr<TestDebug> testObject4(testObject3);
1637         AssertEqual(testObject4->GetWptrRefCount(), EXPECTED_REF_COUNT_FOUR,
1638             "testObject4->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_FOUR", state);
1639     }
1640     BENCHMARK_LOGD("RefbaseTest testRefbaseDebug003 end.");
1641 }
1642 
1643 /*
1644  * @tc.name: testRefbaseDebug004
1645  * @tc.desc: Test for mult-thread.
1646  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefbaseDebug004)1647 BENCHMARK_F(BenchmarkRefbaseTest, testRefbaseDebug004)(benchmark::State& state)
1648 {
1649     BENCHMARK_LOGD("RefbaseTest testRefbaseDebug004 start.");
1650     while (state.KeepRunning()) {
1651         sptr<TestDebug> testObject1(new TestDebug());
1652         std::thread subThread {[&testObject1, &state]() {
1653             sptr<TestDebug> subTestObject1(testObject1);
1654             AssertEqual(testObject1->GetSptrRefCount(), EXPECTED_REF_COUNT_TWO,
1655                 "testObject1->GetSptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1656             wptr<TestDebug> subTestObject2(subTestObject1);
1657             wptr<TestDebug> subTestObject3(subTestObject2);
1658         }};
1659         wptr<TestDebug> testObject2(testObject1);
1660         wptr<TestDebug> testObject3(testObject2);
1661         subThread.join();
1662         AssertEqual(testObject3->GetWptrRefCount(), EXPECTED_REF_COUNT_TWO,
1663             "testObject3->GetWptrRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1664     }
1665     BENCHMARK_LOGD("RefbaseTest testRefbaseDebug004 end.");
1666 }
1667 
1668 /*
1669  * @tc.name: testWeakRefCounter001
1670  * @tc.desc: test CreateWeakRef of Refbase,
1671  *           and GetRefPtr, IncWeakRefCount, DecWeakRefCount, GetWeakRefCount, AttemptIncStrongRef of WeakRefCounter.
1672  */
BENCHMARK_F(BenchmarkRefbaseTest,testWeakRefCounter001)1673 BENCHMARK_F(BenchmarkRefbaseTest, testWeakRefCounter001)(benchmark::State& state)
1674 {
1675     BENCHMARK_LOGD("RefbaseTest testWeakRefCounter001 start.");
1676     while (state.KeepRunning()) {
1677         RefBase *baseObject1 = new RefBase();
1678         RefBase *newRefbase = new RefBase();
1679         WeakRefCounter *newWeakRef = baseObject1->CreateWeakRef(newRefbase);
1680         AssertEqual(newWeakRef->GetRefPtr(), newRefbase,
1681             "WeakRefCounter->GetRefPtr() did not equal RefBase object", state);
1682         newWeakRef->IncWeakRefCount(this);
1683         newWeakRef->IncWeakRefCount(this);
1684         AssertEqual(newWeakRef->GetWeakRefCount(), 2, "WeakRefCounter->GetWeakRefCount() did not equal 2", state);
1685         newWeakRef->AttemptIncStrongRef(this);
1686         AssertEqual(baseObject1->GetRefCounter()->GetStrongRefCount(), EXPECTED_REF_COUNT_ONE,
1687             "RefCounter->GetStrongRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1688         newWeakRef->DecWeakRefCount(this);
1689         AssertEqual(newWeakRef->GetWeakRefCount(), EXPECTED_REF_COUNT_ONE,
1690             "WeakRefCounter->GetWeakRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1691         newWeakRef->DecWeakRefCount(this);
1692         delete newRefbase;
1693         delete baseObject1;
1694     }
1695     BENCHMARK_LOGD("RefbaseTest testWeakRefCounter001 end.");
1696 }
1697 
1698 /*
1699  * @tc.name: testRefCounter001
1700  * @tc.desc: Test for IncRefCount, DecRefCount and GetRefCount
1701  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefCounter001)1702 BENCHMARK_F(BenchmarkRefbaseTest, testRefCounter001)(benchmark::State& state)
1703 {
1704     BENCHMARK_LOGD("RefbaseTest testRefCounter001 start.");
1705     while (state.KeepRunning()) {
1706         RefCounter *refs = new RefCounter();
1707         refs->IncRefCount();
1708         refs->IncRefCount();
1709         AssertEqual(refs->GetRefCount(), EXPECTED_REF_COUNT_TWO,
1710             "refs->GetRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1711         refs->DecRefCount();
1712         AssertEqual(refs->GetRefCount(), EXPECTED_REF_COUNT_ONE,
1713             "refs->GetRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1714         refs->DecRefCount();
1715     }
1716     BENCHMARK_LOGD("RefbaseTest testRefCounter001 end.");
1717 }
1718 
1719 /*
1720 @tc.name: testRefCounter002
1721 @tc.desc: Test for SetCallback, RemoveCallback and IsRefPtrValid
1722 */
BENCHMARK_F(BenchmarkRefbaseTest,testRefCounter002)1723 BENCHMARK_F(BenchmarkRefbaseTest, testRefCounter002)(benchmark::State& state)
1724 {
1725     BENCHMARK_LOGD("RefbaseTest testRefCounter002 start.");
1726     while (state.KeepRunning()) {
1727         RefCounter *refs = new RefCounter();
1728         int externalVariable = 0;
1729 
1730         // Use the SetCallback method to set a lambda function as a
1731         // callback that sets the value of externalVariable to 42 (an arbitrary value)
1732         refs->SetCallback([&externalVariable]() { externalVariable = 42; });
1733         AssertTrue(refs->IsRefPtrValid(), "refs->IsRefPtrValid() did not return true", state);
1734         refs->ExtendObjectLifetime();
1735         refs->IncWeakRefCount(this);
1736         refs->DecWeakRefCount(this);
1737         AssertEqual(externalVariable, 42, "externalVariable did not equal 42", state);
1738         refs->RemoveCallback();
1739         AssertFalse(refs->IsRefPtrValid(), "refs->IsRefPtrValid() did not return false", state);
1740         delete refs;
1741     }
1742     BENCHMARK_LOGD("RefbaseTest testRefCounter002 end.");
1743 }
1744 
1745 /*
1746  * @tc.name: testRefCounter003
1747  * @tc.desc: Test for IncStrongRefCount, DecStrongRefCount and GetStrongRefCount
1748  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefCounter003)1749 BENCHMARK_F(BenchmarkRefbaseTest, testRefCounter003)(benchmark::State& state)
1750 {
1751     BENCHMARK_LOGD("RefbaseTest testRefCounter003 start.");
1752     while (state.KeepRunning()) {
1753         RefCounter *refs = new RefCounter();
1754         refs->IncStrongRefCount(this);
1755         int strongCnt = refs->IncStrongRefCount(this);
1756         AssertEqual(strongCnt, EXPECTED_REF_COUNT_ONE,
1757             "Before IncStrongRefCount, strong count was not EXPECTED_REF_COUNT_ONE", state);
1758         AssertEqual(refs->GetStrongRefCount(), EXPECTED_REF_COUNT_TWO,
1759             "After increments, refs->GetStrongRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1760         refs->DecStrongRefCount(this);
1761         AssertEqual(refs->GetStrongRefCount(), EXPECTED_REF_COUNT_ONE,
1762             "After decrement, refs->GetStrongRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1763         strongCnt = refs->DecStrongRefCount(this);
1764         AssertEqual(strongCnt, EXPECTED_REF_COUNT_ONE,
1765             "Before DecStrongRefCount, strong count was not EXPECTED_REF_COUNT_ONE", state);
1766         AssertEqual(refs->GetStrongRefCount(), EXPECTED_REF_COUNT_ZERO,
1767             "At the end, refs->GetStrongRefCount() did not equal EXPECTED_REF_COUNT_ZERO", state);
1768         delete refs;
1769     }
1770     BENCHMARK_LOGD("RefbaseTest testRefCounter003 end.");
1771 }
1772 
1773 /*
1774  * @tc.name: testRefCounter004
1775  * @tc.desc: Test for IncWeakRefCount, DecWeakRefCount and GetWeakRefCount
1776  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefCounter004)1777 BENCHMARK_F(BenchmarkRefbaseTest, testRefCounter004)(benchmark::State& state)
1778 {
1779     BENCHMARK_LOGD("RefbaseTest testRefCounter004 start.");
1780     while (state.KeepRunning()) {
1781         RefCounter *refs = new RefCounter();
1782         refs->IncWeakRefCount(this);
1783         int count = refs->IncWeakRefCount(this);
1784         AssertEqual(count, EXPECTED_REF_COUNT_ONE,
1785             "Before IncWeakRefCount, weak count was not EXPECTED_REF_COUNT_ONE", state);
1786         AssertEqual(refs->GetWeakRefCount(), EXPECTED_REF_COUNT_TWO,
1787             "refs->GetWeakRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1788         refs->DecWeakRefCount(this);
1789         count = refs->DecWeakRefCount(this);
1790         AssertEqual(count, EXPECTED_REF_COUNT_ONE,
1791             "Before DecWeakRefCount, weak count was not EXPECTED_REF_COUNT_ONE", state);
1792         AssertEqual(refs->GetWeakRefCount(), EXPECTED_REF_COUNT_ZERO,
1793             "At the end, refs->GetWeakRefCount() did not equal EXPECTED_REF_COUNT_ZERO", state);
1794         delete refs;
1795     }
1796     BENCHMARK_LOGD("RefbaseTest testRefCounter004 end.");
1797 }
1798 
1799 /*
1800  * @tc.name: testRefCounter005
1801  * @tc.desc: Test for SetAttemptAcquire, IsAttemptAcquireSet and ClearAttemptAcquire
1802  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefCounter005)1803 BENCHMARK_F(BenchmarkRefbaseTest, testRefCounter005)(benchmark::State& state)
1804 {
1805     BENCHMARK_LOGD("RefbaseTest testRefCounter005 start.");
1806     while (state.KeepRunning()) {
1807         RefCounter *refs = new RefCounter();
1808         refs->SetAttemptAcquire();
1809         AssertTrue(refs->IsAttemptAcquireSet(), "refs->IsAttemptAcquireSet() did not return true", state);
1810         refs->ClearAttemptAcquire();
1811         AssertFalse(refs->IsAttemptAcquireSet(), "refs->IsAttemptAcquireSet() did not return false", state);
1812         delete refs;
1813     }
1814     BENCHMARK_LOGD("RefbaseTest testRefCounter005 end.");
1815 }
1816 
1817 /*
1818  * @tc.name: testRefCounter006
1819  * @tc.desc: Test for AttemptIncStrongRef
1820  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefCounter006)1821 BENCHMARK_F(BenchmarkRefbaseTest, testRefCounter006)(benchmark::State& state)
1822 {
1823     BENCHMARK_LOGD("RefbaseTest testRefCounter006 start.");
1824     while (state.KeepRunning()) {
1825         RefCounter *refs = new RefCounter();
1826         int count = 0;
1827         bool result = refs->AttemptIncStrongRef(this, count);
1828         AssertTrue(result, "refs->AttemptIncStrongRef() did not return true", state);
1829         AssertEqual(count, INITIAL_PRIMARY_VALUE, "outCount did not equal INITIAL_PRIMARY_VALUE", state);
1830         AssertEqual(refs->GetStrongRefCount(), EXPECTED_REF_COUNT_ONE,
1831             "refs->GetStrongRefCount() did not equal EXPECTED_REF_COUNT_ONE", state);
1832         refs->DecStrongRefCount(this);
1833         result = refs->AttemptIncStrongRef(this, count);
1834         AssertFalse(result, "refs->AttemptIncStrongRef() did not return false", state);
1835         AssertEqual(refs->GetStrongRefCount(), EXPECTED_REF_COUNT_ZERO,
1836             "refs->GetStrongRefCount() did not equal EXPECTED_REF_COUNT_ZERO", state);
1837         refs->IncStrongRefCount(this);
1838         result = refs->AttemptIncStrongRef(this, count);
1839         AssertTrue(result, "refs->AttemptIncStrongRef() did not return true", state);
1840         AssertEqual(refs->GetStrongRefCount(), EXPECTED_REF_COUNT_TWO,
1841             "refs->GetStrongRefCount() did not equal EXPECTED_REF_COUNT_TWO", state);
1842         delete refs;
1843     }
1844     BENCHMARK_LOGD("RefbaseTest testRefCounter006 end.");
1845 }
1846 
1847 /*
1848  * @tc.name: testRefCounter007
1849  * @tc.desc: Test for AttemptIncStrong
1850  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefCounter007)1851 BENCHMARK_F(BenchmarkRefbaseTest, testRefCounter007)(benchmark::State& state)
1852 {
1853     BENCHMARK_LOGD("RefbaseTest testRefCounter007 start.");
1854     constexpr int incrementByOne = 1;
1855     constexpr int incrementByThree = 3;
1856     while (state.KeepRunning()) {
1857         RefCounter *refs = new RefCounter();
1858         bool result = refs->AttemptIncStrong(this);
1859         AssertTrue(result, "refs->AttemptIncStrong() did not return true", state);
1860         AssertEqual(refs->GetStrongRefCount(), INITIAL_PRIMARY_VALUE + incrementByOne,
1861             "refs->GetStrongRefCount() did not equal INITIAL_PRIMARY_VALUE + incrementByOne", state);
1862         refs->DecStrongRefCount(this);
1863         result = refs->AttemptIncStrong(this);
1864         AssertTrue(result, "refs->AttemptIncStrong() did not return true", state);
1865         AssertEqual(refs->GetStrongRefCount(), INITIAL_PRIMARY_VALUE + incrementByOne,
1866             "refs->GetStrongRefCount() did not equal INITIAL_PRIMARY_VALUE + incrementByOne", state);
1867         refs->IncStrongRefCount(this);
1868         result = refs->AttemptIncStrong(this);
1869         AssertTrue(result, "refs->AttemptIncStrong() did not return true", state);
1870         AssertEqual(refs->GetStrongRefCount(), INITIAL_PRIMARY_VALUE + incrementByThree,
1871             "refs->GetStrongRefCount() did not equal INITIAL_PRIMARY_VALUE + incrementByThree", state);
1872         delete refs;
1873     }
1874     BENCHMARK_LOGD("RefbaseTest testRefCounter007 end.");
1875 }
1876 
1877 /*
1878  * @tc.name: testRefCounter008
1879  * @tc.desc: Test for IsLifeTimeExtended, ExtendObjectLifetime
1880  */
BENCHMARK_F(BenchmarkRefbaseTest,testRefCounter008)1881 BENCHMARK_F(BenchmarkRefbaseTest, testRefCounter008)(benchmark::State& state)
1882 {
1883     BENCHMARK_LOGD("RefbaseTest testRefCounter008 start.");
1884     while (state.KeepRunning()) {
1885         RefCounter *refs = new RefCounter();
1886         AssertFalse(refs->IsLifeTimeExtended(), "refs->IsLifeTimeExtended() did not return false", state);
1887         refs->ExtendObjectLifetime();
1888         AssertTrue(refs->IsLifeTimeExtended(), "refs->IsLifeTimeExtended did not return true", state);
1889         delete refs;
1890     }
1891     BENCHMARK_LOGD("RefbaseTest testRefCounter008 end.");
1892 }
1893 }  // namespace
1894 }  // namespace OHOS
1895 // Run the benchmark
1896 BENCHMARK_MAIN();
1897