blob: fd28460e8e0151ca1b20b3e30434963d32c3af9e [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 <log/log_event_list.h>
17#include "src/logd/LogEvent.h"
18
19#ifdef __ANDROID__
20
21namespace android {
22namespace os {
23namespace statsd {
24
25TEST(LogEventTest, testEmptyEvent) {
26 const int32_t TAG_ID = 123;
27 LogEvent event(TAG_ID, 0);
28 event.init();
29
30 DimensionsValue dimensionsValue;
31 EXPECT_FALSE(event.GetSimpleAtomDimensionsValueProto(234, &dimensionsValue));
32 FieldMatcher dimensions;
33 dimensions.set_field(event.GetTagId());
34 EXPECT_FALSE(event.GetAtomDimensionsValueProto(dimensions, &dimensionsValue));
35
36 dimensions.add_child()->set_field(3);
37 dimensions.mutable_child(0)->set_position(Position::FIRST);
38 EXPECT_FALSE(event.GetAtomDimensionsValueProto(dimensions, &dimensionsValue));
39
40 dimensions.mutable_child(0)->set_position(Position::ANY);
41 EXPECT_FALSE(event.GetAtomDimensionsValueProto(dimensions, &dimensionsValue));
42
43 dimensions.mutable_child(0)->set_position(Position::LAST);
44 EXPECT_FALSE(event.GetAtomDimensionsValueProto(dimensions, &dimensionsValue));
45}
46
47TEST(LogEventTest, testRepeatedAttributionNode) {
48 const int32_t TAG_ID = 123;
49 LogEvent event(TAG_ID, 0);
50 AttributionNode attribution_node1;
51 attribution_node1.set_uid(1111);
52 attribution_node1.set_tag("locationService");
53
54 AttributionNode attribution_node2;
55 attribution_node2.set_uid(2222);
56 attribution_node2.set_tag("locationService2");
57
58 AttributionNode attribution_node3;
59 attribution_node3.set_uid(3333);
60 attribution_node3.set_tag("locationService3");
61 std::vector<AttributionNode> attribution_nodes =
62 {attribution_node1, attribution_node2, attribution_node3};
63
64 // 1nd field: int32.
65 EXPECT_TRUE(event.write(int32_t(11)));
66 // 2rd field: float.
67 EXPECT_TRUE(event.write(3.45f));
68 // Here it assume that the atom proto contains a repeated AttributionNode field.
69 // 3rd field: attribution node. This is repeated field.
70 EXPECT_TRUE(event.write(attribution_nodes));
71 // 4th field: bool.
72 EXPECT_TRUE(event.write(true));
73 // 5th field: long.
74 EXPECT_TRUE(event.write(uint64_t(1234)));
75
76 event.init();
77
78 DimensionsValue dimensionsValue;
79 // Query single primitive fields.
80 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(1, &dimensionsValue));
81 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
82 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
83 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 1);
84 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_int(), 11);
85
86 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(2, &dimensionsValue));
87 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
88 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
89 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 2);
90 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_float(), 3.45f);
91
92 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(4, &dimensionsValue));
93 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
94 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
95 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 4);
96 // The bool value is stored in value_int field as logD does not support bool.
97 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_int(), true);
98
99 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(5, &dimensionsValue));
100 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
101 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
102 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 5);
103 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_long(), long(1234));
104
105 // First attribution.
106 FieldMatcher first_uid_dimensions;
107 first_uid_dimensions.set_field(event.GetTagId());
108 first_uid_dimensions.add_child()->set_field(3);
109 first_uid_dimensions.mutable_child(0)->set_position(Position::FIRST);
110 first_uid_dimensions.mutable_child(0)->add_child()->set_field(1);
111 EXPECT_TRUE(event.GetAtomDimensionsValueProto(first_uid_dimensions, &dimensionsValue));
112 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
113 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
114 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 3);
115 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
116 .dimensions_value_size(), 1);
117 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
118 .dimensions_value(0).field(), 1);
119 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
120 .dimensions_value(0).value_int(), 1111);
121
122 FieldMatcher first_tag_dimensions = first_uid_dimensions;
123 first_tag_dimensions.mutable_child(0)->mutable_child(0)->set_field(2);
124 EXPECT_TRUE(event.GetAtomDimensionsValueProto(first_tag_dimensions, &dimensionsValue));
125 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
126 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
127 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 3);
128 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
129 .dimensions_value_size(), 1);
130 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
131 .dimensions_value(0).field(), 2);
132 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
133 .dimensions_value(0).value_str(), "locationService");
134
135 FieldMatcher first_attribution_dimensions = first_uid_dimensions;
136 first_attribution_dimensions.mutable_child(0)->add_child()->set_field(2);
137 EXPECT_TRUE(event.GetAtomDimensionsValueProto(first_attribution_dimensions, &dimensionsValue));
138 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
139 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
140 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 3);
141 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
142 .dimensions_value_size(), 2);
143 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
144 .dimensions_value(0).field(), 1);
145 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
146 .dimensions_value(0).value_int(), 1111);
147 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
148 .dimensions_value(1).field(), 2);
149 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
150 .dimensions_value(1).value_str(), "locationService");
151
152 FieldMatcher last_attribution_dimensions = first_attribution_dimensions;
153 last_attribution_dimensions.mutable_child(0)->set_position(Position::LAST);
154 EXPECT_TRUE(event.GetAtomDimensionsValueProto(last_attribution_dimensions, &dimensionsValue));
155 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
156 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
157 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 3);
158 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
159 .dimensions_value_size(), 2);
160 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
161 .dimensions_value(0).field(), 1);
162 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
163 .dimensions_value(0).value_int(), 3333);
164 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
165 .dimensions_value(1).field(), 2);
166 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
167 .dimensions_value(1).value_str(), "locationService3");
168
169 FieldMatcher any_attribution_dimensions = first_attribution_dimensions;
170 any_attribution_dimensions.mutable_child(0)->set_position(Position::ANY);
171 std::vector<DimensionsValue> dimensionsValues;
172 event.GetAtomDimensionsValueProtos(any_attribution_dimensions, &dimensionsValues);
173 EXPECT_EQ(dimensionsValues.size(), 3u);
174 EXPECT_EQ(dimensionsValues[0].field(), event.GetTagId());
175 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value_size(), 1);
176 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).field(), 3);
177 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).value_tuple()
178 .dimensions_value_size(), 2);
179 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).value_tuple()
180 .dimensions_value(0).field(), 1);
181 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).value_tuple()
182 .dimensions_value(0).value_int(), 1111);
183 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).value_tuple()
184 .dimensions_value(1).field(), 2);
185 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).value_tuple()
186 .dimensions_value(1).value_str(), "locationService");
187 EXPECT_EQ(dimensionsValues[1].field(), event.GetTagId());
188 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value_size(), 1);
189 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).field(), 3);
190 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).value_tuple()
191 .dimensions_value_size(), 2);
192 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).value_tuple()
193 .dimensions_value(0).field(), 1);
194 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).value_tuple()
195 .dimensions_value(0).value_int(), 2222);
196 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).value_tuple()
197 .dimensions_value(1).field(), 2);
198 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).value_tuple()
199 .dimensions_value(1).value_str(), "locationService2");
200 EXPECT_EQ(dimensionsValues[2].field(), event.GetTagId());
201 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value_size(), 1);
202 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).field(), 3);
203 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).value_tuple()
204 .dimensions_value_size(), 2);
205 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).value_tuple()
206 .dimensions_value(0).field(), 1);
207 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).value_tuple()
208 .dimensions_value(0).value_int(), 3333);
209 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).value_tuple()
210 .dimensions_value(1).field(), 2);
211 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).value_tuple()
212 .dimensions_value(1).value_str(), "locationService3");
213
214 FieldMatcher mixed_dimensions = any_attribution_dimensions;
215 mixed_dimensions.add_child()->set_field(1000);
216 mixed_dimensions.add_child()->set_field(6); // missing field.
217 mixed_dimensions.add_child()->set_field(3); // position not set.
218 mixed_dimensions.add_child()->set_field(5);
219 mixed_dimensions.add_child()->set_field(1);
220 dimensionsValues.clear();
221 event.GetAtomDimensionsValueProtos(mixed_dimensions, &dimensionsValues);
222 EXPECT_EQ(dimensionsValues.size(), 3u);
223 EXPECT_EQ(dimensionsValues[0].field(), event.GetTagId());
224 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value_size(), 3);
225 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).field(), 3);
226 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).value_tuple().dimensions_value_size(), 2);
227 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).field(), 1);
228 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).value_int(),
229 1111);
230 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).value_tuple().dimensions_value(1).field(), 2);
231 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(0).value_tuple().dimensions_value(1).value_str(),
232 "locationService");
233 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(1).field(), 5);
234 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(1).value_long(), long(1234));
235 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(2).field(), 1);
236 EXPECT_EQ(dimensionsValues[0].value_tuple().dimensions_value(2).value_int(), 11);
237
238 EXPECT_EQ(dimensionsValues[1].field(), event.GetTagId());
239 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value_size(), 3);
240 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).field(), 3);
241 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).value_tuple().dimensions_value_size(), 2);
242 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).field(), 1);
243 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).value_int(),
244 2222);
245 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).value_tuple().dimensions_value(1).field(), 2);
246 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(0).value_tuple().dimensions_value(1).value_str(),
247 "locationService2");
248 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(1).field(), 5);
249 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(1).value_long(), long(1234));
250 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(2).field(), 1);
251 EXPECT_EQ(dimensionsValues[1].value_tuple().dimensions_value(2).value_int(), 11);
252
253 EXPECT_EQ(dimensionsValues[2].field(), event.GetTagId());
254 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value_size(), 3);
255 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).field(), 3);
256 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).value_tuple().dimensions_value_size(), 2);
257 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).field(), 1);
258 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).value_tuple().dimensions_value(0).value_int(),
259 3333);
260 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).value_tuple().dimensions_value(1).field(), 2);
261 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(0).value_tuple().dimensions_value(1).value_str(),
262 "locationService3");
263 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(1).field(), 5);
264 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(1).value_long(), long(1234));
265 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(2).field(), 1);
266 EXPECT_EQ(dimensionsValues[2].value_tuple().dimensions_value(2).value_int(), 11);
267
268 FieldMatcher wrong_dimensions = mixed_dimensions;
269 // Wrong tagId.
270 wrong_dimensions.set_field(event.GetTagId() + 100);
271 dimensionsValues.clear();
272 event.GetAtomDimensionsValueProtos(wrong_dimensions, &dimensionsValues);
273 EXPECT_TRUE(dimensionsValues.empty());
274}
275
276TEST(LogEventTest, testMessageField) {
277 const int32_t TAG_ID = 123;
278 LogEvent event(TAG_ID, 0);
279 AttributionNode attribution_node1;
280 attribution_node1.set_uid(1111);
281 attribution_node1.set_tag("locationService");
282
283 AttributionNode attribution_node2;
284 attribution_node2.set_uid(2222);
285 attribution_node2.set_tag("locationService2");
286
287 // 1nd field: int32.
288 EXPECT_TRUE(event.write(int32_t(11)));
289 // 2rd field: float.
290 EXPECT_TRUE(event.write(3.45f));
291 // Here it assume that the atom proto contains two optional AttributionNode fields.
292 // 3rd field: attribution node. This is not repeated field.
293 EXPECT_TRUE(event.write(attribution_node1));
294 // 4th field: another attribution field. This is not repeated field.
295 EXPECT_TRUE(event.write(attribution_node2));
296 // 5th field: bool.
297 EXPECT_TRUE(event.write(true));
298 // 6th field: long.
299 EXPECT_TRUE(event.write(uint64_t(1234)));
300
301 event.init();
302
303 FieldMatcher uid_dimensions1;
304 uid_dimensions1.set_field(event.GetTagId());
305 uid_dimensions1.add_child()->set_field(3);
306 uid_dimensions1.mutable_child(0)->add_child()->set_field(1);
307
308 FieldMatcher tag_dimensions1;
309 tag_dimensions1.set_field(event.GetTagId());
310 tag_dimensions1.add_child()->set_field(3);
311 tag_dimensions1.mutable_child(0)->add_child()->set_field(2);
312
313 FieldMatcher attribution_dimensions1;
314 attribution_dimensions1.set_field(event.GetTagId());
315 attribution_dimensions1.add_child()->set_field(3);
316 attribution_dimensions1.mutable_child(0)->add_child()->set_field(1);
317 attribution_dimensions1.mutable_child(0)->add_child()->set_field(2);
318
319 FieldMatcher uid_dimensions2 = uid_dimensions1;
320 uid_dimensions2.mutable_child(0)->set_field(4);
321
322 FieldMatcher tag_dimensions2 = tag_dimensions1;
323 tag_dimensions2.mutable_child(0)->set_field(4);
324
325 FieldMatcher attribution_dimensions2 = attribution_dimensions1;
326 attribution_dimensions2.mutable_child(0)->set_field(4);
327
328 FieldMatcher mixed_dimensions = attribution_dimensions1;
329 mixed_dimensions.add_child()->set_field(4);
330 mixed_dimensions.mutable_child(1)->add_child()->set_field(1);
331 mixed_dimensions.add_child()->set_field(1000);
332 mixed_dimensions.add_child()->set_field(5);
333 mixed_dimensions.add_child()->set_field(1);
334
335 DimensionsValue dimensionsValue;
336
337 // Query single primitive fields.
338 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(1, &dimensionsValue));
339 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
340 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
341 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 1);
342 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_int(), 11);
343
344 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(2, &dimensionsValue));
345 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
346 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
347 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 2);
348 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_float(), 3.45f);
349
350 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(5, &dimensionsValue));
351 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
352 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
353 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 5);
354 // The bool value is stored in value_int field as logD does not support bool.
355 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_int(), true);
356
357 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(6, &dimensionsValue));
358 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
359 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
360 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 6);
361 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_long(), long(1234));
362
363 // Query atom field 3: attribution node uid field only.
364 EXPECT_TRUE(event.GetAtomDimensionsValueProto(uid_dimensions1, &dimensionsValue));
365 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
366 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
367 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 3);
368 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
369 .dimensions_value_size(), 1);
370 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
371 .dimensions_value(0).field(), 1);
372 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
373 .dimensions_value(0).value_int(), 1111);
374
375 // Query atom field 3: attribution node tag field only.
376 EXPECT_TRUE(event.GetAtomDimensionsValueProto(tag_dimensions1, &dimensionsValue));
377 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
378 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
379 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 3);
380 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
381 .dimensions_value_size(), 1);
382 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
383 .dimensions_value(0).field(), 2);
384 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
385 .dimensions_value(0).value_str(), "locationService");
386
387 // Query atom field 3: attribution node uid + tag fields.
388 EXPECT_TRUE(event.GetAtomDimensionsValueProto(attribution_dimensions1, &dimensionsValue));
389 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
390 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
391 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 3);
392 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
393 .dimensions_value_size(), 2);
394 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
395 .dimensions_value(0).field(), 1);
396 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
397 .dimensions_value(0).value_int(), 1111);
398 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
399 .dimensions_value(1).field(), 2);
400 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
401 .dimensions_value(1).value_str(), "locationService");
402
403 // Query atom field 4: attribution node uid field only.
404 EXPECT_TRUE(event.GetAtomDimensionsValueProto(uid_dimensions2, &dimensionsValue));
405 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
406 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
407 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 4);
408 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
409 .dimensions_value_size(), 1);
410 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
411 .dimensions_value(0).field(), 1);
412 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
413 .dimensions_value(0).value_int(), 2222);
414
415 // Query atom field 4: attribution node tag field only.
416 EXPECT_TRUE(event.GetAtomDimensionsValueProto(tag_dimensions2, &dimensionsValue));
417 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
418 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
419 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 4);
420 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
421 .dimensions_value_size(), 1);
422 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
423 .dimensions_value(0).field(), 2);
424 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
425 .dimensions_value(0).value_str(), "locationService2");
426
427 // Query atom field 4: attribution node uid + tag fields.
428 EXPECT_TRUE(event.GetAtomDimensionsValueProto(attribution_dimensions2, &dimensionsValue));
429 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
430 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
431 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 4);
432 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
433 .dimensions_value_size(), 2);
434 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
435 .dimensions_value(0).field(), 1);
436 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
437 .dimensions_value(0).value_int(), 2222);
438 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
439 .dimensions_value(1).field(), 2);
440 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
441 .dimensions_value(1).value_str(), "locationService2");
442
443 // Query multiple fields:
444 // 1/ Field 3: attribution uid + tag.
445 // 2/ Field 4: attribution uid only.
446 // 3/ Field not exist.
447 // 4/ Primitive fields #5
448 // 5/ Primitive fields #1
449 EXPECT_TRUE(event.GetAtomDimensionsValueProto(mixed_dimensions, &dimensionsValue));
450 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
451 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 4);
452 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 3);
453 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
454 .dimensions_value_size(), 2);
455 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
456 .dimensions_value(0).field(), 1);
457 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
458 .dimensions_value(0).value_int(), 1111);
459 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
460 .dimensions_value(1).field(), 2);
461 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_tuple()
462 .dimensions_value(1).value_str(), "locationService");
463 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(1).field(), 4);
464 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(1).value_tuple()
465 .dimensions_value_size(), 1);
466 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(1).value_tuple()
467 .dimensions_value(0).field(), 1);
468 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(1).value_tuple()
469 .dimensions_value(0).value_int(), 2222);
470 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(2).field(), 5);
471 // The bool value is stored in value_int field as logD does not support bool.
472 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(2).value_int(), true);
473 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(3).field(), 1);
474 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(3).value_int(), 11);
475}
476
477TEST(LogEventTest, testAllPrimitiveFields) {
478 const int32_t TAG_ID = 123;
479 LogEvent event(TAG_ID, 0);
480
481 // 1nd field: int32.
482 EXPECT_TRUE(event.write(int32_t(11)));
483 // 2rd field: float.
484 EXPECT_TRUE(event.write(3.45f));
485 // 3th field: string.
486 EXPECT_TRUE(event.write("test"));
487 // 4th field: bool.
488 EXPECT_TRUE(event.write(true));
489 // 5th field: bool.
490 EXPECT_TRUE(event.write(false));
491 // 6th field: long.
492 EXPECT_TRUE(event.write(uint64_t(1234)));
493
494 event.init();
495
496 DimensionsValue dimensionsValue;
497 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(1, &dimensionsValue));
498 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
499 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
500 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 1);
501 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_int(), 11);
502
503 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(2, &dimensionsValue));
504 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
505 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
506 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 2);
507 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_float(), 3.45f);
508
509 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(3, &dimensionsValue));
510 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
511 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
512 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 3);
513 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_str(), "test");
514
515 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(4, &dimensionsValue));
516 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
517 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
518 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 4);
519 // The bool value is stored in value_int field as logD does not support bool.
520 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_int(), true);
521
522 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(5, &dimensionsValue));
523 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
524 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
525 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 5);
526 // The bool value is stored in value_int field as logD does not support bool.
527 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_int(), false);
528
529 EXPECT_TRUE(event.GetSimpleAtomDimensionsValueProto(6, &dimensionsValue));
530 EXPECT_EQ(dimensionsValue.field(), event.GetTagId());
531 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value_size(), 1);
532 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).field(), 6);
533 EXPECT_EQ(dimensionsValue.value_tuple().dimensions_value(0).value_long(), long(1234));
534
535 // Field not exist.
536 EXPECT_FALSE(event.GetSimpleAtomDimensionsValueProto(7, &dimensionsValue));
537}
538
539TEST(LogEventTest, testWriteAtomProtoToStream) {
540 AttributionNode attribution_node1;
541 attribution_node1.set_uid(1111);
542 attribution_node1.set_tag("locationService");
543
544 AttributionNode attribution_node2;
545 attribution_node2.set_uid(2222);
546 attribution_node2.set_tag("locationService2");
547
548 AttributionNode attribution_node3;
549 attribution_node3.set_uid(3333);
550 attribution_node3.set_tag("locationService3");
551 std::vector<AttributionNode> attribution_nodes =
552 {attribution_node1, attribution_node2, attribution_node3};
553
554 LogEvent event(1, 0);
555 EXPECT_TRUE(event.write("222"));
556 EXPECT_TRUE(event.write(attribution_nodes));
557 EXPECT_TRUE(event.write(345));
558 EXPECT_TRUE(event.write(attribution_node3));
559 EXPECT_TRUE(event.write("hello"));
560 event.init();
561
562 util::ProtoOutputStream protoOutput;
563 // For now only see whether it will crash.
564 // TODO(yanglu): test parsing from stream.
565 event.ToProto(protoOutput);
566}
567
568} // namespace statsd
569} // namespace os
570} // namespace android
571#else
572GTEST_LOG_(INFO) << "This test does nothing.\n";
573#endif