blob: 39e366fae3f8e4ba4c135e5ba24481f7608522c7 [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
15#include <gtest/gtest.h>
16#include "statsd_test_util.h"
17
18namespace android {
19namespace os {
20namespace statsd {
21
22AtomMatcher CreateWakelockStateChangedAtomMatcher(const string& name,
23 WakelockStateChanged::State state) {
24 AtomMatcher atom_matcher;
25 atom_matcher.set_name(name);
26 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
27 simple_atom_matcher->set_atom_id(android::util::WAKELOCK_STATE_CHANGED);
28 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
29 field_value_matcher->set_field(4); // State field.
30 field_value_matcher->set_eq_int(state);
31 return atom_matcher;
32}
33
34AtomMatcher CreateAcquireWakelockAtomMatcher() {
35 return CreateWakelockStateChangedAtomMatcher("AcquireWakelock", WakelockStateChanged::ACQUIRE);
36}
37
38AtomMatcher CreateReleaseWakelockAtomMatcher() {
39 return CreateWakelockStateChangedAtomMatcher("ReleaseWakelock", WakelockStateChanged::RELEASE);
40}
41
42AtomMatcher CreateScreenStateChangedAtomMatcher(
43 const string& name, ScreenStateChanged::State state) {
44 AtomMatcher atom_matcher;
45 atom_matcher.set_name(name);
46 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
47 simple_atom_matcher->set_atom_id(android::util::SCREEN_STATE_CHANGED);
48 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
49 field_value_matcher->set_field(1); // State field.
50 field_value_matcher->set_eq_int(state);
51 return atom_matcher;
52}
53
54AtomMatcher CreateScreenTurnedOnAtomMatcher() {
55 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOn", ScreenStateChanged::STATE_ON);
56}
57
58AtomMatcher CreateScreenTurnedOffAtomMatcher() {
59 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOff", ScreenStateChanged::STATE_OFF);
60}
61
62AtomMatcher CreateSyncStateChangedAtomMatcher(
63 const string& name, SyncStateChanged::State state) {
64 AtomMatcher atom_matcher;
65 atom_matcher.set_name(name);
66 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
67 simple_atom_matcher->set_atom_id(android::util::SYNC_STATE_CHANGED);
68 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
69 field_value_matcher->set_field(3); // State field.
70 field_value_matcher->set_eq_int(state);
71 return atom_matcher;
72}
73
74AtomMatcher CreateSyncStartAtomMatcher() {
75 return CreateSyncStateChangedAtomMatcher("SyncStart", SyncStateChanged::ON);
76}
77
78AtomMatcher CreateSyncEndAtomMatcher() {
79 return CreateSyncStateChangedAtomMatcher("SyncEnd", SyncStateChanged::OFF);
80}
81
82AtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
83 const string& name, ActivityForegroundStateChanged::Activity activity) {
84 AtomMatcher atom_matcher;
85 atom_matcher.set_name(name);
86 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
87 simple_atom_matcher->set_atom_id(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED);
88 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
89 field_value_matcher->set_field(4); // Activity field.
90 field_value_matcher->set_eq_int(activity);
91 return atom_matcher;
92}
93
94AtomMatcher CreateMoveToBackgroundAtomMatcher() {
95 return CreateActivityForegroundStateChangedAtomMatcher(
96 "MoveToBackground", ActivityForegroundStateChanged::MOVE_TO_BACKGROUND);
97}
98
99AtomMatcher CreateMoveToForegroundAtomMatcher() {
100 return CreateActivityForegroundStateChangedAtomMatcher(
101 "MoveToForeground", ActivityForegroundStateChanged::MOVE_TO_FOREGROUND);
102}
103
104AtomMatcher CreateProcessLifeCycleStateChangedAtomMatcher(
105 const string& name, ProcessLifeCycleStateChanged::Event event) {
106 AtomMatcher atom_matcher;
107 atom_matcher.set_name(name);
108 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
109 simple_atom_matcher->set_atom_id(android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
110 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
111 field_value_matcher->set_field(3); // Process state field.
112 field_value_matcher->set_eq_int(event);
113 return atom_matcher;
114}
115
116AtomMatcher CreateProcessCrashAtomMatcher() {
117 return CreateProcessLifeCycleStateChangedAtomMatcher(
118 "ProcessCrashed", ProcessLifeCycleStateChanged::PROCESS_CRASHED);
119}
120
121
122Predicate CreateScreenIsOnPredicate() {
123 Predicate predicate;
124 predicate.set_name("ScreenIsOn");
125 predicate.mutable_simple_predicate()->set_start("ScreenTurnedOn");
126 predicate.mutable_simple_predicate()->set_stop("ScreenTurnedOff");
127 return predicate;
128}
129
130Predicate CreateScreenIsOffPredicate() {
131 Predicate predicate;
132 predicate.set_name("ScreenIsOff");
133 predicate.mutable_simple_predicate()->set_start("ScreenTurnedOff");
134 predicate.mutable_simple_predicate()->set_stop("ScreenTurnedOn");
135 return predicate;
136}
137
138Predicate CreateHoldingWakelockPredicate() {
139 Predicate predicate;
140 predicate.set_name("HoldingWakelock");
141 predicate.mutable_simple_predicate()->set_start("AcquireWakelock");
142 predicate.mutable_simple_predicate()->set_stop("ReleaseWakelock");
143 return predicate;
144}
145
146Predicate CreateIsSyncingPredicate() {
147 Predicate predicate;
148 predicate.set_name("IsSyncing");
149 predicate.mutable_simple_predicate()->set_start("SyncStart");
150 predicate.mutable_simple_predicate()->set_stop("SyncEnd");
151 return predicate;
152}
153
154Predicate CreateIsInBackgroundPredicate() {
155 Predicate predicate;
156 predicate.set_name("IsInBackground");
157 predicate.mutable_simple_predicate()->set_start("MoveToBackground");
158 predicate.mutable_simple_predicate()->set_stop("MoveToForeground");
159 return predicate;
160}
161
162void addPredicateToPredicateCombination(const Predicate& predicate,
163 Predicate* combinationPredicate) {
164 combinationPredicate->mutable_combination()->add_predicate(predicate.name());
165}
166
167FieldMatcher CreateAttributionUidDimensions(const int atomId,
168 const std::vector<Position>& positions) {
169 FieldMatcher dimensions;
170 dimensions.set_field(atomId);
171 for (const auto position : positions) {
172 auto child = dimensions.add_child();
173 child->set_field(1);
174 child->set_position(position);
175 child->add_child()->set_field(1);
176 }
177 return dimensions;
178}
179
180FieldMatcher CreateAttributionUidAndTagDimensions(const int atomId,
181 const std::vector<Position>& positions) {
182 FieldMatcher dimensions;
183 dimensions.set_field(atomId);
184 for (const auto position : positions) {
185 auto child = dimensions.add_child();
186 child->set_field(1);
187 child->set_position(position);
188 child->add_child()->set_field(1);
189 child->add_child()->set_field(2);
190 }
191 return dimensions;
192}
193
194FieldMatcher CreateDimensions(const int atomId, const std::vector<int>& fields) {
195 FieldMatcher dimensions;
196 dimensions.set_field(atomId);
197 for (const int field : fields) {
198 dimensions.add_child()->set_field(field);
199 }
200 return dimensions;
201}
202
203std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
204 const ScreenStateChanged::State state, uint64_t timestampNs) {
205 auto event = std::make_unique<LogEvent>(android::util::SCREEN_STATE_CHANGED, timestampNs);
206 EXPECT_TRUE(event->write(state));
207 event->init();
208 return event;
209}
210
211std::unique_ptr<LogEvent> CreateWakelockStateChangedEvent(
212 const std::vector<AttributionNode>& attributions, const string& wakelockName,
213 const WakelockStateChanged::State state, uint64_t timestampNs) {
214 auto event = std::make_unique<LogEvent>(android::util::WAKELOCK_STATE_CHANGED, timestampNs);
215 event->write(attributions);
216 event->write(WakelockStateChanged::PARTIAL);
217 event->write(wakelockName);
218 event->write(state);
219 event->init();
220 return event;
221}
222
223std::unique_ptr<LogEvent> CreateAcquireWakelockEvent(
224 const std::vector<AttributionNode>& attributions,
225 const string& wakelockName, uint64_t timestampNs) {
226 return CreateWakelockStateChangedEvent(
227 attributions, wakelockName, WakelockStateChanged::ACQUIRE, timestampNs);
228}
229
230std::unique_ptr<LogEvent> CreateReleaseWakelockEvent(
231 const std::vector<AttributionNode>& attributions,
232 const string& wakelockName, uint64_t timestampNs) {
233 return CreateWakelockStateChangedEvent(
234 attributions, wakelockName, WakelockStateChanged::RELEASE, timestampNs);
235}
236
237std::unique_ptr<LogEvent> CreateActivityForegroundStateChangedEvent(
238 const int uid, const ActivityForegroundStateChanged::Activity activity, uint64_t timestampNs) {
239 auto event = std::make_unique<LogEvent>(
240 android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, timestampNs);
241 event->write(uid);
242 event->write("pkg_name");
243 event->write("class_name");
244 event->write(activity);
245 event->init();
246 return event;
247}
248
249std::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(const int uid, uint64_t timestampNs) {
250 return CreateActivityForegroundStateChangedEvent(
251 uid, ActivityForegroundStateChanged::MOVE_TO_BACKGROUND, timestampNs);
252}
253
254std::unique_ptr<LogEvent> CreateMoveToForegroundEvent(const int uid, uint64_t timestampNs) {
255 return CreateActivityForegroundStateChangedEvent(
256 uid, ActivityForegroundStateChanged::MOVE_TO_FOREGROUND, timestampNs);
257}
258
259std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(
260 const int uid, const string& name, const SyncStateChanged::State state, uint64_t timestampNs) {
261 auto event = std::make_unique<LogEvent>(android::util::SYNC_STATE_CHANGED, timestampNs);
262 event->write(uid);
263 event->write(name);
264 event->write(state);
265 event->init();
266 return event;
267}
268
269std::unique_ptr<LogEvent> CreateSyncStartEvent(
270 const int uid, const string& name, uint64_t timestampNs){
271 return CreateSyncStateChangedEvent(uid, name, SyncStateChanged::ON, timestampNs);
272}
273
274std::unique_ptr<LogEvent> CreateSyncEndEvent(
275 const int uid, const string& name, uint64_t timestampNs) {
276 return CreateSyncStateChangedEvent(uid, name, SyncStateChanged::OFF, timestampNs);
277}
278
279std::unique_ptr<LogEvent> CreateProcessLifeCycleStateChangedEvent(
280 const int uid, const ProcessLifeCycleStateChanged::Event event, uint64_t timestampNs) {
281 auto logEvent = std::make_unique<LogEvent>(
282 android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED, timestampNs);
283 logEvent->write(uid);
284 logEvent->write("");
285 logEvent->write(event);
286 logEvent->init();
287 return logEvent;
288}
289
290std::unique_ptr<LogEvent> CreateAppCrashEvent(const int uid, uint64_t timestampNs) {
291 return CreateProcessLifeCycleStateChangedEvent(
292 uid, ProcessLifeCycleStateChanged::PROCESS_CRASHED, timestampNs);
293}
294
295sp<StatsLogProcessor> CreateStatsLogProcessor(const long timeBaseSec, const StatsdConfig& config,
296 const ConfigKey& key) {
297 sp<UidMap> uidMap = new UidMap();
298 sp<AnomalyMonitor> anomalyMonitor = new AnomalyMonitor(10); // 10 seconds
299 sp<StatsLogProcessor> processor = new StatsLogProcessor(
300 uidMap, anomalyMonitor, timeBaseSec, [](const ConfigKey&){});
301 processor->OnConfigUpdated(key, config);
302 return processor;
303}
304
305AttributionNode CreateAttribution(const int& uid, const string& tag) {
306 AttributionNode attribution;
307 attribution.set_uid(uid);
308 attribution.set_tag(tag);
309 return attribution;
310}
311
312void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) {
313 std::sort(events->begin(), events->end(),
314 [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) {
315 return a->GetTimestampNs() < b->GetTimestampNs();
316 });
317}
318
319} // namespace statsd
320} // namespace os
321} // namespace android