• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2017 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "statsd_test_util.h"
16 
17 #include <aggregator.pb.h>
18 #include <aidl/android/util/StatsEventParcel.h>
19 #include <android-base/properties.h>
20 #include <android-base/stringprintf.h>
21 
22 #include "matchers/SimpleAtomMatchingTracker.h"
23 #include "stats_annotations.h"
24 #include "stats_event.h"
25 #include "stats_util.h"
26 
27 using aidl::android::util::StatsEventParcel;
28 using android::base::SetProperty;
29 using android::base::StringPrintf;
30 using std::shared_ptr;
31 using zetasketch::android::AggregatorStateProto;
32 
33 namespace android {
34 namespace os {
35 namespace statsd {
36 
outputStreamToProto(ProtoOutputStream * proto)37 StatsLogReport outputStreamToProto(ProtoOutputStream* proto) {
38     vector<uint8_t> bytes;
39     bytes.resize(proto->size());
40     size_t pos = 0;
41     sp<ProtoReader> reader = proto->data();
42 
43     while (reader->readBuffer() != NULL) {
44         size_t toRead = reader->currentToRead();
45         std::memcpy(&((bytes)[pos]), reader->readBuffer(), toRead);
46         pos += toRead;
47         reader->move(toRead);
48     }
49 
50     StatsLogReport report;
51     report.ParseFromArray(bytes.data(), bytes.size());
52     return report;
53 }
54 
CreateSimpleAtomMatcher(const string & name,int atomId)55 AtomMatcher CreateSimpleAtomMatcher(const string& name, int atomId) {
56     AtomMatcher atom_matcher;
57     atom_matcher.set_id(StringToId(name));
58     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
59     simple_atom_matcher->set_atom_id(atomId);
60     return atom_matcher;
61 }
62 
CreateTemperatureAtomMatcher()63 AtomMatcher CreateTemperatureAtomMatcher() {
64     return CreateSimpleAtomMatcher("TemperatureMatcher", util::TEMPERATURE);
65 }
66 
CreateScheduledJobStateChangedAtomMatcher(const string & name,ScheduledJobStateChanged::State state)67 AtomMatcher CreateScheduledJobStateChangedAtomMatcher(const string& name,
68                                                       ScheduledJobStateChanged::State state) {
69     AtomMatcher atom_matcher;
70     atom_matcher.set_id(StringToId(name));
71     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
72     simple_atom_matcher->set_atom_id(util::SCHEDULED_JOB_STATE_CHANGED);
73     auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
74     field_value_matcher->set_field(3);  // State field.
75     field_value_matcher->set_eq_int(state);
76     return atom_matcher;
77 }
78 
CreateStartScheduledJobAtomMatcher()79 AtomMatcher CreateStartScheduledJobAtomMatcher() {
80     return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobStart",
81                                                      ScheduledJobStateChanged::STARTED);
82 }
83 
CreateFinishScheduledJobAtomMatcher()84 AtomMatcher CreateFinishScheduledJobAtomMatcher() {
85     return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobFinish",
86                                                      ScheduledJobStateChanged::FINISHED);
87 }
88 
CreateScreenBrightnessChangedAtomMatcher()89 AtomMatcher CreateScreenBrightnessChangedAtomMatcher() {
90     AtomMatcher atom_matcher;
91     atom_matcher.set_id(StringToId("ScreenBrightnessChanged"));
92     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
93     simple_atom_matcher->set_atom_id(util::SCREEN_BRIGHTNESS_CHANGED);
94     return atom_matcher;
95 }
96 
CreateUidProcessStateChangedAtomMatcher()97 AtomMatcher CreateUidProcessStateChangedAtomMatcher() {
98     AtomMatcher atom_matcher;
99     atom_matcher.set_id(StringToId("UidProcessStateChanged"));
100     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
101     simple_atom_matcher->set_atom_id(util::UID_PROCESS_STATE_CHANGED);
102     return atom_matcher;
103 }
104 
CreateWakelockStateChangedAtomMatcher(const string & name,WakelockStateChanged::State state)105 AtomMatcher CreateWakelockStateChangedAtomMatcher(const string& name,
106                                                   WakelockStateChanged::State state) {
107     AtomMatcher atom_matcher;
108     atom_matcher.set_id(StringToId(name));
109     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
110     simple_atom_matcher->set_atom_id(util::WAKELOCK_STATE_CHANGED);
111     auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
112     field_value_matcher->set_field(4);  // State field.
113     field_value_matcher->set_eq_int(state);
114     return atom_matcher;
115 }
116 
CreateAcquireWakelockAtomMatcher()117 AtomMatcher CreateAcquireWakelockAtomMatcher() {
118     return CreateWakelockStateChangedAtomMatcher("AcquireWakelock", WakelockStateChanged::ACQUIRE);
119 }
120 
CreateReleaseWakelockAtomMatcher()121 AtomMatcher CreateReleaseWakelockAtomMatcher() {
122     return CreateWakelockStateChangedAtomMatcher("ReleaseWakelock", WakelockStateChanged::RELEASE);
123 }
124 
CreateBatterySaverModeStateChangedAtomMatcher(const string & name,BatterySaverModeStateChanged::State state)125 AtomMatcher CreateBatterySaverModeStateChangedAtomMatcher(
126     const string& name, BatterySaverModeStateChanged::State state) {
127     AtomMatcher atom_matcher;
128     atom_matcher.set_id(StringToId(name));
129     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
130     simple_atom_matcher->set_atom_id(util::BATTERY_SAVER_MODE_STATE_CHANGED);
131     auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
132     field_value_matcher->set_field(1);  // State field.
133     field_value_matcher->set_eq_int(state);
134     return atom_matcher;
135 }
136 
CreateBatterySaverModeStartAtomMatcher()137 AtomMatcher CreateBatterySaverModeStartAtomMatcher() {
138     return CreateBatterySaverModeStateChangedAtomMatcher(
139         "BatterySaverModeStart", BatterySaverModeStateChanged::ON);
140 }
141 
142 
CreateBatterySaverModeStopAtomMatcher()143 AtomMatcher CreateBatterySaverModeStopAtomMatcher() {
144     return CreateBatterySaverModeStateChangedAtomMatcher(
145         "BatterySaverModeStop", BatterySaverModeStateChanged::OFF);
146 }
147 
CreateBatteryStateChangedAtomMatcher(const string & name,BatteryPluggedStateEnum state)148 AtomMatcher CreateBatteryStateChangedAtomMatcher(const string& name,
149                                                  BatteryPluggedStateEnum state) {
150     AtomMatcher atom_matcher;
151     atom_matcher.set_id(StringToId(name));
152     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
153     simple_atom_matcher->set_atom_id(util::PLUGGED_STATE_CHANGED);
154     auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
155     field_value_matcher->set_field(1);  // State field.
156     field_value_matcher->set_eq_int(state);
157     return atom_matcher;
158 }
159 
CreateBatteryStateNoneMatcher()160 AtomMatcher CreateBatteryStateNoneMatcher() {
161     return CreateBatteryStateChangedAtomMatcher("BatteryPluggedNone",
162                                                 BatteryPluggedStateEnum::BATTERY_PLUGGED_NONE);
163 }
164 
CreateBatteryStateUsbMatcher()165 AtomMatcher CreateBatteryStateUsbMatcher() {
166     return CreateBatteryStateChangedAtomMatcher("BatteryPluggedUsb",
167                                                 BatteryPluggedStateEnum::BATTERY_PLUGGED_USB);
168 }
169 
CreateScreenStateChangedAtomMatcher(const string & name,android::view::DisplayStateEnum state)170 AtomMatcher CreateScreenStateChangedAtomMatcher(
171     const string& name, android::view::DisplayStateEnum state) {
172     AtomMatcher atom_matcher;
173     atom_matcher.set_id(StringToId(name));
174     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
175     simple_atom_matcher->set_atom_id(util::SCREEN_STATE_CHANGED);
176     auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
177     field_value_matcher->set_field(1);  // State field.
178     field_value_matcher->set_eq_int(state);
179     return atom_matcher;
180 }
181 
CreateScreenTurnedOnAtomMatcher()182 AtomMatcher CreateScreenTurnedOnAtomMatcher() {
183     return CreateScreenStateChangedAtomMatcher("ScreenTurnedOn",
184             android::view::DisplayStateEnum::DISPLAY_STATE_ON);
185 }
186 
CreateScreenTurnedOffAtomMatcher()187 AtomMatcher CreateScreenTurnedOffAtomMatcher() {
188     return CreateScreenStateChangedAtomMatcher("ScreenTurnedOff",
189             ::android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
190 }
191 
CreateSyncStateChangedAtomMatcher(const string & name,SyncStateChanged::State state)192 AtomMatcher CreateSyncStateChangedAtomMatcher(
193     const string& name, SyncStateChanged::State state) {
194     AtomMatcher atom_matcher;
195     atom_matcher.set_id(StringToId(name));
196     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
197     simple_atom_matcher->set_atom_id(util::SYNC_STATE_CHANGED);
198     auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
199     field_value_matcher->set_field(3);  // State field.
200     field_value_matcher->set_eq_int(state);
201     return atom_matcher;
202 }
203 
CreateSyncStartAtomMatcher()204 AtomMatcher CreateSyncStartAtomMatcher() {
205     return CreateSyncStateChangedAtomMatcher("SyncStart", SyncStateChanged::ON);
206 }
207 
CreateSyncEndAtomMatcher()208 AtomMatcher CreateSyncEndAtomMatcher() {
209     return CreateSyncStateChangedAtomMatcher("SyncEnd", SyncStateChanged::OFF);
210 }
211 
CreateActivityForegroundStateChangedAtomMatcher(const string & name,ActivityForegroundStateChanged::State state)212 AtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
213     const string& name, ActivityForegroundStateChanged::State state) {
214     AtomMatcher atom_matcher;
215     atom_matcher.set_id(StringToId(name));
216     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
217     simple_atom_matcher->set_atom_id(util::ACTIVITY_FOREGROUND_STATE_CHANGED);
218     auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
219     field_value_matcher->set_field(4);  // Activity field.
220     field_value_matcher->set_eq_int(state);
221     return atom_matcher;
222 }
223 
CreateMoveToBackgroundAtomMatcher()224 AtomMatcher CreateMoveToBackgroundAtomMatcher() {
225     return CreateActivityForegroundStateChangedAtomMatcher(
226         "Background", ActivityForegroundStateChanged::BACKGROUND);
227 }
228 
CreateMoveToForegroundAtomMatcher()229 AtomMatcher CreateMoveToForegroundAtomMatcher() {
230     return CreateActivityForegroundStateChangedAtomMatcher(
231         "Foreground", ActivityForegroundStateChanged::FOREGROUND);
232 }
233 
CreateProcessLifeCycleStateChangedAtomMatcher(const string & name,ProcessLifeCycleStateChanged::State state)234 AtomMatcher CreateProcessLifeCycleStateChangedAtomMatcher(
235     const string& name, ProcessLifeCycleStateChanged::State state) {
236     AtomMatcher atom_matcher;
237     atom_matcher.set_id(StringToId(name));
238     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
239     simple_atom_matcher->set_atom_id(util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
240     auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
241     field_value_matcher->set_field(3);  // Process state field.
242     field_value_matcher->set_eq_int(state);
243     return atom_matcher;
244 }
245 
CreateProcessCrashAtomMatcher()246 AtomMatcher CreateProcessCrashAtomMatcher() {
247     return CreateProcessLifeCycleStateChangedAtomMatcher(
248         "Crashed", ProcessLifeCycleStateChanged::CRASHED);
249 }
250 
CreateAppStartOccurredAtomMatcher()251 AtomMatcher CreateAppStartOccurredAtomMatcher() {
252     return CreateSimpleAtomMatcher("AppStartOccurredMatcher", util::APP_START_OCCURRED);
253 }
254 
CreateTestAtomRepeatedStateAtomMatcher(const string & name,TestAtomReported::State state,Position position)255 AtomMatcher CreateTestAtomRepeatedStateAtomMatcher(const string& name,
256                                                    TestAtomReported::State state,
257                                                    Position position) {
258     AtomMatcher atom_matcher;
259     atom_matcher.set_id(StringToId(name));
260     auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
261     simple_atom_matcher->set_atom_id(util::TEST_ATOM_REPORTED);
262     auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
263     field_value_matcher->set_field(14);  // Repeated enum field.
264     field_value_matcher->set_eq_int(state);
265     field_value_matcher->set_position(position);
266     return atom_matcher;
267 }
268 
CreateTestAtomRepeatedStateFirstOffAtomMatcher()269 AtomMatcher CreateTestAtomRepeatedStateFirstOffAtomMatcher() {
270     return CreateTestAtomRepeatedStateAtomMatcher("TestFirstStateOff", TestAtomReported::OFF,
271                                                   Position::FIRST);
272 }
273 
CreateTestAtomRepeatedStateFirstOnAtomMatcher()274 AtomMatcher CreateTestAtomRepeatedStateFirstOnAtomMatcher() {
275     return CreateTestAtomRepeatedStateAtomMatcher("TestFirstStateOn", TestAtomReported::ON,
276                                                   Position::FIRST);
277 }
278 
CreateTestAtomRepeatedStateAnyOnAtomMatcher()279 AtomMatcher CreateTestAtomRepeatedStateAnyOnAtomMatcher() {
280     return CreateTestAtomRepeatedStateAtomMatcher("TestAnyStateOn", TestAtomReported::ON,
281                                                   Position::ANY);
282 }
283 
addMatcherToMatcherCombination(const AtomMatcher & matcher,AtomMatcher * combinationMatcher)284 void addMatcherToMatcherCombination(const AtomMatcher& matcher, AtomMatcher* combinationMatcher) {
285     combinationMatcher->mutable_combination()->add_matcher(matcher.id());
286 }
287 
CreateScheduledJobPredicate()288 Predicate CreateScheduledJobPredicate() {
289     Predicate predicate;
290     predicate.set_id(StringToId("ScheduledJobRunningPredicate"));
291     predicate.mutable_simple_predicate()->set_start(StringToId("ScheduledJobStart"));
292     predicate.mutable_simple_predicate()->set_stop(StringToId("ScheduledJobFinish"));
293     return predicate;
294 }
295 
CreateBatterySaverModePredicate()296 Predicate CreateBatterySaverModePredicate() {
297     Predicate predicate;
298     predicate.set_id(StringToId("BatterySaverIsOn"));
299     predicate.mutable_simple_predicate()->set_start(StringToId("BatterySaverModeStart"));
300     predicate.mutable_simple_predicate()->set_stop(StringToId("BatterySaverModeStop"));
301     return predicate;
302 }
303 
CreateDeviceUnpluggedPredicate()304 Predicate CreateDeviceUnpluggedPredicate() {
305     Predicate predicate;
306     predicate.set_id(StringToId("DeviceUnplugged"));
307     predicate.mutable_simple_predicate()->set_start(StringToId("BatteryPluggedNone"));
308     predicate.mutable_simple_predicate()->set_stop(StringToId("BatteryPluggedUsb"));
309     return predicate;
310 }
311 
CreateScreenIsOnPredicate()312 Predicate CreateScreenIsOnPredicate() {
313     Predicate predicate;
314     predicate.set_id(StringToId("ScreenIsOn"));
315     predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOn"));
316     predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOff"));
317     return predicate;
318 }
319 
CreateScreenIsOffPredicate()320 Predicate CreateScreenIsOffPredicate() {
321     Predicate predicate;
322     predicate.set_id(1111123);
323     predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOff"));
324     predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOn"));
325     return predicate;
326 }
327 
CreateHoldingWakelockPredicate()328 Predicate CreateHoldingWakelockPredicate() {
329     Predicate predicate;
330     predicate.set_id(StringToId("HoldingWakelock"));
331     predicate.mutable_simple_predicate()->set_start(StringToId("AcquireWakelock"));
332     predicate.mutable_simple_predicate()->set_stop(StringToId("ReleaseWakelock"));
333     return predicate;
334 }
335 
CreateIsSyncingPredicate()336 Predicate CreateIsSyncingPredicate() {
337     Predicate predicate;
338     predicate.set_id(33333333333333);
339     predicate.mutable_simple_predicate()->set_start(StringToId("SyncStart"));
340     predicate.mutable_simple_predicate()->set_stop(StringToId("SyncEnd"));
341     return predicate;
342 }
343 
CreateIsInBackgroundPredicate()344 Predicate CreateIsInBackgroundPredicate() {
345     Predicate predicate;
346     predicate.set_id(StringToId("IsInBackground"));
347     predicate.mutable_simple_predicate()->set_start(StringToId("Background"));
348     predicate.mutable_simple_predicate()->set_stop(StringToId("Foreground"));
349     return predicate;
350 }
351 
CreateTestAtomRepeatedStateFirstOffPredicate()352 Predicate CreateTestAtomRepeatedStateFirstOffPredicate() {
353     Predicate predicate;
354     predicate.set_id(StringToId("TestFirstStateIsOff"));
355     predicate.mutable_simple_predicate()->set_start(StringToId("TestFirstStateOff"));
356     predicate.mutable_simple_predicate()->set_stop(StringToId("TestFirstStateOn"));
357     return predicate;
358 }
359 
CreateScreenState()360 State CreateScreenState() {
361     State state;
362     state.set_id(StringToId("ScreenState"));
363     state.set_atom_id(util::SCREEN_STATE_CHANGED);
364     return state;
365 }
366 
CreateUidProcessState()367 State CreateUidProcessState() {
368     State state;
369     state.set_id(StringToId("UidProcessState"));
370     state.set_atom_id(util::UID_PROCESS_STATE_CHANGED);
371     return state;
372 }
373 
CreateOverlayState()374 State CreateOverlayState() {
375     State state;
376     state.set_id(StringToId("OverlayState"));
377     state.set_atom_id(util::OVERLAY_STATE_CHANGED);
378     return state;
379 }
380 
CreateScreenStateWithOnOffMap(int64_t screenOnId,int64_t screenOffId)381 State CreateScreenStateWithOnOffMap(int64_t screenOnId, int64_t screenOffId) {
382     State state;
383     state.set_id(StringToId("ScreenStateOnOff"));
384     state.set_atom_id(util::SCREEN_STATE_CHANGED);
385 
386     auto map = CreateScreenStateOnOffMap(screenOnId, screenOffId);
387     *state.mutable_map() = map;
388 
389     return state;
390 }
391 
CreateScreenStateWithSimpleOnOffMap(int64_t screenOnId,int64_t screenOffId)392 State CreateScreenStateWithSimpleOnOffMap(int64_t screenOnId, int64_t screenOffId) {
393     State state;
394     state.set_id(StringToId("ScreenStateSimpleOnOff"));
395     state.set_atom_id(util::SCREEN_STATE_CHANGED);
396 
397     auto map = CreateScreenStateSimpleOnOffMap(screenOnId, screenOffId);
398     *state.mutable_map() = map;
399 
400     return state;
401 }
402 
CreateScreenStateOnGroup(int64_t screenOnId)403 StateMap_StateGroup CreateScreenStateOnGroup(int64_t screenOnId) {
404     StateMap_StateGroup group;
405     group.set_group_id(screenOnId);
406     group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_ON);
407     group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_VR);
408     group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_ON_SUSPEND);
409     return group;
410 }
411 
CreateScreenStateOffGroup(int64_t screenOffId)412 StateMap_StateGroup CreateScreenStateOffGroup(int64_t screenOffId) {
413     StateMap_StateGroup group;
414     group.set_group_id(screenOffId);
415     group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
416     group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_DOZE);
417     group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_DOZE_SUSPEND);
418     return group;
419 }
420 
CreateScreenStateSimpleOnGroup(int64_t screenOnId)421 StateMap_StateGroup CreateScreenStateSimpleOnGroup(int64_t screenOnId) {
422     StateMap_StateGroup group;
423     group.set_group_id(screenOnId);
424     group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_ON);
425     return group;
426 }
427 
CreateScreenStateSimpleOffGroup(int64_t screenOffId)428 StateMap_StateGroup CreateScreenStateSimpleOffGroup(int64_t screenOffId) {
429     StateMap_StateGroup group;
430     group.set_group_id(screenOffId);
431     group.add_value(android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
432     return group;
433 }
434 
CreateScreenStateOnOffMap(int64_t screenOnId,int64_t screenOffId)435 StateMap CreateScreenStateOnOffMap(int64_t screenOnId, int64_t screenOffId) {
436     StateMap map;
437     *map.add_group() = CreateScreenStateOnGroup(screenOnId);
438     *map.add_group() = CreateScreenStateOffGroup(screenOffId);
439     return map;
440 }
441 
CreateScreenStateSimpleOnOffMap(int64_t screenOnId,int64_t screenOffId)442 StateMap CreateScreenStateSimpleOnOffMap(int64_t screenOnId, int64_t screenOffId) {
443     StateMap map;
444     *map.add_group() = CreateScreenStateSimpleOnGroup(screenOnId);
445     *map.add_group() = CreateScreenStateSimpleOffGroup(screenOffId);
446     return map;
447 }
448 
addPredicateToPredicateCombination(const Predicate & predicate,Predicate * combinationPredicate)449 void addPredicateToPredicateCombination(const Predicate& predicate,
450                                         Predicate* combinationPredicate) {
451     combinationPredicate->mutable_combination()->add_predicate(predicate.id());
452 }
453 
CreateAttributionUidDimensions(const int atomId,const std::vector<Position> & positions)454 FieldMatcher CreateAttributionUidDimensions(const int atomId,
455                                             const std::vector<Position>& positions) {
456     FieldMatcher dimensions;
457     dimensions.set_field(atomId);
458     for (const auto position : positions) {
459         auto child = dimensions.add_child();
460         child->set_field(1);
461         child->set_position(position);
462         child->add_child()->set_field(1);
463     }
464     return dimensions;
465 }
466 
CreateAttributionUidAndTagDimensions(const int atomId,const std::vector<Position> & positions)467 FieldMatcher CreateAttributionUidAndTagDimensions(const int atomId,
468                                                  const std::vector<Position>& positions) {
469     FieldMatcher dimensions;
470     dimensions.set_field(atomId);
471     for (const auto position : positions) {
472         auto child = dimensions.add_child();
473         child->set_field(1);
474         child->set_position(position);
475         child->add_child()->set_field(1);
476         child->add_child()->set_field(2);
477     }
478     return dimensions;
479 }
480 
CreateDimensions(const int atomId,const std::vector<int> & fields)481 FieldMatcher CreateDimensions(const int atomId, const std::vector<int>& fields) {
482     FieldMatcher dimensions;
483     dimensions.set_field(atomId);
484     for (const int field : fields) {
485         dimensions.add_child()->set_field(field);
486     }
487     return dimensions;
488 }
489 
CreateRepeatedDimensions(const int atomId,const std::vector<int> & fields,const std::vector<Position> & positions)490 FieldMatcher CreateRepeatedDimensions(const int atomId, const std::vector<int>& fields,
491                                       const std::vector<Position>& positions) {
492     FieldMatcher dimensions;
493     if (fields.size() != positions.size()) {
494         return dimensions;
495     }
496 
497     dimensions.set_field(atomId);
498     for (size_t i = 0; i < fields.size(); i++) {
499         auto child = dimensions.add_child();
500         child->set_field(fields[i]);
501         child->set_position(positions[i]);
502     }
503     return dimensions;
504 }
505 
CreateAttributionUidAndOtherDimensions(const int atomId,const std::vector<Position> & positions,const std::vector<int> & fields)506 FieldMatcher CreateAttributionUidAndOtherDimensions(const int atomId,
507                                                     const std::vector<Position>& positions,
508                                                     const std::vector<int>& fields) {
509     FieldMatcher dimensions = CreateAttributionUidDimensions(atomId, positions);
510 
511     for (const int field : fields) {
512         dimensions.add_child()->set_field(field);
513     }
514     return dimensions;
515 }
516 
createEventMetric(const string & name,const int64_t what,const optional<int64_t> & condition)517 EventMetric createEventMetric(const string& name, const int64_t what,
518                               const optional<int64_t>& condition) {
519     EventMetric metric;
520     metric.set_id(StringToId(name));
521     metric.set_what(what);
522     if (condition) {
523         metric.set_condition(condition.value());
524     }
525     return metric;
526 }
527 
createCountMetric(const string & name,const int64_t what,const optional<int64_t> & condition,const vector<int64_t> & states)528 CountMetric createCountMetric(const string& name, const int64_t what,
529                               const optional<int64_t>& condition, const vector<int64_t>& states) {
530     CountMetric metric;
531     metric.set_id(StringToId(name));
532     metric.set_what(what);
533     metric.set_bucket(TEN_MINUTES);
534     if (condition) {
535         metric.set_condition(condition.value());
536     }
537     for (const int64_t state : states) {
538         metric.add_slice_by_state(state);
539     }
540     return metric;
541 }
542 
createDurationMetric(const string & name,const int64_t what,const optional<int64_t> & condition,const vector<int64_t> & states)543 DurationMetric createDurationMetric(const string& name, const int64_t what,
544                                     const optional<int64_t>& condition,
545                                     const vector<int64_t>& states) {
546     DurationMetric metric;
547     metric.set_id(StringToId(name));
548     metric.set_what(what);
549     metric.set_bucket(TEN_MINUTES);
550     if (condition) {
551         metric.set_condition(condition.value());
552     }
553     for (const int64_t state : states) {
554         metric.add_slice_by_state(state);
555     }
556     return metric;
557 }
558 
createGaugeMetric(const string & name,const int64_t what,const GaugeMetric::SamplingType samplingType,const optional<int64_t> & condition,const optional<int64_t> & triggerEvent)559 GaugeMetric createGaugeMetric(const string& name, const int64_t what,
560                               const GaugeMetric::SamplingType samplingType,
561                               const optional<int64_t>& condition,
562                               const optional<int64_t>& triggerEvent) {
563     GaugeMetric metric;
564     metric.set_id(StringToId(name));
565     metric.set_what(what);
566     metric.set_bucket(TEN_MINUTES);
567     metric.set_sampling_type(samplingType);
568     if (condition) {
569         metric.set_condition(condition.value());
570     }
571     if (triggerEvent) {
572         metric.set_trigger_event(triggerEvent.value());
573     }
574     metric.mutable_gauge_fields_filter()->set_include_all(true);
575     return metric;
576 }
577 
createValueMetric(const string & name,const AtomMatcher & what,const int valueField,const optional<int64_t> & condition,const vector<int64_t> & states)578 ValueMetric createValueMetric(const string& name, const AtomMatcher& what, const int valueField,
579                               const optional<int64_t>& condition, const vector<int64_t>& states) {
580     ValueMetric metric;
581     metric.set_id(StringToId(name));
582     metric.set_what(what.id());
583     metric.set_bucket(TEN_MINUTES);
584     metric.mutable_value_field()->set_field(what.simple_atom_matcher().atom_id());
585     metric.mutable_value_field()->add_child()->set_field(valueField);
586     if (condition) {
587         metric.set_condition(condition.value());
588     }
589     for (const int64_t state : states) {
590         metric.add_slice_by_state(state);
591     }
592     return metric;
593 }
594 
createKllMetric(const string & name,const AtomMatcher & what,const int valueField,const optional<int64_t> & condition)595 KllMetric createKllMetric(const string& name, const AtomMatcher& what, const int valueField,
596                           const optional<int64_t>& condition) {
597     KllMetric metric;
598     metric.set_id(StringToId(name));
599     metric.set_what(what.id());
600     metric.set_bucket(TEN_MINUTES);
601     metric.mutable_kll_field()->set_field(what.simple_atom_matcher().atom_id());
602     metric.mutable_kll_field()->add_child()->set_field(valueField);
603     if (condition) {
604         metric.set_condition(condition.value());
605     }
606     return metric;
607 }
608 
createAlert(const string & name,const int64_t metricId,const int buckets,const int64_t triggerSum)609 Alert createAlert(const string& name, const int64_t metricId, const int buckets,
610                   const int64_t triggerSum) {
611     Alert alert;
612     alert.set_id(StringToId(name));
613     alert.set_metric_id(metricId);
614     alert.set_num_buckets(buckets);
615     alert.set_trigger_if_sum_gt(triggerSum);
616     return alert;
617 }
618 
createAlarm(const string & name,const int64_t offsetMillis,const int64_t periodMillis)619 Alarm createAlarm(const string& name, const int64_t offsetMillis, const int64_t periodMillis) {
620     Alarm alarm;
621     alarm.set_id(StringToId(name));
622     alarm.set_offset_millis(offsetMillis);
623     alarm.set_period_millis(periodMillis);
624     return alarm;
625 }
626 
createSubscription(const string & name,const Subscription_RuleType type,const int64_t ruleId)627 Subscription createSubscription(const string& name, const Subscription_RuleType type,
628                                 const int64_t ruleId) {
629     Subscription subscription;
630     subscription.set_id(StringToId(name));
631     subscription.set_rule_type(type);
632     subscription.set_rule_id(ruleId);
633     subscription.mutable_broadcast_subscriber_details();
634     return subscription;
635 }
636 
637 // START: get primary key functions
getUidProcessKey(int uid,HashableDimensionKey * key)638 void getUidProcessKey(int uid, HashableDimensionKey* key) {
639     int pos1[] = {1, 0, 0};
640     Field field1(27 /* atom id */, pos1, 0 /* depth */);
641     Value value1((int32_t)uid);
642 
643     key->addValue(FieldValue(field1, value1));
644 }
645 
getOverlayKey(int uid,string packageName,HashableDimensionKey * key)646 void getOverlayKey(int uid, string packageName, HashableDimensionKey* key) {
647     int pos1[] = {1, 0, 0};
648     int pos2[] = {2, 0, 0};
649 
650     Field field1(59 /* atom id */, pos1, 0 /* depth */);
651     Field field2(59 /* atom id */, pos2, 0 /* depth */);
652 
653     Value value1((int32_t)uid);
654     Value value2(packageName);
655 
656     key->addValue(FieldValue(field1, value1));
657     key->addValue(FieldValue(field2, value2));
658 }
659 
getPartialWakelockKey(int uid,const std::string & tag,HashableDimensionKey * key)660 void getPartialWakelockKey(int uid, const std::string& tag, HashableDimensionKey* key) {
661     int pos1[] = {1, 1, 1};
662     int pos3[] = {2, 0, 0};
663     int pos4[] = {3, 0, 0};
664 
665     Field field1(10 /* atom id */, pos1, 2 /* depth */);
666 
667     Field field3(10 /* atom id */, pos3, 0 /* depth */);
668     Field field4(10 /* atom id */, pos4, 0 /* depth */);
669 
670     Value value1((int32_t)uid);
671     Value value3((int32_t)1 /*partial*/);
672     Value value4(tag);
673 
674     key->addValue(FieldValue(field1, value1));
675     key->addValue(FieldValue(field3, value3));
676     key->addValue(FieldValue(field4, value4));
677 }
678 
getPartialWakelockKey(int uid,HashableDimensionKey * key)679 void getPartialWakelockKey(int uid, HashableDimensionKey* key) {
680     int pos1[] = {1, 1, 1};
681     int pos3[] = {2, 0, 0};
682 
683     Field field1(10 /* atom id */, pos1, 2 /* depth */);
684     Field field3(10 /* atom id */, pos3, 0 /* depth */);
685 
686     Value value1((int32_t)uid);
687     Value value3((int32_t)1 /*partial*/);
688 
689     key->addValue(FieldValue(field1, value1));
690     key->addValue(FieldValue(field3, value3));
691 }
692 // END: get primary key functions
693 
writeAttribution(AStatsEvent * statsEvent,const vector<int> & attributionUids,const vector<string> & attributionTags)694 void writeAttribution(AStatsEvent* statsEvent, const vector<int>& attributionUids,
695                       const vector<string>& attributionTags) {
696     vector<const char*> cTags(attributionTags.size());
697     for (int i = 0; i < cTags.size(); i++) {
698         cTags[i] = attributionTags[i].c_str();
699     }
700 
701     AStatsEvent_writeAttributionChain(statsEvent,
702                                       reinterpret_cast<const uint32_t*>(attributionUids.data()),
703                                       cTags.data(), attributionUids.size());
704 }
705 
parseStatsEventToLogEvent(AStatsEvent * statsEvent,LogEvent * logEvent)706 void parseStatsEventToLogEvent(AStatsEvent* statsEvent, LogEvent* logEvent) {
707     AStatsEvent_build(statsEvent);
708 
709     size_t size;
710     uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size);
711     logEvent->parseBuffer(buf, size);
712 
713     AStatsEvent_release(statsEvent);
714 }
715 
CreateTwoValueLogEvent(LogEvent * logEvent,int atomId,int64_t eventTimeNs,int32_t value1,int32_t value2)716 void CreateTwoValueLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs, int32_t value1,
717                             int32_t value2) {
718     AStatsEvent* statsEvent = AStatsEvent_obtain();
719     AStatsEvent_setAtomId(statsEvent, atomId);
720     AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
721 
722     AStatsEvent_writeInt32(statsEvent, value1);
723     AStatsEvent_writeInt32(statsEvent, value2);
724 
725     parseStatsEventToLogEvent(statsEvent, logEvent);
726 }
727 
CreateTwoValueLogEvent(int atomId,int64_t eventTimeNs,int32_t value1,int32_t value2)728 shared_ptr<LogEvent> CreateTwoValueLogEvent(int atomId, int64_t eventTimeNs, int32_t value1,
729                                             int32_t value2) {
730     shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
731     CreateTwoValueLogEvent(logEvent.get(), atomId, eventTimeNs, value1, value2);
732     return logEvent;
733 }
734 
CreateThreeValueLogEvent(LogEvent * logEvent,int atomId,int64_t eventTimeNs,int32_t value1,int32_t value2,int32_t value3)735 void CreateThreeValueLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs, int32_t value1,
736                               int32_t value2, int32_t value3) {
737     AStatsEvent* statsEvent = AStatsEvent_obtain();
738     AStatsEvent_setAtomId(statsEvent, atomId);
739     AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
740 
741     AStatsEvent_writeInt32(statsEvent, value1);
742     AStatsEvent_writeInt32(statsEvent, value2);
743     AStatsEvent_writeInt32(statsEvent, value3);
744 
745     parseStatsEventToLogEvent(statsEvent, logEvent);
746 }
747 
CreateThreeValueLogEvent(int atomId,int64_t eventTimeNs,int32_t value1,int32_t value2,int32_t value3)748 shared_ptr<LogEvent> CreateThreeValueLogEvent(int atomId, int64_t eventTimeNs, int32_t value1,
749                                               int32_t value2, int32_t value3) {
750     shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
751     CreateThreeValueLogEvent(logEvent.get(), atomId, eventTimeNs, value1, value2, value3);
752     return logEvent;
753 }
754 
CreateRepeatedValueLogEvent(LogEvent * logEvent,int atomId,int64_t eventTimeNs,int32_t value)755 void CreateRepeatedValueLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs,
756                                  int32_t value) {
757     AStatsEvent* statsEvent = AStatsEvent_obtain();
758     AStatsEvent_setAtomId(statsEvent, atomId);
759     AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
760 
761     AStatsEvent_writeInt32(statsEvent, value);
762     AStatsEvent_writeInt32(statsEvent, value);
763 
764     parseStatsEventToLogEvent(statsEvent, logEvent);
765 }
766 
CreateRepeatedValueLogEvent(int atomId,int64_t eventTimeNs,int32_t value)767 shared_ptr<LogEvent> CreateRepeatedValueLogEvent(int atomId, int64_t eventTimeNs, int32_t value) {
768     shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
769     CreateRepeatedValueLogEvent(logEvent.get(), atomId, eventTimeNs, value);
770     return logEvent;
771 }
772 
CreateNoValuesLogEvent(LogEvent * logEvent,int atomId,int64_t eventTimeNs)773 void CreateNoValuesLogEvent(LogEvent* logEvent, int atomId, int64_t eventTimeNs) {
774     AStatsEvent* statsEvent = AStatsEvent_obtain();
775     AStatsEvent_setAtomId(statsEvent, atomId);
776     AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
777 
778     parseStatsEventToLogEvent(statsEvent, logEvent);
779 }
780 
CreateNoValuesLogEvent(int atomId,int64_t eventTimeNs)781 shared_ptr<LogEvent> CreateNoValuesLogEvent(int atomId, int64_t eventTimeNs) {
782     shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
783     CreateNoValuesLogEvent(logEvent.get(), atomId, eventTimeNs);
784     return logEvent;
785 }
786 
makeUidStatsEvent(int atomId,int64_t eventTimeNs,int uid,int data1,int data2)787 AStatsEvent* makeUidStatsEvent(int atomId, int64_t eventTimeNs, int uid, int data1, int data2) {
788     AStatsEvent* statsEvent = AStatsEvent_obtain();
789     AStatsEvent_setAtomId(statsEvent, atomId);
790     AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
791 
792     AStatsEvent_writeInt32(statsEvent, uid);
793     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
794     AStatsEvent_writeInt32(statsEvent, data1);
795     AStatsEvent_writeInt32(statsEvent, data2);
796 
797     return statsEvent;
798 }
799 
makeUidStatsEvent(int atomId,int64_t eventTimeNs,int uid,int data1,const vector<int> & data2)800 AStatsEvent* makeUidStatsEvent(int atomId, int64_t eventTimeNs, int uid, int data1,
801                                const vector<int>& data2) {
802     AStatsEvent* statsEvent = AStatsEvent_obtain();
803     AStatsEvent_setAtomId(statsEvent, atomId);
804     AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
805     AStatsEvent_writeInt32(statsEvent, uid);
806     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
807     AStatsEvent_writeInt32(statsEvent, data1);
808     AStatsEvent_writeInt32Array(statsEvent, data2.data(), data2.size());
809 
810     return statsEvent;
811 }
812 
makeUidLogEvent(int atomId,int64_t eventTimeNs,int uid,int data1,int data2)813 shared_ptr<LogEvent> makeUidLogEvent(int atomId, int64_t eventTimeNs, int uid, int data1,
814                                      int data2) {
815     AStatsEvent* statsEvent = makeUidStatsEvent(atomId, eventTimeNs, uid, data1, data2);
816 
817     shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
818     parseStatsEventToLogEvent(statsEvent, logEvent.get());
819     return logEvent;
820 }
821 
makeUidLogEvent(int atomId,int64_t eventTimeNs,int uid,int data1,const vector<int> & data2)822 shared_ptr<LogEvent> makeUidLogEvent(int atomId, int64_t eventTimeNs, int uid, int data1,
823                                      const vector<int>& data2) {
824     AStatsEvent* statsEvent = makeUidStatsEvent(atomId, eventTimeNs, uid, data1, data2);
825 
826     shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
827     parseStatsEventToLogEvent(statsEvent, logEvent.get());
828     return logEvent;
829 }
830 
makeExtraUidsLogEvent(int atomId,int64_t eventTimeNs,int uid1,int data1,int data2,const vector<int> & extraUids)831 shared_ptr<LogEvent> makeExtraUidsLogEvent(int atomId, int64_t eventTimeNs, int uid1, int data1,
832                                            int data2, const vector<int>& extraUids) {
833     AStatsEvent* statsEvent = makeUidStatsEvent(atomId, eventTimeNs, uid1, data1, data2);
834     for (const int extraUid : extraUids) {
835         AStatsEvent_writeInt32(statsEvent, extraUid);
836         AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
837     }
838 
839     shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
840     parseStatsEventToLogEvent(statsEvent, logEvent.get());
841     return logEvent;
842 }
843 
makeRepeatedUidLogEvent(int atomId,int64_t eventTimeNs,const vector<int> & uids)844 shared_ptr<LogEvent> makeRepeatedUidLogEvent(int atomId, int64_t eventTimeNs,
845                                              const vector<int>& uids) {
846     AStatsEvent* statsEvent = AStatsEvent_obtain();
847     AStatsEvent_setAtomId(statsEvent, atomId);
848     AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
849     AStatsEvent_writeInt32Array(statsEvent, uids.data(), uids.size());
850     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
851 
852     shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
853     parseStatsEventToLogEvent(statsEvent, logEvent.get());
854 
855     return logEvent;
856 }
857 
makeRepeatedUidLogEvent(int atomId,int64_t eventTimeNs,const vector<int> & uids,int data1,int data2)858 shared_ptr<LogEvent> makeRepeatedUidLogEvent(int atomId, int64_t eventTimeNs,
859                                              const vector<int>& uids, int data1, int data2) {
860     AStatsEvent* statsEvent = AStatsEvent_obtain();
861     AStatsEvent_setAtomId(statsEvent, atomId);
862     AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
863     AStatsEvent_writeInt32Array(statsEvent, uids.data(), uids.size());
864     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
865     AStatsEvent_writeInt32(statsEvent, data1);
866     AStatsEvent_writeInt32(statsEvent, data2);
867 
868     shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
869     parseStatsEventToLogEvent(statsEvent, logEvent.get());
870 
871     return logEvent;
872 }
873 
makeRepeatedUidLogEvent(int atomId,int64_t eventTimeNs,const vector<int> & uids,int data1,const vector<int> & data2)874 shared_ptr<LogEvent> makeRepeatedUidLogEvent(int atomId, int64_t eventTimeNs,
875                                              const vector<int>& uids, int data1,
876                                              const vector<int>& data2) {
877     AStatsEvent* statsEvent = AStatsEvent_obtain();
878     AStatsEvent_setAtomId(statsEvent, atomId);
879     AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
880     AStatsEvent_writeInt32Array(statsEvent, uids.data(), uids.size());
881     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
882     AStatsEvent_writeInt32(statsEvent, data1);
883     AStatsEvent_writeInt32Array(statsEvent, data2.data(), data2.size());
884 
885     shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
886     parseStatsEventToLogEvent(statsEvent, logEvent.get());
887 
888     return logEvent;
889 }
890 
makeAttributionLogEvent(int atomId,int64_t eventTimeNs,const vector<int> & uids,const vector<string> & tags,int data1,int data2)891 shared_ptr<LogEvent> makeAttributionLogEvent(int atomId, int64_t eventTimeNs,
892                                              const vector<int>& uids, const vector<string>& tags,
893                                              int data1, int data2) {
894     AStatsEvent* statsEvent = AStatsEvent_obtain();
895     AStatsEvent_setAtomId(statsEvent, atomId);
896     AStatsEvent_overwriteTimestamp(statsEvent, eventTimeNs);
897 
898     writeAttribution(statsEvent, uids, tags);
899     AStatsEvent_writeInt32(statsEvent, data1);
900     AStatsEvent_writeInt32(statsEvent, data2);
901 
902     shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
903     parseStatsEventToLogEvent(statsEvent, logEvent.get());
904     return logEvent;
905 }
906 
makeMockUidMapForHosts(const map<int,vector<int>> & hostUidToIsolatedUidsMap)907 sp<MockUidMap> makeMockUidMapForHosts(const map<int, vector<int>>& hostUidToIsolatedUidsMap) {
908     sp<MockUidMap> uidMap = new NaggyMock<MockUidMap>();
909     EXPECT_CALL(*uidMap, getHostUidOrSelf(_)).WillRepeatedly(ReturnArg<0>());
910     for (const auto& [hostUid, isolatedUids] : hostUidToIsolatedUidsMap) {
911         for (const int isolatedUid : isolatedUids) {
912             EXPECT_CALL(*uidMap, getHostUidOrSelf(isolatedUid)).WillRepeatedly(Return(hostUid));
913         }
914     }
915 
916     return uidMap;
917 }
918 
makeMockUidMapForPackage(const string & pkg,const set<int32_t> & uids)919 sp<MockUidMap> makeMockUidMapForPackage(const string& pkg, const set<int32_t>& uids) {
920     sp<MockUidMap> uidMap = new StrictMock<MockUidMap>();
921     EXPECT_CALL(*uidMap, getAppUid(_)).Times(AnyNumber());
922     EXPECT_CALL(*uidMap, getAppUid(pkg)).WillRepeatedly(Return(uids));
923 
924     return uidMap;
925 }
926 
CreateScreenStateChangedEvent(uint64_t timestampNs,const android::view::DisplayStateEnum state,int loggerUid)927 std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(uint64_t timestampNs,
928                                                         const android::view::DisplayStateEnum state,
929                                                         int loggerUid) {
930     AStatsEvent* statsEvent = AStatsEvent_obtain();
931     AStatsEvent_setAtomId(statsEvent, util::SCREEN_STATE_CHANGED);
932     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
933     AStatsEvent_writeInt32(statsEvent, state);
934     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
935     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, false);
936 
937     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(loggerUid, /*pid=*/0);
938     parseStatsEventToLogEvent(statsEvent, logEvent.get());
939     return logEvent;
940 }
941 
CreateBatterySaverOnEvent(uint64_t timestampNs)942 std::unique_ptr<LogEvent> CreateBatterySaverOnEvent(uint64_t timestampNs) {
943     AStatsEvent* statsEvent = AStatsEvent_obtain();
944     AStatsEvent_setAtomId(statsEvent, util::BATTERY_SAVER_MODE_STATE_CHANGED);
945     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
946     AStatsEvent_writeInt32(statsEvent, BatterySaverModeStateChanged::ON);
947     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
948     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, false);
949 
950     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
951     parseStatsEventToLogEvent(statsEvent, logEvent.get());
952     return logEvent;
953 }
954 
CreateBatterySaverOffEvent(uint64_t timestampNs)955 std::unique_ptr<LogEvent> CreateBatterySaverOffEvent(uint64_t timestampNs) {
956     AStatsEvent* statsEvent = AStatsEvent_obtain();
957     AStatsEvent_setAtomId(statsEvent, util::BATTERY_SAVER_MODE_STATE_CHANGED);
958     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
959     AStatsEvent_writeInt32(statsEvent, BatterySaverModeStateChanged::OFF);
960     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
961     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, false);
962 
963     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
964     parseStatsEventToLogEvent(statsEvent, logEvent.get());
965     return logEvent;
966 }
967 
CreateBatteryStateChangedEvent(const uint64_t timestampNs,const BatteryPluggedStateEnum state)968 std::unique_ptr<LogEvent> CreateBatteryStateChangedEvent(const uint64_t timestampNs, const BatteryPluggedStateEnum state) {
969     AStatsEvent* statsEvent = AStatsEvent_obtain();
970     AStatsEvent_setAtomId(statsEvent, util::PLUGGED_STATE_CHANGED);
971     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
972     AStatsEvent_writeInt32(statsEvent, state);
973 
974     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
975     parseStatsEventToLogEvent(statsEvent, logEvent.get());
976     return logEvent;
977 }
978 
CreateScreenBrightnessChangedEvent(uint64_t timestampNs,int level)979 std::unique_ptr<LogEvent> CreateScreenBrightnessChangedEvent(uint64_t timestampNs, int level) {
980     AStatsEvent* statsEvent = AStatsEvent_obtain();
981     AStatsEvent_setAtomId(statsEvent, util::SCREEN_BRIGHTNESS_CHANGED);
982     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
983     AStatsEvent_writeInt32(statsEvent, level);
984 
985     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
986     parseStatsEventToLogEvent(statsEvent, logEvent.get());
987     return logEvent;
988 }
989 
CreateScheduledJobStateChangedEvent(const vector<int> & attributionUids,const vector<string> & attributionTags,const string & jobName,const ScheduledJobStateChanged::State state,uint64_t timestampNs)990 std::unique_ptr<LogEvent> CreateScheduledJobStateChangedEvent(
991         const vector<int>& attributionUids, const vector<string>& attributionTags,
992         const string& jobName, const ScheduledJobStateChanged::State state, uint64_t timestampNs) {
993     AStatsEvent* statsEvent = AStatsEvent_obtain();
994     AStatsEvent_setAtomId(statsEvent, util::SCHEDULED_JOB_STATE_CHANGED);
995     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
996 
997     writeAttribution(statsEvent, attributionUids, attributionTags);
998     AStatsEvent_writeString(statsEvent, jobName.c_str());
999     AStatsEvent_writeInt32(statsEvent, state);
1000 
1001     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1002     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1003     return logEvent;
1004 }
1005 
CreateStartScheduledJobEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & jobName)1006 std::unique_ptr<LogEvent> CreateStartScheduledJobEvent(uint64_t timestampNs,
1007                                                        const vector<int>& attributionUids,
1008                                                        const vector<string>& attributionTags,
1009                                                        const string& jobName) {
1010     return CreateScheduledJobStateChangedEvent(attributionUids, attributionTags, jobName,
1011                                                ScheduledJobStateChanged::STARTED, timestampNs);
1012 }
1013 
1014 // Create log event when scheduled job finishes.
CreateFinishScheduledJobEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & jobName)1015 std::unique_ptr<LogEvent> CreateFinishScheduledJobEvent(uint64_t timestampNs,
1016                                                         const vector<int>& attributionUids,
1017                                                         const vector<string>& attributionTags,
1018                                                         const string& jobName) {
1019     return CreateScheduledJobStateChangedEvent(attributionUids, attributionTags, jobName,
1020                                                ScheduledJobStateChanged::FINISHED, timestampNs);
1021 }
1022 
CreateTestAtomReportedEventVariableRepeatedFields(uint64_t timestampNs,const vector<int> & repeatedIntField,const vector<int64_t> & repeatedLongField,const vector<float> & repeatedFloatField,const vector<string> & repeatedStringField,const bool * repeatedBoolField,const size_t repeatedBoolFieldLength,const vector<int> & repeatedEnumField)1023 std::unique_ptr<LogEvent> CreateTestAtomReportedEventVariableRepeatedFields(
1024         uint64_t timestampNs, const vector<int>& repeatedIntField,
1025         const vector<int64_t>& repeatedLongField, const vector<float>& repeatedFloatField,
1026         const vector<string>& repeatedStringField, const bool* repeatedBoolField,
1027         const size_t repeatedBoolFieldLength, const vector<int>& repeatedEnumField) {
1028     return CreateTestAtomReportedEvent(timestampNs, {1001, 1002}, {"app1", "app2"}, 5, 1000l, 21.9f,
1029                                        "string", 1, TestAtomReported::ON, {8, 1, 8, 2, 8, 3},
1030                                        repeatedIntField, repeatedLongField, repeatedFloatField,
1031                                        repeatedStringField, repeatedBoolField,
1032                                        repeatedBoolFieldLength, repeatedEnumField);
1033 }
1034 
CreateTestAtomReportedEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const int intField,const long longField,const float floatField,const string & stringField,const bool boolField,const TestAtomReported::State enumField,const vector<uint8_t> & bytesField,const vector<int> & repeatedIntField,const vector<int64_t> & repeatedLongField,const vector<float> & repeatedFloatField,const vector<string> & repeatedStringField,const bool * repeatedBoolField,const size_t repeatedBoolFieldLength,const vector<int> & repeatedEnumField)1035 std::unique_ptr<LogEvent> CreateTestAtomReportedEvent(
1036         uint64_t timestampNs, const vector<int>& attributionUids,
1037         const vector<string>& attributionTags, const int intField, const long longField,
1038         const float floatField, const string& stringField, const bool boolField,
1039         const TestAtomReported::State enumField, const vector<uint8_t>& bytesField,
1040         const vector<int>& repeatedIntField, const vector<int64_t>& repeatedLongField,
1041         const vector<float>& repeatedFloatField, const vector<string>& repeatedStringField,
1042         const bool* repeatedBoolField, const size_t repeatedBoolFieldLength,
1043         const vector<int>& repeatedEnumField) {
1044     vector<const char*> cRepeatedStringField(repeatedStringField.size());
1045     for (int i = 0; i < cRepeatedStringField.size(); i++) {
1046         cRepeatedStringField[i] = repeatedStringField[i].c_str();
1047     }
1048 
1049     AStatsEvent* statsEvent = AStatsEvent_obtain();
1050     AStatsEvent_setAtomId(statsEvent, util::TEST_ATOM_REPORTED);
1051     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1052 
1053     writeAttribution(statsEvent, attributionUids, attributionTags);
1054     AStatsEvent_writeInt32(statsEvent, intField);
1055     AStatsEvent_writeInt64(statsEvent, longField);
1056     AStatsEvent_writeFloat(statsEvent, floatField);
1057     AStatsEvent_writeString(statsEvent, stringField.c_str());
1058     AStatsEvent_writeBool(statsEvent, boolField);
1059     AStatsEvent_writeInt32(statsEvent, enumField);
1060     AStatsEvent_writeByteArray(statsEvent, bytesField.data(), bytesField.size());
1061     AStatsEvent_writeInt32Array(statsEvent, repeatedIntField.data(), repeatedIntField.size());
1062     AStatsEvent_writeInt64Array(statsEvent, repeatedLongField.data(), repeatedLongField.size());
1063     AStatsEvent_writeFloatArray(statsEvent, repeatedFloatField.data(), repeatedFloatField.size());
1064     AStatsEvent_writeStringArray(statsEvent, cRepeatedStringField.data(),
1065                                  repeatedStringField.size());
1066     AStatsEvent_writeBoolArray(statsEvent, repeatedBoolField, repeatedBoolFieldLength);
1067     AStatsEvent_writeInt32Array(statsEvent, repeatedEnumField.data(), repeatedEnumField.size());
1068 
1069     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1070     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1071     return logEvent;
1072 }
1073 
CreateWakelockStateChangedEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & wakelockName,const WakelockStateChanged::State state)1074 std::unique_ptr<LogEvent> CreateWakelockStateChangedEvent(uint64_t timestampNs,
1075                                                           const vector<int>& attributionUids,
1076                                                           const vector<string>& attributionTags,
1077                                                           const string& wakelockName,
1078                                                           const WakelockStateChanged::State state) {
1079     AStatsEvent* statsEvent = AStatsEvent_obtain();
1080     AStatsEvent_setAtomId(statsEvent, util::WAKELOCK_STATE_CHANGED);
1081     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1082 
1083     writeAttribution(statsEvent, attributionUids, attributionTags);
1084     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true);
1085     AStatsEvent_writeInt32(statsEvent, android::os::WakeLockLevelEnum::PARTIAL_WAKE_LOCK);
1086     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1087     AStatsEvent_writeString(statsEvent, wakelockName.c_str());
1088     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1089     AStatsEvent_writeInt32(statsEvent, state);
1090     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
1091     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, true);
1092 
1093     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1094     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1095     return logEvent;
1096 }
1097 
CreateAcquireWakelockEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & wakelockName)1098 std::unique_ptr<LogEvent> CreateAcquireWakelockEvent(uint64_t timestampNs,
1099                                                      const vector<int>& attributionUids,
1100                                                      const vector<string>& attributionTags,
1101                                                      const string& wakelockName) {
1102     return CreateWakelockStateChangedEvent(timestampNs, attributionUids, attributionTags,
1103                                            wakelockName, WakelockStateChanged::ACQUIRE);
1104 }
1105 
CreateReleaseWakelockEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & wakelockName)1106 std::unique_ptr<LogEvent> CreateReleaseWakelockEvent(uint64_t timestampNs,
1107                                                      const vector<int>& attributionUids,
1108                                                      const vector<string>& attributionTags,
1109                                                      const string& wakelockName) {
1110     return CreateWakelockStateChangedEvent(timestampNs, attributionUids, attributionTags,
1111                                            wakelockName, WakelockStateChanged::RELEASE);
1112 }
1113 
CreateActivityForegroundStateChangedEvent(uint64_t timestampNs,const int uid,const ActivityForegroundStateChanged::State state)1114 std::unique_ptr<LogEvent> CreateActivityForegroundStateChangedEvent(
1115         uint64_t timestampNs, const int uid, const ActivityForegroundStateChanged::State state) {
1116     AStatsEvent* statsEvent = AStatsEvent_obtain();
1117     AStatsEvent_setAtomId(statsEvent, util::ACTIVITY_FOREGROUND_STATE_CHANGED);
1118     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1119 
1120     AStatsEvent_writeInt32(statsEvent, uid);
1121     AStatsEvent_writeString(statsEvent, "pkg_name");
1122     AStatsEvent_writeString(statsEvent, "class_name");
1123     AStatsEvent_writeInt32(statsEvent, state);
1124 
1125     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1126     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1127     return logEvent;
1128 }
1129 
CreateMoveToBackgroundEvent(uint64_t timestampNs,const int uid)1130 std::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(uint64_t timestampNs, const int uid) {
1131     return CreateActivityForegroundStateChangedEvent(timestampNs, uid,
1132                                                      ActivityForegroundStateChanged::BACKGROUND);
1133 }
1134 
CreateMoveToForegroundEvent(uint64_t timestampNs,const int uid)1135 std::unique_ptr<LogEvent> CreateMoveToForegroundEvent(uint64_t timestampNs, const int uid) {
1136     return CreateActivityForegroundStateChangedEvent(timestampNs, uid,
1137                                                      ActivityForegroundStateChanged::FOREGROUND);
1138 }
1139 
CreateSyncStateChangedEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & name,const SyncStateChanged::State state)1140 std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(uint64_t timestampNs,
1141                                                       const vector<int>& attributionUids,
1142                                                       const vector<string>& attributionTags,
1143                                                       const string& name,
1144                                                       const SyncStateChanged::State state) {
1145     AStatsEvent* statsEvent = AStatsEvent_obtain();
1146     AStatsEvent_setAtomId(statsEvent, util::SYNC_STATE_CHANGED);
1147     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1148 
1149     writeAttribution(statsEvent, attributionUids, attributionTags);
1150     AStatsEvent_writeString(statsEvent, name.c_str());
1151     AStatsEvent_writeInt32(statsEvent, state);
1152 
1153     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1154     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1155     return logEvent;
1156 }
1157 
CreateSyncStartEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & name)1158 std::unique_ptr<LogEvent> CreateSyncStartEvent(uint64_t timestampNs,
1159                                                const vector<int>& attributionUids,
1160                                                const vector<string>& attributionTags,
1161                                                const string& name) {
1162     return CreateSyncStateChangedEvent(timestampNs, attributionUids, attributionTags, name,
1163                                        SyncStateChanged::ON);
1164 }
1165 
CreateSyncEndEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const string & name)1166 std::unique_ptr<LogEvent> CreateSyncEndEvent(uint64_t timestampNs,
1167                                              const vector<int>& attributionUids,
1168                                              const vector<string>& attributionTags,
1169                                              const string& name) {
1170     return CreateSyncStateChangedEvent(timestampNs, attributionUids, attributionTags, name,
1171                                        SyncStateChanged::OFF);
1172 }
1173 
CreateProcessLifeCycleStateChangedEvent(uint64_t timestampNs,const int uid,const ProcessLifeCycleStateChanged::State state)1174 std::unique_ptr<LogEvent> CreateProcessLifeCycleStateChangedEvent(
1175         uint64_t timestampNs, const int uid, const ProcessLifeCycleStateChanged::State state) {
1176     AStatsEvent* statsEvent = AStatsEvent_obtain();
1177     AStatsEvent_setAtomId(statsEvent, util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
1178     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1179 
1180     AStatsEvent_writeInt32(statsEvent, uid);
1181     AStatsEvent_writeString(statsEvent, "");
1182     AStatsEvent_writeInt32(statsEvent, state);
1183 
1184     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1185     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1186     return logEvent;
1187 }
1188 
CreateAppCrashEvent(uint64_t timestampNs,const int uid)1189 std::unique_ptr<LogEvent> CreateAppCrashEvent(uint64_t timestampNs, const int uid) {
1190     return CreateProcessLifeCycleStateChangedEvent(timestampNs, uid,
1191                                                    ProcessLifeCycleStateChanged::CRASHED);
1192 }
1193 
CreateAppCrashOccurredEvent(uint64_t timestampNs,const int uid)1194 std::unique_ptr<LogEvent> CreateAppCrashOccurredEvent(uint64_t timestampNs, const int uid) {
1195     AStatsEvent* statsEvent = AStatsEvent_obtain();
1196     AStatsEvent_setAtomId(statsEvent, util::APP_CRASH_OCCURRED);
1197     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1198 
1199     AStatsEvent_writeInt32(statsEvent, uid);
1200     AStatsEvent_writeString(statsEvent, "eventType");
1201     AStatsEvent_writeString(statsEvent, "processName");
1202 
1203     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1204     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1205     return logEvent;
1206 }
1207 
CreateIsolatedUidChangedEvent(uint64_t timestampNs,int hostUid,int isolatedUid,bool is_create)1208 std::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(uint64_t timestampNs, int hostUid,
1209                                                         int isolatedUid, bool is_create) {
1210     AStatsEvent* statsEvent = AStatsEvent_obtain();
1211     AStatsEvent_setAtomId(statsEvent, util::ISOLATED_UID_CHANGED);
1212     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1213 
1214     AStatsEvent_writeInt32(statsEvent, hostUid);
1215     AStatsEvent_writeInt32(statsEvent, isolatedUid);
1216     AStatsEvent_writeInt32(statsEvent, is_create);
1217 
1218     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1219     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1220     return logEvent;
1221 }
1222 
CreateUidProcessStateChangedEvent(uint64_t timestampNs,int uid,const android::app::ProcessStateEnum state)1223 std::unique_ptr<LogEvent> CreateUidProcessStateChangedEvent(
1224         uint64_t timestampNs, int uid, const android::app::ProcessStateEnum state) {
1225     AStatsEvent* statsEvent = AStatsEvent_obtain();
1226     AStatsEvent_setAtomId(statsEvent, util::UID_PROCESS_STATE_CHANGED);
1227     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1228 
1229     AStatsEvent_writeInt32(statsEvent, uid);
1230     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
1231     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1232     AStatsEvent_writeInt32(statsEvent, state);
1233     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
1234     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, false);
1235 
1236     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1237     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1238     return logEvent;
1239 }
1240 
CreateBleScanStateChangedEvent(uint64_t timestampNs,const vector<int> & attributionUids,const vector<string> & attributionTags,const BleScanStateChanged::State state,const bool filtered,const bool firstMatch,const bool opportunistic)1241 std::unique_ptr<LogEvent> CreateBleScanStateChangedEvent(uint64_t timestampNs,
1242                                                          const vector<int>& attributionUids,
1243                                                          const vector<string>& attributionTags,
1244                                                          const BleScanStateChanged::State state,
1245                                                          const bool filtered, const bool firstMatch,
1246                                                          const bool opportunistic) {
1247     AStatsEvent* statsEvent = AStatsEvent_obtain();
1248     AStatsEvent_setAtomId(statsEvent, util::BLE_SCAN_STATE_CHANGED);
1249     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1250 
1251     writeAttribution(statsEvent, attributionUids, attributionTags);
1252     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true);
1253     AStatsEvent_writeInt32(statsEvent, state);
1254     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
1255     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, true);
1256     if (state == util::BLE_SCAN_STATE_CHANGED__STATE__RESET) {
1257         AStatsEvent_addInt32Annotation(statsEvent, ANNOTATION_ID_TRIGGER_STATE_RESET,
1258                                        util::BLE_SCAN_STATE_CHANGED__STATE__OFF);
1259     }
1260     AStatsEvent_writeBool(statsEvent, filtered);  // filtered
1261     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1262     AStatsEvent_writeBool(statsEvent, firstMatch);  // first match
1263     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1264     AStatsEvent_writeBool(statsEvent, opportunistic);  // opportunistic
1265     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1266 
1267     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1268     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1269     return logEvent;
1270 }
1271 
CreateOverlayStateChangedEvent(int64_t timestampNs,const int32_t uid,const string & packageName,const bool usingAlertWindow,const OverlayStateChanged::State state)1272 std::unique_ptr<LogEvent> CreateOverlayStateChangedEvent(int64_t timestampNs, const int32_t uid,
1273                                                          const string& packageName,
1274                                                          const bool usingAlertWindow,
1275                                                          const OverlayStateChanged::State state) {
1276     AStatsEvent* statsEvent = AStatsEvent_obtain();
1277     AStatsEvent_setAtomId(statsEvent, util::OVERLAY_STATE_CHANGED);
1278     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1279 
1280     AStatsEvent_writeInt32(statsEvent, uid);
1281     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_IS_UID, true);
1282     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1283     AStatsEvent_writeString(statsEvent, packageName.c_str());
1284     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_PRIMARY_FIELD, true);
1285     AStatsEvent_writeBool(statsEvent, usingAlertWindow);
1286     AStatsEvent_writeInt32(statsEvent, state);
1287     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_EXCLUSIVE_STATE, true);
1288     AStatsEvent_addBoolAnnotation(statsEvent, ANNOTATION_ID_STATE_NESTED, false);
1289 
1290     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1291     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1292     return logEvent;
1293 }
1294 
CreateAppStartOccurredEvent(uint64_t timestampNs,const int uid,const string & pkgName,AppStartOccurred::TransitionType type,const string & activityName,const string & callingPkgName,const bool isInstantApp,int64_t activityStartMs)1295 std::unique_ptr<LogEvent> CreateAppStartOccurredEvent(
1296         uint64_t timestampNs, const int uid, const string& pkgName,
1297         AppStartOccurred::TransitionType type, const string& activityName,
1298         const string& callingPkgName, const bool isInstantApp, int64_t activityStartMs) {
1299     AStatsEvent* statsEvent = AStatsEvent_obtain();
1300     AStatsEvent_setAtomId(statsEvent, util::APP_START_OCCURRED);
1301     AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
1302 
1303     AStatsEvent_writeInt32(statsEvent, uid);
1304     AStatsEvent_writeString(statsEvent, pkgName.c_str());
1305     AStatsEvent_writeInt32(statsEvent, type);
1306     AStatsEvent_writeString(statsEvent, activityName.c_str());
1307     AStatsEvent_writeString(statsEvent, callingPkgName.c_str());
1308     AStatsEvent_writeInt32(statsEvent, isInstantApp);
1309     AStatsEvent_writeInt32(statsEvent, activityStartMs);
1310 
1311     std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
1312     parseStatsEventToLogEvent(statsEvent, logEvent.get());
1313     return logEvent;
1314 }
1315 
CreateStatsLogProcessor(const int64_t timeBaseNs,const int64_t currentTimeNs,const StatsdConfig & config,const ConfigKey & key,const shared_ptr<IPullAtomCallback> & puller,const int32_t atomTag,const sp<UidMap> uidMap)1316 sp<StatsLogProcessor> CreateStatsLogProcessor(const int64_t timeBaseNs, const int64_t currentTimeNs,
1317                                               const StatsdConfig& config, const ConfigKey& key,
1318                                               const shared_ptr<IPullAtomCallback>& puller,
1319                                               const int32_t atomTag, const sp<UidMap> uidMap) {
1320     sp<StatsPullerManager> pullerManager = new StatsPullerManager();
1321     if (puller != nullptr) {
1322         pullerManager->RegisterPullAtomCallback(/*uid=*/0, atomTag, NS_PER_SEC, NS_PER_SEC * 10, {},
1323                                                 puller);
1324     }
1325     sp<AlarmMonitor> anomalyAlarmMonitor =
1326         new AlarmMonitor(1,
1327                          [](const shared_ptr<IStatsCompanionService>&, int64_t){},
1328                          [](const shared_ptr<IStatsCompanionService>&){});
1329     sp<AlarmMonitor> periodicAlarmMonitor =
1330         new AlarmMonitor(1,
1331                          [](const shared_ptr<IStatsCompanionService>&, int64_t){},
1332                          [](const shared_ptr<IStatsCompanionService>&){});
1333     sp<StatsLogProcessor> processor =
1334             new StatsLogProcessor(uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor,
1335                                   timeBaseNs, [](const ConfigKey&) { return true; },
1336                                   [](const int&, const vector<int64_t>&) {return true;});
1337     processor->OnConfigUpdated(currentTimeNs, key, config);
1338     return processor;
1339 }
1340 
sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> * events)1341 void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) {
1342   std::sort(events->begin(), events->end(),
1343             [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) {
1344               return a->GetElapsedTimestampNs() < b->GetElapsedTimestampNs();
1345             });
1346 }
1347 
StringToId(const string & str)1348 int64_t StringToId(const string& str) {
1349     return static_cast<int64_t>(std::hash<std::string>()(str));
1350 }
1351 
createEventMatcherWizard(int tagId,int matcherIndex,const vector<FieldValueMatcher> & fieldValueMatchers)1352 sp<EventMatcherWizard> createEventMatcherWizard(
1353         int tagId, int matcherIndex, const vector<FieldValueMatcher>& fieldValueMatchers) {
1354     sp<UidMap> uidMap = new UidMap();
1355     SimpleAtomMatcher atomMatcher;
1356     atomMatcher.set_atom_id(tagId);
1357     for (const FieldValueMatcher& fvm : fieldValueMatchers) {
1358         *atomMatcher.add_field_value_matcher() = fvm;
1359     }
1360     uint64_t matcherHash = 0x12345678;
1361     int64_t matcherId = 678;
1362     return new EventMatcherWizard({new SimpleAtomMatchingTracker(
1363             matcherId, matcherIndex, matcherHash, atomMatcher, uidMap)});
1364 }
1365 
CreateAttributionUidDimensionsValueParcel(const int atomId,const int uid)1366 StatsDimensionsValueParcel CreateAttributionUidDimensionsValueParcel(const int atomId,
1367                                                                      const int uid) {
1368     StatsDimensionsValueParcel root;
1369     root.field = atomId;
1370     root.valueType = STATS_DIMENSIONS_VALUE_TUPLE_TYPE;
1371     StatsDimensionsValueParcel attrNode;
1372     attrNode.field = 1;
1373     attrNode.valueType = STATS_DIMENSIONS_VALUE_TUPLE_TYPE;
1374     StatsDimensionsValueParcel posInAttrChain;
1375     posInAttrChain.field = 1;
1376     posInAttrChain.valueType = STATS_DIMENSIONS_VALUE_TUPLE_TYPE;
1377     StatsDimensionsValueParcel uidNode;
1378     uidNode.field = 1;
1379     uidNode.valueType = STATS_DIMENSIONS_VALUE_INT_TYPE;
1380     uidNode.intValue = uid;
1381     posInAttrChain.tupleValue.push_back(uidNode);
1382     attrNode.tupleValue.push_back(posInAttrChain);
1383     root.tupleValue.push_back(attrNode);
1384     return root;
1385 }
1386 
ValidateUidDimension(const DimensionsValue & value,int atomId,int uid)1387 void ValidateUidDimension(const DimensionsValue& value, int atomId, int uid) {
1388     EXPECT_EQ(value.field(), atomId);
1389     ASSERT_EQ(value.value_tuple().dimensions_value_size(), 1);
1390     EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
1391     EXPECT_EQ(value.value_tuple().dimensions_value(0).value_int(), uid);
1392 }
1393 
ValidateWakelockAttributionUidAndTagDimension(const DimensionsValue & value,const int atomId,const int uid,const string & tag)1394 void ValidateWakelockAttributionUidAndTagDimension(const DimensionsValue& value, const int atomId,
1395                                                    const int uid, const string& tag) {
1396     EXPECT_EQ(value.field(), atomId);
1397     ASSERT_EQ(value.value_tuple().dimensions_value_size(), 2);
1398     // Attribution field.
1399     EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
1400     // Uid field.
1401     ASSERT_EQ(value.value_tuple().dimensions_value(0).value_tuple().dimensions_value_size(), 1);
1402     EXPECT_EQ(value.value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).field(), 1);
1403     EXPECT_EQ(value.value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).value_int(),
1404               uid);
1405     // Tag field.
1406     EXPECT_EQ(value.value_tuple().dimensions_value(1).field(), 3);
1407     EXPECT_EQ(value.value_tuple().dimensions_value(1).value_str(), tag);
1408 }
1409 
ValidateAttributionUidDimension(const DimensionsValue & value,int atomId,int uid)1410 void ValidateAttributionUidDimension(const DimensionsValue& value, int atomId, int uid) {
1411     EXPECT_EQ(value.field(), atomId);
1412     ASSERT_EQ(value.value_tuple().dimensions_value_size(), 1);
1413     // Attribution field.
1414     EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
1415     // Uid only.
1416     EXPECT_EQ(value.value_tuple().dimensions_value(0)
1417         .value_tuple().dimensions_value_size(), 1);
1418     EXPECT_EQ(value.value_tuple().dimensions_value(0)
1419         .value_tuple().dimensions_value(0).field(), 1);
1420     EXPECT_EQ(value.value_tuple().dimensions_value(0)
1421         .value_tuple().dimensions_value(0).value_int(), uid);
1422 }
1423 
ValidateUidDimension(const DimensionsValue & value,int node_idx,int atomId,int uid)1424 void ValidateUidDimension(const DimensionsValue& value, int node_idx, int atomId, int uid) {
1425     EXPECT_EQ(value.field(), atomId);
1426     ASSERT_GT(value.value_tuple().dimensions_value_size(), node_idx);
1427     // Attribution field.
1428     EXPECT_EQ(value.value_tuple().dimensions_value(node_idx).field(), 1);
1429     EXPECT_EQ(value.value_tuple().dimensions_value(node_idx)
1430         .value_tuple().dimensions_value(0).field(), 1);
1431     EXPECT_EQ(value.value_tuple().dimensions_value(node_idx)
1432         .value_tuple().dimensions_value(0).value_int(), uid);
1433 }
1434 
ValidateAttributionUidAndTagDimension(const DimensionsValue & value,int node_idx,int atomId,int uid,const std::string & tag)1435 void ValidateAttributionUidAndTagDimension(
1436     const DimensionsValue& value, int node_idx, int atomId, int uid, const std::string& tag) {
1437     EXPECT_EQ(value.field(), atomId);
1438     ASSERT_GT(value.value_tuple().dimensions_value_size(), node_idx);
1439     // Attribution field.
1440     EXPECT_EQ(1, value.value_tuple().dimensions_value(node_idx).field());
1441     // Uid only.
1442     EXPECT_EQ(2, value.value_tuple().dimensions_value(node_idx)
1443         .value_tuple().dimensions_value_size());
1444     EXPECT_EQ(1, value.value_tuple().dimensions_value(node_idx)
1445         .value_tuple().dimensions_value(0).field());
1446     EXPECT_EQ(uid, value.value_tuple().dimensions_value(node_idx)
1447         .value_tuple().dimensions_value(0).value_int());
1448     EXPECT_EQ(2, value.value_tuple().dimensions_value(node_idx)
1449         .value_tuple().dimensions_value(1).field());
1450     EXPECT_EQ(tag, value.value_tuple().dimensions_value(node_idx)
1451         .value_tuple().dimensions_value(1).value_str());
1452 }
1453 
ValidateAttributionUidAndTagDimension(const DimensionsValue & value,int atomId,int uid,const std::string & tag)1454 void ValidateAttributionUidAndTagDimension(
1455     const DimensionsValue& value, int atomId, int uid, const std::string& tag) {
1456     EXPECT_EQ(value.field(), atomId);
1457     ASSERT_EQ(1, value.value_tuple().dimensions_value_size());
1458     // Attribution field.
1459     EXPECT_EQ(1, value.value_tuple().dimensions_value(0).field());
1460     // Uid only.
1461     EXPECT_EQ(value.value_tuple().dimensions_value(0)
1462         .value_tuple().dimensions_value_size(), 2);
1463     EXPECT_EQ(value.value_tuple().dimensions_value(0)
1464         .value_tuple().dimensions_value(0).field(), 1);
1465     EXPECT_EQ(value.value_tuple().dimensions_value(0)
1466         .value_tuple().dimensions_value(0).value_int(), uid);
1467     EXPECT_EQ(value.value_tuple().dimensions_value(0)
1468         .value_tuple().dimensions_value(1).field(), 2);
1469     EXPECT_EQ(value.value_tuple().dimensions_value(0)
1470         .value_tuple().dimensions_value(1).value_str(), tag);
1471 }
1472 
ValidateStateValue(const google::protobuf::RepeatedPtrField<StateValue> & stateValues,int atomId,int64_t value)1473 void ValidateStateValue(const google::protobuf::RepeatedPtrField<StateValue>& stateValues,
1474                         int atomId, int64_t value) {
1475     ASSERT_EQ(stateValues.size(), 1);
1476     ASSERT_EQ(stateValues[0].atom_id(), atomId);
1477     switch (stateValues[0].contents_case()) {
1478         case StateValue::ContentsCase::kValue:
1479             EXPECT_EQ(stateValues[0].value(), (int32_t)value);
1480             break;
1481         case StateValue::ContentsCase::kGroupId:
1482             EXPECT_EQ(stateValues[0].group_id(), value);
1483             break;
1484         default:
1485             FAIL() << "State value should have either a value or a group id";
1486     }
1487 }
1488 
ValidateCountBucket(const CountBucketInfo & countBucket,int64_t startTimeNs,int64_t endTimeNs,int64_t count)1489 void ValidateCountBucket(const CountBucketInfo& countBucket, int64_t startTimeNs, int64_t endTimeNs,
1490                          int64_t count) {
1491     EXPECT_EQ(countBucket.start_bucket_elapsed_nanos(), startTimeNs);
1492     EXPECT_EQ(countBucket.end_bucket_elapsed_nanos(), endTimeNs);
1493     EXPECT_EQ(countBucket.count(), count);
1494 }
1495 
ValidateDurationBucket(const DurationBucketInfo & bucket,int64_t startTimeNs,int64_t endTimeNs,int64_t durationNs)1496 void ValidateDurationBucket(const DurationBucketInfo& bucket, int64_t startTimeNs,
1497                             int64_t endTimeNs, int64_t durationNs) {
1498     EXPECT_EQ(bucket.start_bucket_elapsed_nanos(), startTimeNs);
1499     EXPECT_EQ(bucket.end_bucket_elapsed_nanos(), endTimeNs);
1500     EXPECT_EQ(bucket.duration_nanos(), durationNs);
1501 }
1502 
ValidateGaugeBucketTimes(const GaugeBucketInfo & gaugeBucket,int64_t startTimeNs,int64_t endTimeNs,vector<int64_t> eventTimesNs)1503 void ValidateGaugeBucketTimes(const GaugeBucketInfo& gaugeBucket, int64_t startTimeNs,
1504                               int64_t endTimeNs, vector<int64_t> eventTimesNs) {
1505     EXPECT_EQ(gaugeBucket.start_bucket_elapsed_nanos(), startTimeNs);
1506     EXPECT_EQ(gaugeBucket.end_bucket_elapsed_nanos(), endTimeNs);
1507     EXPECT_EQ(gaugeBucket.elapsed_timestamp_nanos_size(), eventTimesNs.size());
1508     for (int i = 0; i < eventTimesNs.size(); i++) {
1509         EXPECT_EQ(gaugeBucket.elapsed_timestamp_nanos(i), eventTimesNs[i]);
1510     }
1511 }
1512 
ValidateValueBucket(const ValueBucketInfo & bucket,int64_t startTimeNs,int64_t endTimeNs,const vector<int64_t> & values,int64_t conditionTrueNs,int64_t conditionCorrectionNs)1513 void ValidateValueBucket(const ValueBucketInfo& bucket, int64_t startTimeNs, int64_t endTimeNs,
1514                          const vector<int64_t>& values, int64_t conditionTrueNs,
1515                          int64_t conditionCorrectionNs) {
1516     EXPECT_EQ(bucket.start_bucket_elapsed_nanos(), startTimeNs);
1517     EXPECT_EQ(bucket.end_bucket_elapsed_nanos(), endTimeNs);
1518     ASSERT_EQ(bucket.values_size(), values.size());
1519     for (int i = 0; i < values.size(); ++i) {
1520         if (bucket.values(i).has_value_double()) {
1521             EXPECT_EQ((int64_t)bucket.values(i).value_double(), values[i]);
1522         } else {
1523             EXPECT_EQ(bucket.values(i).value_long(), values[i]);
1524         }
1525     }
1526     if (conditionTrueNs > 0) {
1527         EXPECT_EQ(bucket.condition_true_nanos(), conditionTrueNs);
1528         if (conditionCorrectionNs > 0) {
1529             EXPECT_EQ(bucket.condition_correction_nanos(), conditionCorrectionNs);
1530         }
1531     }
1532 }
1533 
ValidateKllBucket(const KllBucketInfo & bucket,int64_t startTimeNs,int64_t endTimeNs,const vector<int64_t> sketchSizes,int64_t conditionTrueNs)1534 void ValidateKllBucket(const KllBucketInfo& bucket, int64_t startTimeNs, int64_t endTimeNs,
1535                        const vector<int64_t> sketchSizes, int64_t conditionTrueNs) {
1536     EXPECT_EQ(bucket.start_bucket_elapsed_nanos(), startTimeNs);
1537     EXPECT_EQ(bucket.end_bucket_elapsed_nanos(), endTimeNs);
1538     ASSERT_EQ(bucket.sketches_size(), sketchSizes.size());
1539     for (int i = 0; i < sketchSizes.size(); ++i) {
1540         AggregatorStateProto aggProto;
1541         EXPECT_TRUE(aggProto.ParseFromString(bucket.sketches(i).kll_sketch()));
1542         EXPECT_EQ(aggProto.num_values(), sketchSizes[i]);
1543     }
1544     if (conditionTrueNs > 0) {
1545         EXPECT_EQ(bucket.condition_true_nanos(), conditionTrueNs);
1546     }
1547 }
1548 
EqualsTo(const DimensionsValue & s1,const DimensionsValue & s2)1549 bool EqualsTo(const DimensionsValue& s1, const DimensionsValue& s2) {
1550     if (s1.field() != s2.field()) {
1551         return false;
1552     }
1553     if (s1.value_case() != s2.value_case()) {
1554         return false;
1555     }
1556     switch (s1.value_case()) {
1557         case DimensionsValue::ValueCase::kValueStr:
1558             return (s1.value_str() == s2.value_str());
1559         case DimensionsValue::ValueCase::kValueInt:
1560             return s1.value_int() == s2.value_int();
1561         case DimensionsValue::ValueCase::kValueLong:
1562             return s1.value_long() == s2.value_long();
1563         case DimensionsValue::ValueCase::kValueBool:
1564             return s1.value_bool() == s2.value_bool();
1565         case DimensionsValue::ValueCase::kValueFloat:
1566             return s1.value_float() == s2.value_float();
1567         case DimensionsValue::ValueCase::kValueTuple: {
1568             if (s1.value_tuple().dimensions_value_size() !=
1569                 s2.value_tuple().dimensions_value_size()) {
1570                 return false;
1571             }
1572             bool allMatched = true;
1573             for (int i = 0; allMatched && i < s1.value_tuple().dimensions_value_size(); ++i) {
1574                 allMatched &= EqualsTo(s1.value_tuple().dimensions_value(i),
1575                                        s2.value_tuple().dimensions_value(i));
1576             }
1577             return allMatched;
1578         }
1579         case DimensionsValue::ValueCase::VALUE_NOT_SET:
1580         default:
1581             return true;
1582     }
1583 }
1584 
LessThan(const google::protobuf::RepeatedPtrField<StateValue> & s1,const google::protobuf::RepeatedPtrField<StateValue> & s2)1585 bool LessThan(const google::protobuf::RepeatedPtrField<StateValue>& s1,
1586               const google::protobuf::RepeatedPtrField<StateValue>& s2) {
1587     if (s1.size() != s2.size()) {
1588         return s1.size() < s2.size();
1589     }
1590     for (int i = 0; i < s1.size(); i++) {
1591         const StateValue& state1 = s1[i];
1592         const StateValue& state2 = s2[i];
1593         if (state1.atom_id() != state2.atom_id()) {
1594             return state1.atom_id() < state2.atom_id();
1595         }
1596         if (state1.value() != state2.value()) {
1597             return state1.value() < state2.value();
1598         }
1599         if (state1.group_id() != state2.group_id()) {
1600             return state1.group_id() < state2.group_id();
1601         }
1602     }
1603     return false;
1604 }
1605 
LessThan(const DimensionsValue & s1,const DimensionsValue & s2)1606 bool LessThan(const DimensionsValue& s1, const DimensionsValue& s2) {
1607     if (s1.field() != s2.field()) {
1608         return s1.field() < s2.field();
1609     }
1610     if (s1.value_case() != s2.value_case()) {
1611         return s1.value_case() < s2.value_case();
1612     }
1613     switch (s1.value_case()) {
1614         case DimensionsValue::ValueCase::kValueStr:
1615             return s1.value_str() < s2.value_str();
1616         case DimensionsValue::ValueCase::kValueInt:
1617             return s1.value_int() < s2.value_int();
1618         case DimensionsValue::ValueCase::kValueLong:
1619             return s1.value_long() < s2.value_long();
1620         case DimensionsValue::ValueCase::kValueBool:
1621             return (int)s1.value_bool() < (int)s2.value_bool();
1622         case DimensionsValue::ValueCase::kValueFloat:
1623             return s1.value_float() < s2.value_float();
1624         case DimensionsValue::ValueCase::kValueTuple: {
1625             if (s1.value_tuple().dimensions_value_size() !=
1626                 s2.value_tuple().dimensions_value_size()) {
1627                 return s1.value_tuple().dimensions_value_size() <
1628                        s2.value_tuple().dimensions_value_size();
1629             }
1630             for (int i = 0; i < s1.value_tuple().dimensions_value_size(); ++i) {
1631                 if (EqualsTo(s1.value_tuple().dimensions_value(i),
1632                              s2.value_tuple().dimensions_value(i))) {
1633                     continue;
1634                 } else {
1635                     return LessThan(s1.value_tuple().dimensions_value(i),
1636                                     s2.value_tuple().dimensions_value(i));
1637                 }
1638             }
1639             return false;
1640         }
1641         case DimensionsValue::ValueCase::VALUE_NOT_SET:
1642         default:
1643             return false;
1644     }
1645 }
1646 
LessThan(const DimensionsPair & s1,const DimensionsPair & s2)1647 bool LessThan(const DimensionsPair& s1, const DimensionsPair& s2) {
1648     if (LessThan(s1.dimInWhat, s2.dimInWhat)) {
1649         return true;
1650     } else if (LessThan(s2.dimInWhat, s1.dimInWhat)) {
1651         return false;
1652     }
1653 
1654     return LessThan(s1.stateValues, s2.stateValues);
1655 }
1656 
backfillStringInDimension(const std::map<uint64_t,string> & str_map,DimensionsValue * dimension)1657 void backfillStringInDimension(const std::map<uint64_t, string>& str_map,
1658                                DimensionsValue* dimension) {
1659     if (dimension->has_value_str_hash()) {
1660         auto it = str_map.find((uint64_t)(dimension->value_str_hash()));
1661         if (it != str_map.end()) {
1662             dimension->clear_value_str_hash();
1663             dimension->set_value_str(it->second);
1664         } else {
1665             ALOGE("Can not find the string hash: %llu",
1666                 (unsigned long long)dimension->value_str_hash());
1667         }
1668     } else if (dimension->has_value_tuple()) {
1669         auto value_tuple = dimension->mutable_value_tuple();
1670         for (int i = 0; i < value_tuple->dimensions_value_size(); ++i) {
1671             backfillStringInDimension(str_map, value_tuple->mutable_dimensions_value(i));
1672         }
1673     }
1674 }
1675 
backfillStringInReport(ConfigMetricsReport * config_report)1676 void backfillStringInReport(ConfigMetricsReport *config_report) {
1677     std::map<uint64_t, string> str_map;
1678     for (const auto& str : config_report->strings()) {
1679         uint64_t hash = Hash64(str);
1680         if (str_map.find(hash) != str_map.end()) {
1681             ALOGE("String hash conflicts: %s %s", str.c_str(), str_map[hash].c_str());
1682         }
1683         str_map[hash] = str;
1684     }
1685     for (int i = 0; i < config_report->metrics_size(); ++i) {
1686         auto metric_report = config_report->mutable_metrics(i);
1687         if (metric_report->has_count_metrics()) {
1688             backfillStringInDimension(str_map, metric_report->mutable_count_metrics());
1689         } else if (metric_report->has_duration_metrics()) {
1690             backfillStringInDimension(str_map, metric_report->mutable_duration_metrics());
1691         } else if (metric_report->has_gauge_metrics()) {
1692             backfillStringInDimension(str_map, metric_report->mutable_gauge_metrics());
1693         } else if (metric_report->has_value_metrics()) {
1694             backfillStringInDimension(str_map, metric_report->mutable_value_metrics());
1695         }
1696     }
1697     // Backfill the package names.
1698     for (int i = 0 ; i < config_report->uid_map().snapshots_size(); ++i) {
1699         auto snapshot = config_report->mutable_uid_map()->mutable_snapshots(i);
1700         for (int j = 0 ; j < snapshot->package_info_size(); ++j) {
1701             auto package_info = snapshot->mutable_package_info(j);
1702             if (package_info->has_name_hash()) {
1703                 auto it = str_map.find((uint64_t)(package_info->name_hash()));
1704                 if (it != str_map.end()) {
1705                     package_info->clear_name_hash();
1706                     package_info->set_name(it->second);
1707                 } else {
1708                     ALOGE("Can not find the string package name hash: %llu",
1709                         (unsigned long long)package_info->name_hash());
1710                 }
1711 
1712             }
1713         }
1714     }
1715     // Backfill the app name in app changes.
1716     for (int i = 0 ; i < config_report->uid_map().changes_size(); ++i) {
1717         auto change = config_report->mutable_uid_map()->mutable_changes(i);
1718         if (change->has_app_hash()) {
1719             auto it = str_map.find((uint64_t)(change->app_hash()));
1720             if (it != str_map.end()) {
1721                 change->clear_app_hash();
1722                 change->set_app(it->second);
1723             } else {
1724                 ALOGE("Can not find the string change app name hash: %llu",
1725                     (unsigned long long)change->app_hash());
1726             }
1727         }
1728     }
1729 }
1730 
backfillStringInReport(ConfigMetricsReportList * config_report_list)1731 void backfillStringInReport(ConfigMetricsReportList *config_report_list) {
1732     for (int i = 0; i < config_report_list->reports_size(); ++i) {
1733         backfillStringInReport(config_report_list->mutable_reports(i));
1734     }
1735 }
1736 
backfillDimensionPath(const DimensionsValue & path,const google::protobuf::RepeatedPtrField<DimensionsValue> & leafValues,int * leafIndex,DimensionsValue * dimension)1737 bool backfillDimensionPath(const DimensionsValue& path,
1738                            const google::protobuf::RepeatedPtrField<DimensionsValue>& leafValues,
1739                            int* leafIndex, DimensionsValue* dimension) {
1740     dimension->set_field(path.field());
1741     if (path.has_value_tuple()) {
1742         for (int i = 0; i < path.value_tuple().dimensions_value_size(); ++i) {
1743             if (!backfillDimensionPath(path.value_tuple().dimensions_value(i), leafValues,
1744                                        leafIndex,
1745                                        dimension->mutable_value_tuple()->add_dimensions_value())) {
1746                 return false;
1747             }
1748         }
1749     } else {
1750         if (*leafIndex < 0 || *leafIndex >= leafValues.size()) {
1751             return false;
1752         }
1753         dimension->MergeFrom(leafValues.Get(*leafIndex));
1754         (*leafIndex)++;
1755     }
1756     return true;
1757 }
1758 
backfillDimensionPath(const DimensionsValue & path,const google::protobuf::RepeatedPtrField<DimensionsValue> & leafValues,DimensionsValue * dimension)1759 bool backfillDimensionPath(const DimensionsValue& path,
1760                            const google::protobuf::RepeatedPtrField<DimensionsValue>& leafValues,
1761                            DimensionsValue* dimension) {
1762     int leafIndex = 0;
1763     return backfillDimensionPath(path, leafValues, &leafIndex, dimension);
1764 }
1765 
backfillDimensionPath(StatsLogReport * report)1766 void backfillDimensionPath(StatsLogReport* report) {
1767     if (report->has_dimensions_path_in_what() || report->has_dimensions_path_in_condition()) {
1768         auto whatPath = report->dimensions_path_in_what();
1769         auto conditionPath = report->dimensions_path_in_condition();
1770         if (report->has_count_metrics()) {
1771             backfillDimensionPath(whatPath, conditionPath, report->mutable_count_metrics());
1772         } else if (report->has_duration_metrics()) {
1773             backfillDimensionPath(whatPath, conditionPath, report->mutable_duration_metrics());
1774         } else if (report->has_gauge_metrics()) {
1775             backfillDimensionPath(whatPath, conditionPath, report->mutable_gauge_metrics());
1776         } else if (report->has_value_metrics()) {
1777             backfillDimensionPath(whatPath, conditionPath, report->mutable_value_metrics());
1778         }
1779         report->clear_dimensions_path_in_what();
1780         report->clear_dimensions_path_in_condition();
1781     }
1782 }
1783 
backfillDimensionPath(ConfigMetricsReport * config_report)1784 void backfillDimensionPath(ConfigMetricsReport* config_report) {
1785     for (int i = 0; i < config_report->metrics_size(); ++i) {
1786         backfillDimensionPath(config_report->mutable_metrics(i));
1787     }
1788 }
1789 
backfillDimensionPath(ConfigMetricsReportList * config_report_list)1790 void backfillDimensionPath(ConfigMetricsReportList* config_report_list) {
1791     for (int i = 0; i < config_report_list->reports_size(); ++i) {
1792         backfillDimensionPath(config_report_list->mutable_reports(i));
1793     }
1794 }
1795 
backfillStartEndTimestamp(StatsLogReport * report)1796 void backfillStartEndTimestamp(StatsLogReport *report) {
1797     const int64_t timeBaseNs = report->time_base_elapsed_nano_seconds();
1798     const int64_t bucketSizeNs = report->bucket_size_nano_seconds();
1799     if (report->has_count_metrics()) {
1800         backfillStartEndTimestampForMetrics(
1801             timeBaseNs, bucketSizeNs, report->mutable_count_metrics());
1802     } else if (report->has_duration_metrics()) {
1803         backfillStartEndTimestampForMetrics(
1804             timeBaseNs, bucketSizeNs, report->mutable_duration_metrics());
1805     } else if (report->has_gauge_metrics()) {
1806         backfillStartEndTimestampForMetrics(
1807             timeBaseNs, bucketSizeNs, report->mutable_gauge_metrics());
1808         if (report->gauge_metrics().skipped_size() > 0) {
1809             backfillStartEndTimestampForSkippedBuckets(
1810                 timeBaseNs, report->mutable_gauge_metrics());
1811         }
1812     } else if (report->has_value_metrics()) {
1813         backfillStartEndTimestampForMetrics(
1814             timeBaseNs, bucketSizeNs, report->mutable_value_metrics());
1815         if (report->value_metrics().skipped_size() > 0) {
1816             backfillStartEndTimestampForSkippedBuckets(
1817                 timeBaseNs, report->mutable_value_metrics());
1818         }
1819     } else if (report->has_kll_metrics()) {
1820         backfillStartEndTimestampForMetrics(timeBaseNs, bucketSizeNs,
1821                                             report->mutable_kll_metrics());
1822         if (report->kll_metrics().skipped_size() > 0) {
1823             backfillStartEndTimestampForSkippedBuckets(timeBaseNs, report->mutable_kll_metrics());
1824         }
1825     }
1826 }
1827 
backfillStartEndTimestamp(ConfigMetricsReport * config_report)1828 void backfillStartEndTimestamp(ConfigMetricsReport *config_report) {
1829     for (int j = 0; j < config_report->metrics_size(); ++j) {
1830         backfillStartEndTimestamp(config_report->mutable_metrics(j));
1831     }
1832 }
1833 
backfillStartEndTimestamp(ConfigMetricsReportList * config_report_list)1834 void backfillStartEndTimestamp(ConfigMetricsReportList *config_report_list) {
1835     for (int i = 0; i < config_report_list->reports_size(); ++i) {
1836         backfillStartEndTimestamp(config_report_list->mutable_reports(i));
1837     }
1838 }
1839 
backfillAggregatedAtoms(ConfigMetricsReportList * config_report_list)1840 void backfillAggregatedAtoms(ConfigMetricsReportList* config_report_list) {
1841     for (int i = 0; i < config_report_list->reports_size(); ++i) {
1842         backfillAggregatedAtoms(config_report_list->mutable_reports(i));
1843     }
1844 }
1845 
backfillAggregatedAtoms(ConfigMetricsReport * config_report)1846 void backfillAggregatedAtoms(ConfigMetricsReport* config_report) {
1847     for (int i = 0; i < config_report->metrics_size(); ++i) {
1848         backfillAggregatedAtoms(config_report->mutable_metrics(i));
1849     }
1850 }
1851 
backfillAggregatedAtoms(StatsLogReport * report)1852 void backfillAggregatedAtoms(StatsLogReport* report) {
1853     if (report->has_event_metrics()) {
1854         backfillAggregatedAtomsInEventMetric(report->mutable_event_metrics());
1855     }
1856     if (report->has_gauge_metrics()) {
1857         backfillAggregatedAtomsInGaugeMetric(report->mutable_gauge_metrics());
1858     }
1859 }
1860 
backfillAggregatedAtomsInEventMetric(StatsLogReport::EventMetricDataWrapper * wrapper)1861 void backfillAggregatedAtomsInEventMetric(StatsLogReport::EventMetricDataWrapper* wrapper) {
1862     std::vector<EventMetricData> metricData;
1863     for (int i = 0; i < wrapper->data_size(); ++i) {
1864         AggregatedAtomInfo* atomInfo = wrapper->mutable_data(i)->mutable_aggregated_atom_info();
1865         for (int j = 0; j < atomInfo->elapsed_timestamp_nanos_size(); j++) {
1866             EventMetricData data;
1867             *(data.mutable_atom()) = atomInfo->atom();
1868             data.set_elapsed_timestamp_nanos(atomInfo->elapsed_timestamp_nanos(j));
1869             metricData.push_back(data);
1870         }
1871     }
1872 
1873     if (metricData.size() == 0) {
1874         return;
1875     }
1876 
1877     sort(metricData.begin(), metricData.end(),
1878          [](const EventMetricData& lhs, const EventMetricData& rhs) {
1879              return lhs.elapsed_timestamp_nanos() < rhs.elapsed_timestamp_nanos();
1880          });
1881 
1882     wrapper->clear_data();
1883     for (int i = 0; i < metricData.size(); ++i) {
1884         *(wrapper->add_data()) = metricData[i];
1885     }
1886 }
1887 
backfillAggregatedAtomsInGaugeMetric(StatsLogReport::GaugeMetricDataWrapper * wrapper)1888 void backfillAggregatedAtomsInGaugeMetric(StatsLogReport::GaugeMetricDataWrapper* wrapper) {
1889     for (int i = 0; i < wrapper->data_size(); ++i) {
1890         for (int j = 0; j < wrapper->data(i).bucket_info_size(); ++j) {
1891             GaugeBucketInfo* bucketInfo = wrapper->mutable_data(i)->mutable_bucket_info(j);
1892             vector<pair<Atom, int64_t>> atomData = unnestGaugeAtomData(*bucketInfo);
1893 
1894             if (atomData.size() == 0) {
1895                 return;
1896             }
1897 
1898             bucketInfo->clear_aggregated_atom_info();
1899             ASSERT_EQ(bucketInfo->atom_size(), 0);
1900             ASSERT_EQ(bucketInfo->elapsed_timestamp_nanos_size(), 0);
1901 
1902             for (int k = 0; k < atomData.size(); ++k) {
1903                 *(bucketInfo->add_atom()) = atomData[k].first;
1904                 bucketInfo->add_elapsed_timestamp_nanos(atomData[k].second);
1905             }
1906         }
1907     }
1908 }
1909 
unnestGaugeAtomData(const GaugeBucketInfo & bucketInfo)1910 vector<pair<Atom, int64_t>> unnestGaugeAtomData(const GaugeBucketInfo& bucketInfo) {
1911     vector<pair<Atom, int64_t>> atomData;
1912     for (int k = 0; k < bucketInfo.aggregated_atom_info_size(); ++k) {
1913         const AggregatedAtomInfo& atomInfo = bucketInfo.aggregated_atom_info(k);
1914         for (int l = 0; l < atomInfo.elapsed_timestamp_nanos_size(); ++l) {
1915             atomData.push_back(make_pair(atomInfo.atom(), atomInfo.elapsed_timestamp_nanos(l)));
1916         }
1917     }
1918 
1919     sort(atomData.begin(), atomData.end(),
1920          [](const pair<Atom, int64_t>& lhs, const pair<Atom, int64_t>& rhs) {
1921              return lhs.second < rhs.second;
1922          });
1923 
1924     return atomData;
1925 }
1926 
sortReportsByElapsedTime(ConfigMetricsReportList * configReportList)1927 void sortReportsByElapsedTime(ConfigMetricsReportList* configReportList) {
1928     RepeatedPtrField<ConfigMetricsReport>* reports = configReportList->mutable_reports();
1929     sort(reports->pointer_begin(), reports->pointer_end(),
1930          [](const ConfigMetricsReport* lhs, const ConfigMetricsReport* rhs) {
1931              return lhs->current_report_elapsed_nanos() < rhs->current_report_elapsed_nanos();
1932          });
1933 }
1934 
onPullAtom(int atomTag,const shared_ptr<IPullAtomResultReceiver> & resultReceiver)1935 Status FakeSubsystemSleepCallback::onPullAtom(int atomTag,
1936         const shared_ptr<IPullAtomResultReceiver>& resultReceiver) {
1937     // Convert stats_events into StatsEventParcels.
1938     std::vector<StatsEventParcel> parcels;
1939     for (int i = 1; i < 3; i++) {
1940         AStatsEvent* event = AStatsEvent_obtain();
1941         AStatsEvent_setAtomId(event, atomTag);
1942         std::string subsystemName = "subsystem_name_";
1943         subsystemName = subsystemName + std::to_string(i);
1944         AStatsEvent_writeString(event, subsystemName.c_str());
1945         AStatsEvent_writeString(event, "subsystem_subname foo");
1946         AStatsEvent_writeInt64(event, /*count= */ i);
1947         AStatsEvent_writeInt64(event, /*time_millis= */ pullNum * pullNum * 100 + i);
1948         AStatsEvent_build(event);
1949         size_t size;
1950         uint8_t* buffer = AStatsEvent_getBuffer(event, &size);
1951 
1952         StatsEventParcel p;
1953         // vector.assign() creates a copy, but this is inevitable unless
1954         // stats_event.h/c uses a vector as opposed to a buffer.
1955         p.buffer.assign(buffer, buffer + size);
1956         parcels.push_back(std::move(p));
1957         AStatsEvent_release(event);
1958     }
1959     pullNum++;
1960     resultReceiver->pullFinished(atomTag, /*success=*/true, parcels);
1961     return Status::ok();
1962 }
1963 
writeFlag(const string & flagName,const string & flagValue)1964 void writeFlag(const string& flagName, const string& flagValue) {
1965     SetProperty(StringPrintf("persist.device_config.%s.%s", STATSD_NATIVE_NAMESPACE.c_str(),
1966                              flagName.c_str()),
1967                 flagValue);
1968 }
1969 
writeBootFlag(const string & flagName,const string & flagValue)1970 void writeBootFlag(const string& flagName, const string& flagValue) {
1971     SetProperty(StringPrintf("persist.device_config.%s.%s", STATSD_NATIVE_BOOT_NAMESPACE.c_str(),
1972                              flagName.c_str()),
1973                 flagValue);
1974 }
1975 }  // namespace statsd
1976 }  // namespace os
1977 }  // namespace android
1978