blob: 7216e1d8cc8e214962bc0cbc001b24a973aa49e6 [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
Ruchir Rastogie449b0c2020-02-10 17:40:09 -080017#include <aidl/android/util/StatsEventParcel.h>
Ruchir Rastogidfd63d42020-02-20 17:54:13 -080018#include "stats_event.h"
Ruchir Rastogie449b0c2020-02-10 17:40:09 -080019
20using aidl::android::util::StatsEventParcel;
21using std::shared_ptr;
22
Yangster-mac20877162017-12-22 17:19:39 -080023namespace android {
24namespace os {
25namespace statsd {
26
tsaichristineb87ca152019-12-09 15:19:41 -080027StatsLogReport outputStreamToProto(ProtoOutputStream* proto) {
28 vector<uint8_t> bytes;
29 bytes.resize(proto->size());
30 size_t pos = 0;
31 sp<ProtoReader> reader = proto->data();
32
33 while (reader->readBuffer() != NULL) {
34 size_t toRead = reader->currentToRead();
35 std::memcpy(&((bytes)[pos]), reader->readBuffer(), toRead);
36 pos += toRead;
37 reader->move(toRead);
38 }
39
40 StatsLogReport report;
41 report.ParseFromArray(bytes.data(), bytes.size());
42 return report;
43}
Yangster-mac15f6bbc2018-04-08 11:52:26 -070044
Yangster-mac87718e22018-01-11 16:16:26 -080045AtomMatcher CreateSimpleAtomMatcher(const string& name, int atomId) {
46 AtomMatcher atom_matcher;
47 atom_matcher.set_id(StringToId(name));
48 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
49 simple_atom_matcher->set_atom_id(atomId);
50 return atom_matcher;
51}
52
Yangster-mac15f6bbc2018-04-08 11:52:26 -070053AtomMatcher CreateTemperatureAtomMatcher() {
Jeffrey Huang3eb84d42020-03-17 10:31:22 -070054 return CreateSimpleAtomMatcher("TemperatureMatcher", util::TEMPERATURE);
Yangster-mac15f6bbc2018-04-08 11:52:26 -070055}
56
Yangster13fb7e42018-03-07 17:30:49 -080057AtomMatcher CreateScheduledJobStateChangedAtomMatcher(const string& name,
58 ScheduledJobStateChanged::State state) {
59 AtomMatcher atom_matcher;
60 atom_matcher.set_id(StringToId(name));
61 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -070062 simple_atom_matcher->set_atom_id(util::SCHEDULED_JOB_STATE_CHANGED);
Yangster13fb7e42018-03-07 17:30:49 -080063 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
64 field_value_matcher->set_field(3); // State field.
65 field_value_matcher->set_eq_int(state);
66 return atom_matcher;
67}
68
69AtomMatcher CreateStartScheduledJobAtomMatcher() {
70 return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobStart",
71 ScheduledJobStateChanged::STARTED);
72}
73
74AtomMatcher CreateFinishScheduledJobAtomMatcher() {
75 return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobFinish",
76 ScheduledJobStateChanged::FINISHED);
77}
78
Yangster-mac93694462018-01-22 20:49:31 -080079AtomMatcher CreateScreenBrightnessChangedAtomMatcher() {
80 AtomMatcher atom_matcher;
81 atom_matcher.set_id(StringToId("ScreenBrightnessChanged"));
82 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -070083 simple_atom_matcher->set_atom_id(util::SCREEN_BRIGHTNESS_CHANGED);
Yangster-mac93694462018-01-22 20:49:31 -080084 return atom_matcher;
85}
86
87AtomMatcher CreateUidProcessStateChangedAtomMatcher() {
88 AtomMatcher atom_matcher;
89 atom_matcher.set_id(StringToId("UidProcessStateChanged"));
90 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -070091 simple_atom_matcher->set_atom_id(util::UID_PROCESS_STATE_CHANGED);
Yangster-mac93694462018-01-22 20:49:31 -080092 return atom_matcher;
93}
94
Yangster-mac20877162017-12-22 17:19:39 -080095AtomMatcher CreateWakelockStateChangedAtomMatcher(const string& name,
96 WakelockStateChanged::State state) {
97 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -080098 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -080099 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700100 simple_atom_matcher->set_atom_id(util::WAKELOCK_STATE_CHANGED);
Yangster-mac20877162017-12-22 17:19:39 -0800101 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
102 field_value_matcher->set_field(4); // State field.
103 field_value_matcher->set_eq_int(state);
104 return atom_matcher;
105}
106
107AtomMatcher CreateAcquireWakelockAtomMatcher() {
108 return CreateWakelockStateChangedAtomMatcher("AcquireWakelock", WakelockStateChanged::ACQUIRE);
109}
110
111AtomMatcher CreateReleaseWakelockAtomMatcher() {
112 return CreateWakelockStateChangedAtomMatcher("ReleaseWakelock", WakelockStateChanged::RELEASE);
113}
114
Yangster-mac93694462018-01-22 20:49:31 -0800115AtomMatcher CreateBatterySaverModeStateChangedAtomMatcher(
116 const string& name, BatterySaverModeStateChanged::State state) {
117 AtomMatcher atom_matcher;
118 atom_matcher.set_id(StringToId(name));
119 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700120 simple_atom_matcher->set_atom_id(util::BATTERY_SAVER_MODE_STATE_CHANGED);
Yangster-mac93694462018-01-22 20:49:31 -0800121 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
122 field_value_matcher->set_field(1); // State field.
123 field_value_matcher->set_eq_int(state);
124 return atom_matcher;
125}
126
127AtomMatcher CreateBatterySaverModeStartAtomMatcher() {
128 return CreateBatterySaverModeStateChangedAtomMatcher(
129 "BatterySaverModeStart", BatterySaverModeStateChanged::ON);
130}
131
132
133AtomMatcher CreateBatterySaverModeStopAtomMatcher() {
134 return CreateBatterySaverModeStateChangedAtomMatcher(
135 "BatterySaverModeStop", BatterySaverModeStateChanged::OFF);
136}
137
tsaichristine1449fa42020-01-02 12:12:05 -0800138AtomMatcher CreateBatteryStateChangedAtomMatcher(const string& name,
139 BatteryPluggedStateEnum state) {
140 AtomMatcher atom_matcher;
141 atom_matcher.set_id(StringToId(name));
142 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
143 simple_atom_matcher->set_atom_id(util::PLUGGED_STATE_CHANGED);
144 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
145 field_value_matcher->set_field(1); // State field.
146 field_value_matcher->set_eq_int(state);
147 return atom_matcher;
148}
149
150AtomMatcher CreateBatteryStateNoneMatcher() {
151 return CreateBatteryStateChangedAtomMatcher("BatteryPluggedNone",
152 BatteryPluggedStateEnum::BATTERY_PLUGGED_NONE);
153}
154
155AtomMatcher CreateBatteryStateUsbMatcher() {
156 return CreateBatteryStateChangedAtomMatcher("BatteryPluggedUsb",
157 BatteryPluggedStateEnum::BATTERY_PLUGGED_USB);
158}
Yangster-mac93694462018-01-22 20:49:31 -0800159
Yangster-mac20877162017-12-22 17:19:39 -0800160AtomMatcher CreateScreenStateChangedAtomMatcher(
Bookatz1a1b0462018-01-12 11:47:03 -0800161 const string& name, android::view::DisplayStateEnum state) {
Yangster-mac20877162017-12-22 17:19:39 -0800162 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800163 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800164 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700165 simple_atom_matcher->set_atom_id(util::SCREEN_STATE_CHANGED);
Yangster-mac20877162017-12-22 17:19:39 -0800166 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
167 field_value_matcher->set_field(1); // State field.
168 field_value_matcher->set_eq_int(state);
169 return atom_matcher;
170}
171
Yangster-mac93694462018-01-22 20:49:31 -0800172
Yangster-mac20877162017-12-22 17:19:39 -0800173AtomMatcher CreateScreenTurnedOnAtomMatcher() {
Bookatz1a1b0462018-01-12 11:47:03 -0800174 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOn",
175 android::view::DisplayStateEnum::DISPLAY_STATE_ON);
Yangster-mac20877162017-12-22 17:19:39 -0800176}
177
178AtomMatcher CreateScreenTurnedOffAtomMatcher() {
Bookatz1a1b0462018-01-12 11:47:03 -0800179 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOff",
180 ::android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
Yangster-mac20877162017-12-22 17:19:39 -0800181}
182
183AtomMatcher CreateSyncStateChangedAtomMatcher(
184 const string& name, SyncStateChanged::State state) {
185 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800186 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800187 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700188 simple_atom_matcher->set_atom_id(util::SYNC_STATE_CHANGED);
Yangster-mac20877162017-12-22 17:19:39 -0800189 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
190 field_value_matcher->set_field(3); // State field.
191 field_value_matcher->set_eq_int(state);
192 return atom_matcher;
193}
194
195AtomMatcher CreateSyncStartAtomMatcher() {
196 return CreateSyncStateChangedAtomMatcher("SyncStart", SyncStateChanged::ON);
197}
198
199AtomMatcher CreateSyncEndAtomMatcher() {
200 return CreateSyncStateChangedAtomMatcher("SyncEnd", SyncStateChanged::OFF);
201}
202
203AtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800204 const string& name, ActivityForegroundStateChanged::State state) {
Yangster-mac20877162017-12-22 17:19:39 -0800205 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800206 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800207 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700208 simple_atom_matcher->set_atom_id(util::ACTIVITY_FOREGROUND_STATE_CHANGED);
Yangster-mac20877162017-12-22 17:19:39 -0800209 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
210 field_value_matcher->set_field(4); // Activity field.
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800211 field_value_matcher->set_eq_int(state);
Yangster-mac20877162017-12-22 17:19:39 -0800212 return atom_matcher;
213}
214
215AtomMatcher CreateMoveToBackgroundAtomMatcher() {
216 return CreateActivityForegroundStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800217 "Background", ActivityForegroundStateChanged::BACKGROUND);
Yangster-mac20877162017-12-22 17:19:39 -0800218}
219
220AtomMatcher CreateMoveToForegroundAtomMatcher() {
221 return CreateActivityForegroundStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800222 "Foreground", ActivityForegroundStateChanged::FOREGROUND);
Yangster-mac20877162017-12-22 17:19:39 -0800223}
224
225AtomMatcher CreateProcessLifeCycleStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800226 const string& name, ProcessLifeCycleStateChanged::State state) {
Yangster-mac20877162017-12-22 17:19:39 -0800227 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800228 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800229 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700230 simple_atom_matcher->set_atom_id(util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
Yangster-mac20877162017-12-22 17:19:39 -0800231 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
232 field_value_matcher->set_field(3); // Process state field.
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800233 field_value_matcher->set_eq_int(state);
Yangster-mac20877162017-12-22 17:19:39 -0800234 return atom_matcher;
235}
236
237AtomMatcher CreateProcessCrashAtomMatcher() {
238 return CreateProcessLifeCycleStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800239 "Crashed", ProcessLifeCycleStateChanged::CRASHED);
Yangster-mac20877162017-12-22 17:19:39 -0800240}
241
Yangster13fb7e42018-03-07 17:30:49 -0800242Predicate CreateScheduledJobPredicate() {
243 Predicate predicate;
244 predicate.set_id(StringToId("ScheduledJobRunningPredicate"));
245 predicate.mutable_simple_predicate()->set_start(StringToId("ScheduledJobStart"));
246 predicate.mutable_simple_predicate()->set_stop(StringToId("ScheduledJobFinish"));
247 return predicate;
248}
249
Yangster-mac93694462018-01-22 20:49:31 -0800250Predicate CreateBatterySaverModePredicate() {
251 Predicate predicate;
252 predicate.set_id(StringToId("BatterySaverIsOn"));
253 predicate.mutable_simple_predicate()->set_start(StringToId("BatterySaverModeStart"));
254 predicate.mutable_simple_predicate()->set_stop(StringToId("BatterySaverModeStop"));
255 return predicate;
256}
Yangster-mac20877162017-12-22 17:19:39 -0800257
tsaichristine1449fa42020-01-02 12:12:05 -0800258Predicate CreateDeviceUnpluggedPredicate() {
259 Predicate predicate;
260 predicate.set_id(StringToId("DeviceUnplugged"));
261 predicate.mutable_simple_predicate()->set_start(StringToId("BatteryPluggedNone"));
262 predicate.mutable_simple_predicate()->set_stop(StringToId("BatteryPluggedUsb"));
263 return predicate;
264}
265
Yangster-mac20877162017-12-22 17:19:39 -0800266Predicate CreateScreenIsOnPredicate() {
267 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800268 predicate.set_id(StringToId("ScreenIsOn"));
269 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOn"));
270 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOff"));
Yangster-mac20877162017-12-22 17:19:39 -0800271 return predicate;
272}
273
274Predicate CreateScreenIsOffPredicate() {
275 Predicate predicate;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800276 predicate.set_id(1111123);
Yangster-mac94e197c2018-01-02 16:03:03 -0800277 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOff"));
278 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOn"));
Yangster-mac20877162017-12-22 17:19:39 -0800279 return predicate;
280}
281
282Predicate CreateHoldingWakelockPredicate() {
283 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800284 predicate.set_id(StringToId("HoldingWakelock"));
285 predicate.mutable_simple_predicate()->set_start(StringToId("AcquireWakelock"));
286 predicate.mutable_simple_predicate()->set_stop(StringToId("ReleaseWakelock"));
Yangster-mac20877162017-12-22 17:19:39 -0800287 return predicate;
288}
289
290Predicate CreateIsSyncingPredicate() {
291 Predicate predicate;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800292 predicate.set_id(33333333333333);
Yangster-mac94e197c2018-01-02 16:03:03 -0800293 predicate.mutable_simple_predicate()->set_start(StringToId("SyncStart"));
294 predicate.mutable_simple_predicate()->set_stop(StringToId("SyncEnd"));
Yangster-mac20877162017-12-22 17:19:39 -0800295 return predicate;
296}
297
298Predicate CreateIsInBackgroundPredicate() {
299 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800300 predicate.set_id(StringToId("IsInBackground"));
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800301 predicate.mutable_simple_predicate()->set_start(StringToId("Background"));
302 predicate.mutable_simple_predicate()->set_stop(StringToId("Foreground"));
Yangster-mac20877162017-12-22 17:19:39 -0800303 return predicate;
304}
305
tsaichristined21aacf2019-10-07 14:47:38 -0700306State CreateScreenState() {
307 State state;
308 state.set_id(StringToId("ScreenState"));
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700309 state.set_atom_id(util::SCREEN_STATE_CHANGED);
tsaichristined21aacf2019-10-07 14:47:38 -0700310 return state;
311}
312
313State CreateUidProcessState() {
314 State state;
315 state.set_id(StringToId("UidProcessState"));
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700316 state.set_atom_id(util::UID_PROCESS_STATE_CHANGED);
tsaichristined21aacf2019-10-07 14:47:38 -0700317 return state;
318}
319
320State CreateOverlayState() {
321 State state;
322 state.set_id(StringToId("OverlayState"));
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700323 state.set_atom_id(util::OVERLAY_STATE_CHANGED);
tsaichristined21aacf2019-10-07 14:47:38 -0700324 return state;
325}
326
Tej Singh5d823b32019-05-21 20:13:21 -0700327State CreateScreenStateWithOnOffMap(int64_t screenOnId, int64_t screenOffId) {
tsaichristined21aacf2019-10-07 14:47:38 -0700328 State state;
329 state.set_id(StringToId("ScreenStateOnOff"));
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700330 state.set_atom_id(util::SCREEN_STATE_CHANGED);
tsaichristined21aacf2019-10-07 14:47:38 -0700331
Tej Singh5d823b32019-05-21 20:13:21 -0700332 auto map = CreateScreenStateOnOffMap(screenOnId, screenOffId);
tsaichristined21aacf2019-10-07 14:47:38 -0700333 *state.mutable_map() = map;
334
335 return state;
336}
337
Tej Singh5d823b32019-05-21 20:13:21 -0700338StateMap_StateGroup CreateScreenStateOnGroup(int64_t screenOnId) {
tsaichristined21aacf2019-10-07 14:47:38 -0700339 StateMap_StateGroup group;
Tej Singh5d823b32019-05-21 20:13:21 -0700340 group.set_group_id(screenOnId);
tsaichristined21aacf2019-10-07 14:47:38 -0700341 group.add_value(2);
342 group.add_value(5);
343 group.add_value(6);
344 return group;
345}
346
Tej Singh5d823b32019-05-21 20:13:21 -0700347StateMap_StateGroup CreateScreenStateOffGroup(int64_t screenOffId) {
tsaichristined21aacf2019-10-07 14:47:38 -0700348 StateMap_StateGroup group;
Tej Singh5d823b32019-05-21 20:13:21 -0700349 group.set_group_id(screenOffId);
tsaichristined21aacf2019-10-07 14:47:38 -0700350 group.add_value(0);
351 group.add_value(1);
352 group.add_value(3);
353 group.add_value(4);
354 return group;
355}
356
Tej Singh5d823b32019-05-21 20:13:21 -0700357StateMap CreateScreenStateOnOffMap(int64_t screenOnId, int64_t screenOffId) {
tsaichristined21aacf2019-10-07 14:47:38 -0700358 StateMap map;
Tej Singh5d823b32019-05-21 20:13:21 -0700359 *map.add_group() = CreateScreenStateOnGroup(screenOnId);
360 *map.add_group() = CreateScreenStateOffGroup(screenOffId);
tsaichristined21aacf2019-10-07 14:47:38 -0700361 return map;
362}
363
Yangster-mac20877162017-12-22 17:19:39 -0800364void addPredicateToPredicateCombination(const Predicate& predicate,
365 Predicate* combinationPredicate) {
Yangster-mac94e197c2018-01-02 16:03:03 -0800366 combinationPredicate->mutable_combination()->add_predicate(predicate.id());
Yangster-mac20877162017-12-22 17:19:39 -0800367}
368
369FieldMatcher CreateAttributionUidDimensions(const int atomId,
370 const std::vector<Position>& positions) {
371 FieldMatcher dimensions;
372 dimensions.set_field(atomId);
373 for (const auto position : positions) {
374 auto child = dimensions.add_child();
375 child->set_field(1);
376 child->set_position(position);
377 child->add_child()->set_field(1);
378 }
379 return dimensions;
380}
381
382FieldMatcher CreateAttributionUidAndTagDimensions(const int atomId,
383 const std::vector<Position>& positions) {
384 FieldMatcher dimensions;
385 dimensions.set_field(atomId);
386 for (const auto position : positions) {
387 auto child = dimensions.add_child();
388 child->set_field(1);
389 child->set_position(position);
390 child->add_child()->set_field(1);
391 child->add_child()->set_field(2);
392 }
393 return dimensions;
394}
395
396FieldMatcher CreateDimensions(const int atomId, const std::vector<int>& fields) {
397 FieldMatcher dimensions;
398 dimensions.set_field(atomId);
399 for (const int field : fields) {
400 dimensions.add_child()->set_field(field);
401 }
402 return dimensions;
403}
404
tsaichristine1449fa42020-01-02 12:12:05 -0800405FieldMatcher CreateAttributionUidAndOtherDimensions(const int atomId,
406 const std::vector<Position>& positions,
407 const std::vector<int>& fields) {
408 FieldMatcher dimensions = CreateAttributionUidDimensions(atomId, positions);
409
410 for (const int field : fields) {
411 dimensions.add_child()->set_field(field);
412 }
413 return dimensions;
414}
415
416// START: get primary key functions
417void getUidProcessKey(int uid, HashableDimensionKey* key) {
418 int pos1[] = {1, 0, 0};
419 Field field1(27 /* atom id */, pos1, 0 /* depth */);
420 Value value1((int32_t)uid);
421
422 key->addValue(FieldValue(field1, value1));
423}
424
425void getOverlayKey(int uid, string packageName, HashableDimensionKey* key) {
426 int pos1[] = {1, 0, 0};
427 int pos2[] = {2, 0, 0};
428
429 Field field1(59 /* atom id */, pos1, 0 /* depth */);
430 Field field2(59 /* atom id */, pos2, 0 /* depth */);
431
432 Value value1((int32_t)uid);
433 Value value2(packageName);
434
435 key->addValue(FieldValue(field1, value1));
436 key->addValue(FieldValue(field2, value2));
437}
438
439void getPartialWakelockKey(int uid, const std::string& tag, HashableDimensionKey* key) {
440 int pos1[] = {1, 1, 1};
441 int pos3[] = {2, 0, 0};
442 int pos4[] = {3, 0, 0};
443
444 Field field1(10 /* atom id */, pos1, 2 /* depth */);
445
446 Field field3(10 /* atom id */, pos3, 0 /* depth */);
447 Field field4(10 /* atom id */, pos4, 0 /* depth */);
448
449 Value value1((int32_t)uid);
450 Value value3((int32_t)1 /*partial*/);
451 Value value4(tag);
452
453 key->addValue(FieldValue(field1, value1));
454 key->addValue(FieldValue(field3, value3));
455 key->addValue(FieldValue(field4, value4));
456}
457
458void getPartialWakelockKey(int uid, HashableDimensionKey* key) {
459 int pos1[] = {1, 1, 1};
460 int pos3[] = {2, 0, 0};
461
462 Field field1(10 /* atom id */, pos1, 2 /* depth */);
463 Field field3(10 /* atom id */, pos3, 0 /* depth */);
464
465 Value value1((int32_t)uid);
466 Value value3((int32_t)1 /*partial*/);
467
468 key->addValue(FieldValue(field1, value1));
469 key->addValue(FieldValue(field3, value3));
470}
471// END: get primary key functions
472
tsaichristine8dca82e2020-04-07 09:40:03 -0700473void writeAttribution(AStatsEvent* statsEvent, const vector<int>& attributionUids,
474 const vector<string>& attributionTags) {
475 vector<const char*> cTags(attributionTags.size());
476 for (int i = 0; i < cTags.size(); i++) {
477 cTags[i] = attributionTags[i].c_str();
478 }
tsaichristinebb33b802020-03-16 09:46:41 -0700479
tsaichristine8dca82e2020-04-07 09:40:03 -0700480 AStatsEvent_writeAttributionChain(statsEvent,
481 reinterpret_cast<const uint32_t*>(attributionUids.data()),
482 cTags.data(), attributionUids.size());
483}
484
485void parseStatsEventToLogEvent(AStatsEvent* statsEvent, LogEvent* logEvent) {
tsaichristinebb33b802020-03-16 09:46:41 -0700486 AStatsEvent_build(statsEvent);
487
488 size_t size;
489 uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size);
tsaichristinebb33b802020-03-16 09:46:41 -0700490 logEvent->parseBuffer(buf, size);
tsaichristinebb33b802020-03-16 09:46:41 -0700491
tsaichristine8dca82e2020-04-07 09:40:03 -0700492 AStatsEvent_release(statsEvent);
tsaichristinebb33b802020-03-16 09:46:41 -0700493}
tsaichristined5800b22020-03-25 10:31:50 -0700494
tsaichristinebb33b802020-03-16 09:46:41 -0700495void CreateTwoValueLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs, int32_t value1,
496 int32_t value2) {
497 AStatsEvent* statsEvent = AStatsEvent_obtain();
498 AStatsEvent_setAtomId(statsEvent, atomId);
499 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
500
501 AStatsEvent_writeInt32(statsEvent, value1);
502 AStatsEvent_writeInt32(statsEvent, value2);
tsaichristinebb33b802020-03-16 09:46:41 -0700503
tsaichristine8dca82e2020-04-07 09:40:03 -0700504 parseStatsEventToLogEvent(statsEvent, logEvent);
tsaichristinebb33b802020-03-16 09:46:41 -0700505}
506
tsaichristine8dca82e2020-04-07 09:40:03 -0700507shared_ptr<LogEvent> CreateTwoValueLogEvent(int atomId, int64_t eventTimeNs, int32_t value1,
508 int32_t value2) {
tsaichristinebb33b802020-03-16 09:46:41 -0700509 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700510 CreateTwoValueLogEvent(logEvent.get(), atomId, eventTimeNs, value1, value2);
tsaichristinebb33b802020-03-16 09:46:41 -0700511 return logEvent;
512}
513
514void CreateThreeValueLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs, int32_t value1,
515 int32_t value2, int32_t value3) {
516 AStatsEvent* statsEvent = AStatsEvent_obtain();
517 AStatsEvent_setAtomId(statsEvent, atomId);
518 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
519
520 AStatsEvent_writeInt32(statsEvent, value1);
521 AStatsEvent_writeInt32(statsEvent, value2);
522 AStatsEvent_writeInt32(statsEvent, value3);
tsaichristinebb33b802020-03-16 09:46:41 -0700523
tsaichristine8dca82e2020-04-07 09:40:03 -0700524 parseStatsEventToLogEvent(statsEvent, logEvent);
tsaichristinebb33b802020-03-16 09:46:41 -0700525}
526
tsaichristine8dca82e2020-04-07 09:40:03 -0700527shared_ptr<LogEvent> CreateThreeValueLogEvent(int atomId, int64_t eventTimeNs, int32_t value1,
528 int32_t value2, int32_t value3) {
tsaichristinebb33b802020-03-16 09:46:41 -0700529 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700530 CreateThreeValueLogEvent(logEvent.get(), atomId, eventTimeNs, value1, value2, value3);
tsaichristinebb33b802020-03-16 09:46:41 -0700531 return logEvent;
532}
533
534void CreateRepeatedValueLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs,
535 int32_t value) {
536 AStatsEvent* statsEvent = AStatsEvent_obtain();
537 AStatsEvent_setAtomId(statsEvent, atomId);
538 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
539
540 AStatsEvent_writeInt32(statsEvent, value);
541 AStatsEvent_writeInt32(statsEvent, value);
tsaichristinebb33b802020-03-16 09:46:41 -0700542
tsaichristine8dca82e2020-04-07 09:40:03 -0700543 parseStatsEventToLogEvent(statsEvent, logEvent);
tsaichristinebb33b802020-03-16 09:46:41 -0700544}
545
tsaichristine8dca82e2020-04-07 09:40:03 -0700546shared_ptr<LogEvent> CreateRepeatedValueLogEvent(int atomId, int64_t eventTimeNs, int32_t value) {
tsaichristinebb33b802020-03-16 09:46:41 -0700547 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700548 CreateRepeatedValueLogEvent(logEvent.get(), atomId, eventTimeNs, value);
tsaichristinebb33b802020-03-16 09:46:41 -0700549 return logEvent;
550}
551
tsaichristined5800b22020-03-25 10:31:50 -0700552void CreateNoValuesLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs) {
553 AStatsEvent* statsEvent = AStatsEvent_obtain();
554 AStatsEvent_setAtomId(statsEvent, atomId);
555 AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
tsaichristined5800b22020-03-25 10:31:50 -0700556
tsaichristine8dca82e2020-04-07 09:40:03 -0700557 parseStatsEventToLogEvent(statsEvent, logEvent);
558}
559
560shared_ptr<LogEvent> CreateNoValuesLogEvent(int atomId, int64_t eventTimeNs) {
561 shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
562 CreateNoValuesLogEvent(logEvent.get(), atomId, eventTimeNs);
563 return logEvent;
tsaichristined5800b22020-03-25 10:31:50 -0700564}
565
tsaichristine7747d372020-02-28 17:36:59 -0800566std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
567 uint64_t timestampNs, const android::view::DisplayStateEnum state) {
568 AStatsEvent* statsEvent = AStatsEvent_obtain();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700569 AStatsEvent_setAtomId(statsEvent, util::SCREEN_STATE_CHANGED);
tsaichristine7747d372020-02-28 17:36:59 -0800570 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
tsaichristine7747d372020-02-28 17:36:59 -0800571 AStatsEvent_writeInt32(statsEvent, state);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700572 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
573 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, false);
tsaichristine7747d372020-02-28 17:36:59 -0800574
575 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700576 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine7747d372020-02-28 17:36:59 -0800577 return logEvent;
578}
579
580std::unique_ptr<LogEvent> CreateBatterySaverOnEvent(uint64_t timestampNs) {
581 AStatsEvent* statsEvent = AStatsEvent_obtain();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700582 AStatsEvent_setAtomId(statsEvent, util::BATTERY_SAVER_MODE_STATE_CHANGED);
tsaichristine7747d372020-02-28 17:36:59 -0800583 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
tsaichristine7747d372020-02-28 17:36:59 -0800584 AStatsEvent_writeInt32(statsEvent, BatterySaverModeStateChanged::ON);
tsaichristine7747d372020-02-28 17:36:59 -0800585
586 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700587 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine7747d372020-02-28 17:36:59 -0800588 return logEvent;
589}
590
591std::unique_ptr<LogEvent> CreateBatterySaverOffEvent(uint64_t timestampNs) {
592 AStatsEvent* statsEvent = AStatsEvent_obtain();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700593 AStatsEvent_setAtomId(statsEvent, util::BATTERY_SAVER_MODE_STATE_CHANGED);
tsaichristine7747d372020-02-28 17:36:59 -0800594 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
tsaichristine7747d372020-02-28 17:36:59 -0800595 AStatsEvent_writeInt32(statsEvent, BatterySaverModeStateChanged::OFF);
tsaichristine7747d372020-02-28 17:36:59 -0800596
597 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700598 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine7747d372020-02-28 17:36:59 -0800599 return logEvent;
600}
601
tsaichristine1449fa42020-01-02 12:12:05 -0800602std::unique_ptr<LogEvent> CreateBatteryStateChangedEvent(const uint64_t timestampNs, const BatteryPluggedStateEnum state) {
603 AStatsEvent* statsEvent = AStatsEvent_obtain();
604 AStatsEvent_setAtomId(statsEvent, util::PLUGGED_STATE_CHANGED);
605 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
tsaichristine1449fa42020-01-02 12:12:05 -0800606 AStatsEvent_writeInt32(statsEvent, state);
tsaichristine1449fa42020-01-02 12:12:05 -0800607
608 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700609 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine1449fa42020-01-02 12:12:05 -0800610 return logEvent;
611}
612
tsaichristine7747d372020-02-28 17:36:59 -0800613std::unique_ptr<LogEvent> CreateScreenBrightnessChangedEvent(uint64_t timestampNs, int level) {
614 AStatsEvent* statsEvent = AStatsEvent_obtain();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700615 AStatsEvent_setAtomId(statsEvent, util::SCREEN_BRIGHTNESS_CHANGED);
tsaichristine7747d372020-02-28 17:36:59 -0800616 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
tsaichristine7747d372020-02-28 17:36:59 -0800617 AStatsEvent_writeInt32(statsEvent, level);
tsaichristine7747d372020-02-28 17:36:59 -0800618
619 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700620 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine7747d372020-02-28 17:36:59 -0800621 return logEvent;
622}
623
tsaichristinea3d2ed82020-03-19 20:53:36 -0700624std::unique_ptr<LogEvent> CreateScheduledJobStateChangedEvent(
625 const vector<int>& attributionUids, const vector<string>& attributionTags,
626 const string& jobName, const ScheduledJobStateChanged::State state, uint64_t timestampNs) {
627 AStatsEvent* statsEvent = AStatsEvent_obtain();
628 AStatsEvent_setAtomId(statsEvent, util::SCHEDULED_JOB_STATE_CHANGED);
629 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
630
tsaichristine8dca82e2020-04-07 09:40:03 -0700631 writeAttribution(statsEvent, attributionUids, attributionTags);
tsaichristinea3d2ed82020-03-19 20:53:36 -0700632 AStatsEvent_writeString(statsEvent, jobName.c_str());
633 AStatsEvent_writeInt32(statsEvent, state);
tsaichristinea3d2ed82020-03-19 20:53:36 -0700634
635 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700636 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristinea3d2ed82020-03-19 20:53:36 -0700637 return logEvent;
638}
639
640std::unique_ptr<LogEvent> CreateStartScheduledJobEvent(uint64_t timestampNs,
641 const vector<int>& attributionUids,
642 const vector<string>& attributionTags,
643 const string& jobName) {
644 return CreateScheduledJobStateChangedEvent(attributionUids, attributionTags, jobName,
645 ScheduledJobStateChanged::STARTED, timestampNs);
646}
647
648// Create log event when scheduled job finishes.
649std::unique_ptr<LogEvent> CreateFinishScheduledJobEvent(uint64_t timestampNs,
650 const vector<int>& attributionUids,
651 const vector<string>& attributionTags,
652 const string& jobName) {
653 return CreateScheduledJobStateChangedEvent(attributionUids, attributionTags, jobName,
654 ScheduledJobStateChanged::FINISHED, timestampNs);
655}
656
tsaichristine7747d372020-02-28 17:36:59 -0800657std::unique_ptr<LogEvent> CreateWakelockStateChangedEvent(uint64_t timestampNs,
658 const vector<int>& attributionUids,
659 const vector<string>& attributionTags,
660 const string& wakelockName,
661 const WakelockStateChanged::State state) {
662 AStatsEvent* statsEvent = AStatsEvent_obtain();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700663 AStatsEvent_setAtomId(statsEvent, util::WAKELOCK_STATE_CHANGED);
tsaichristine7747d372020-02-28 17:36:59 -0800664 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
665
tsaichristine8dca82e2020-04-07 09:40:03 -0700666 writeAttribution(statsEvent, attributionUids, attributionTags);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700667 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true);
tsaichristine7747d372020-02-28 17:36:59 -0800668 AStatsEvent_writeInt32(statsEvent, android::os::WakeLockLevelEnum::PARTIAL_WAKE_LOCK);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700669 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
tsaichristine7747d372020-02-28 17:36:59 -0800670 AStatsEvent_writeString(statsEvent, wakelockName.c_str());
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700671 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
tsaichristine7747d372020-02-28 17:36:59 -0800672 AStatsEvent_writeInt32(statsEvent, state);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700673 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
674 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, true);
tsaichristine7747d372020-02-28 17:36:59 -0800675
676 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700677 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine7747d372020-02-28 17:36:59 -0800678 return logEvent;
679}
680
681std::unique_ptr<LogEvent> CreateAcquireWakelockEvent(uint64_t timestampNs,
682 const vector<int>& attributionUids,
683 const vector<string>& attributionTags,
684 const string& wakelockName) {
685 return CreateWakelockStateChangedEvent(timestampNs, attributionUids, attributionTags,
686 wakelockName, WakelockStateChanged::ACQUIRE);
687}
688
689std::unique_ptr<LogEvent> CreateReleaseWakelockEvent(uint64_t timestampNs,
690 const vector<int>& attributionUids,
691 const vector<string>& attributionTags,
692 const string& wakelockName) {
693 return CreateWakelockStateChangedEvent(timestampNs, attributionUids, attributionTags,
694 wakelockName, WakelockStateChanged::RELEASE);
695}
696
697std::unique_ptr<LogEvent> CreateActivityForegroundStateChangedEvent(
698 uint64_t timestampNs, const int uid, const ActivityForegroundStateChanged::State state) {
699 AStatsEvent* statsEvent = AStatsEvent_obtain();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700700 AStatsEvent_setAtomId(statsEvent, util::ACTIVITY_FOREGROUND_STATE_CHANGED);
tsaichristine7747d372020-02-28 17:36:59 -0800701 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
702
703 AStatsEvent_writeInt32(statsEvent, uid);
704 AStatsEvent_writeString(statsEvent, "pkg_name");
705 AStatsEvent_writeString(statsEvent, "class_name");
706 AStatsEvent_writeInt32(statsEvent, state);
tsaichristine7747d372020-02-28 17:36:59 -0800707
708 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700709 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine7747d372020-02-28 17:36:59 -0800710 return logEvent;
711}
712
713std::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(uint64_t timestampNs, const int uid) {
714 return CreateActivityForegroundStateChangedEvent(timestampNs, uid,
715 ActivityForegroundStateChanged::BACKGROUND);
716}
717
718std::unique_ptr<LogEvent> CreateMoveToForegroundEvent(uint64_t timestampNs, const int uid) {
719 return CreateActivityForegroundStateChangedEvent(timestampNs, uid,
720 ActivityForegroundStateChanged::FOREGROUND);
721}
722
723std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(uint64_t timestampNs,
724 const vector<int>& attributionUids,
725 const vector<string>& attributionTags,
726 const string& name,
727 const SyncStateChanged::State state) {
728 AStatsEvent* statsEvent = AStatsEvent_obtain();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700729 AStatsEvent_setAtomId(statsEvent, util::SYNC_STATE_CHANGED);
tsaichristine7747d372020-02-28 17:36:59 -0800730 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
731
tsaichristine8dca82e2020-04-07 09:40:03 -0700732 writeAttribution(statsEvent, attributionUids, attributionTags);
tsaichristine7747d372020-02-28 17:36:59 -0800733 AStatsEvent_writeString(statsEvent, name.c_str());
734 AStatsEvent_writeInt32(statsEvent, state);
tsaichristine7747d372020-02-28 17:36:59 -0800735
736 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700737 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine7747d372020-02-28 17:36:59 -0800738 return logEvent;
739}
740
741std::unique_ptr<LogEvent> CreateSyncStartEvent(uint64_t timestampNs,
742 const vector<int>& attributionUids,
743 const vector<string>& attributionTags,
744 const string& name) {
745 return CreateSyncStateChangedEvent(timestampNs, attributionUids, attributionTags, name,
746 SyncStateChanged::ON);
747}
748
749std::unique_ptr<LogEvent> CreateSyncEndEvent(uint64_t timestampNs,
750 const vector<int>& attributionUids,
751 const vector<string>& attributionTags,
752 const string& name) {
753 return CreateSyncStateChangedEvent(timestampNs, attributionUids, attributionTags, name,
754 SyncStateChanged::OFF);
755}
756
757std::unique_ptr<LogEvent> CreateProcessLifeCycleStateChangedEvent(
758 uint64_t timestampNs, const int uid, const ProcessLifeCycleStateChanged::State state) {
759 AStatsEvent* statsEvent = AStatsEvent_obtain();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700760 AStatsEvent_setAtomId(statsEvent, util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
tsaichristine7747d372020-02-28 17:36:59 -0800761 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
762
763 AStatsEvent_writeInt32(statsEvent, uid);
764 AStatsEvent_writeString(statsEvent, "");
765 AStatsEvent_writeInt32(statsEvent, state);
tsaichristine7747d372020-02-28 17:36:59 -0800766
767 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700768 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine7747d372020-02-28 17:36:59 -0800769 return logEvent;
770}
771
772std::unique_ptr<LogEvent> CreateAppCrashEvent(uint64_t timestampNs, const int uid) {
773 return CreateProcessLifeCycleStateChangedEvent(timestampNs, uid,
774 ProcessLifeCycleStateChanged::CRASHED);
775}
776
777std::unique_ptr<LogEvent> CreateAppCrashOccurredEvent(uint64_t timestampNs, const int uid) {
778 AStatsEvent* statsEvent = AStatsEvent_obtain();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700779 AStatsEvent_setAtomId(statsEvent, util::APP_CRASH_OCCURRED);
tsaichristine7747d372020-02-28 17:36:59 -0800780 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
781
782 AStatsEvent_writeInt32(statsEvent, uid);
783 AStatsEvent_writeString(statsEvent, "eventType");
784 AStatsEvent_writeString(statsEvent, "processName");
tsaichristine7747d372020-02-28 17:36:59 -0800785
786 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700787 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine7747d372020-02-28 17:36:59 -0800788 return logEvent;
789}
790
791std::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(uint64_t timestampNs, int hostUid,
792 int isolatedUid, bool is_create) {
793 AStatsEvent* statsEvent = AStatsEvent_obtain();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700794 AStatsEvent_setAtomId(statsEvent, util::ISOLATED_UID_CHANGED);
tsaichristine7747d372020-02-28 17:36:59 -0800795 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
796
797 AStatsEvent_writeInt32(statsEvent, hostUid);
798 AStatsEvent_writeInt32(statsEvent, isolatedUid);
799 AStatsEvent_writeInt32(statsEvent, is_create);
tsaichristine7747d372020-02-28 17:36:59 -0800800
801 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700802 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine7747d372020-02-28 17:36:59 -0800803 return logEvent;
804}
805
806std::unique_ptr<LogEvent> CreateUidProcessStateChangedEvent(
807 uint64_t timestampNs, int uid, const android::app::ProcessStateEnum state) {
808 AStatsEvent* statsEvent = AStatsEvent_obtain();
Jeffrey Huang3eb84d42020-03-17 10:31:22 -0700809 AStatsEvent_setAtomId(statsEvent, util::UID_PROCESS_STATE_CHANGED);
tsaichristine7747d372020-02-28 17:36:59 -0800810 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
811
812 AStatsEvent_writeInt32(statsEvent, uid);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700813 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_IS_UID, true);
814 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
tsaichristine7747d372020-02-28 17:36:59 -0800815 AStatsEvent_writeInt32(statsEvent, state);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700816 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
817 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, false);
tsaichristine7747d372020-02-28 17:36:59 -0800818
819 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700820 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine7747d372020-02-28 17:36:59 -0800821 return logEvent;
822}
tsaichristine69000e62019-10-18 17:34:52 -0700823
tsaichristinea3d2ed82020-03-19 20:53:36 -0700824std::unique_ptr<LogEvent> CreateBleScanStateChangedEvent(uint64_t timestampNs,
825 const vector<int>& attributionUids,
826 const vector<string>& attributionTags,
827 const BleScanStateChanged::State state,
828 const bool filtered, const bool firstMatch,
829 const bool opportunistic) {
830 AStatsEvent* statsEvent = AStatsEvent_obtain();
831 AStatsEvent_setAtomId(statsEvent, util::BLE_SCAN_STATE_CHANGED);
832 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
833
tsaichristine8dca82e2020-04-07 09:40:03 -0700834 writeAttribution(statsEvent, attributionUids, attributionTags);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700835 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true);
tsaichristinea3d2ed82020-03-19 20:53:36 -0700836 AStatsEvent_writeInt32(statsEvent, state);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700837 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
838 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, true);
839 if (state == util::BLE_SCAN_STATE_CHANGED__STATE__RESET) {
840 AStatsEvent_addInt32Annotation(statsEvent, ANNOTATION_ID_TRIGGER_STATE_RESET,
841 util::BLE_SCAN_STATE_CHANGED__STATE__OFF);
842 }
843 AStatsEvent_writeBool(statsEvent, filtered); // filtered
844 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
845 AStatsEvent_writeBool(statsEvent, firstMatch); // first match
846 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
847 AStatsEvent_writeBool(statsEvent, opportunistic); // opportunistic
848 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
tsaichristinea3d2ed82020-03-19 20:53:36 -0700849
850 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700851 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristinea3d2ed82020-03-19 20:53:36 -0700852 return logEvent;
853}
854
855std::unique_ptr<LogEvent> CreateOverlayStateChangedEvent(int64_t timestampNs, const int32_t uid,
856 const string& packageName,
857 const bool usingAlertWindow,
858 const OverlayStateChanged::State state) {
859 AStatsEvent* statsEvent = AStatsEvent_obtain();
860 AStatsEvent_setAtomId(statsEvent, util::OVERLAY_STATE_CHANGED);
861 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
862
863 AStatsEvent_writeInt32(statsEvent, uid);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700864 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_IS_UID, true);
865 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
tsaichristinea3d2ed82020-03-19 20:53:36 -0700866 AStatsEvent_writeString(statsEvent, packageName.c_str());
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700867 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_PRIMARY_FIELD, true);
868 AStatsEvent_writeBool(statsEvent, usingAlertWindow);
tsaichristinea3d2ed82020-03-19 20:53:36 -0700869 AStatsEvent_writeInt32(statsEvent, state);
Muhammad Qureshibfc4bdb2020-04-08 06:26:49 -0700870 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
871 AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, false);
tsaichristinea3d2ed82020-03-19 20:53:36 -0700872
873 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700874 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristinea3d2ed82020-03-19 20:53:36 -0700875 return logEvent;
876}
877
Yangster-mac15f6bbc2018-04-08 11:52:26 -0700878sp<StatsLogProcessor> CreateStatsLogProcessor(const int64_t timeBaseNs, const int64_t currentTimeNs,
Tej Singh730ed292020-02-03 17:24:27 -0800879 const StatsdConfig& config, const ConfigKey& key,
Ruchir Rastogie449b0c2020-02-10 17:40:09 -0800880 const shared_ptr<IPullAtomCallback>& puller,
Tej Singh730ed292020-02-03 17:24:27 -0800881 const int32_t atomTag) {
Yangster-mac20877162017-12-22 17:19:39 -0800882 sp<UidMap> uidMap = new UidMap();
Chenjie Yue2219202018-06-08 10:07:51 -0700883 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Tej Singh730ed292020-02-03 17:24:27 -0800884 if (puller != nullptr) {
885 pullerManager->RegisterPullAtomCallback(/*uid=*/0, atomTag, NS_PER_SEC, NS_PER_SEC * 10, {},
886 puller);
887 }
Yangster-macbe10ddf2018-03-13 15:39:51 -0700888 sp<AlarmMonitor> anomalyAlarmMonitor =
Ruchir Rastogie449b0c2020-02-10 17:40:09 -0800889 new AlarmMonitor(1,
890 [](const shared_ptr<IStatsCompanionService>&, int64_t){},
891 [](const shared_ptr<IStatsCompanionService>&){});
Yangster-mac684d1952018-03-24 16:47:16 -0700892 sp<AlarmMonitor> periodicAlarmMonitor =
Ruchir Rastogie449b0c2020-02-10 17:40:09 -0800893 new AlarmMonitor(1,
894 [](const shared_ptr<IStatsCompanionService>&, int64_t){},
895 [](const shared_ptr<IStatsCompanionService>&){});
Chenjie Yue2219202018-06-08 10:07:51 -0700896 sp<StatsLogProcessor> processor =
897 new StatsLogProcessor(uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor,
Tej Singh6ede28b2019-01-29 17:06:54 -0800898 timeBaseNs, [](const ConfigKey&) { return true; },
899 [](const int&, const vector<int64_t>&) {return true;});
Yangster-mac15f6bbc2018-04-08 11:52:26 -0700900 processor->OnConfigUpdated(currentTimeNs, key, config);
Yangster-mac20877162017-12-22 17:19:39 -0800901 return processor;
902}
903
Yangster-mac20877162017-12-22 17:19:39 -0800904void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) {
905 std::sort(events->begin(), events->end(),
906 [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) {
Yangster-mac330af582018-02-08 15:24:38 -0800907 return a->GetElapsedTimestampNs() < b->GetElapsedTimestampNs();
Yangster-mac20877162017-12-22 17:19:39 -0800908 });
909}
910
Yangster-mac94e197c2018-01-02 16:03:03 -0800911int64_t StringToId(const string& str) {
912 return static_cast<int64_t>(std::hash<std::string>()(str));
913}
Yangster-macb5bc7412018-01-06 23:17:45 -0800914
tsaichristine1449fa42020-01-02 12:12:05 -0800915void ValidateWakelockAttributionUidAndTagDimension(const DimensionsValue& value, const int atomId,
916 const int uid, const string& tag) {
917 EXPECT_EQ(value.field(), atomId);
918 EXPECT_EQ(value.value_tuple().dimensions_value_size(), 2);
919 // Attribution field.
920 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
921 // Uid field.
922 EXPECT_EQ(value.value_tuple().dimensions_value(0).value_tuple().dimensions_value_size(), 1);
923 EXPECT_EQ(value.value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).field(), 1);
924 EXPECT_EQ(value.value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).value_int(),
925 uid);
926 // Tag field.
927 EXPECT_EQ(value.value_tuple().dimensions_value(1).field(), 3);
928 EXPECT_EQ(value.value_tuple().dimensions_value(1).value_str(), tag);
929}
930
Yangster-macb5bc7412018-01-06 23:17:45 -0800931void ValidateAttributionUidDimension(const DimensionsValue& value, int atomId, int uid) {
932 EXPECT_EQ(value.field(), atomId);
Yangster-macb5bc7412018-01-06 23:17:45 -0800933 EXPECT_EQ(value.value_tuple().dimensions_value_size(), 1);
934 // Attribution field.
935 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
936 // Uid only.
937 EXPECT_EQ(value.value_tuple().dimensions_value(0)
938 .value_tuple().dimensions_value_size(), 1);
939 EXPECT_EQ(value.value_tuple().dimensions_value(0)
940 .value_tuple().dimensions_value(0).field(), 1);
941 EXPECT_EQ(value.value_tuple().dimensions_value(0)
942 .value_tuple().dimensions_value(0).value_int(), uid);
943}
944
Yangster-mace06cfd72018-03-10 23:22:59 -0800945void ValidateUidDimension(const DimensionsValue& value, int node_idx, int atomId, int uid) {
946 EXPECT_EQ(value.field(), atomId);
947 EXPECT_GT(value.value_tuple().dimensions_value_size(), node_idx);
948 // Attribution field.
949 EXPECT_EQ(value.value_tuple().dimensions_value(node_idx).field(), 1);
950 EXPECT_EQ(value.value_tuple().dimensions_value(node_idx)
951 .value_tuple().dimensions_value(0).field(), 1);
952 EXPECT_EQ(value.value_tuple().dimensions_value(node_idx)
953 .value_tuple().dimensions_value(0).value_int(), uid);
954}
955
956void ValidateAttributionUidAndTagDimension(
957 const DimensionsValue& value, int node_idx, int atomId, int uid, const std::string& tag) {
958 EXPECT_EQ(value.field(), atomId);
959 EXPECT_GT(value.value_tuple().dimensions_value_size(), node_idx);
960 // Attribution field.
961 EXPECT_EQ(1, value.value_tuple().dimensions_value(node_idx).field());
962 // Uid only.
963 EXPECT_EQ(2, value.value_tuple().dimensions_value(node_idx)
964 .value_tuple().dimensions_value_size());
965 EXPECT_EQ(1, value.value_tuple().dimensions_value(node_idx)
966 .value_tuple().dimensions_value(0).field());
967 EXPECT_EQ(uid, value.value_tuple().dimensions_value(node_idx)
968 .value_tuple().dimensions_value(0).value_int());
969 EXPECT_EQ(2, value.value_tuple().dimensions_value(node_idx)
970 .value_tuple().dimensions_value(1).field());
971 EXPECT_EQ(tag, value.value_tuple().dimensions_value(node_idx)
972 .value_tuple().dimensions_value(1).value_str());
973}
974
Yangster-macb5bc7412018-01-06 23:17:45 -0800975void ValidateAttributionUidAndTagDimension(
976 const DimensionsValue& value, int atomId, int uid, const std::string& tag) {
977 EXPECT_EQ(value.field(), atomId);
Yangster-mace06cfd72018-03-10 23:22:59 -0800978 EXPECT_EQ(1, value.value_tuple().dimensions_value_size());
Yangster-macb5bc7412018-01-06 23:17:45 -0800979 // Attribution field.
Yangster-mace06cfd72018-03-10 23:22:59 -0800980 EXPECT_EQ(1, value.value_tuple().dimensions_value(0).field());
Yangster-macb5bc7412018-01-06 23:17:45 -0800981 // Uid only.
982 EXPECT_EQ(value.value_tuple().dimensions_value(0)
983 .value_tuple().dimensions_value_size(), 2);
984 EXPECT_EQ(value.value_tuple().dimensions_value(0)
985 .value_tuple().dimensions_value(0).field(), 1);
986 EXPECT_EQ(value.value_tuple().dimensions_value(0)
987 .value_tuple().dimensions_value(0).value_int(), uid);
988 EXPECT_EQ(value.value_tuple().dimensions_value(0)
989 .value_tuple().dimensions_value(1).field(), 2);
990 EXPECT_EQ(value.value_tuple().dimensions_value(0)
991 .value_tuple().dimensions_value(1).value_str(), tag);
992}
993
Yao Chen8a8d16c2018-02-08 14:50:40 -0800994bool EqualsTo(const DimensionsValue& s1, const DimensionsValue& s2) {
995 if (s1.field() != s2.field()) {
996 return false;
997 }
998 if (s1.value_case() != s2.value_case()) {
999 return false;
1000 }
1001 switch (s1.value_case()) {
1002 case DimensionsValue::ValueCase::kValueStr:
1003 return (s1.value_str() == s2.value_str());
1004 case DimensionsValue::ValueCase::kValueInt:
1005 return s1.value_int() == s2.value_int();
1006 case DimensionsValue::ValueCase::kValueLong:
1007 return s1.value_long() == s2.value_long();
1008 case DimensionsValue::ValueCase::kValueBool:
1009 return s1.value_bool() == s2.value_bool();
1010 case DimensionsValue::ValueCase::kValueFloat:
1011 return s1.value_float() == s2.value_float();
1012 case DimensionsValue::ValueCase::kValueTuple: {
1013 if (s1.value_tuple().dimensions_value_size() !=
1014 s2.value_tuple().dimensions_value_size()) {
1015 return false;
1016 }
1017 bool allMatched = true;
1018 for (int i = 0; allMatched && i < s1.value_tuple().dimensions_value_size(); ++i) {
1019 allMatched &= EqualsTo(s1.value_tuple().dimensions_value(i),
1020 s2.value_tuple().dimensions_value(i));
1021 }
1022 return allMatched;
1023 }
1024 case DimensionsValue::ValueCase::VALUE_NOT_SET:
1025 default:
1026 return true;
1027 }
1028}
1029
Tej Singh5d823b32019-05-21 20:13:21 -07001030bool LessThan(const google::protobuf::RepeatedPtrField<StateValue>& s1,
1031 const google::protobuf::RepeatedPtrField<StateValue>& s2) {
1032 if (s1.size() != s2.size()) {
1033 return s1.size() < s2.size();
1034 }
1035 for (int i = 0; i < s1.size(); i++) {
1036 const StateValue& state1 = s1[i];
1037 const StateValue& state2 = s2[i];
1038 if (state1.atom_id() != state2.atom_id()) {
1039 return state1.atom_id() < state2.atom_id();
1040 }
1041 if (state1.value() != state2.value()) {
1042 return state1.value() < state2.value();
1043 }
1044 if (state1.group_id() != state2.group_id()) {
1045 return state1.group_id() < state2.group_id();
1046 }
1047 }
1048 return false;
1049}
1050
Yao Chen8a8d16c2018-02-08 14:50:40 -08001051bool LessThan(const DimensionsValue& s1, const DimensionsValue& s2) {
1052 if (s1.field() != s2.field()) {
1053 return s1.field() < s2.field();
1054 }
1055 if (s1.value_case() != s2.value_case()) {
1056 return s1.value_case() < s2.value_case();
1057 }
1058 switch (s1.value_case()) {
1059 case DimensionsValue::ValueCase::kValueStr:
1060 return s1.value_str() < s2.value_str();
1061 case DimensionsValue::ValueCase::kValueInt:
1062 return s1.value_int() < s2.value_int();
1063 case DimensionsValue::ValueCase::kValueLong:
1064 return s1.value_long() < s2.value_long();
1065 case DimensionsValue::ValueCase::kValueBool:
1066 return (int)s1.value_bool() < (int)s2.value_bool();
1067 case DimensionsValue::ValueCase::kValueFloat:
1068 return s1.value_float() < s2.value_float();
1069 case DimensionsValue::ValueCase::kValueTuple: {
1070 if (s1.value_tuple().dimensions_value_size() !=
1071 s2.value_tuple().dimensions_value_size()) {
1072 return s1.value_tuple().dimensions_value_size() <
1073 s2.value_tuple().dimensions_value_size();
1074 }
1075 for (int i = 0; i < s1.value_tuple().dimensions_value_size(); ++i) {
1076 if (EqualsTo(s1.value_tuple().dimensions_value(i),
1077 s2.value_tuple().dimensions_value(i))) {
1078 continue;
1079 } else {
1080 return LessThan(s1.value_tuple().dimensions_value(i),
1081 s2.value_tuple().dimensions_value(i));
1082 }
1083 }
1084 return false;
1085 }
1086 case DimensionsValue::ValueCase::VALUE_NOT_SET:
1087 default:
1088 return false;
1089 }
1090}
1091
1092bool LessThan(const DimensionsPair& s1, const DimensionsPair& s2) {
1093 if (LessThan(s1.dimInWhat, s2.dimInWhat)) {
1094 return true;
1095 } else if (LessThan(s2.dimInWhat, s1.dimInWhat)) {
1096 return false;
1097 }
1098
Tej Singh5d823b32019-05-21 20:13:21 -07001099 return LessThan(s1.stateValues, s2.stateValues);
Yao Chen8a8d16c2018-02-08 14:50:40 -08001100}
1101
Yangster-mac9def8e32018-04-17 13:55:51 -07001102void backfillStringInDimension(const std::map<uint64_t, string>& str_map,
1103 DimensionsValue* dimension) {
1104 if (dimension->has_value_str_hash()) {
1105 auto it = str_map.find((uint64_t)(dimension->value_str_hash()));
1106 if (it != str_map.end()) {
1107 dimension->clear_value_str_hash();
1108 dimension->set_value_str(it->second);
1109 } else {
1110 ALOGE("Can not find the string hash: %llu",
1111 (unsigned long long)dimension->value_str_hash());
1112 }
1113 } else if (dimension->has_value_tuple()) {
1114 auto value_tuple = dimension->mutable_value_tuple();
1115 for (int i = 0; i < value_tuple->dimensions_value_size(); ++i) {
1116 backfillStringInDimension(str_map, value_tuple->mutable_dimensions_value(i));
1117 }
1118 }
1119}
1120
1121void backfillStringInReport(ConfigMetricsReport *config_report) {
1122 std::map<uint64_t, string> str_map;
1123 for (const auto& str : config_report->strings()) {
1124 uint64_t hash = Hash64(str);
1125 if (str_map.find(hash) != str_map.end()) {
1126 ALOGE("String hash conflicts: %s %s", str.c_str(), str_map[hash].c_str());
1127 }
1128 str_map[hash] = str;
1129 }
1130 for (int i = 0; i < config_report->metrics_size(); ++i) {
1131 auto metric_report = config_report->mutable_metrics(i);
1132 if (metric_report->has_count_metrics()) {
1133 backfillStringInDimension(str_map, metric_report->mutable_count_metrics());
1134 } else if (metric_report->has_duration_metrics()) {
1135 backfillStringInDimension(str_map, metric_report->mutable_duration_metrics());
1136 } else if (metric_report->has_gauge_metrics()) {
1137 backfillStringInDimension(str_map, metric_report->mutable_gauge_metrics());
1138 } else if (metric_report->has_value_metrics()) {
1139 backfillStringInDimension(str_map, metric_report->mutable_value_metrics());
1140 }
1141 }
1142 // Backfill the package names.
1143 for (int i = 0 ; i < config_report->uid_map().snapshots_size(); ++i) {
1144 auto snapshot = config_report->mutable_uid_map()->mutable_snapshots(i);
1145 for (int j = 0 ; j < snapshot->package_info_size(); ++j) {
1146 auto package_info = snapshot->mutable_package_info(j);
1147 if (package_info->has_name_hash()) {
1148 auto it = str_map.find((uint64_t)(package_info->name_hash()));
1149 if (it != str_map.end()) {
1150 package_info->clear_name_hash();
1151 package_info->set_name(it->second);
1152 } else {
1153 ALOGE("Can not find the string package name hash: %llu",
1154 (unsigned long long)package_info->name_hash());
1155 }
1156
1157 }
1158 }
1159 }
1160 // Backfill the app name in app changes.
1161 for (int i = 0 ; i < config_report->uid_map().changes_size(); ++i) {
1162 auto change = config_report->mutable_uid_map()->mutable_changes(i);
1163 if (change->has_app_hash()) {
1164 auto it = str_map.find((uint64_t)(change->app_hash()));
1165 if (it != str_map.end()) {
1166 change->clear_app_hash();
1167 change->set_app(it->second);
1168 } else {
1169 ALOGE("Can not find the string change app name hash: %llu",
1170 (unsigned long long)change->app_hash());
1171 }
1172 }
1173 }
1174}
1175
1176void backfillStringInReport(ConfigMetricsReportList *config_report_list) {
1177 for (int i = 0; i < config_report_list->reports_size(); ++i) {
1178 backfillStringInReport(config_report_list->mutable_reports(i));
1179 }
1180}
1181
1182bool backfillDimensionPath(const DimensionsValue& path,
1183 const google::protobuf::RepeatedPtrField<DimensionsValue>& leafValues,
1184 int* leafIndex,
1185 DimensionsValue* dimension) {
1186 dimension->set_field(path.field());
1187 if (path.has_value_tuple()) {
1188 for (int i = 0; i < path.value_tuple().dimensions_value_size(); ++i) {
1189 if (!backfillDimensionPath(
1190 path.value_tuple().dimensions_value(i), leafValues, leafIndex,
1191 dimension->mutable_value_tuple()->add_dimensions_value())) {
1192 return false;
1193 }
1194 }
1195 } else {
1196 if (*leafIndex < 0 || *leafIndex >= leafValues.size()) {
1197 return false;
1198 }
1199 dimension->MergeFrom(leafValues.Get(*leafIndex));
1200 (*leafIndex)++;
1201 }
1202 return true;
1203}
1204
1205bool backfillDimensionPath(const DimensionsValue& path,
1206 const google::protobuf::RepeatedPtrField<DimensionsValue>& leafValues,
1207 DimensionsValue* dimension) {
1208 int leafIndex = 0;
1209 return backfillDimensionPath(path, leafValues, &leafIndex, dimension);
1210}
1211
1212void backfillDimensionPath(ConfigMetricsReportList *config_report_list) {
1213 for (int i = 0; i < config_report_list->reports_size(); ++i) {
1214 auto report = config_report_list->mutable_reports(i);
1215 for (int j = 0; j < report->metrics_size(); ++j) {
1216 auto metric_report = report->mutable_metrics(j);
1217 if (metric_report->has_dimensions_path_in_what() ||
1218 metric_report->has_dimensions_path_in_condition()) {
1219 auto whatPath = metric_report->dimensions_path_in_what();
1220 auto conditionPath = metric_report->dimensions_path_in_condition();
1221 if (metric_report->has_count_metrics()) {
1222 backfillDimensionPath(whatPath, conditionPath,
1223 metric_report->mutable_count_metrics());
1224 } else if (metric_report->has_duration_metrics()) {
1225 backfillDimensionPath(whatPath, conditionPath,
1226 metric_report->mutable_duration_metrics());
1227 } else if (metric_report->has_gauge_metrics()) {
1228 backfillDimensionPath(whatPath, conditionPath,
1229 metric_report->mutable_gauge_metrics());
1230 } else if (metric_report->has_value_metrics()) {
1231 backfillDimensionPath(whatPath, conditionPath,
1232 metric_report->mutable_value_metrics());
1233 }
1234 metric_report->clear_dimensions_path_in_what();
1235 metric_report->clear_dimensions_path_in_condition();
1236 }
1237 }
1238 }
1239}
1240
1241void backfillStartEndTimestamp(StatsLogReport *report) {
1242 const int64_t timeBaseNs = report->time_base_elapsed_nano_seconds();
1243 const int64_t bucketSizeNs = report->bucket_size_nano_seconds();
1244 if (report->has_count_metrics()) {
1245 backfillStartEndTimestampForMetrics(
1246 timeBaseNs, bucketSizeNs, report->mutable_count_metrics());
1247 } else if (report->has_duration_metrics()) {
1248 backfillStartEndTimestampForMetrics(
1249 timeBaseNs, bucketSizeNs, report->mutable_duration_metrics());
1250 } else if (report->has_gauge_metrics()) {
1251 backfillStartEndTimestampForMetrics(
1252 timeBaseNs, bucketSizeNs, report->mutable_gauge_metrics());
1253 if (report->gauge_metrics().skipped_size() > 0) {
1254 backfillStartEndTimestampForSkippedBuckets(
1255 timeBaseNs, report->mutable_gauge_metrics());
1256 }
1257 } else if (report->has_value_metrics()) {
1258 backfillStartEndTimestampForMetrics(
1259 timeBaseNs, bucketSizeNs, report->mutable_value_metrics());
1260 if (report->value_metrics().skipped_size() > 0) {
1261 backfillStartEndTimestampForSkippedBuckets(
1262 timeBaseNs, report->mutable_value_metrics());
1263 }
1264 }
1265}
1266
1267void backfillStartEndTimestamp(ConfigMetricsReport *config_report) {
1268 for (int j = 0; j < config_report->metrics_size(); ++j) {
1269 backfillStartEndTimestamp(config_report->mutable_metrics(j));
1270 }
1271}
1272
1273void backfillStartEndTimestamp(ConfigMetricsReportList *config_report_list) {
1274 for (int i = 0; i < config_report_list->reports_size(); ++i) {
1275 backfillStartEndTimestamp(config_report_list->mutable_reports(i));
1276 }
1277}
1278
Ruchir Rastogie449b0c2020-02-10 17:40:09 -08001279Status FakeSubsystemSleepCallback::onPullAtom(int atomTag,
1280 const shared_ptr<IPullAtomResultReceiver>& resultReceiver) {
Tej Singh730ed292020-02-03 17:24:27 -08001281 // Convert stats_events into StatsEventParcels.
Ruchir Rastogie449b0c2020-02-10 17:40:09 -08001282 std::vector<StatsEventParcel> parcels;
Tej Singh730ed292020-02-03 17:24:27 -08001283 for (int i = 1; i < 3; i++) {
Tej Singhb26d0442020-01-31 16:18:21 -08001284 AStatsEvent* event = AStatsEvent_obtain();
1285 AStatsEvent_setAtomId(event, atomTag);
Tej Singh730ed292020-02-03 17:24:27 -08001286 std::string subsystemName = "subsystem_name_";
1287 subsystemName = subsystemName + std::to_string(i);
Tej Singhb26d0442020-01-31 16:18:21 -08001288 AStatsEvent_writeString(event, subsystemName.c_str());
1289 AStatsEvent_writeString(event, "subsystem_subname foo");
1290 AStatsEvent_writeInt64(event, /*count= */ i);
1291 AStatsEvent_writeInt64(event, /*time_millis= */ i * 100);
1292 AStatsEvent_build(event);
Tej Singh730ed292020-02-03 17:24:27 -08001293 size_t size;
Tej Singhb26d0442020-01-31 16:18:21 -08001294 uint8_t* buffer = AStatsEvent_getBuffer(event, &size);
Tej Singh730ed292020-02-03 17:24:27 -08001295
Ruchir Rastogie449b0c2020-02-10 17:40:09 -08001296 StatsEventParcel p;
Tej Singh730ed292020-02-03 17:24:27 -08001297 // vector.assign() creates a copy, but this is inevitable unless
1298 // stats_event.h/c uses a vector as opposed to a buffer.
1299 p.buffer.assign(buffer, buffer + size);
1300 parcels.push_back(std::move(p));
Tej Singhb26d0442020-01-31 16:18:21 -08001301 AStatsEvent_write(event);
Tej Singh730ed292020-02-03 17:24:27 -08001302 }
1303 resultReceiver->pullFinished(atomTag, /*success=*/true, parcels);
Ruchir Rastogie449b0c2020-02-10 17:40:09 -08001304 return Status::ok();
Tej Singh730ed292020-02-03 17:24:27 -08001305}
1306
Yangster-mac20877162017-12-22 17:19:39 -08001307} // namespace statsd
1308} // namespace os
Tej Singh6ede28b2019-01-29 17:06:54 -08001309} // namespace android