blob: e7882353bec0520adba173c191b6469568343d6a [file] [log] [blame]
Yangster-mac20877162017-12-22 17:19:39 -08001// Copyright (C) 2017 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 <gtest/gtest.h>
16#include "statsd_test_util.h"
17
18namespace android {
19namespace os {
20namespace statsd {
21
22AtomMatcher CreateWakelockStateChangedAtomMatcher(const string& name,
23 WakelockStateChanged::State state) {
24 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -080025 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -080026 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
27 simple_atom_matcher->set_atom_id(android::util::WAKELOCK_STATE_CHANGED);
28 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
29 field_value_matcher->set_field(4); // State field.
30 field_value_matcher->set_eq_int(state);
31 return atom_matcher;
32}
33
34AtomMatcher CreateAcquireWakelockAtomMatcher() {
35 return CreateWakelockStateChangedAtomMatcher("AcquireWakelock", WakelockStateChanged::ACQUIRE);
36}
37
38AtomMatcher CreateReleaseWakelockAtomMatcher() {
39 return CreateWakelockStateChangedAtomMatcher("ReleaseWakelock", WakelockStateChanged::RELEASE);
40}
41
42AtomMatcher CreateScreenStateChangedAtomMatcher(
43 const string& name, ScreenStateChanged::State state) {
44 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -080045 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -080046 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
47 simple_atom_matcher->set_atom_id(android::util::SCREEN_STATE_CHANGED);
48 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
49 field_value_matcher->set_field(1); // State field.
50 field_value_matcher->set_eq_int(state);
51 return atom_matcher;
52}
53
54AtomMatcher CreateScreenTurnedOnAtomMatcher() {
55 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOn", ScreenStateChanged::STATE_ON);
56}
57
58AtomMatcher CreateScreenTurnedOffAtomMatcher() {
59 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOff", ScreenStateChanged::STATE_OFF);
60}
61
62AtomMatcher CreateSyncStateChangedAtomMatcher(
63 const string& name, SyncStateChanged::State state) {
64 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -080065 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -080066 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
67 simple_atom_matcher->set_atom_id(android::util::SYNC_STATE_CHANGED);
68 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
69 field_value_matcher->set_field(3); // State field.
70 field_value_matcher->set_eq_int(state);
71 return atom_matcher;
72}
73
74AtomMatcher CreateSyncStartAtomMatcher() {
75 return CreateSyncStateChangedAtomMatcher("SyncStart", SyncStateChanged::ON);
76}
77
78AtomMatcher CreateSyncEndAtomMatcher() {
79 return CreateSyncStateChangedAtomMatcher("SyncEnd", SyncStateChanged::OFF);
80}
81
82AtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
83 const string& name, ActivityForegroundStateChanged::Activity activity) {
84 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -080085 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -080086 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
87 simple_atom_matcher->set_atom_id(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED);
88 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
89 field_value_matcher->set_field(4); // Activity field.
90 field_value_matcher->set_eq_int(activity);
91 return atom_matcher;
92}
93
94AtomMatcher CreateMoveToBackgroundAtomMatcher() {
95 return CreateActivityForegroundStateChangedAtomMatcher(
96 "MoveToBackground", ActivityForegroundStateChanged::MOVE_TO_BACKGROUND);
97}
98
99AtomMatcher CreateMoveToForegroundAtomMatcher() {
100 return CreateActivityForegroundStateChangedAtomMatcher(
101 "MoveToForeground", ActivityForegroundStateChanged::MOVE_TO_FOREGROUND);
102}
103
104AtomMatcher CreateProcessLifeCycleStateChangedAtomMatcher(
105 const string& name, ProcessLifeCycleStateChanged::Event event) {
106 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800107 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800108 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
109 simple_atom_matcher->set_atom_id(android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
110 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
111 field_value_matcher->set_field(3); // Process state field.
112 field_value_matcher->set_eq_int(event);
113 return atom_matcher;
114}
115
116AtomMatcher CreateProcessCrashAtomMatcher() {
117 return CreateProcessLifeCycleStateChangedAtomMatcher(
118 "ProcessCrashed", ProcessLifeCycleStateChanged::PROCESS_CRASHED);
119}
120
121
122Predicate CreateScreenIsOnPredicate() {
123 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800124 predicate.set_id(StringToId("ScreenIsOn"));
125 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOn"));
126 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOff"));
Yangster-mac20877162017-12-22 17:19:39 -0800127 return predicate;
128}
129
130Predicate CreateScreenIsOffPredicate() {
131 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800132 predicate.set_id(StringToId("ScreenIsOff"));
133 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOff"));
134 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOn"));
Yangster-mac20877162017-12-22 17:19:39 -0800135 return predicate;
136}
137
138Predicate CreateHoldingWakelockPredicate() {
139 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800140 predicate.set_id(StringToId("HoldingWakelock"));
141 predicate.mutable_simple_predicate()->set_start(StringToId("AcquireWakelock"));
142 predicate.mutable_simple_predicate()->set_stop(StringToId("ReleaseWakelock"));
Yangster-mac20877162017-12-22 17:19:39 -0800143 return predicate;
144}
145
146Predicate CreateIsSyncingPredicate() {
147 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800148 predicate.set_id(StringToId("IsSyncing"));
149 predicate.mutable_simple_predicate()->set_start(StringToId("SyncStart"));
150 predicate.mutable_simple_predicate()->set_stop(StringToId("SyncEnd"));
Yangster-mac20877162017-12-22 17:19:39 -0800151 return predicate;
152}
153
154Predicate CreateIsInBackgroundPredicate() {
155 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800156 predicate.set_id(StringToId("IsInBackground"));
157 predicate.mutable_simple_predicate()->set_start(StringToId("MoveToBackground"));
158 predicate.mutable_simple_predicate()->set_stop(StringToId("MoveToForeground"));
Yangster-mac20877162017-12-22 17:19:39 -0800159 return predicate;
160}
161
162void addPredicateToPredicateCombination(const Predicate& predicate,
163 Predicate* combinationPredicate) {
Yangster-mac94e197c2018-01-02 16:03:03 -0800164 combinationPredicate->mutable_combination()->add_predicate(predicate.id());
Yangster-mac20877162017-12-22 17:19:39 -0800165}
166
167FieldMatcher CreateAttributionUidDimensions(const int atomId,
168 const std::vector<Position>& positions) {
169 FieldMatcher dimensions;
170 dimensions.set_field(atomId);
171 for (const auto position : positions) {
172 auto child = dimensions.add_child();
173 child->set_field(1);
174 child->set_position(position);
175 child->add_child()->set_field(1);
176 }
177 return dimensions;
178}
179
180FieldMatcher CreateAttributionUidAndTagDimensions(const int atomId,
181 const std::vector<Position>& positions) {
182 FieldMatcher dimensions;
183 dimensions.set_field(atomId);
184 for (const auto position : positions) {
185 auto child = dimensions.add_child();
186 child->set_field(1);
187 child->set_position(position);
188 child->add_child()->set_field(1);
189 child->add_child()->set_field(2);
190 }
191 return dimensions;
192}
193
194FieldMatcher CreateDimensions(const int atomId, const std::vector<int>& fields) {
195 FieldMatcher dimensions;
196 dimensions.set_field(atomId);
197 for (const int field : fields) {
198 dimensions.add_child()->set_field(field);
199 }
200 return dimensions;
201}
202
203std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
204 const ScreenStateChanged::State state, uint64_t timestampNs) {
205 auto event = std::make_unique<LogEvent>(android::util::SCREEN_STATE_CHANGED, timestampNs);
206 EXPECT_TRUE(event->write(state));
207 event->init();
208 return event;
209}
210
211std::unique_ptr<LogEvent> CreateWakelockStateChangedEvent(
212 const std::vector<AttributionNode>& attributions, const string& wakelockName,
213 const WakelockStateChanged::State state, uint64_t timestampNs) {
214 auto event = std::make_unique<LogEvent>(android::util::WAKELOCK_STATE_CHANGED, timestampNs);
215 event->write(attributions);
216 event->write(WakelockStateChanged::PARTIAL);
217 event->write(wakelockName);
218 event->write(state);
219 event->init();
220 return event;
221}
222
223std::unique_ptr<LogEvent> CreateAcquireWakelockEvent(
224 const std::vector<AttributionNode>& attributions,
225 const string& wakelockName, uint64_t timestampNs) {
226 return CreateWakelockStateChangedEvent(
227 attributions, wakelockName, WakelockStateChanged::ACQUIRE, timestampNs);
228}
229
230std::unique_ptr<LogEvent> CreateReleaseWakelockEvent(
231 const std::vector<AttributionNode>& attributions,
232 const string& wakelockName, uint64_t timestampNs) {
233 return CreateWakelockStateChangedEvent(
234 attributions, wakelockName, WakelockStateChanged::RELEASE, timestampNs);
235}
236
237std::unique_ptr<LogEvent> CreateActivityForegroundStateChangedEvent(
238 const int uid, const ActivityForegroundStateChanged::Activity activity, uint64_t timestampNs) {
239 auto event = std::make_unique<LogEvent>(
240 android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, timestampNs);
241 event->write(uid);
242 event->write("pkg_name");
243 event->write("class_name");
244 event->write(activity);
245 event->init();
246 return event;
247}
248
249std::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(const int uid, uint64_t timestampNs) {
250 return CreateActivityForegroundStateChangedEvent(
251 uid, ActivityForegroundStateChanged::MOVE_TO_BACKGROUND, timestampNs);
252}
253
254std::unique_ptr<LogEvent> CreateMoveToForegroundEvent(const int uid, uint64_t timestampNs) {
255 return CreateActivityForegroundStateChangedEvent(
256 uid, ActivityForegroundStateChanged::MOVE_TO_FOREGROUND, timestampNs);
257}
258
259std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(
260 const int uid, const string& name, const SyncStateChanged::State state, uint64_t timestampNs) {
261 auto event = std::make_unique<LogEvent>(android::util::SYNC_STATE_CHANGED, timestampNs);
262 event->write(uid);
263 event->write(name);
264 event->write(state);
265 event->init();
266 return event;
267}
268
269std::unique_ptr<LogEvent> CreateSyncStartEvent(
270 const int uid, const string& name, uint64_t timestampNs){
271 return CreateSyncStateChangedEvent(uid, name, SyncStateChanged::ON, timestampNs);
272}
273
274std::unique_ptr<LogEvent> CreateSyncEndEvent(
275 const int uid, const string& name, uint64_t timestampNs) {
276 return CreateSyncStateChangedEvent(uid, name, SyncStateChanged::OFF, timestampNs);
277}
278
279std::unique_ptr<LogEvent> CreateProcessLifeCycleStateChangedEvent(
280 const int uid, const ProcessLifeCycleStateChanged::Event event, uint64_t timestampNs) {
281 auto logEvent = std::make_unique<LogEvent>(
282 android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED, timestampNs);
283 logEvent->write(uid);
284 logEvent->write("");
285 logEvent->write(event);
286 logEvent->init();
287 return logEvent;
288}
289
290std::unique_ptr<LogEvent> CreateAppCrashEvent(const int uid, uint64_t timestampNs) {
291 return CreateProcessLifeCycleStateChangedEvent(
292 uid, ProcessLifeCycleStateChanged::PROCESS_CRASHED, timestampNs);
293}
294
Yangster-macd40053e2018-01-09 16:29:22 -0800295std::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(
296 int isolatedUid, int hostUid, bool is_create, uint64_t timestampNs) {
297 auto logEvent = std::make_unique<LogEvent>(
298 android::util::ISOLATED_UID_CHANGED, timestampNs);
299 logEvent->write(hostUid);
300 logEvent->write(isolatedUid);
301 logEvent->write(is_create);
302 logEvent->init();
303 return logEvent;
304}
305
Yangster-mac20877162017-12-22 17:19:39 -0800306sp<StatsLogProcessor> CreateStatsLogProcessor(const long timeBaseSec, const StatsdConfig& config,
307 const ConfigKey& key) {
308 sp<UidMap> uidMap = new UidMap();
309 sp<AnomalyMonitor> anomalyMonitor = new AnomalyMonitor(10); // 10 seconds
310 sp<StatsLogProcessor> processor = new StatsLogProcessor(
311 uidMap, anomalyMonitor, timeBaseSec, [](const ConfigKey&){});
312 processor->OnConfigUpdated(key, config);
313 return processor;
314}
315
316AttributionNode CreateAttribution(const int& uid, const string& tag) {
317 AttributionNode attribution;
318 attribution.set_uid(uid);
319 attribution.set_tag(tag);
320 return attribution;
321}
322
323void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) {
324 std::sort(events->begin(), events->end(),
325 [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) {
326 return a->GetTimestampNs() < b->GetTimestampNs();
327 });
328}
329
Yangster-mac94e197c2018-01-02 16:03:03 -0800330int64_t StringToId(const string& str) {
331 return static_cast<int64_t>(std::hash<std::string>()(str));
332}
Yangster-macb5bc7412018-01-06 23:17:45 -0800333
334void ValidateAttributionUidDimension(const DimensionsValue& value, int atomId, int uid) {
335 EXPECT_EQ(value.field(), atomId);
336 EXPECT_EQ(value.value_tuple().dimensions_value_size(), 1);
337 // Attribution field.
338 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
339 // Uid only.
340 EXPECT_EQ(value.value_tuple().dimensions_value(0)
341 .value_tuple().dimensions_value_size(), 1);
342 EXPECT_EQ(value.value_tuple().dimensions_value(0)
343 .value_tuple().dimensions_value(0).field(), 1);
344 EXPECT_EQ(value.value_tuple().dimensions_value(0)
345 .value_tuple().dimensions_value(0).value_int(), uid);
346}
347
348void ValidateUidDimension(const DimensionsValue& value, int atomId, int uid) {
349 EXPECT_EQ(value.field(), atomId);
350 EXPECT_EQ(value.value_tuple().dimensions_value_size(), 1);
351 // Attribution field.
352 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
353 // Uid only.
354 EXPECT_EQ(value.value_tuple().dimensions_value(0)
355 .value_tuple().dimensions_value_size(), 1);
356 EXPECT_EQ(value.value_tuple().dimensions_value(0)
357 .value_tuple().dimensions_value(0).field(), 1);
358 EXPECT_EQ(value.value_tuple().dimensions_value(0)
359 .value_tuple().dimensions_value(0).value_int(), uid);
360}
361
362void ValidateAttributionUidAndTagDimension(
363 const DimensionsValue& value, int atomId, int uid, const std::string& tag) {
364 EXPECT_EQ(value.field(), atomId);
365 EXPECT_EQ(value.value_tuple().dimensions_value_size(), 1);
366 // Attribution field.
367 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
368 // Uid only.
369 EXPECT_EQ(value.value_tuple().dimensions_value(0)
370 .value_tuple().dimensions_value_size(), 2);
371 EXPECT_EQ(value.value_tuple().dimensions_value(0)
372 .value_tuple().dimensions_value(0).field(), 1);
373 EXPECT_EQ(value.value_tuple().dimensions_value(0)
374 .value_tuple().dimensions_value(0).value_int(), uid);
375 EXPECT_EQ(value.value_tuple().dimensions_value(0)
376 .value_tuple().dimensions_value(1).field(), 2);
377 EXPECT_EQ(value.value_tuple().dimensions_value(0)
378 .value_tuple().dimensions_value(1).value_str(), tag);
379}
380
Yangster-mac20877162017-12-22 17:19:39 -0800381} // namespace statsd
382} // namespace os
383} // namespace android