blob: 7568348108c40e7f5813d678cf9b7731b20c5811 [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
Yangster-mac93694462018-01-22 20:49:31 -080029AtomMatcher CreateScreenBrightnessChangedAtomMatcher() {
30 AtomMatcher atom_matcher;
31 atom_matcher.set_id(StringToId("ScreenBrightnessChanged"));
32 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
33 simple_atom_matcher->set_atom_id(android::util::SCREEN_BRIGHTNESS_CHANGED);
34 return atom_matcher;
35}
36
37AtomMatcher CreateUidProcessStateChangedAtomMatcher() {
38 AtomMatcher atom_matcher;
39 atom_matcher.set_id(StringToId("UidProcessStateChanged"));
40 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
41 simple_atom_matcher->set_atom_id(android::util::UID_PROCESS_STATE_CHANGED);
42 return atom_matcher;
43}
44
Yangster-mac20877162017-12-22 17:19:39 -080045AtomMatcher CreateWakelockStateChangedAtomMatcher(const string& name,
46 WakelockStateChanged::State state) {
47 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -080048 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -080049 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
50 simple_atom_matcher->set_atom_id(android::util::WAKELOCK_STATE_CHANGED);
51 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
52 field_value_matcher->set_field(4); // State field.
53 field_value_matcher->set_eq_int(state);
54 return atom_matcher;
55}
56
57AtomMatcher CreateAcquireWakelockAtomMatcher() {
58 return CreateWakelockStateChangedAtomMatcher("AcquireWakelock", WakelockStateChanged::ACQUIRE);
59}
60
61AtomMatcher CreateReleaseWakelockAtomMatcher() {
62 return CreateWakelockStateChangedAtomMatcher("ReleaseWakelock", WakelockStateChanged::RELEASE);
63}
64
Yangster-mac93694462018-01-22 20:49:31 -080065AtomMatcher CreateBatterySaverModeStateChangedAtomMatcher(
66 const string& name, BatterySaverModeStateChanged::State state) {
67 AtomMatcher atom_matcher;
68 atom_matcher.set_id(StringToId(name));
69 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
70 simple_atom_matcher->set_atom_id(android::util::BATTERY_SAVER_MODE_STATE_CHANGED);
71 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
72 field_value_matcher->set_field(1); // State field.
73 field_value_matcher->set_eq_int(state);
74 return atom_matcher;
75}
76
77AtomMatcher CreateBatterySaverModeStartAtomMatcher() {
78 return CreateBatterySaverModeStateChangedAtomMatcher(
79 "BatterySaverModeStart", BatterySaverModeStateChanged::ON);
80}
81
82
83AtomMatcher CreateBatterySaverModeStopAtomMatcher() {
84 return CreateBatterySaverModeStateChangedAtomMatcher(
85 "BatterySaverModeStop", BatterySaverModeStateChanged::OFF);
86}
87
88
Yangster-mac20877162017-12-22 17:19:39 -080089AtomMatcher CreateScreenStateChangedAtomMatcher(
Bookatz1a1b0462018-01-12 11:47:03 -080090 const string& name, android::view::DisplayStateEnum state) {
Yangster-mac20877162017-12-22 17:19:39 -080091 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -080092 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -080093 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
94 simple_atom_matcher->set_atom_id(android::util::SCREEN_STATE_CHANGED);
95 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
96 field_value_matcher->set_field(1); // State field.
97 field_value_matcher->set_eq_int(state);
98 return atom_matcher;
99}
100
Yangster-mac93694462018-01-22 20:49:31 -0800101
Yangster-mac20877162017-12-22 17:19:39 -0800102AtomMatcher CreateScreenTurnedOnAtomMatcher() {
Bookatz1a1b0462018-01-12 11:47:03 -0800103 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOn",
104 android::view::DisplayStateEnum::DISPLAY_STATE_ON);
Yangster-mac20877162017-12-22 17:19:39 -0800105}
106
107AtomMatcher CreateScreenTurnedOffAtomMatcher() {
Bookatz1a1b0462018-01-12 11:47:03 -0800108 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOff",
109 ::android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
Yangster-mac20877162017-12-22 17:19:39 -0800110}
111
112AtomMatcher CreateSyncStateChangedAtomMatcher(
113 const string& name, SyncStateChanged::State state) {
114 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800115 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800116 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
117 simple_atom_matcher->set_atom_id(android::util::SYNC_STATE_CHANGED);
118 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
119 field_value_matcher->set_field(3); // State field.
120 field_value_matcher->set_eq_int(state);
121 return atom_matcher;
122}
123
124AtomMatcher CreateSyncStartAtomMatcher() {
125 return CreateSyncStateChangedAtomMatcher("SyncStart", SyncStateChanged::ON);
126}
127
128AtomMatcher CreateSyncEndAtomMatcher() {
129 return CreateSyncStateChangedAtomMatcher("SyncEnd", SyncStateChanged::OFF);
130}
131
132AtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
133 const string& name, ActivityForegroundStateChanged::Activity activity) {
134 AtomMatcher atom_matcher;
Yangster-mac94e197c2018-01-02 16:03:03 -0800135 atom_matcher.set_id(StringToId(name));
Yangster-mac20877162017-12-22 17:19:39 -0800136 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
137 simple_atom_matcher->set_atom_id(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED);
138 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
139 field_value_matcher->set_field(4); // Activity field.
140 field_value_matcher->set_eq_int(activity);
141 return atom_matcher;
142}
143
144AtomMatcher CreateMoveToBackgroundAtomMatcher() {
145 return CreateActivityForegroundStateChangedAtomMatcher(
146 "MoveToBackground", ActivityForegroundStateChanged::MOVE_TO_BACKGROUND);
147}
148
149AtomMatcher CreateMoveToForegroundAtomMatcher() {
150 return CreateActivityForegroundStateChangedAtomMatcher(
151 "MoveToForeground", ActivityForegroundStateChanged::MOVE_TO_FOREGROUND);
152}
153
154AtomMatcher CreateProcessLifeCycleStateChangedAtomMatcher(
155 const string& name, ProcessLifeCycleStateChanged::Event event) {
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::PROCESS_LIFE_CYCLE_STATE_CHANGED);
160 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
161 field_value_matcher->set_field(3); // Process state field.
162 field_value_matcher->set_eq_int(event);
163 return atom_matcher;
164}
165
166AtomMatcher CreateProcessCrashAtomMatcher() {
167 return CreateProcessLifeCycleStateChangedAtomMatcher(
168 "ProcessCrashed", ProcessLifeCycleStateChanged::PROCESS_CRASHED);
169}
170
Yangster-mac93694462018-01-22 20:49:31 -0800171Predicate CreateBatterySaverModePredicate() {
172 Predicate predicate;
173 predicate.set_id(StringToId("BatterySaverIsOn"));
174 predicate.mutable_simple_predicate()->set_start(StringToId("BatterySaverModeStart"));
175 predicate.mutable_simple_predicate()->set_stop(StringToId("BatterySaverModeStop"));
176 return predicate;
177}
Yangster-mac20877162017-12-22 17:19:39 -0800178
179Predicate CreateScreenIsOnPredicate() {
180 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800181 predicate.set_id(StringToId("ScreenIsOn"));
182 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOn"));
183 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOff"));
Yangster-mac20877162017-12-22 17:19:39 -0800184 return predicate;
185}
186
187Predicate CreateScreenIsOffPredicate() {
188 Predicate predicate;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800189 predicate.set_id(1111123);
Yangster-mac94e197c2018-01-02 16:03:03 -0800190 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOff"));
191 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOn"));
Yangster-mac20877162017-12-22 17:19:39 -0800192 return predicate;
193}
194
195Predicate CreateHoldingWakelockPredicate() {
196 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800197 predicate.set_id(StringToId("HoldingWakelock"));
198 predicate.mutable_simple_predicate()->set_start(StringToId("AcquireWakelock"));
199 predicate.mutable_simple_predicate()->set_stop(StringToId("ReleaseWakelock"));
Yangster-mac20877162017-12-22 17:19:39 -0800200 return predicate;
201}
202
203Predicate CreateIsSyncingPredicate() {
204 Predicate predicate;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800205 predicate.set_id(33333333333333);
Yangster-mac94e197c2018-01-02 16:03:03 -0800206 predicate.mutable_simple_predicate()->set_start(StringToId("SyncStart"));
207 predicate.mutable_simple_predicate()->set_stop(StringToId("SyncEnd"));
Yangster-mac20877162017-12-22 17:19:39 -0800208 return predicate;
209}
210
211Predicate CreateIsInBackgroundPredicate() {
212 Predicate predicate;
Yangster-mac94e197c2018-01-02 16:03:03 -0800213 predicate.set_id(StringToId("IsInBackground"));
214 predicate.mutable_simple_predicate()->set_start(StringToId("MoveToBackground"));
215 predicate.mutable_simple_predicate()->set_stop(StringToId("MoveToForeground"));
Yangster-mac20877162017-12-22 17:19:39 -0800216 return predicate;
217}
218
219void addPredicateToPredicateCombination(const Predicate& predicate,
220 Predicate* combinationPredicate) {
Yangster-mac94e197c2018-01-02 16:03:03 -0800221 combinationPredicate->mutable_combination()->add_predicate(predicate.id());
Yangster-mac20877162017-12-22 17:19:39 -0800222}
223
224FieldMatcher CreateAttributionUidDimensions(const int atomId,
225 const std::vector<Position>& positions) {
226 FieldMatcher dimensions;
227 dimensions.set_field(atomId);
228 for (const auto position : positions) {
229 auto child = dimensions.add_child();
230 child->set_field(1);
231 child->set_position(position);
232 child->add_child()->set_field(1);
233 }
234 return dimensions;
235}
236
237FieldMatcher CreateAttributionUidAndTagDimensions(const int atomId,
238 const std::vector<Position>& positions) {
239 FieldMatcher dimensions;
240 dimensions.set_field(atomId);
241 for (const auto position : positions) {
242 auto child = dimensions.add_child();
243 child->set_field(1);
244 child->set_position(position);
245 child->add_child()->set_field(1);
246 child->add_child()->set_field(2);
247 }
248 return dimensions;
249}
250
251FieldMatcher CreateDimensions(const int atomId, const std::vector<int>& fields) {
252 FieldMatcher dimensions;
253 dimensions.set_field(atomId);
254 for (const int field : fields) {
255 dimensions.add_child()->set_field(field);
256 }
257 return dimensions;
258}
259
260std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
Bookatz1a1b0462018-01-12 11:47:03 -0800261 const android::view::DisplayStateEnum state, uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800262 auto event = std::make_unique<LogEvent>(android::util::SCREEN_STATE_CHANGED, timestampNs);
263 EXPECT_TRUE(event->write(state));
264 event->init();
265 return event;
266}
267
Yangster-mac93694462018-01-22 20:49:31 -0800268std::unique_ptr<LogEvent> CreateBatterySaverOnEvent(uint64_t timestampNs) {
269 auto event = std::make_unique<LogEvent>(
270 android::util::BATTERY_SAVER_MODE_STATE_CHANGED, timestampNs);
271 EXPECT_TRUE(event->write(BatterySaverModeStateChanged::ON));
272 event->init();
273 return event;
274}
275
276std::unique_ptr<LogEvent> CreateBatterySaverOffEvent(uint64_t timestampNs) {
277 auto event = std::make_unique<LogEvent>(
278 android::util::BATTERY_SAVER_MODE_STATE_CHANGED, timestampNs);
279 EXPECT_TRUE(event->write(BatterySaverModeStateChanged::OFF));
280 event->init();
281 return event;
282}
283
284std::unique_ptr<LogEvent> CreateScreenBrightnessChangedEvent(
285 int level, uint64_t timestampNs) {
286 auto event = std::make_unique<LogEvent>(android::util::SCREEN_BRIGHTNESS_CHANGED, timestampNs);
287 EXPECT_TRUE(event->write(level));
288 event->init();
289 return event;
290
291}
292
Yangster-mac20877162017-12-22 17:19:39 -0800293std::unique_ptr<LogEvent> CreateWakelockStateChangedEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800294 const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
295 const WakelockStateChanged::State state, uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800296 auto event = std::make_unique<LogEvent>(android::util::WAKELOCK_STATE_CHANGED, timestampNs);
297 event->write(attributions);
Bookatz1a1b0462018-01-12 11:47:03 -0800298 event->write(android::os::WakeLockLevelEnum::PARTIAL_WAKE_LOCK);
Yangster-mac20877162017-12-22 17:19:39 -0800299 event->write(wakelockName);
300 event->write(state);
301 event->init();
302 return event;
303}
304
305std::unique_ptr<LogEvent> CreateAcquireWakelockEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800306 const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
307 uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800308 return CreateWakelockStateChangedEvent(
309 attributions, wakelockName, WakelockStateChanged::ACQUIRE, timestampNs);
310}
311
312std::unique_ptr<LogEvent> CreateReleaseWakelockEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800313 const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
314 uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800315 return CreateWakelockStateChangedEvent(
316 attributions, wakelockName, WakelockStateChanged::RELEASE, timestampNs);
317}
318
319std::unique_ptr<LogEvent> CreateActivityForegroundStateChangedEvent(
320 const int uid, const ActivityForegroundStateChanged::Activity activity, uint64_t timestampNs) {
321 auto event = std::make_unique<LogEvent>(
322 android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, timestampNs);
323 event->write(uid);
324 event->write("pkg_name");
325 event->write("class_name");
326 event->write(activity);
327 event->init();
328 return event;
329}
330
331std::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(const int uid, uint64_t timestampNs) {
332 return CreateActivityForegroundStateChangedEvent(
333 uid, ActivityForegroundStateChanged::MOVE_TO_BACKGROUND, timestampNs);
334}
335
336std::unique_ptr<LogEvent> CreateMoveToForegroundEvent(const int uid, uint64_t timestampNs) {
337 return CreateActivityForegroundStateChangedEvent(
338 uid, ActivityForegroundStateChanged::MOVE_TO_FOREGROUND, timestampNs);
339}
340
341std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800342 const std::vector<AttributionNodeInternal>& attributions, const string& name,
343 const SyncStateChanged::State state, uint64_t timestampNs) {
Yangster-mac20877162017-12-22 17:19:39 -0800344 auto event = std::make_unique<LogEvent>(android::util::SYNC_STATE_CHANGED, timestampNs);
Yangster-mac93694462018-01-22 20:49:31 -0800345 event->write(attributions);
Yangster-mac20877162017-12-22 17:19:39 -0800346 event->write(name);
347 event->write(state);
348 event->init();
349 return event;
350}
351
352std::unique_ptr<LogEvent> CreateSyncStartEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800353 const std::vector<AttributionNodeInternal>& attributions, const string& name,
354 uint64_t timestampNs) {
Yangster-mac93694462018-01-22 20:49:31 -0800355 return CreateSyncStateChangedEvent(attributions, name, SyncStateChanged::ON, timestampNs);
Yangster-mac20877162017-12-22 17:19:39 -0800356}
357
358std::unique_ptr<LogEvent> CreateSyncEndEvent(
Yao Chen9c1debe2018-02-19 14:39:19 -0800359 const std::vector<AttributionNodeInternal>& attributions, const string& name,
360 uint64_t timestampNs) {
Yangster-mac93694462018-01-22 20:49:31 -0800361 return CreateSyncStateChangedEvent(attributions, name, SyncStateChanged::OFF, timestampNs);
Yangster-mac20877162017-12-22 17:19:39 -0800362}
363
364std::unique_ptr<LogEvent> CreateProcessLifeCycleStateChangedEvent(
365 const int uid, const ProcessLifeCycleStateChanged::Event event, uint64_t timestampNs) {
366 auto logEvent = std::make_unique<LogEvent>(
367 android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED, timestampNs);
368 logEvent->write(uid);
369 logEvent->write("");
370 logEvent->write(event);
371 logEvent->init();
372 return logEvent;
373}
374
375std::unique_ptr<LogEvent> CreateAppCrashEvent(const int uid, uint64_t timestampNs) {
376 return CreateProcessLifeCycleStateChangedEvent(
377 uid, ProcessLifeCycleStateChanged::PROCESS_CRASHED, timestampNs);
378}
379
Yangster-macd40053e2018-01-09 16:29:22 -0800380std::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(
381 int isolatedUid, int hostUid, bool is_create, uint64_t timestampNs) {
382 auto logEvent = std::make_unique<LogEvent>(
383 android::util::ISOLATED_UID_CHANGED, timestampNs);
384 logEvent->write(hostUid);
385 logEvent->write(isolatedUid);
386 logEvent->write(is_create);
387 logEvent->init();
388 return logEvent;
389}
390
Yangster-mac20877162017-12-22 17:19:39 -0800391sp<StatsLogProcessor> CreateStatsLogProcessor(const long timeBaseSec, const StatsdConfig& config,
392 const ConfigKey& key) {
393 sp<UidMap> uidMap = new UidMap();
394 sp<AnomalyMonitor> anomalyMonitor = new AnomalyMonitor(10); // 10 seconds
395 sp<StatsLogProcessor> processor = new StatsLogProcessor(
396 uidMap, anomalyMonitor, timeBaseSec, [](const ConfigKey&){});
397 processor->OnConfigUpdated(key, config);
398 return processor;
399}
400
Yao Chen9c1debe2018-02-19 14:39:19 -0800401AttributionNodeInternal CreateAttribution(const int& uid, const string& tag) {
402 AttributionNodeInternal attribution;
Yangster-mac20877162017-12-22 17:19:39 -0800403 attribution.set_uid(uid);
404 attribution.set_tag(tag);
405 return attribution;
406}
407
408void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) {
409 std::sort(events->begin(), events->end(),
410 [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) {
Yangster-mac330af582018-02-08 15:24:38 -0800411 return a->GetElapsedTimestampNs() < b->GetElapsedTimestampNs();
Yangster-mac20877162017-12-22 17:19:39 -0800412 });
413}
414
Yangster-mac94e197c2018-01-02 16:03:03 -0800415int64_t StringToId(const string& str) {
416 return static_cast<int64_t>(std::hash<std::string>()(str));
417}
Yangster-macb5bc7412018-01-06 23:17:45 -0800418
419void ValidateAttributionUidDimension(const DimensionsValue& value, int atomId, int uid) {
420 EXPECT_EQ(value.field(), atomId);
421 EXPECT_EQ(value.value_tuple().dimensions_value_size(), 1);
422 // Attribution field.
423 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
424 // Uid only.
425 EXPECT_EQ(value.value_tuple().dimensions_value(0)
426 .value_tuple().dimensions_value_size(), 1);
427 EXPECT_EQ(value.value_tuple().dimensions_value(0)
428 .value_tuple().dimensions_value(0).field(), 1);
429 EXPECT_EQ(value.value_tuple().dimensions_value(0)
430 .value_tuple().dimensions_value(0).value_int(), uid);
431}
432
433void ValidateUidDimension(const DimensionsValue& value, int atomId, int uid) {
434 EXPECT_EQ(value.field(), atomId);
435 EXPECT_EQ(value.value_tuple().dimensions_value_size(), 1);
436 // Attribution field.
437 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
438 // Uid only.
439 EXPECT_EQ(value.value_tuple().dimensions_value(0)
440 .value_tuple().dimensions_value_size(), 1);
441 EXPECT_EQ(value.value_tuple().dimensions_value(0)
442 .value_tuple().dimensions_value(0).field(), 1);
443 EXPECT_EQ(value.value_tuple().dimensions_value(0)
444 .value_tuple().dimensions_value(0).value_int(), uid);
445}
446
447void ValidateAttributionUidAndTagDimension(
448 const DimensionsValue& value, int atomId, int uid, const std::string& tag) {
449 EXPECT_EQ(value.field(), atomId);
450 EXPECT_EQ(value.value_tuple().dimensions_value_size(), 1);
451 // Attribution field.
452 EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
453 // Uid only.
454 EXPECT_EQ(value.value_tuple().dimensions_value(0)
455 .value_tuple().dimensions_value_size(), 2);
456 EXPECT_EQ(value.value_tuple().dimensions_value(0)
457 .value_tuple().dimensions_value(0).field(), 1);
458 EXPECT_EQ(value.value_tuple().dimensions_value(0)
459 .value_tuple().dimensions_value(0).value_int(), uid);
460 EXPECT_EQ(value.value_tuple().dimensions_value(0)
461 .value_tuple().dimensions_value(1).field(), 2);
462 EXPECT_EQ(value.value_tuple().dimensions_value(0)
463 .value_tuple().dimensions_value(1).value_str(), tag);
464}
465
Yao Chen8a8d16c2018-02-08 14:50:40 -0800466bool EqualsTo(const DimensionsValue& s1, const DimensionsValue& s2) {
467 if (s1.field() != s2.field()) {
468 return false;
469 }
470 if (s1.value_case() != s2.value_case()) {
471 return false;
472 }
473 switch (s1.value_case()) {
474 case DimensionsValue::ValueCase::kValueStr:
475 return (s1.value_str() == s2.value_str());
476 case DimensionsValue::ValueCase::kValueInt:
477 return s1.value_int() == s2.value_int();
478 case DimensionsValue::ValueCase::kValueLong:
479 return s1.value_long() == s2.value_long();
480 case DimensionsValue::ValueCase::kValueBool:
481 return s1.value_bool() == s2.value_bool();
482 case DimensionsValue::ValueCase::kValueFloat:
483 return s1.value_float() == s2.value_float();
484 case DimensionsValue::ValueCase::kValueTuple: {
485 if (s1.value_tuple().dimensions_value_size() !=
486 s2.value_tuple().dimensions_value_size()) {
487 return false;
488 }
489 bool allMatched = true;
490 for (int i = 0; allMatched && i < s1.value_tuple().dimensions_value_size(); ++i) {
491 allMatched &= EqualsTo(s1.value_tuple().dimensions_value(i),
492 s2.value_tuple().dimensions_value(i));
493 }
494 return allMatched;
495 }
496 case DimensionsValue::ValueCase::VALUE_NOT_SET:
497 default:
498 return true;
499 }
500}
501
502bool LessThan(const DimensionsValue& s1, const DimensionsValue& s2) {
503 if (s1.field() != s2.field()) {
504 return s1.field() < s2.field();
505 }
506 if (s1.value_case() != s2.value_case()) {
507 return s1.value_case() < s2.value_case();
508 }
509 switch (s1.value_case()) {
510 case DimensionsValue::ValueCase::kValueStr:
511 return s1.value_str() < s2.value_str();
512 case DimensionsValue::ValueCase::kValueInt:
513 return s1.value_int() < s2.value_int();
514 case DimensionsValue::ValueCase::kValueLong:
515 return s1.value_long() < s2.value_long();
516 case DimensionsValue::ValueCase::kValueBool:
517 return (int)s1.value_bool() < (int)s2.value_bool();
518 case DimensionsValue::ValueCase::kValueFloat:
519 return s1.value_float() < s2.value_float();
520 case DimensionsValue::ValueCase::kValueTuple: {
521 if (s1.value_tuple().dimensions_value_size() !=
522 s2.value_tuple().dimensions_value_size()) {
523 return s1.value_tuple().dimensions_value_size() <
524 s2.value_tuple().dimensions_value_size();
525 }
526 for (int i = 0; i < s1.value_tuple().dimensions_value_size(); ++i) {
527 if (EqualsTo(s1.value_tuple().dimensions_value(i),
528 s2.value_tuple().dimensions_value(i))) {
529 continue;
530 } else {
531 return LessThan(s1.value_tuple().dimensions_value(i),
532 s2.value_tuple().dimensions_value(i));
533 }
534 }
535 return false;
536 }
537 case DimensionsValue::ValueCase::VALUE_NOT_SET:
538 default:
539 return false;
540 }
541}
542
543bool LessThan(const DimensionsPair& s1, const DimensionsPair& s2) {
544 if (LessThan(s1.dimInWhat, s2.dimInWhat)) {
545 return true;
546 } else if (LessThan(s2.dimInWhat, s1.dimInWhat)) {
547 return false;
548 }
549
550 return LessThan(s1.dimInCondition, s2.dimInCondition);
551}
552
Yangster-mac20877162017-12-22 17:19:39 -0800553} // namespace statsd
554} // namespace os
555} // namespace android