• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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();