blob: 76e2097a90b88e7e3fc2c82840a3595069f8ecd1 [file] [log] [blame]
Chenjie Yu0bd73db2018-12-16 07:37:04 -08001// Copyright (C) 2018 The Android Open Source Project
2//
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#include <gmock/gmock.h>
16#include <gtest/gtest.h>
17#include <stdio.h>
18#include <chrono>
19#include <thread>
20#include <vector>
21#include "../metrics/metrics_test_helper.h"
22#include "src/stats_log_util.h"
23#include "tests/statsd_test_util.h"
24
25#ifdef __ANDROID__
26
27namespace android {
28namespace os {
29namespace statsd {
30
31using namespace testing;
32using std::make_shared;
33using std::shared_ptr;
34using std::vector;
35using std::this_thread::sleep_for;
36using testing::Contains;
37
38// cooldown time 1sec.
39int pullTagId = 10014;
40
41bool pullSuccess;
42vector<std::shared_ptr<LogEvent>> pullData;
43long pullDelayNs;
44
45class FakePuller : public StatsPuller {
46public:
47 FakePuller() : StatsPuller(pullTagId){};
48
49private:
50 bool PullInternal(vector<std::shared_ptr<LogEvent>>* data) override {
51 (*data) = pullData;
52 sleep_for(std::chrono::nanoseconds(pullDelayNs));
53 return pullSuccess;
54 }
55};
56
57FakePuller puller;
58
59shared_ptr<LogEvent> createSimpleEvent(int64_t eventTimeNs, int64_t value) {
60 shared_ptr<LogEvent> event = make_shared<LogEvent>(pullTagId, eventTimeNs);
61 event->write(value);
62 event->init();
63 return event;
64}
65
66class StatsPullerTest : public ::testing::Test {
67public:
68 StatsPullerTest() {
69 }
70
71 void SetUp() override {
72 puller.ForceClearCache();
73 pullSuccess = false;
74 pullDelayNs = 0;
75 pullData.clear();
76 }
77};
78
79TEST_F(StatsPullerTest, PullSucces) {
80 pullData.push_back(createSimpleEvent(1111L, 33));
81
82 pullSuccess = true;
83
84 vector<std::shared_ptr<LogEvent>> dataHolder;
85 EXPECT_TRUE(puller.Pull(&dataHolder));
86 EXPECT_EQ(1, dataHolder.size());
87 EXPECT_EQ(pullTagId, dataHolder[0]->GetTagId());
88 EXPECT_EQ(1111L, dataHolder[0]->GetElapsedTimestampNs());
89 EXPECT_EQ(1, dataHolder[0]->size());
90 EXPECT_EQ(33, dataHolder[0]->getValues()[0].mValue.int_value);
91
92 sleep_for(std::chrono::seconds(1));
93
94 pullData.clear();
95 pullData.push_back(createSimpleEvent(2222L, 44));
96
97 pullSuccess = true;
98
99 EXPECT_TRUE(puller.Pull(&dataHolder));
100 EXPECT_EQ(1, dataHolder.size());
101 EXPECT_EQ(pullTagId, dataHolder[0]->GetTagId());
102 EXPECT_EQ(2222L, dataHolder[0]->GetElapsedTimestampNs());
103 EXPECT_EQ(1, dataHolder[0]->size());
104 EXPECT_EQ(44, dataHolder[0]->getValues()[0].mValue.int_value);
105}
106
107TEST_F(StatsPullerTest, PullFailAfterSuccess) {
108 pullData.push_back(createSimpleEvent(1111L, 33));
109
110 pullSuccess = true;
111
112 vector<std::shared_ptr<LogEvent>> dataHolder;
113 EXPECT_TRUE(puller.Pull(&dataHolder));
114 EXPECT_EQ(1, dataHolder.size());
115 EXPECT_EQ(pullTagId, dataHolder[0]->GetTagId());
116 EXPECT_EQ(1111L, dataHolder[0]->GetElapsedTimestampNs());
117 EXPECT_EQ(1, dataHolder[0]->size());
118 EXPECT_EQ(33, dataHolder[0]->getValues()[0].mValue.int_value);
119
120 sleep_for(std::chrono::seconds(1));
121
122 pullData.clear();
123 pullData.push_back(createSimpleEvent(2222L, 44));
124
125 pullSuccess = false;
126 dataHolder.clear();
127 EXPECT_FALSE(puller.Pull(&dataHolder));
128 EXPECT_EQ(0, dataHolder.size());
129
130 pullSuccess = true;
131 dataHolder.clear();
132 EXPECT_FALSE(puller.Pull(&dataHolder));
133 EXPECT_EQ(0, dataHolder.size());
134}
135
136// Test pull takes longer than timeout, 2nd pull happens shorter than cooldown
137TEST_F(StatsPullerTest, PullTakeTooLongAndPullFast) {
138 pullData.push_back(createSimpleEvent(1111L, 33));
139 pullSuccess = true;
140 // timeout is 0.5
141 pullDelayNs = (long)(0.8 * NS_PER_SEC);
142
143 vector<std::shared_ptr<LogEvent>> dataHolder;
144 EXPECT_FALSE(puller.Pull(&dataHolder));
145 EXPECT_EQ(0, dataHolder.size());
146
147 pullData.clear();
148 pullData.push_back(createSimpleEvent(2222L, 44));
149
150 pullSuccess = true;
151 dataHolder.clear();
152 EXPECT_FALSE(puller.Pull(&dataHolder));
153 EXPECT_EQ(0, dataHolder.size());
154}
155
156TEST_F(StatsPullerTest, PullFail) {
157 pullData.push_back(createSimpleEvent(1111L, 33));
158
159 pullSuccess = false;
160
161 vector<std::shared_ptr<LogEvent>> dataHolder;
162 EXPECT_FALSE(puller.Pull(&dataHolder));
163 EXPECT_EQ(0, dataHolder.size());
164}
165
166TEST_F(StatsPullerTest, PullTakeTooLong) {
167 pullData.push_back(createSimpleEvent(1111L, 33));
168
169 pullSuccess = true;
170 pullDelayNs = NS_PER_SEC;
171
172 vector<std::shared_ptr<LogEvent>> dataHolder;
173 EXPECT_FALSE(puller.Pull(&dataHolder));
174 EXPECT_EQ(0, dataHolder.size());
175}
176
177TEST_F(StatsPullerTest, PullTooFast) {
178 pullData.push_back(createSimpleEvent(1111L, 33));
179
180 pullSuccess = true;
181
182 vector<std::shared_ptr<LogEvent>> dataHolder;
183 EXPECT_TRUE(puller.Pull(&dataHolder));
184 EXPECT_EQ(1, dataHolder.size());
185 EXPECT_EQ(pullTagId, dataHolder[0]->GetTagId());
186 EXPECT_EQ(1111L, dataHolder[0]->GetElapsedTimestampNs());
187 EXPECT_EQ(1, dataHolder[0]->size());
188 EXPECT_EQ(33, dataHolder[0]->getValues()[0].mValue.int_value);
189
190 pullData.clear();
191 pullData.push_back(createSimpleEvent(2222L, 44));
192
193 pullSuccess = true;
194
195 dataHolder.clear();
196 EXPECT_TRUE(puller.Pull(&dataHolder));
197 EXPECT_EQ(1, dataHolder.size());
198 EXPECT_EQ(pullTagId, dataHolder[0]->GetTagId());
199 EXPECT_EQ(1111L, dataHolder[0]->GetElapsedTimestampNs());
200 EXPECT_EQ(1, dataHolder[0]->size());
201 EXPECT_EQ(33, dataHolder[0]->getValues()[0].mValue.int_value);
202}
203
204TEST_F(StatsPullerTest, PullFailsAndTooFast) {
205 pullData.push_back(createSimpleEvent(1111L, 33));
206
207 pullSuccess = false;
208
209 vector<std::shared_ptr<LogEvent>> dataHolder;
210 EXPECT_FALSE(puller.Pull(&dataHolder));
211 EXPECT_EQ(0, dataHolder.size());
212
213 pullData.clear();
214 pullData.push_back(createSimpleEvent(2222L, 44));
215
216 pullSuccess = true;
217
218 EXPECT_FALSE(puller.Pull(&dataHolder));
219 EXPECT_EQ(0, dataHolder.size());
220}
221
222} // namespace statsd
223} // namespace os
224} // namespace android
225#else
226GTEST_LOG_(INFO) << "This test does nothing.\n";
227#endif