blob: 2c4f3c7692c904cbb28e926d3416c9ab67d231e6 [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
Yangster-mac20877162017-12-22 17:19:39 -080015#include "statsd_test_util.h"
16
17namespace android {
18namespace os {
19namespace statsd {
20
Yangster-mac15f6bbc2018-04-08 11:52:26 -070021
Yangster-mac87718e22018-01-11 16:16:26 -080022AtomMatcher CreateSimpleAtomMatcher(const string& name, int atomId) {
23 AtomMatcher atom_matcher;
24 atom_matcher.set_id(StringToId(name));
25 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
26 simple_atom_matcher->set_atom_id(atomId);
27 return atom_matcher;
28}
29
Yangster-mac15f6bbc2018-04-08 11:52:26 -070030AtomMatcher CreateTemperatureAtomMatcher() {
31 return CreateSimpleAtomMatcher("TemperatureMatcher", android::util::TEMPERATURE);
32}
33
Yangster13fb7e42018-03-07 17:30:49 -080034AtomMatcher CreateScheduledJobStateChangedAtomMatcher(const string& name,
35 ScheduledJobStateChanged::State state) {
36 AtomMatcher atom_matcher;
37 atom_matcher.set_id(StringToId(name));
38 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
39 simple_atom_matcher->set_atom_id(android::util::SCHEDULED_JOB_STATE_CHANGED);
40 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
41 field_value_matcher->set_field(3); // State field.
42 field_value_matcher->set_eq_int(state);
43 return atom_matcher;
44}
45
46AtomMatcher CreateStartScheduledJobAtomMatcher() {
47 return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobStart",
48 ScheduledJobStateChanged::STARTED);
49}
50
51AtomMatcher CreateFinishScheduledJobAtomMatcher() {
52 return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobFinish",
53 ScheduledJobStateChanged::FINISHED);
54}
55
Yangster-mac93694462018-01-22 20:49:31 -080056AtomMatcher CreateScreenBrightnessChangedAtomMatcher() {
57 AtomMatcher atom_matcher;
58 atom_matcher.set_id(StringToId("ScreenBrightnessChanged"));
59 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
60 simple_atom_matcher->set_atom_id(android::util::SCREEN_BRIGHTNESS_CHANGED);
61 return atom_matcher;
62}
63
64AtomMatcher CreateUidProcessStateChangedAtomMatcher() {
65 AtomMatcher atom_matcher;
66 atom_matcher.set_id(StringToId("UidProcessStateChanged"));
67 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
68 simple_atom_matcher->set_atom_id(android::util::UID_PROCESS_STATE_CHANGED);
69 return atom_matcher;
70}
71
Yangster-mac20877162017-12-22 17:19:39 -080072AtomMatcher CreateWakelockStateChangedAtomMatcher(const string& name,
73 WakelockStateChanged::State state) {
74 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -080075 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -080076 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
77 simple_atom_matcher->set_atom_id(android::util::WAKELOCK_STATE_CHANGED);
78 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
79 field_value_matcher->set_field(4); // State field.
80 field_value_matcher->set_eq_int(state);
81 return atom_matcher;
82}
83
84AtomMatcher CreateAcquireWakelockAtomMatcher() {
85 return CreateWakelockStateChangedAtomMatcher("AcquireWakelock", WakelockStateChanged::ACQUIRE);
86}
87
88AtomMatcher CreateReleaseWakelockAtomMatcher() {
89 return CreateWakelockStateChangedAtomMatcher("ReleaseWakelock", WakelockStateChanged::RELEASE);
90}
91
Yangster-mac93694462018-01-22 20:49:31 -080092AtomMatcher CreateBatterySaverModeStateChangedAtomMatcher(
93 const string& name, BatterySaverModeStateChanged::State state) {
94 AtomMatcher atom_matcher;
95 atom_matcher.set_id(StringToId(name));
96 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
97 simple_atom_matcher->set_atom_id(android::util::BATTERY_SAVER_MODE_STATE_CHANGED);
98 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
99 field_value_matcher->set_field(1); // State field.
100 field_value_matcher->set_eq_int(state);
101 return atom_matcher;
102}
103
104AtomMatcher CreateBatterySaverModeStartAtomMatcher() {
105 return CreateBatterySaverModeStateChangedAtomMatcher(
106 "BatterySaverModeStart", BatterySaverModeStateChanged::ON);
107}
108
109
110AtomMatcher CreateBatterySaverModeStopAtomMatcher() {
111 return CreateBatterySaverModeStateChangedAtomMatcher(
112 "BatterySaverModeStop", BatterySaverModeStateChanged::OFF);
113}
114
115
Yangster-mac20877162017-12-22 17:19:39 -0800116AtomMatcher CreateScreenStateChangedAtomMatcher(
Bookatz1a1b0462018-01-12 11:47:03 -0800117 const string& name, android::view::DisplayStateEnum state) {
Yangster-mac20877162017-12-22 17:19:39 -0800118 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800119 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800120 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
121 simple_atom_matcher->set_atom_id(android::util::SCREEN_STATE_CHANGED);
122 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
123 field_value_matcher->set_field(1); // State field.
124 field_value_matcher->set_eq_int(state);
125 return atom_matcher;
126}
127
Yangster-mac93694462018-01-22 20:49:31 -0800128
Yangster-mac20877162017-12-22 17:19:39 -0800129AtomMatcher CreateScreenTurnedOnAtomMatcher() {
Bookatz1a1b0462018-01-12 11:47:03 -0800130 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOn",
131 android::view::DisplayStateEnum::DISPLAY_STATE_ON);
Yangster-mac20877162017-12-22 17:19:39 -0800132}
133
134AtomMatcher CreateScreenTurnedOffAtomMatcher() {
Bookatz1a1b0462018-01-12 11:47:03 -0800135 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOff",
136 ::android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
Yangster-mac20877162017-12-22 17:19:39 -0800137}
138
139AtomMatcher CreateSyncStateChangedAtomMatcher(
140 const string& name, SyncStateChanged::State state) {
141 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800142 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800143 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
144 simple_atom_matcher->set_atom_id(android::util::SYNC_STATE_CHANGED);
145 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
146 field_value_matcher->set_field(3); // State field.
147 field_value_matcher->set_eq_int(state);
148 return atom_matcher;
149}
150
151AtomMatcher CreateSyncStartAtomMatcher() {
152 return CreateSyncStateChangedAtomMatcher("SyncStart", SyncStateChanged::ON);
153}
154
155AtomMatcher CreateSyncEndAtomMatcher() {
156 return CreateSyncStateChangedAtomMatcher("SyncEnd", SyncStateChanged::OFF);
157}
158
159AtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800160 const string& name, ActivityForegroundStateChanged::State state) {
Yangster-mac20877162017-12-22 17:19:39 -0800161 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800162 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800163 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
164 simple_atom_matcher->set_atom_id(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED);
165 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
166 field_value_matcher->set_field(4); // Activity field.
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800167 field_value_matcher->set_eq_int(state);
Yangster-mac20877162017-12-22 17:19:39 -0800168 return atom_matcher;
169}
170
171AtomMatcher CreateMoveToBackgroundAtomMatcher() {
172 return CreateActivityForegroundStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800173 "Background", ActivityForegroundStateChanged::BACKGROUND);
Yangster-mac20877162017-12-22 17:19:39 -0800174}
175
176AtomMatcher CreateMoveToForegroundAtomMatcher() {
177 return CreateActivityForegroundStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800178 "Foreground", ActivityForegroundStateChanged::FOREGROUND);
Yangster-mac20877162017-12-22 17:19:39 -0800179}
180
181AtomMatcher CreateProcessLifeCycleStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800182 const string& name, ProcessLifeCycleStateChanged::State state) {
Yangster-mac20877162017-12-22 17:19:39 -0800183 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800184 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800185 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
186 simple_atom_matcher->set_atom_id(android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
187 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
188 field_value_matcher->set_field(3); // Process state field.
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800189 field_value_matcher->set_eq_int(state);
Yangster-mac20877162017-12-22 17:19:39 -0800190 return atom_matcher;
191}
192
193AtomMatcher CreateProcessCrashAtomMatcher() {
194 return CreateProcessLifeCycleStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800195 "Crashed", ProcessLifeCycleStateChanged::CRASHED);
Yangster-mac20877162017-12-22 17:19:39 -0800196}
197
Yangster13fb7e42018-03-07 17:30:49 -0800198Predicate CreateScheduledJobPredicate() {
199 Predicate predicate;
200 predicate.set_id(StringToId("ScheduledJobRunningPredicate"));
201 predicate.mutable_simple_predicate()->set_start(StringToId("ScheduledJobStart"));
202 predicate.mutable_simple_predicate()->set_stop(StringToId("ScheduledJobFinish"));
203 return predicate;
204}
205
Yangster-mac93694462018-01-22 20:49:31 -0800206Predicate CreateBatterySaverModePredicate() {
207 Predicate predicate;
208 predicate.set_id(StringToId("BatterySaverIsOn"));
209 predicate.mutable_simple_predicate()->set_start(StringToId("BatterySaverModeStart"));
210 predicate.mutable_simple_predicate()->set_stop(StringToId("BatterySaverModeStop"));
211 return predicate;
212}
Yangster-mac20877162017-12-22 17:19:39 -0800213
214Predicate CreateScreenIsOnPredicate() {
215 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800216 predicate.set_id(StringToId("ScreenIsOn"));
217 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOn"));
218 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOff"));
Yangster-mac20877162017-12-22 17:19:39 -0800219 return predicate;
220}
221
222Predicate CreateScreenIsOffPredicate() {
223 Predicate predicate;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800224 predicate.set_id(1111123);
Yangster-mac94e197c2018-01-02 16:03:03 -0800225 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOff"));
226 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOn"));
Yangster-mac20877162017-12-22 17:19:39 -0800227 return predicate;
228}
229
230Predicate CreateHoldingWakelockPredicate() {
231 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800232 predicate.set_id(StringToId("HoldingWakelock"));
233 predicate.mutable_simple_predicate()->set_start(StringToId("AcquireWakelock"));
234 predicate.mutable_simple_predicate()->set_stop(StringToId("ReleaseWakelock"));
Yangster-mac20877162017-12-22 17:19:39 -0800235 return predicate;
236}
237
238Predicate CreateIsSyncingPredicate() {
239 Predicate predicate;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800240 predicate.set_id(33333333333333);
Yangster-mac94e197c2018-01-02 16:03:03 -0800241 predicate.mutable_simple_predicate()->set_start(StringToId("SyncStart"));
242 predicate.mutable_simple_predicate()->set_stop(StringToId("SyncEnd"));
Yangster-mac20877162017-12-22 17:19:39 -0800243 return predicate;
244}
245
246Predicate CreateIsInBackgroundPredicate() {
247 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800248 predicate.set_id(StringToId("IsInBackground"));
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800249 predicate.mutable_simple_predicate()->set_start(StringToId("Background"));
250 predicate.mutable_simple_predicate()->set_stop(StringToId("Foreground"));
Yangster-mac20877162017-12-22 17:19:39 -0800251 return predicate;
252}
253
254void addPredicateToPredicateCombination(const Predicate& predicate,
255 Predicate* combinationPredicate) {
Yangster-mac94e197c2018-01-02 16:03:03 -0800256 combinationPredicate->mutable_combination()->add_predicate(predicate.id());
Yangster-mac20877162017-12-22 17:19:39 -0800257}
258
259FieldMatcher CreateAttributionUidDimensions(const int atomId,
260 const std::vector<Position>& positions) {
261 FieldMatcher dimensions;
262 dimensions.set_field(atomId);
263 for (const auto position : positions) {
264 auto child = dimensions.add_child();
265 child->set_field(1);
266 child->set_position(position);
267 child->add_child()->set_field(1);
268 }
269 return dimensions;
270}
271
272FieldMatcher CreateAttributionUidAndTagDimensions(const int atomId,
273 const std::vector<Position>& positions) {
274 FieldMatcher dimensions;
275 dimensions.set_field(atomId);
276 for (const auto position : positions) {
277 auto child = dimensions.add_child();
278 child->set_field(1);
279 child->set_position(position);
280 child->add_child()->set_field(1);
281 child->add_child()->set_field(2);
282 }
283 return dimensions;
284}
285
286FieldMatcher CreateDimensions(const int atomId, const std::vector<int>& fields) {
287 FieldMatcher dimensions;
288 dimensions.set_field(atomId);
289 for (const int field : fields) {
290 dimensions.add_child()->set_field(field);
291 }
292 return dimensions;
293}
294
295std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
Bookatz1a1b0462018-01-12 11:47:03 -0800296 const android::view::DisplayStateEnum state, uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800297 auto event = std::make_unique<LogEvent>(android::util::SCREEN_STATE_CHANGED, timestampNs);
298 EXPECT_TRUE(event->write(state));
299 event->init();
300 return event;
301}
302
Yangster-mac93694462018-01-22 20:49:31 -0800303std::unique_ptr<LogEvent> CreateBatterySaverOnEvent(uint64_t timestampNs) {
304 auto event = std::make_unique<LogEvent>(
305 android::util::BATTERY_SAVER_MODE_STATE_CHANGED, timestampNs);
306 EXPECT_TRUE(event->write(BatterySaverModeStateChanged::ON));
307 event->init();
308 return event;
309}
310
311std::unique_ptr<LogEvent> CreateBatterySaverOffEvent(uint64_t timestampNs) {
312 auto event = std::make_unique<LogEvent>(
313 android::util::BATTERY_SAVER_MODE_STATE_CHANGED, timestampNs);
314 EXPECT_TRUE(event->write(BatterySaverModeStateChanged::OFF));
315 event->init();
316 return event;
317}
318
319std::unique_ptr<LogEvent> CreateScreenBrightnessChangedEvent(
320 int level, uint64_t timestampNs) {
321 auto event = std::make_unique<LogEvent>(android::util::SCREEN_BRIGHTNESS_CHANGED, timestampNs);
322 EXPECT_TRUE(event->write(level));
323 event->init();
324 return event;
325
326}
327
Yangster13fb7e42018-03-07 17:30:49 -0800328std::unique_ptr<LogEvent> CreateScheduledJobStateChangedEvent(
329 const std::vector<AttributionNodeInternal>& attributions, const string& jobName,
330 const ScheduledJobStateChanged::State state, uint64_t timestampNs) {
331 auto event = std::make_unique<LogEvent>(android::util::SCHEDULED_JOB_STATE_CHANGED, timestampNs);
332 event->write(attributions);
333 event->write(jobName);
334 event->write(state);
335 event->init();
336 return event;
337}
338
339std::unique_ptr<LogEvent> CreateStartScheduledJobEvent(
340 const std::vector<AttributionNodeInternal>& attributions,
341 const string& name, uint64_t timestampNs) {
342 return CreateScheduledJobStateChangedEvent(
343 attributions, name, ScheduledJobStateChanged::STARTED, timestampNs);
344}
345
346// Create log event when scheduled job finishes.
347std::unique_ptr<LogEvent> CreateFinishScheduledJobEvent(
348 const std::vector<AttributionNodeInternal>& attributions,
349 const string& name, uint64_t timestampNs) {
350 return CreateScheduledJobStateChangedEvent(
351 attributions, name, ScheduledJobStateChanged::FINISHED, timestampNs);
352}
353
Yangster-mac20877162017-12-22 17:19:39 -0800354std::unique_ptr<LogEvent> CreateWakelockStateChangedEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800355 const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
356 const WakelockStateChanged::State state, uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800357 auto event = std::make_unique<LogEvent>(android::util::WAKELOCK_STATE_CHANGED, timestampNs);
358 event->write(attributions);
Bookatz1a1b0462018-01-12 11:47:03 -0800359 event->write(android::os::WakeLockLevelEnum::PARTIAL_WAKE_LOCK);
Yangster-mac20877162017-12-22 17:19:39 -0800360 event->write(wakelockName);
361 event->write(state);
362 event->init();
363 return event;
364}
365
366std::unique_ptr<LogEvent> CreateAcquireWakelockEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800367 const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
368 uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800369 return CreateWakelockStateChangedEvent(
370 attributions, wakelockName, WakelockStateChanged::ACQUIRE, timestampNs);
371}
372
373std::unique_ptr<LogEvent> CreateReleaseWakelockEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800374 const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
375 uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800376 return CreateWakelockStateChangedEvent(
377 attributions, wakelockName, WakelockStateChanged::RELEASE, timestampNs);
378}
379
380std::unique_ptr<LogEvent> CreateActivityForegroundStateChangedEvent(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800381 const int uid, const ActivityForegroundStateChanged::State state, uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800382 auto event = std::make_unique<LogEvent>(
383 android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, timestampNs);
384 event->write(uid);
385 event->write("pkg_name");
386 event->write("class_name");
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800387 event->write(state);
Yangster-mac20877162017-12-22 17:19:39 -0800388 event->init();
389 return event;
390}
391
392std::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(const int uid, uint64_t timestampNs) {
393 return CreateActivityForegroundStateChangedEvent(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800394 uid, ActivityForegroundStateChanged::BACKGROUND, timestampNs);
Yangster-mac20877162017-12-22 17:19:39 -0800395}
396
397std::unique_ptr<LogEvent> CreateMoveToForegroundEvent(const int uid, uint64_t timestampNs) {
398 return CreateActivityForegroundStateChangedEvent(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800399 uid, ActivityForegroundStateChanged::FOREGROUND, timestampNs);
Yangster-mac20877162017-12-22 17:19:39 -0800400}
401
402std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800403 const std::vector<AttributionNodeInternal>& attributions, const string& name,
404 const SyncStateChanged::State state, uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800405 auto event = std::make_unique<LogEvent>(android::util::SYNC_STATE_CHANGED, timestampNs);
Yangster-mac93694462018-01-22 20:49:31 -0800406 event->write(attributions);
Yangster-mac20877162017-12-22 17:19:39 -0800407 event->write(name);
408 event->write(state);
409 event->init();
410 return event;
411}
412
413std::unique_ptr<LogEvent> CreateSyncStartEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800414 const std::vector<AttributionNodeInternal>& attributions, const string& name,
415 uint64_t timestampNs) {
Yangster-mac93694462018-01-22 20:49:31 -0800416 return CreateSyncStateChangedEvent(attributions, name, SyncStateChanged::ON, timestampNs);
Yangster-mac20877162017-12-22 17:19:39 -0800417}
418
419std::unique_ptr<LogEvent> CreateSyncEndEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800420 const std::vector<AttributionNodeInternal>& attributions, const string& name,
421 uint64_t timestampNs) {
Yangster-mac93694462018-01-22 20:49:31 -0800422 return CreateSyncStateChangedEvent(attributions, name, SyncStateChanged::OFF, timestampNs);
Yangster-mac20877162017-12-22 17:19:39 -0800423}
424
425std::unique_ptr<LogEvent> CreateProcessLifeCycleStateChangedEvent(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800426 const int uid, const ProcessLifeCycleStateChanged::State state, uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800427 auto logEvent = std::make_unique<LogEvent>(
428 android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED, timestampNs);
429 logEvent->write(uid);
430 logEvent->write("");
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800431 logEvent->write(state);
Yangster-mac20877162017-12-22 17:19:39 -0800432 logEvent->init();
433 return logEvent;
434}
435
436std::unique_ptr<LogEvent> CreateAppCrashEvent(const int uid, uint64_t timestampNs) {
437 return CreateProcessLifeCycleStateChangedEvent(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800438 uid, ProcessLifeCycleStateChanged::CRASHED, timestampNs);
Yangster-mac20877162017-12-22 17:19:39 -0800439}
440
Yangster-macd40053e2018-01-09 16:29:22 -0800441std::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(
442 int isolatedUid, int hostUid, bool is_create, uint64_t timestampNs) {
443 auto logEvent = std::make_unique<LogEvent>(
444 android::util::ISOLATED_UID_CHANGED, timestampNs);
445 logEvent->write(hostUid);
446 logEvent->write(isolatedUid);
447 logEvent->write(is_create);
448 logEvent->init();
449 return logEvent;
450}
451
Yangster-mac15f6bbc2018-04-08 11:52:26 -0700452sp<StatsLogProcessor> CreateStatsLogProcessor(const int64_t timeBaseNs, const int64_t currentTimeNs,
453 const StatsdConfig& config, const ConfigKey& key) {
Yangster-mac20877162017-12-22 17:19:39 -0800454 sp<UidMap> uidMap = new UidMap();
Chenjie Yue2219202018-06-08 10:07:51 -0700455 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster-macbe10ddf2018-03-13 15:39:51 -0700456 sp<AlarmMonitor> anomalyAlarmMonitor =
457 new AlarmMonitor(1, [](const sp<IStatsCompanionService>&, int64_t){},
458 [](const sp<IStatsCompanionService>&){});
Yangster-mac684d1952018-03-24 16:47:16 -0700459 sp<AlarmMonitor> periodicAlarmMonitor =
460 new AlarmMonitor(1, [](const sp<IStatsCompanionService>&, int64_t){},
461 [](const sp<IStatsCompanionService>&){});
Chenjie Yue2219202018-06-08 10:07:51 -0700462 sp<StatsLogProcessor> processor =
463 new StatsLogProcessor(uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor,
Tej Singh6ede28b2019-01-29 17:06:54 -0800464 timeBaseNs, [](const ConfigKey&) { return true; },
465 [](const int&, const vector<int64_t>&) {return true;});
Yangster-mac15f6bbc2018-04-08 11:52:26 -0700466 processor->OnConfigUpdated(currentTimeNs, key, config);
Yangster-mac20877162017-12-22 17:19:39 -0800467 return processor;
468}
469
Yao Chen9c1debe2018-02-19 14:39:19 -0800470AttributionNodeInternal CreateAttribution(const int& uid, const string& tag) {
471 AttributionNodeInternal attribution;
Yangster-mac20877162017-12-22 17:19:39 -0800472 attribution.set_uid(uid);
473 attribution.set_tag(tag);
474 return attribution;
475}
476
477void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) {
478 std::sort(events->begin(), events->end(),
479 [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) {
Yangster-mac330af582018-02-08 15:24:38 -0800480 return a->GetElapsedTimestampNs() < b->GetElapsedTimestampNs();
Yangster-mac20877162017-12-22 17:19:39 -0800481 });
482}
483
Yangster-mac94e197c2018-01-02 16:03:03 -0800484int64_t StringToId(const string& str) {
485 return static_cast<int64_t>(std::hash<std::string>()(str));
486}
Yangster-macb5bc7412018-01-06 23:17:45 -0800487
488void ValidateAttributionUidDimension(const DimensionsValue& value, int atomId, int uid) {
489 EXPECT_EQ(value.field(), atomId);
Yangster-macb5bc7412018-01-06 23:17:45 -0800490 // Attribution field.
491 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
492 // Uid only.
493 EXPECT_EQ(value.value_tuple().dimensions_value(0)
494 .value_tuple().dimensions_value_size(), 1);
495 EXPECT_EQ(value.value_tuple().dimensions_value(0)
496 .value_tuple().dimensions_value(0).field(), 1);
497 EXPECT_EQ(value.value_tuple().dimensions_value(0)
498 .value_tuple().dimensions_value(0).value_int(), uid);
499}
500
501void ValidateUidDimension(const DimensionsValue& value, int atomId, int uid) {
502 EXPECT_EQ(value.field(), atomId);
503 EXPECT_EQ(value.value_tuple().dimensions_value_size(), 1);
504 // Attribution field.
505 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
506 // Uid only.
507 EXPECT_EQ(value.value_tuple().dimensions_value(0)
508 .value_tuple().dimensions_value_size(), 1);
509 EXPECT_EQ(value.value_tuple().dimensions_value(0)
510 .value_tuple().dimensions_value(0).field(), 1);
511 EXPECT_EQ(value.value_tuple().dimensions_value(0)
512 .value_tuple().dimensions_value(0).value_int(), uid);
513}
514
Yangster-mace06cfd72018-03-10 23:22:59 -0800515void ValidateUidDimension(const DimensionsValue& value, int node_idx, int atomId, int uid) {
516 EXPECT_EQ(value.field(), atomId);
517 EXPECT_GT(value.value_tuple().dimensions_value_size(), node_idx);
518 // Attribution field.
519 EXPECT_EQ(value.value_tuple().dimensions_value(node_idx).field(), 1);
520 EXPECT_EQ(value.value_tuple().dimensions_value(node_idx)
521 .value_tuple().dimensions_value(0).field(), 1);
522 EXPECT_EQ(value.value_tuple().dimensions_value(node_idx)
523 .value_tuple().dimensions_value(0).value_int(), uid);
524}
525
526void ValidateAttributionUidAndTagDimension(
527 const DimensionsValue& value, int node_idx, int atomId, int uid, const std::string& tag) {
528 EXPECT_EQ(value.field(), atomId);
529 EXPECT_GT(value.value_tuple().dimensions_value_size(), node_idx);
530 // Attribution field.
531 EXPECT_EQ(1, value.value_tuple().dimensions_value(node_idx).field());
532 // Uid only.
533 EXPECT_EQ(2, value.value_tuple().dimensions_value(node_idx)
534 .value_tuple().dimensions_value_size());
535 EXPECT_EQ(1, value.value_tuple().dimensions_value(node_idx)
536 .value_tuple().dimensions_value(0).field());
537 EXPECT_EQ(uid, value.value_tuple().dimensions_value(node_idx)
538 .value_tuple().dimensions_value(0).value_int());
539 EXPECT_EQ(2, value.value_tuple().dimensions_value(node_idx)
540 .value_tuple().dimensions_value(1).field());
541 EXPECT_EQ(tag, value.value_tuple().dimensions_value(node_idx)
542 .value_tuple().dimensions_value(1).value_str());
543}
544
Yangster-macb5bc7412018-01-06 23:17:45 -0800545void ValidateAttributionUidAndTagDimension(
546 const DimensionsValue& value, int atomId, int uid, const std::string& tag) {
547 EXPECT_EQ(value.field(), atomId);
Yangster-mace06cfd72018-03-10 23:22:59 -0800548 EXPECT_EQ(1, value.value_tuple().dimensions_value_size());
Yangster-macb5bc7412018-01-06 23:17:45 -0800549 // Attribution field.
Yangster-mace06cfd72018-03-10 23:22:59 -0800550 EXPECT_EQ(1, value.value_tuple().dimensions_value(0).field());
Yangster-macb5bc7412018-01-06 23:17:45 -0800551 // Uid only.
552 EXPECT_EQ(value.value_tuple().dimensions_value(0)
553 .value_tuple().dimensions_value_size(), 2);
554 EXPECT_EQ(value.value_tuple().dimensions_value(0)
555 .value_tuple().dimensions_value(0).field(), 1);
556 EXPECT_EQ(value.value_tuple().dimensions_value(0)
557 .value_tuple().dimensions_value(0).value_int(), uid);
558 EXPECT_EQ(value.value_tuple().dimensions_value(0)
559 .value_tuple().dimensions_value(1).field(), 2);
560 EXPECT_EQ(value.value_tuple().dimensions_value(0)
561 .value_tuple().dimensions_value(1).value_str(), tag);
562}
563
Yao Chen8a8d16c2018-02-08 14:50:40 -0800564bool EqualsTo(const DimensionsValue& s1, const DimensionsValue& s2) {
565 if (s1.field() != s2.field()) {
566 return false;
567 }
568 if (s1.value_case() != s2.value_case()) {
569 return false;
570 }
571 switch (s1.value_case()) {
572 case DimensionsValue::ValueCase::kValueStr:
573 return (s1.value_str() == s2.value_str());
574 case DimensionsValue::ValueCase::kValueInt:
575 return s1.value_int() == s2.value_int();
576 case DimensionsValue::ValueCase::kValueLong:
577 return s1.value_long() == s2.value_long();
578 case DimensionsValue::ValueCase::kValueBool:
579 return s1.value_bool() == s2.value_bool();
580 case DimensionsValue::ValueCase::kValueFloat:
581 return s1.value_float() == s2.value_float();
582 case DimensionsValue::ValueCase::kValueTuple: {
583 if (s1.value_tuple().dimensions_value_size() !=
584 s2.value_tuple().dimensions_value_size()) {
585 return false;
586 }
587 bool allMatched = true;
588 for (int i = 0; allMatched && i < s1.value_tuple().dimensions_value_size(); ++i) {
589 allMatched &= EqualsTo(s1.value_tuple().dimensions_value(i),
590 s2.value_tuple().dimensions_value(i));
591 }
592 return allMatched;
593 }
594 case DimensionsValue::ValueCase::VALUE_NOT_SET:
595 default:
596 return true;
597 }
598}
599
600bool LessThan(const DimensionsValue& s1, const DimensionsValue& s2) {
601 if (s1.field() != s2.field()) {
602 return s1.field() < s2.field();
603 }
604 if (s1.value_case() != s2.value_case()) {
605 return s1.value_case() < s2.value_case();
606 }
607 switch (s1.value_case()) {
608 case DimensionsValue::ValueCase::kValueStr:
609 return s1.value_str() < s2.value_str();
610 case DimensionsValue::ValueCase::kValueInt:
611 return s1.value_int() < s2.value_int();
612 case DimensionsValue::ValueCase::kValueLong:
613 return s1.value_long() < s2.value_long();
614 case DimensionsValue::ValueCase::kValueBool:
615 return (int)s1.value_bool() < (int)s2.value_bool();
616 case DimensionsValue::ValueCase::kValueFloat:
617 return s1.value_float() < s2.value_float();
618 case DimensionsValue::ValueCase::kValueTuple: {
619 if (s1.value_tuple().dimensions_value_size() !=
620 s2.value_tuple().dimensions_value_size()) {
621 return s1.value_tuple().dimensions_value_size() <
622 s2.value_tuple().dimensions_value_size();
623 }
624 for (int i = 0; i < s1.value_tuple().dimensions_value_size(); ++i) {
625 if (EqualsTo(s1.value_tuple().dimensions_value(i),
626 s2.value_tuple().dimensions_value(i))) {
627 continue;
628 } else {
629 return LessThan(s1.value_tuple().dimensions_value(i),
630 s2.value_tuple().dimensions_value(i));
631 }
632 }
633 return false;
634 }
635 case DimensionsValue::ValueCase::VALUE_NOT_SET:
636 default:
637 return false;
638 }
639}
640
641bool LessThan(const DimensionsPair& s1, const DimensionsPair& s2) {
642 if (LessThan(s1.dimInWhat, s2.dimInWhat)) {
643 return true;
644 } else if (LessThan(s2.dimInWhat, s1.dimInWhat)) {
645 return false;
646 }
647
648 return LessThan(s1.dimInCondition, s2.dimInCondition);
649}
650
Yangster-mac9def8e32018-04-17 13:55:51 -0700651void backfillStringInDimension(const std::map<uint64_t, string>& str_map,
652 DimensionsValue* dimension) {
653 if (dimension->has_value_str_hash()) {
654 auto it = str_map.find((uint64_t)(dimension->value_str_hash()));
655 if (it != str_map.end()) {
656 dimension->clear_value_str_hash();
657 dimension->set_value_str(it->second);
658 } else {
659 ALOGE("Can not find the string hash: %llu",
660 (unsigned long long)dimension->value_str_hash());
661 }
662 } else if (dimension->has_value_tuple()) {
663 auto value_tuple = dimension->mutable_value_tuple();
664 for (int i = 0; i < value_tuple->dimensions_value_size(); ++i) {
665 backfillStringInDimension(str_map, value_tuple->mutable_dimensions_value(i));
666 }
667 }
668}
669
670void backfillStringInReport(ConfigMetricsReport *config_report) {
671 std::map<uint64_t, string> str_map;
672 for (const auto& str : config_report->strings()) {
673 uint64_t hash = Hash64(str);
674 if (str_map.find(hash) != str_map.end()) {
675 ALOGE("String hash conflicts: %s %s", str.c_str(), str_map[hash].c_str());
676 }
677 str_map[hash] = str;
678 }
679 for (int i = 0; i < config_report->metrics_size(); ++i) {
680 auto metric_report = config_report->mutable_metrics(i);
681 if (metric_report->has_count_metrics()) {
682 backfillStringInDimension(str_map, metric_report->mutable_count_metrics());
683 } else if (metric_report->has_duration_metrics()) {
684 backfillStringInDimension(str_map, metric_report->mutable_duration_metrics());
685 } else if (metric_report->has_gauge_metrics()) {
686 backfillStringInDimension(str_map, metric_report->mutable_gauge_metrics());
687 } else if (metric_report->has_value_metrics()) {
688 backfillStringInDimension(str_map, metric_report->mutable_value_metrics());
689 }
690 }
691 // Backfill the package names.
692 for (int i = 0 ; i < config_report->uid_map().snapshots_size(); ++i) {
693 auto snapshot = config_report->mutable_uid_map()->mutable_snapshots(i);
694 for (int j = 0 ; j < snapshot->package_info_size(); ++j) {
695 auto package_info = snapshot->mutable_package_info(j);
696 if (package_info->has_name_hash()) {
697 auto it = str_map.find((uint64_t)(package_info->name_hash()));
698 if (it != str_map.end()) {
699 package_info->clear_name_hash();
700 package_info->set_name(it->second);
701 } else {
702 ALOGE("Can not find the string package name hash: %llu",
703 (unsigned long long)package_info->name_hash());
704 }
705
706 }
707 }
708 }
709 // Backfill the app name in app changes.
710 for (int i = 0 ; i < config_report->uid_map().changes_size(); ++i) {
711 auto change = config_report->mutable_uid_map()->mutable_changes(i);
712 if (change->has_app_hash()) {
713 auto it = str_map.find((uint64_t)(change->app_hash()));
714 if (it != str_map.end()) {
715 change->clear_app_hash();
716 change->set_app(it->second);
717 } else {
718 ALOGE("Can not find the string change app name hash: %llu",
719 (unsigned long long)change->app_hash());
720 }
721 }
722 }
723}
724
725void backfillStringInReport(ConfigMetricsReportList *config_report_list) {
726 for (int i = 0; i < config_report_list->reports_size(); ++i) {
727 backfillStringInReport(config_report_list->mutable_reports(i));
728 }
729}
730
731bool backfillDimensionPath(const DimensionsValue& path,
732 const google::protobuf::RepeatedPtrField<DimensionsValue>& leafValues,
733 int* leafIndex,
734 DimensionsValue* dimension) {
735 dimension->set_field(path.field());
736 if (path.has_value_tuple()) {
737 for (int i = 0; i < path.value_tuple().dimensions_value_size(); ++i) {
738 if (!backfillDimensionPath(
739 path.value_tuple().dimensions_value(i), leafValues, leafIndex,
740 dimension->mutable_value_tuple()->add_dimensions_value())) {
741 return false;
742 }
743 }
744 } else {
745 if (*leafIndex < 0 || *leafIndex >= leafValues.size()) {
746 return false;
747 }
748 dimension->MergeFrom(leafValues.Get(*leafIndex));
749 (*leafIndex)++;
750 }
751 return true;
752}
753
754bool backfillDimensionPath(const DimensionsValue& path,
755 const google::protobuf::RepeatedPtrField<DimensionsValue>& leafValues,
756 DimensionsValue* dimension) {
757 int leafIndex = 0;
758 return backfillDimensionPath(path, leafValues, &leafIndex, dimension);
759}
760
761void backfillDimensionPath(ConfigMetricsReportList *config_report_list) {
762 for (int i = 0; i < config_report_list->reports_size(); ++i) {
763 auto report = config_report_list->mutable_reports(i);
764 for (int j = 0; j < report->metrics_size(); ++j) {
765 auto metric_report = report->mutable_metrics(j);
766 if (metric_report->has_dimensions_path_in_what() ||
767 metric_report->has_dimensions_path_in_condition()) {
768 auto whatPath = metric_report->dimensions_path_in_what();
769 auto conditionPath = metric_report->dimensions_path_in_condition();
770 if (metric_report->has_count_metrics()) {
771 backfillDimensionPath(whatPath, conditionPath,
772 metric_report->mutable_count_metrics());
773 } else if (metric_report->has_duration_metrics()) {
774 backfillDimensionPath(whatPath, conditionPath,
775 metric_report->mutable_duration_metrics());
776 } else if (metric_report->has_gauge_metrics()) {
777 backfillDimensionPath(whatPath, conditionPath,
778 metric_report->mutable_gauge_metrics());
779 } else if (metric_report->has_value_metrics()) {
780 backfillDimensionPath(whatPath, conditionPath,
781 metric_report->mutable_value_metrics());
782 }
783 metric_report->clear_dimensions_path_in_what();
784 metric_report->clear_dimensions_path_in_condition();
785 }
786 }
787 }
788}
789
790void backfillStartEndTimestamp(StatsLogReport *report) {
791 const int64_t timeBaseNs = report->time_base_elapsed_nano_seconds();
792 const int64_t bucketSizeNs = report->bucket_size_nano_seconds();
793 if (report->has_count_metrics()) {
794 backfillStartEndTimestampForMetrics(
795 timeBaseNs, bucketSizeNs, report->mutable_count_metrics());
796 } else if (report->has_duration_metrics()) {
797 backfillStartEndTimestampForMetrics(
798 timeBaseNs, bucketSizeNs, report->mutable_duration_metrics());
799 } else if (report->has_gauge_metrics()) {
800 backfillStartEndTimestampForMetrics(
801 timeBaseNs, bucketSizeNs, report->mutable_gauge_metrics());
802 if (report->gauge_metrics().skipped_size() > 0) {
803 backfillStartEndTimestampForSkippedBuckets(
804 timeBaseNs, report->mutable_gauge_metrics());
805 }
806 } else if (report->has_value_metrics()) {
807 backfillStartEndTimestampForMetrics(
808 timeBaseNs, bucketSizeNs, report->mutable_value_metrics());
809 if (report->value_metrics().skipped_size() > 0) {
810 backfillStartEndTimestampForSkippedBuckets(
811 timeBaseNs, report->mutable_value_metrics());
812 }
813 }
814}
815
816void backfillStartEndTimestamp(ConfigMetricsReport *config_report) {
817 for (int j = 0; j < config_report->metrics_size(); ++j) {
818 backfillStartEndTimestamp(config_report->mutable_metrics(j));
819 }
820}
821
822void backfillStartEndTimestamp(ConfigMetricsReportList *config_report_list) {
823 for (int i = 0; i < config_report_list->reports_size(); ++i) {
824 backfillStartEndTimestamp(config_report_list->mutable_reports(i));
825 }
826}
827
Yangster-mac20877162017-12-22 17:19:39 -0800828} // namespace statsd
829} // namespace os
Tej Singh6ede28b2019-01-29 17:06:54 -0800830} // namespace android