blob: 2678c8a93463c32dff73f36614ae0c2168c44d12 [file] [log] [blame]
Yangster-mac20877162017-12-22 17:19:39 -08001// Copyright (C) 2017 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Yangster-mac20877162017-12-22 17:19:39 -080015#include "statsd_test_util.h"
16
17namespace android {
18namespace os {
19namespace statsd {
20
Yangster-mac87718e22018-01-11 16:16:26 -080021AtomMatcher CreateSimpleAtomMatcher(const string& name, int atomId) {
22 AtomMatcher atom_matcher;
23 atom_matcher.set_id(StringToId(name));
24 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
25 simple_atom_matcher->set_atom_id(atomId);
26 return atom_matcher;
27}
28
Yangster13fb7e42018-03-07 17:30:49 -080029AtomMatcher CreateScheduledJobStateChangedAtomMatcher(const string& name,
30 ScheduledJobStateChanged::State state) {
31 AtomMatcher atom_matcher;
32 atom_matcher.set_id(StringToId(name));
33 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
34 simple_atom_matcher->set_atom_id(android::util::SCHEDULED_JOB_STATE_CHANGED);
35 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
36 field_value_matcher->set_field(3); // State field.
37 field_value_matcher->set_eq_int(state);
38 return atom_matcher;
39}
40
41AtomMatcher CreateStartScheduledJobAtomMatcher() {
42 return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobStart",
43 ScheduledJobStateChanged::STARTED);
44}
45
46AtomMatcher CreateFinishScheduledJobAtomMatcher() {
47 return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobFinish",
48 ScheduledJobStateChanged::FINISHED);
49}
50
Yangster-mac93694462018-01-22 20:49:31 -080051AtomMatcher CreateScreenBrightnessChangedAtomMatcher() {
52 AtomMatcher atom_matcher;
53 atom_matcher.set_id(StringToId("ScreenBrightnessChanged"));
54 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
55 simple_atom_matcher->set_atom_id(android::util::SCREEN_BRIGHTNESS_CHANGED);
56 return atom_matcher;
57}
58
59AtomMatcher CreateUidProcessStateChangedAtomMatcher() {
60 AtomMatcher atom_matcher;
61 atom_matcher.set_id(StringToId("UidProcessStateChanged"));
62 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
63 simple_atom_matcher->set_atom_id(android::util::UID_PROCESS_STATE_CHANGED);
64 return atom_matcher;
65}
66
Yangster-mac20877162017-12-22 17:19:39 -080067AtomMatcher CreateWakelockStateChangedAtomMatcher(const string& name,
68 WakelockStateChanged::State state) {
69 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -080070 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -080071 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
72 simple_atom_matcher->set_atom_id(android::util::WAKELOCK_STATE_CHANGED);
73 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
74 field_value_matcher->set_field(4); // State field.
75 field_value_matcher->set_eq_int(state);
76 return atom_matcher;
77}
78
79AtomMatcher CreateAcquireWakelockAtomMatcher() {
80 return CreateWakelockStateChangedAtomMatcher("AcquireWakelock", WakelockStateChanged::ACQUIRE);
81}
82
83AtomMatcher CreateReleaseWakelockAtomMatcher() {
84 return CreateWakelockStateChangedAtomMatcher("ReleaseWakelock", WakelockStateChanged::RELEASE);
85}
86
Yangster-mac93694462018-01-22 20:49:31 -080087AtomMatcher CreateBatterySaverModeStateChangedAtomMatcher(
88 const string& name, BatterySaverModeStateChanged::State state) {
89 AtomMatcher atom_matcher;
90 atom_matcher.set_id(StringToId(name));
91 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
92 simple_atom_matcher->set_atom_id(android::util::BATTERY_SAVER_MODE_STATE_CHANGED);
93 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
94 field_value_matcher->set_field(1); // State field.
95 field_value_matcher->set_eq_int(state);
96 return atom_matcher;
97}
98
99AtomMatcher CreateBatterySaverModeStartAtomMatcher() {
100 return CreateBatterySaverModeStateChangedAtomMatcher(
101 "BatterySaverModeStart", BatterySaverModeStateChanged::ON);
102}
103
104
105AtomMatcher CreateBatterySaverModeStopAtomMatcher() {
106 return CreateBatterySaverModeStateChangedAtomMatcher(
107 "BatterySaverModeStop", BatterySaverModeStateChanged::OFF);
108}
109
110
Yangster-mac20877162017-12-22 17:19:39 -0800111AtomMatcher CreateScreenStateChangedAtomMatcher(
Bookatz1a1b0462018-01-12 11:47:03 -0800112 const string& name, android::view::DisplayStateEnum state) {
Yangster-mac20877162017-12-22 17:19:39 -0800113 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800114 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800115 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
116 simple_atom_matcher->set_atom_id(android::util::SCREEN_STATE_CHANGED);
117 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
118 field_value_matcher->set_field(1); // State field.
119 field_value_matcher->set_eq_int(state);
120 return atom_matcher;
121}
122
Yangster-mac93694462018-01-22 20:49:31 -0800123
Yangster-mac20877162017-12-22 17:19:39 -0800124AtomMatcher CreateScreenTurnedOnAtomMatcher() {
Bookatz1a1b0462018-01-12 11:47:03 -0800125 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOn",
126 android::view::DisplayStateEnum::DISPLAY_STATE_ON);
Yangster-mac20877162017-12-22 17:19:39 -0800127}
128
129AtomMatcher CreateScreenTurnedOffAtomMatcher() {
Bookatz1a1b0462018-01-12 11:47:03 -0800130 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOff",
131 ::android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
Yangster-mac20877162017-12-22 17:19:39 -0800132}
133
134AtomMatcher CreateSyncStateChangedAtomMatcher(
135 const string& name, SyncStateChanged::State state) {
136 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800137 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800138 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
139 simple_atom_matcher->set_atom_id(android::util::SYNC_STATE_CHANGED);
140 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
141 field_value_matcher->set_field(3); // State field.
142 field_value_matcher->set_eq_int(state);
143 return atom_matcher;
144}
145
146AtomMatcher CreateSyncStartAtomMatcher() {
147 return CreateSyncStateChangedAtomMatcher("SyncStart", SyncStateChanged::ON);
148}
149
150AtomMatcher CreateSyncEndAtomMatcher() {
151 return CreateSyncStateChangedAtomMatcher("SyncEnd", SyncStateChanged::OFF);
152}
153
154AtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
155 const string& name, ActivityForegroundStateChanged::Activity activity) {
156 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800157 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800158 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
159 simple_atom_matcher->set_atom_id(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED);
160 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
161 field_value_matcher->set_field(4); // Activity field.
162 field_value_matcher->set_eq_int(activity);
163 return atom_matcher;
164}
165
166AtomMatcher CreateMoveToBackgroundAtomMatcher() {
167 return CreateActivityForegroundStateChangedAtomMatcher(
168 "MoveToBackground", ActivityForegroundStateChanged::MOVE_TO_BACKGROUND);
169}
170
171AtomMatcher CreateMoveToForegroundAtomMatcher() {
172 return CreateActivityForegroundStateChangedAtomMatcher(
173 "MoveToForeground", ActivityForegroundStateChanged::MOVE_TO_FOREGROUND);
174}
175
176AtomMatcher CreateProcessLifeCycleStateChangedAtomMatcher(
177 const string& name, ProcessLifeCycleStateChanged::Event event) {
178 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800179 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800180 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
181 simple_atom_matcher->set_atom_id(android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
182 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
183 field_value_matcher->set_field(3); // Process state field.
184 field_value_matcher->set_eq_int(event);
185 return atom_matcher;
186}
187
188AtomMatcher CreateProcessCrashAtomMatcher() {
189 return CreateProcessLifeCycleStateChangedAtomMatcher(
190 "ProcessCrashed", ProcessLifeCycleStateChanged::PROCESS_CRASHED);
191}
192
Yangster13fb7e42018-03-07 17:30:49 -0800193Predicate CreateScheduledJobPredicate() {
194 Predicate predicate;
195 predicate.set_id(StringToId("ScheduledJobRunningPredicate"));
196 predicate.mutable_simple_predicate()->set_start(StringToId("ScheduledJobStart"));
197 predicate.mutable_simple_predicate()->set_stop(StringToId("ScheduledJobFinish"));
198 return predicate;
199}
200
Yangster-mac93694462018-01-22 20:49:31 -0800201Predicate CreateBatterySaverModePredicate() {
202 Predicate predicate;
203 predicate.set_id(StringToId("BatterySaverIsOn"));
204 predicate.mutable_simple_predicate()->set_start(StringToId("BatterySaverModeStart"));
205 predicate.mutable_simple_predicate()->set_stop(StringToId("BatterySaverModeStop"));
206 return predicate;
207}
Yangster-mac20877162017-12-22 17:19:39 -0800208
209Predicate CreateScreenIsOnPredicate() {
210 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800211 predicate.set_id(StringToId("ScreenIsOn"));
212 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOn"));
213 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOff"));
Yangster-mac20877162017-12-22 17:19:39 -0800214 return predicate;
215}
216
217Predicate CreateScreenIsOffPredicate() {
218 Predicate predicate;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800219 predicate.set_id(1111123);
Yangster-mac94e197c2018-01-02 16:03:03 -0800220 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOff"));
221 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOn"));
Yangster-mac20877162017-12-22 17:19:39 -0800222 return predicate;
223}
224
225Predicate CreateHoldingWakelockPredicate() {
226 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800227 predicate.set_id(StringToId("HoldingWakelock"));
228 predicate.mutable_simple_predicate()->set_start(StringToId("AcquireWakelock"));
229 predicate.mutable_simple_predicate()->set_stop(StringToId("ReleaseWakelock"));
Yangster-mac20877162017-12-22 17:19:39 -0800230 return predicate;
231}
232
233Predicate CreateIsSyncingPredicate() {
234 Predicate predicate;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800235 predicate.set_id(33333333333333);
Yangster-mac94e197c2018-01-02 16:03:03 -0800236 predicate.mutable_simple_predicate()->set_start(StringToId("SyncStart"));
237 predicate.mutable_simple_predicate()->set_stop(StringToId("SyncEnd"));
Yangster-mac20877162017-12-22 17:19:39 -0800238 return predicate;
239}
240
241Predicate CreateIsInBackgroundPredicate() {
242 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800243 predicate.set_id(StringToId("IsInBackground"));
244 predicate.mutable_simple_predicate()->set_start(StringToId("MoveToBackground"));
245 predicate.mutable_simple_predicate()->set_stop(StringToId("MoveToForeground"));
Yangster-mac20877162017-12-22 17:19:39 -0800246 return predicate;
247}
248
249void addPredicateToPredicateCombination(const Predicate& predicate,
250 Predicate* combinationPredicate) {
Yangster-mac94e197c2018-01-02 16:03:03 -0800251 combinationPredicate->mutable_combination()->add_predicate(predicate.id());
Yangster-mac20877162017-12-22 17:19:39 -0800252}
253
254FieldMatcher CreateAttributionUidDimensions(const int atomId,
255 const std::vector<Position>& positions) {
256 FieldMatcher dimensions;
257 dimensions.set_field(atomId);
258 for (const auto position : positions) {
259 auto child = dimensions.add_child();
260 child->set_field(1);
261 child->set_position(position);
262 child->add_child()->set_field(1);
263 }
264 return dimensions;
265}
266
267FieldMatcher CreateAttributionUidAndTagDimensions(const int atomId,
268 const std::vector<Position>& positions) {
269 FieldMatcher dimensions;
270 dimensions.set_field(atomId);
271 for (const auto position : positions) {
272 auto child = dimensions.add_child();
273 child->set_field(1);
274 child->set_position(position);
275 child->add_child()->set_field(1);
276 child->add_child()->set_field(2);
277 }
278 return dimensions;
279}
280
281FieldMatcher CreateDimensions(const int atomId, const std::vector<int>& fields) {
282 FieldMatcher dimensions;
283 dimensions.set_field(atomId);
284 for (const int field : fields) {
285 dimensions.add_child()->set_field(field);
286 }
287 return dimensions;
288}
289
290std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
Bookatz1a1b0462018-01-12 11:47:03 -0800291 const android::view::DisplayStateEnum state, uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800292 auto event = std::make_unique<LogEvent>(android::util::SCREEN_STATE_CHANGED, timestampNs);
293 EXPECT_TRUE(event->write(state));
294 event->init();
295 return event;
296}
297
Yangster-mac93694462018-01-22 20:49:31 -0800298std::unique_ptr<LogEvent> CreateBatterySaverOnEvent(uint64_t timestampNs) {
299 auto event = std::make_unique<LogEvent>(
300 android::util::BATTERY_SAVER_MODE_STATE_CHANGED, timestampNs);
301 EXPECT_TRUE(event->write(BatterySaverModeStateChanged::ON));
302 event->init();
303 return event;
304}
305
306std::unique_ptr<LogEvent> CreateBatterySaverOffEvent(uint64_t timestampNs) {
307 auto event = std::make_unique<LogEvent>(
308 android::util::BATTERY_SAVER_MODE_STATE_CHANGED, timestampNs);
309 EXPECT_TRUE(event->write(BatterySaverModeStateChanged::OFF));
310 event->init();
311 return event;
312}
313
314std::unique_ptr<LogEvent> CreateScreenBrightnessChangedEvent(
315 int level, uint64_t timestampNs) {
316 auto event = std::make_unique<LogEvent>(android::util::SCREEN_BRIGHTNESS_CHANGED, timestampNs);
317 EXPECT_TRUE(event->write(level));
318 event->init();
319 return event;
320
321}
322
Yangster13fb7e42018-03-07 17:30:49 -0800323std::unique_ptr<LogEvent> CreateScheduledJobStateChangedEvent(
324 const std::vector<AttributionNodeInternal>& attributions, const string& jobName,
325 const ScheduledJobStateChanged::State state, uint64_t timestampNs) {
326 auto event = std::make_unique<LogEvent>(android::util::SCHEDULED_JOB_STATE_CHANGED, timestampNs);
327 event->write(attributions);
328 event->write(jobName);
329 event->write(state);
330 event->init();
331 return event;
332}
333
334std::unique_ptr<LogEvent> CreateStartScheduledJobEvent(
335 const std::vector<AttributionNodeInternal>& attributions,
336 const string& name, uint64_t timestampNs) {
337 return CreateScheduledJobStateChangedEvent(
338 attributions, name, ScheduledJobStateChanged::STARTED, timestampNs);
339}
340
341// Create log event when scheduled job finishes.
342std::unique_ptr<LogEvent> CreateFinishScheduledJobEvent(
343 const std::vector<AttributionNodeInternal>& attributions,
344 const string& name, uint64_t timestampNs) {
345 return CreateScheduledJobStateChangedEvent(
346 attributions, name, ScheduledJobStateChanged::FINISHED, timestampNs);
347}
348
Yangster-mac20877162017-12-22 17:19:39 -0800349std::unique_ptr<LogEvent> CreateWakelockStateChangedEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800350 const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
351 const WakelockStateChanged::State state, uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800352 auto event = std::make_unique<LogEvent>(android::util::WAKELOCK_STATE_CHANGED, timestampNs);
353 event->write(attributions);
Bookatz1a1b0462018-01-12 11:47:03 -0800354 event->write(android::os::WakeLockLevelEnum::PARTIAL_WAKE_LOCK);
Yangster-mac20877162017-12-22 17:19:39 -0800355 event->write(wakelockName);
356 event->write(state);
357 event->init();
358 return event;
359}
360
361std::unique_ptr<LogEvent> CreateAcquireWakelockEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800362 const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
363 uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800364 return CreateWakelockStateChangedEvent(
365 attributions, wakelockName, WakelockStateChanged::ACQUIRE, timestampNs);
366}
367
368std::unique_ptr<LogEvent> CreateReleaseWakelockEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800369 const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
370 uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800371 return CreateWakelockStateChangedEvent(
372 attributions, wakelockName, WakelockStateChanged::RELEASE, timestampNs);
373}
374
375std::unique_ptr<LogEvent> CreateActivityForegroundStateChangedEvent(
376 const int uid, const ActivityForegroundStateChanged::Activity activity, uint64_t timestampNs) {
377 auto event = std::make_unique<LogEvent>(
378 android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, timestampNs);
379 event->write(uid);
380 event->write("pkg_name");
381 event->write("class_name");
382 event->write(activity);
383 event->init();
384 return event;
385}
386
387std::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(const int uid, uint64_t timestampNs) {
388 return CreateActivityForegroundStateChangedEvent(
389 uid, ActivityForegroundStateChanged::MOVE_TO_BACKGROUND, timestampNs);
390}
391
392std::unique_ptr<LogEvent> CreateMoveToForegroundEvent(const int uid, uint64_t timestampNs) {
393 return CreateActivityForegroundStateChangedEvent(
394 uid, ActivityForegroundStateChanged::MOVE_TO_FOREGROUND, timestampNs);
395}
396
397std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800398 const std::vector<AttributionNodeInternal>& attributions, const string& name,
399 const SyncStateChanged::State state, uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800400 auto event = std::make_unique<LogEvent>(android::util::SYNC_STATE_CHANGED, timestampNs);
Yangster-mac93694462018-01-22 20:49:31 -0800401 event->write(attributions);
Yangster-mac20877162017-12-22 17:19:39 -0800402 event->write(name);
403 event->write(state);
404 event->init();
405 return event;
406}
407
408std::unique_ptr<LogEvent> CreateSyncStartEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800409 const std::vector<AttributionNodeInternal>& attributions, const string& name,
410 uint64_t timestampNs) {
Yangster-mac93694462018-01-22 20:49:31 -0800411 return CreateSyncStateChangedEvent(attributions, name, SyncStateChanged::ON, timestampNs);
Yangster-mac20877162017-12-22 17:19:39 -0800412}
413
414std::unique_ptr<LogEvent> CreateSyncEndEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800415 const std::vector<AttributionNodeInternal>& attributions, const string& name,
416 uint64_t timestampNs) {
Yangster-mac93694462018-01-22 20:49:31 -0800417 return CreateSyncStateChangedEvent(attributions, name, SyncStateChanged::OFF, timestampNs);
Yangster-mac20877162017-12-22 17:19:39 -0800418}
419
420std::unique_ptr<LogEvent> CreateProcessLifeCycleStateChangedEvent(
421 const int uid, const ProcessLifeCycleStateChanged::Event event, uint64_t timestampNs) {
422 auto logEvent = std::make_unique<LogEvent>(
423 android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED, timestampNs);
424 logEvent->write(uid);
425 logEvent->write("");
426 logEvent->write(event);
427 logEvent->init();
428 return logEvent;
429}
430
431std::unique_ptr<LogEvent> CreateAppCrashEvent(const int uid, uint64_t timestampNs) {
432 return CreateProcessLifeCycleStateChangedEvent(
433 uid, ProcessLifeCycleStateChanged::PROCESS_CRASHED, timestampNs);
434}
435
Yangster-macd40053e2018-01-09 16:29:22 -0800436std::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(
437 int isolatedUid, int hostUid, bool is_create, uint64_t timestampNs) {
438 auto logEvent = std::make_unique<LogEvent>(
439 android::util::ISOLATED_UID_CHANGED, timestampNs);
440 logEvent->write(hostUid);
441 logEvent->write(isolatedUid);
442 logEvent->write(is_create);
443 logEvent->init();
444 return logEvent;
445}
446
Yangster-mac20877162017-12-22 17:19:39 -0800447sp<StatsLogProcessor> CreateStatsLogProcessor(const long timeBaseSec, const StatsdConfig& config,
448 const ConfigKey& key) {
449 sp<UidMap> uidMap = new UidMap();
Yangster-mac932ecec2018-02-01 10:23:52 -0800450 sp<AlarmMonitor> anomalyAlarmMonitor;
451 sp<AlarmMonitor> periodicAlarmMonitor;
Yangster-mac20877162017-12-22 17:19:39 -0800452 sp<StatsLogProcessor> processor = new StatsLogProcessor(
Yangster-mac932ecec2018-02-01 10:23:52 -0800453 uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, [](const ConfigKey&){});
Yangster-mac20877162017-12-22 17:19:39 -0800454 processor->OnConfigUpdated(key, config);
455 return processor;
456}
457
Yao Chen9c1debe2018-02-19 14:39:19 -0800458AttributionNodeInternal CreateAttribution(const int& uid, const string& tag) {
459 AttributionNodeInternal attribution;
Yangster-mac20877162017-12-22 17:19:39 -0800460 attribution.set_uid(uid);
461 attribution.set_tag(tag);
462 return attribution;
463}
464
465void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) {
466 std::sort(events->begin(), events->end(),
467 [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) {
Yangster-mac330af582018-02-08 15:24:38 -0800468 return a->GetElapsedTimestampNs() < b->GetElapsedTimestampNs();
Yangster-mac20877162017-12-22 17:19:39 -0800469 });
470}
471
Yangster-mac94e197c2018-01-02 16:03:03 -0800472int64_t StringToId(const string& str) {
473 return static_cast<int64_t>(std::hash<std::string>()(str));
474}
Yangster-macb5bc7412018-01-06 23:17:45 -0800475
476void ValidateAttributionUidDimension(const DimensionsValue& value, int atomId, int uid) {
477 EXPECT_EQ(value.field(), atomId);
Yangster-macb5bc7412018-01-06 23:17:45 -0800478 // Attribution field.
479 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
480 // Uid only.
481 EXPECT_EQ(value.value_tuple().dimensions_value(0)
482 .value_tuple().dimensions_value_size(), 1);
483 EXPECT_EQ(value.value_tuple().dimensions_value(0)
484 .value_tuple().dimensions_value(0).field(), 1);
485 EXPECT_EQ(value.value_tuple().dimensions_value(0)
486 .value_tuple().dimensions_value(0).value_int(), uid);
487}
488
489void ValidateUidDimension(const DimensionsValue& value, int atomId, int uid) {
490 EXPECT_EQ(value.field(), atomId);
491 EXPECT_EQ(value.value_tuple().dimensions_value_size(), 1);
492 // Attribution field.
493 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
494 // Uid only.
495 EXPECT_EQ(value.value_tuple().dimensions_value(0)
496 .value_tuple().dimensions_value_size(), 1);
497 EXPECT_EQ(value.value_tuple().dimensions_value(0)
498 .value_tuple().dimensions_value(0).field(), 1);
499 EXPECT_EQ(value.value_tuple().dimensions_value(0)
500 .value_tuple().dimensions_value(0).value_int(), uid);
501}
502
503void ValidateAttributionUidAndTagDimension(
504 const DimensionsValue& value, int atomId, int uid, const std::string& tag) {
505 EXPECT_EQ(value.field(), atomId);
506 EXPECT_EQ(value.value_tuple().dimensions_value_size(), 1);
507 // Attribution field.
508 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
509 // Uid only.
510 EXPECT_EQ(value.value_tuple().dimensions_value(0)
511 .value_tuple().dimensions_value_size(), 2);
512 EXPECT_EQ(value.value_tuple().dimensions_value(0)
513 .value_tuple().dimensions_value(0).field(), 1);
514 EXPECT_EQ(value.value_tuple().dimensions_value(0)
515 .value_tuple().dimensions_value(0).value_int(), uid);
516 EXPECT_EQ(value.value_tuple().dimensions_value(0)
517 .value_tuple().dimensions_value(1).field(), 2);
518 EXPECT_EQ(value.value_tuple().dimensions_value(0)
519 .value_tuple().dimensions_value(1).value_str(), tag);
520}
521
Yao Chen8a8d16c2018-02-08 14:50:40 -0800522bool EqualsTo(const DimensionsValue& s1, const DimensionsValue& s2) {
523 if (s1.field() != s2.field()) {
524 return false;
525 }
526 if (s1.value_case() != s2.value_case()) {
527 return false;
528 }
529 switch (s1.value_case()) {
530 case DimensionsValue::ValueCase::kValueStr:
531 return (s1.value_str() == s2.value_str());
532 case DimensionsValue::ValueCase::kValueInt:
533 return s1.value_int() == s2.value_int();
534 case DimensionsValue::ValueCase::kValueLong:
535 return s1.value_long() == s2.value_long();
536 case DimensionsValue::ValueCase::kValueBool:
537 return s1.value_bool() == s2.value_bool();
538 case DimensionsValue::ValueCase::kValueFloat:
539 return s1.value_float() == s2.value_float();
540 case DimensionsValue::ValueCase::kValueTuple: {
541 if (s1.value_tuple().dimensions_value_size() !=
542 s2.value_tuple().dimensions_value_size()) {
543 return false;
544 }
545 bool allMatched = true;
546 for (int i = 0; allMatched && i < s1.value_tuple().dimensions_value_size(); ++i) {
547 allMatched &= EqualsTo(s1.value_tuple().dimensions_value(i),
548 s2.value_tuple().dimensions_value(i));
549 }
550 return allMatched;
551 }
552 case DimensionsValue::ValueCase::VALUE_NOT_SET:
553 default:
554 return true;
555 }
556}
557
558bool LessThan(const DimensionsValue& s1, const DimensionsValue& s2) {
559 if (s1.field() != s2.field()) {
560 return s1.field() < s2.field();
561 }
562 if (s1.value_case() != s2.value_case()) {
563 return s1.value_case() < s2.value_case();
564 }
565 switch (s1.value_case()) {
566 case DimensionsValue::ValueCase::kValueStr:
567 return s1.value_str() < s2.value_str();
568 case DimensionsValue::ValueCase::kValueInt:
569 return s1.value_int() < s2.value_int();
570 case DimensionsValue::ValueCase::kValueLong:
571 return s1.value_long() < s2.value_long();
572 case DimensionsValue::ValueCase::kValueBool:
573 return (int)s1.value_bool() < (int)s2.value_bool();
574 case DimensionsValue::ValueCase::kValueFloat:
575 return s1.value_float() < s2.value_float();
576 case DimensionsValue::ValueCase::kValueTuple: {
577 if (s1.value_tuple().dimensions_value_size() !=
578 s2.value_tuple().dimensions_value_size()) {
579 return s1.value_tuple().dimensions_value_size() <
580 s2.value_tuple().dimensions_value_size();
581 }
582 for (int i = 0; i < s1.value_tuple().dimensions_value_size(); ++i) {
583 if (EqualsTo(s1.value_tuple().dimensions_value(i),
584 s2.value_tuple().dimensions_value(i))) {
585 continue;
586 } else {
587 return LessThan(s1.value_tuple().dimensions_value(i),
588 s2.value_tuple().dimensions_value(i));
589 }
590 }
591 return false;
592 }
593 case DimensionsValue::ValueCase::VALUE_NOT_SET:
594 default:
595 return false;
596 }
597}
598
599bool LessThan(const DimensionsPair& s1, const DimensionsPair& s2) {
600 if (LessThan(s1.dimInWhat, s2.dimInWhat)) {
601 return true;
602 } else if (LessThan(s2.dimInWhat, s1.dimInWhat)) {
603 return false;
604 }
605
606 return LessThan(s1.dimInCondition, s2.dimInCondition);
607}
608
Yangster-mac20877162017-12-22 17:19:39 -0800609} // namespace statsd
610} // namespace os
611} // namespace android