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();