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 "observer.h"
18 #include <algorithm>
19 #include <iostream>
20 #include <fstream>
21 #include "benchmark_log.h"
22 #include "benchmark_assert.h"
23 using namespace std;
24
25 namespace OHOS {
26 namespace {
27
28 class BenchmarkObserverTest : public benchmark::Fixture {
29 public:
SetUp(const::benchmark::State & state)30 void SetUp(const ::benchmark::State& state) override
31 {
32 }
33
TearDown(const::benchmark::State & state)34 void TearDown(const ::benchmark::State& state) override
35 {
36 }
37
BenchmarkObserverTest()38 BenchmarkObserverTest()
39 {
40 Iterations(iterations);
41 Repetitions(repetitions);
42 ReportAggregatesOnly();
43 }
44
45 ~BenchmarkObserverTest() override = default;
46
47 protected:
48 const int32_t repetitions = 3;
49 const int32_t iterations = 1000;
50 };
51
52 const int EXPECTED_COUNT_ZERO = 0;
53 const int EXPECTED_COUNT_ONE = 1;
54 const int EXPECTED_COUNT_TWO = 2;
55
56 class BookList : public Observable {
57 public:
BookList()58 BookList() { books_.clear(); }
AddBook(const string & book)59 void AddBook(const string& book)
60 {
61 BENCHMARK_LOGD("ObserverTest void AddBook is called.");
62 books_.insert(book);
63 SetChanged();
64 NotifyObservers();
65 }
66
RemoveBook(const string & book)67 void RemoveBook(const string& book)
68 {
69 BENCHMARK_LOGD("ObserverTest void RemoveBook is called.");
70 books_.erase(book);
71 SetChanged();
72 NotifyObservers();
73 }
74
NoChangeNotify()75 void NoChangeNotify()
76 {
77 BENCHMARK_LOGD("ObserverTest void NoChangeNotify is called.");
78 if (HasChanged() == false) {
79 NotifyObservers();
80 }
81 }
82
GetBooks()83 const set<string>& GetBooks() { return books_; }
84 private:
85 set<string> books_;
86 };
87
88 class BookObserver : public Observer {
89 public:
Update(const Observable * o,const ObserverArg *)90 virtual void Update(const Observable* o, const ObserverArg* /* arg */)
91 {
92 BookList* bookList = reinterpret_cast<BookList*>(const_cast<Observable*>(o));
93 books_ = bookList->GetBooks();
94 }
95
GetBooksCount()96 int GetBooksCount() { return static_cast<int>(books_.size()); }
BookExists(const string & book)97 bool BookExists(const string& book) { return books_.count(book) > 0;}
98 private:
99 set<string> books_;
100 };
101
102 /*
103 * @tc.name: test_Observer
104 * @tc.desc: Test add null or repeat observer to the observable object.
105 */
BENCHMARK_F(BenchmarkObserverTest,test_Observer)106 BENCHMARK_F(BenchmarkObserverTest, test_Observer)(benchmark::State& state)
107 {
108 BENCHMARK_LOGD("ObserverTest test_Observer start.");
109 while (state.KeepRunning()) {
110 BookList bookList;
111 bookList.AddObserver(nullptr);
112 shared_ptr<BookObserver> bookObserver1 = make_shared<BookObserver>();
113 bookList.AddObserver(bookObserver1);
114 bookList.AddObserver(bookObserver1);
115 bookList.NoChangeNotify();
116 int ret = bookList.GetObserversCount();
117 AssertEqual(ret, 1, "ret did not equal 1 as expected.", state);
118 }
119 BENCHMARK_LOGD("ObserverTest test_Observer end.");
120 }
121
AddObservers(BookList & bookList,shared_ptr<BookObserver> & bookObserver1,shared_ptr<BookObserver> & bookObserver2,shared_ptr<BookObserver> & bookObserver3,benchmark::State & state)122 void AddObservers(BookList& bookList, shared_ptr<BookObserver>& bookObserver1, shared_ptr<BookObserver>& bookObserver2,
123 shared_ptr<BookObserver>& bookObserver3, benchmark::State& state)
124 {
125 bookList.AddObserver(bookObserver1);
126 bookList.AddObserver(bookObserver2);
127 bookList.AddObserver(bookObserver3);
128 bookList.AddBook("book1");
129
130 AssertEqual(bookObserver1->GetBooksCount(), EXPECTED_COUNT_ONE,
131 "bookObserver1->GetBooksCount() did not equal EXPECTED_COUNT_ONE as expected.", state);
132 AssertEqual(bookObserver2->GetBooksCount(), EXPECTED_COUNT_ONE,
133 "bookObserver2->GetBooksCount() did not equal EXPECTED_COUNT_ONE as expected.", state);
134 AssertEqual(bookObserver3->GetBooksCount(), EXPECTED_COUNT_ONE,
135 "bookObserver3->GetBooksCount() did not equal EXPECTED_COUNT_ONE as expected.", state);
136 }
137
BENCHMARK_F(BenchmarkObserverTest,test_ObserverNotify)138 BENCHMARK_F(BenchmarkObserverTest, test_ObserverNotify)(benchmark::State& state)
139 {
140 BENCHMARK_LOGD("ObserverTest test_ObserverNotify start.");
141 while (state.KeepRunning()) {
142 BookList bookList;
143 shared_ptr<BookObserver> bookObserver1 = make_shared<BookObserver>();
144 shared_ptr<BookObserver> bookObserver2 = make_shared<BookObserver>();
145 shared_ptr<BookObserver> bookObserver3 = make_shared<BookObserver>();
146 AddObservers(bookList, bookObserver1, bookObserver2, bookObserver3, state);
147
148 bookList.RemoveObserver(bookObserver1);
149 bookList.RemoveBook("book1");
150 AssertEqual(bookObserver1->GetBooksCount(), EXPECTED_COUNT_ONE,
151 "bookObserver1->GetBooksCount() did not equal EXPECTED_COUNT_ONE as expected.", state);
152 AssertEqual(bookObserver2->GetBooksCount(), EXPECTED_COUNT_ZERO,
153 "bookObserver2->GetBooksCount() did not equal EXPECTED_COUNT_ZERO as expected.", state);
154 AssertEqual(bookObserver3->GetBooksCount(), EXPECTED_COUNT_ZERO,
155 "bookObserver3->GetBooksCount() did not equal EXPECTED_COUNT_ZERO as expected.", state);
156
157 bookList.RemoveObserver(bookObserver2);
158 bookList.AddBook("book2");
159 bookList.AddBook("book3");
160 AssertEqual(bookObserver1->GetBooksCount(), EXPECTED_COUNT_ONE,
161 "bookObserver1->GetBooksCount() did not equal EXPECTED_COUNT_ONE as expected.", state);
162 AssertEqual(bookObserver2->GetBooksCount(), EXPECTED_COUNT_ZERO,
163 "bookObserver2->GetBooksCount() did not equal EXPECTED_COUNT_ZERO as expected.", state);
164 AssertEqual(bookObserver3->GetBooksCount(), EXPECTED_COUNT_TWO,
165 "bookObserver3->GetBooksCount() did not equal EXPECTED_COUNT_TWO as expected.", state);
166 }
167 BENCHMARK_LOGD("ObserverTest test_ObserverNotify end.");
168 }
169
BENCHMARK_F(BenchmarkObserverTest,test_RemoveAllObserver)170 BENCHMARK_F(BenchmarkObserverTest, test_RemoveAllObserver)(benchmark::State& state)
171 {
172 BENCHMARK_LOGD("ObserverTest test_RemoveAllObserver start.");
173 while (state.KeepRunning()) {
174 BookList bookList;
175 shared_ptr<BookObserver> bookObserver1 = make_shared<BookObserver>();
176 shared_ptr<BookObserver> bookObserver2 = make_shared<BookObserver>();
177 shared_ptr<BookObserver> bookObserver3 = make_shared<BookObserver>();
178 AddObservers(bookList, bookObserver1, bookObserver2, bookObserver3, state);
179
180 bookList.RemoveAllObservers();
181 bookList.RemoveBook("book1");
182 AssertEqual(bookObserver1->GetBooksCount(), EXPECTED_COUNT_ONE,
183 "bookObserver1->GetBooksCount() did not equal EXPECTED_COUNT_ONE as expected.", state);
184 AssertEqual(bookObserver2->GetBooksCount(), EXPECTED_COUNT_ONE,
185 "bookObserver2->GetBooksCount() did not equal EXPECTED_COUNT_ONE as expected.", state);
186 AssertEqual(bookObserver3->GetBooksCount(), EXPECTED_COUNT_ONE,
187 "bookObserver3->GetBooksCount() did not equal EXPECTED_COUNT_ONE as expected.", state);
188 AssertEqual(bookList.GetObserversCount(), EXPECTED_COUNT_ZERO,
189 "bookList.GetObserversCount() did not equal EXPECTED_COUNT_ZERO as expected.", state);
190 }
191 BENCHMARK_LOGD("ObserverTest test_RemoveAllObserver end.");
192 }
193 } // namespace
194 } // namespace OHOS
195 // Run the benchmark
196 BENCHMARK_MAIN();