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