blob: f624e12c9623f98e1921b85552634d8d167b2019 [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
Yao Chen8c433862018-10-24 14:09:20 -070015#include "src/logd/LogEvent.h"
Yangster-mac20877162017-12-22 17:19:39 -080016#include <gtest/gtest.h>
17#include <log/log_event_list.h>
Yao Chen8c433862018-10-24 14:09:20 -070018#include "frameworks/base/cmds/statsd/src/atoms.pb.h"
19#include "frameworks/base/core/proto/android/stats/launcher/launcher.pb.h"
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -080020#include <stats_event.h>
21
Yangster-mac20877162017-12-22 17:19:39 -080022
23#ifdef __ANDROID__
24
25namespace android {
26namespace os {
27namespace statsd {
28
Yao Chen8c433862018-10-24 14:09:20 -070029using std::string;
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -080030using std::vector;
Yao Chen8c433862018-10-24 14:09:20 -070031using util::ProtoOutputStream;
Joe Onorato99598ee2019-02-11 15:55:13 +000032using util::ProtoReader;
Yao Chen8c433862018-10-24 14:09:20 -070033
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -080034
35#ifdef NEW_ENCODING_SCHEME
36
37Field getField(int32_t tag, const vector<int32_t>& pos, int32_t depth, const vector<bool>& last) {
38 Field f(tag, (int32_t*)pos.data(), depth);
39
40 // For loop starts at 1 because the last field at depth 0 is not decorated.
41 for (int i = 1; i < depth; i++) {
42 if (last[i]) f.decorateLastPos(i);
43 }
44
45 return f;
46}
47
48TEST(LogEventTest, TestPrimitiveParsing) {
Tej Singhb26d0442020-01-31 16:18:21 -080049 AStatsEvent* event = AStatsEvent_obtain();
50 AStatsEvent_setAtomId(event, 100);
51 AStatsEvent_writeInt32(event, 10);
52 AStatsEvent_writeInt64(event, 0x123456789);
53 AStatsEvent_writeFloat(event, 2.0);
54 AStatsEvent_writeBool(event, true);
55 AStatsEvent_build(event);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -080056
57 size_t size;
Tej Singhb26d0442020-01-31 16:18:21 -080058 uint8_t* buf = AStatsEvent_getBuffer(event, &size);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -080059
Ruchir Rastogiab71ef02020-01-30 01:24:50 -080060 LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -080061 EXPECT_TRUE(logEvent.isValid());
62 EXPECT_EQ(100, logEvent.GetTagId());
Ruchir Rastogiab71ef02020-01-30 01:24:50 -080063 EXPECT_EQ(1000, logEvent.GetUid());
64 EXPECT_EQ(1001, logEvent.GetPid());
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -080065
66 const vector<FieldValue>& values = logEvent.getValues();
67 EXPECT_EQ(4, values.size());
68
69 const FieldValue& int32Item = values[0];
70 Field expectedField = getField(100, {1, 1, 1}, 0, {false, false, false});
71 EXPECT_EQ(expectedField, int32Item.mField);
72 EXPECT_EQ(Type::INT, int32Item.mValue.getType());
73 EXPECT_EQ(10, int32Item.mValue.int_value);
74
75 const FieldValue& int64Item = values[1];
76 expectedField = getField(100, {2, 1, 1}, 0, {false, false, false});
77 EXPECT_EQ(expectedField, int64Item.mField);
78 EXPECT_EQ(Type::LONG, int64Item.mValue.getType());
79 EXPECT_EQ(0x123456789, int64Item.mValue.long_value);
80
81 const FieldValue& floatItem = values[2];
82 expectedField = getField(100, {3, 1, 1}, 0, {false, false, false});
83 EXPECT_EQ(expectedField, floatItem.mField);
84 EXPECT_EQ(Type::FLOAT, floatItem.mValue.getType());
85 EXPECT_EQ(2.0, floatItem.mValue.float_value);
86
87 const FieldValue& boolItem = values[3];
88 expectedField = getField(100, {4, 1, 1}, 0, {true, false, false});
89 EXPECT_EQ(expectedField, boolItem.mField);
90 EXPECT_EQ(Type::INT, boolItem.mValue.getType()); // FieldValue does not support boolean type
91 EXPECT_EQ(1, boolItem.mValue.int_value);
92
Tej Singhb26d0442020-01-31 16:18:21 -080093 AStatsEvent_release(event);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -080094}
95
96
97TEST(LogEventTest, TestStringAndByteArrayParsing) {
Tej Singhb26d0442020-01-31 16:18:21 -080098 AStatsEvent* event = AStatsEvent_obtain();
99 AStatsEvent_setAtomId(event, 100);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800100 string str = "test";
Tej Singhb26d0442020-01-31 16:18:21 -0800101 AStatsEvent_writeString(event, str.c_str());
102 AStatsEvent_writeByteArray(event, (uint8_t*)str.c_str(), str.length());
103 AStatsEvent_build(event);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800104
105 size_t size;
Tej Singhb26d0442020-01-31 16:18:21 -0800106 uint8_t* buf = AStatsEvent_getBuffer(event, &size);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800107
Ruchir Rastogiab71ef02020-01-30 01:24:50 -0800108 LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800109 EXPECT_TRUE(logEvent.isValid());
110 EXPECT_EQ(100, logEvent.GetTagId());
Ruchir Rastogiab71ef02020-01-30 01:24:50 -0800111 EXPECT_EQ(1000, logEvent.GetUid());
112 EXPECT_EQ(1001, logEvent.GetPid());
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800113
114 const vector<FieldValue>& values = logEvent.getValues();
115 EXPECT_EQ(2, values.size());
116
117 const FieldValue& stringItem = values[0];
118 Field expectedField = getField(100, {1, 1, 1}, 0, {false, false, false});
119 EXPECT_EQ(expectedField, stringItem.mField);
120 EXPECT_EQ(Type::STRING, stringItem.mValue.getType());
121 EXPECT_EQ(str, stringItem.mValue.str_value);
122
123 const FieldValue& storageItem = values[1];
124 expectedField = getField(100, {2, 1, 1}, 0, {true, false, false});
125 EXPECT_EQ(expectedField, storageItem.mField);
126 EXPECT_EQ(Type::STORAGE, storageItem.mValue.getType());
127 vector<uint8_t> expectedValue = {'t', 'e', 's', 't'};
128 EXPECT_EQ(expectedValue, storageItem.mValue.storage_value);
129
Tej Singhb26d0442020-01-31 16:18:21 -0800130 AStatsEvent_release(event);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800131}
132
133TEST(LogEventTest, TestEmptyString) {
Tej Singhb26d0442020-01-31 16:18:21 -0800134 AStatsEvent* event = AStatsEvent_obtain();
135 AStatsEvent_setAtomId(event, 100);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800136 string empty = "";
Tej Singhb26d0442020-01-31 16:18:21 -0800137 AStatsEvent_writeString(event, empty.c_str());
138 AStatsEvent_build(event);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800139
140 size_t size;
Tej Singhb26d0442020-01-31 16:18:21 -0800141 uint8_t* buf = AStatsEvent_getBuffer(event, &size);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800142
Ruchir Rastogiab71ef02020-01-30 01:24:50 -0800143 LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800144 EXPECT_TRUE(logEvent.isValid());
145 EXPECT_EQ(100, logEvent.GetTagId());
Ruchir Rastogiab71ef02020-01-30 01:24:50 -0800146 EXPECT_EQ(1000, logEvent.GetUid());
147 EXPECT_EQ(1001, logEvent.GetPid());
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800148
149 const vector<FieldValue>& values = logEvent.getValues();
150 EXPECT_EQ(1, values.size());
151
152 const FieldValue& item = values[0];
153 Field expectedField = getField(100, {1, 1, 1}, 0, {true, false, false});
154 EXPECT_EQ(expectedField, item.mField);
155 EXPECT_EQ(Type::STRING, item.mValue.getType());
156 EXPECT_EQ(empty, item.mValue.str_value);
157
Tej Singhb26d0442020-01-31 16:18:21 -0800158 AStatsEvent_release(event);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800159}
160
161TEST(LogEventTest, TestByteArrayWithNullCharacter) {
Tej Singhb26d0442020-01-31 16:18:21 -0800162 AStatsEvent* event = AStatsEvent_obtain();
163 AStatsEvent_setAtomId(event, 100);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800164 uint8_t message[] = {'\t', 'e', '\0', 's', 't'};
Tej Singhb26d0442020-01-31 16:18:21 -0800165 AStatsEvent_writeByteArray(event, message, 5);
166 AStatsEvent_build(event);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800167
168 size_t size;
Tej Singhb26d0442020-01-31 16:18:21 -0800169 uint8_t* buf = AStatsEvent_getBuffer(event, &size);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800170
Ruchir Rastogiab71ef02020-01-30 01:24:50 -0800171 LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800172 EXPECT_TRUE(logEvent.isValid());
173 EXPECT_EQ(100, logEvent.GetTagId());
Ruchir Rastogiab71ef02020-01-30 01:24:50 -0800174 EXPECT_EQ(1000, logEvent.GetUid());
175 EXPECT_EQ(1001, logEvent.GetPid());
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800176
177 const vector<FieldValue>& values = logEvent.getValues();
178 EXPECT_EQ(1, values.size());
179
180 const FieldValue& item = values[0];
181 Field expectedField = getField(100, {1, 1, 1}, 0, {true, false, false});
182 EXPECT_EQ(expectedField, item.mField);
183 EXPECT_EQ(Type::STORAGE, item.mValue.getType());
184 vector<uint8_t> expectedValue(message, message + 5);
185 EXPECT_EQ(expectedValue, item.mValue.storage_value);
186
Tej Singhb26d0442020-01-31 16:18:21 -0800187 AStatsEvent_release(event);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800188}
189
190TEST(LogEventTest, TestAttributionChain) {
Tej Singhb26d0442020-01-31 16:18:21 -0800191 AStatsEvent* event = AStatsEvent_obtain();
192 AStatsEvent_setAtomId(event, 100);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800193
194 string tag1 = "tag1";
195 string tag2 = "tag2";
196
197 uint32_t uids[] = {1001, 1002};
198 const char* tags[] = {tag1.c_str(), tag2.c_str()};
199
Tej Singhb26d0442020-01-31 16:18:21 -0800200 AStatsEvent_writeAttributionChain(event, uids, tags, 2);
201 AStatsEvent_build(event);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800202
203 size_t size;
Tej Singhb26d0442020-01-31 16:18:21 -0800204 uint8_t* buf = AStatsEvent_getBuffer(event, &size);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800205
Ruchir Rastogiab71ef02020-01-30 01:24:50 -0800206 LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800207 EXPECT_TRUE(logEvent.isValid());
208 EXPECT_EQ(100, logEvent.GetTagId());
Ruchir Rastogiab71ef02020-01-30 01:24:50 -0800209 EXPECT_EQ(1000, logEvent.GetUid());
210 EXPECT_EQ(1001, logEvent.GetPid());
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800211
212 const vector<FieldValue>& values = logEvent.getValues();
213 EXPECT_EQ(4, values.size()); // 2 per attribution node
214
215 // Check first attribution node
216 const FieldValue& uid1Item = values[0];
217 Field expectedField = getField(100, {1, 1, 1}, 2, {true, false, false});
218 EXPECT_EQ(expectedField, uid1Item.mField);
219 EXPECT_EQ(Type::INT, uid1Item.mValue.getType());
220 EXPECT_EQ(1001, uid1Item.mValue.int_value);
221
222 const FieldValue& tag1Item = values[1];
223 expectedField = getField(100, {1, 1, 2}, 2, {true, false, true});
224 EXPECT_EQ(expectedField, tag1Item.mField);
225 EXPECT_EQ(Type::STRING, tag1Item.mValue.getType());
226 EXPECT_EQ(tag1, tag1Item.mValue.str_value);
227
228 // Check second attribution nodes
229 const FieldValue& uid2Item = values[2];
230 expectedField = getField(100, {1, 2, 1}, 2, {true, true, false});
231 EXPECT_EQ(expectedField, uid2Item.mField);
232 EXPECT_EQ(Type::INT, uid2Item.mValue.getType());
233 EXPECT_EQ(1002, uid2Item.mValue.int_value);
234
235 const FieldValue& tag2Item = values[3];
236 expectedField = getField(100, {1, 2, 2}, 2, {true, true, true});
237 EXPECT_EQ(expectedField, tag2Item.mField);
238 EXPECT_EQ(Type::STRING, tag2Item.mValue.getType());
239 EXPECT_EQ(tag2, tag2Item.mValue.str_value);
240
Tej Singhb26d0442020-01-31 16:18:21 -0800241 AStatsEvent_release(event);
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800242}
243
244#else // NEW_ENCODING_SCHEME
245
Yao Chen8a8d16c2018-02-08 14:50:40 -0800246TEST(LogEventTest, TestLogParsing) {
247 LogEvent event1(1, 2000);
Yangster-mac20877162017-12-22 17:19:39 -0800248
Yao Chen9c1debe2018-02-19 14:39:19 -0800249 std::vector<AttributionNodeInternal> nodes;
Yangster-mac20877162017-12-22 17:19:39 -0800250
Yao Chen9c1debe2018-02-19 14:39:19 -0800251 AttributionNodeInternal node1;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800252 node1.set_uid(1000);
253 node1.set_tag("tag1");
254 nodes.push_back(node1);
Yangster-mac20877162017-12-22 17:19:39 -0800255
Yao Chen9c1debe2018-02-19 14:39:19 -0800256 AttributionNodeInternal node2;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800257 node2.set_uid(2000);
258 node2.set_tag("tag2");
259 nodes.push_back(node2);
Yangster-mac20877162017-12-22 17:19:39 -0800260
Yao Chen8a8d16c2018-02-08 14:50:40 -0800261 event1.write(nodes);
262 event1.write("hello");
263 event1.write((int32_t)10);
264 event1.write((int64_t)20);
265 event1.write((float)1.1);
266 event1.init();
267
268 const auto& items = event1.getValues();
269 EXPECT_EQ((size_t)8, items.size());
270 EXPECT_EQ(1, event1.GetTagId());
271
272 const FieldValue& item0 = event1.getValues()[0];
273 EXPECT_EQ(0x2010101, item0.mField.getField());
274 EXPECT_EQ(Type::INT, item0.mValue.getType());
275 EXPECT_EQ(1000, item0.mValue.int_value);
276
277 const FieldValue& item1 = event1.getValues()[1];
278 EXPECT_EQ(0x2010182, item1.mField.getField());
279 EXPECT_EQ(Type::STRING, item1.mValue.getType());
280 EXPECT_EQ("tag1", item1.mValue.str_value);
281
282 const FieldValue& item2 = event1.getValues()[2];
283 EXPECT_EQ(0x2018201, item2.mField.getField());
284 EXPECT_EQ(Type::INT, item2.mValue.getType());
285 EXPECT_EQ(2000, item2.mValue.int_value);
286
287 const FieldValue& item3 = event1.getValues()[3];
288 EXPECT_EQ(0x2018282, item3.mField.getField());
289 EXPECT_EQ(Type::STRING, item3.mValue.getType());
290 EXPECT_EQ("tag2", item3.mValue.str_value);
291
292 const FieldValue& item4 = event1.getValues()[4];
293 EXPECT_EQ(0x20000, item4.mField.getField());
294 EXPECT_EQ(Type::STRING, item4.mValue.getType());
295 EXPECT_EQ("hello", item4.mValue.str_value);
296
297 const FieldValue& item5 = event1.getValues()[5];
298 EXPECT_EQ(0x30000, item5.mField.getField());
299 EXPECT_EQ(Type::INT, item5.mValue.getType());
300 EXPECT_EQ(10, item5.mValue.int_value);
301
302 const FieldValue& item6 = event1.getValues()[6];
303 EXPECT_EQ(0x40000, item6.mField.getField());
304 EXPECT_EQ(Type::LONG, item6.mValue.getType());
305 EXPECT_EQ((int64_t)20, item6.mValue.long_value);
306
307 const FieldValue& item7 = event1.getValues()[7];
308 EXPECT_EQ(0x50000, item7.mField.getField());
309 EXPECT_EQ(Type::FLOAT, item7.mValue.getType());
310 EXPECT_EQ((float)1.1, item7.mValue.float_value);
Yangster-mac20877162017-12-22 17:19:39 -0800311}
312
Yangster-mace124e422018-08-16 10:30:28 -0700313TEST(LogEventTest, TestKeyValuePairsAtomParsing) {
Howard Ro1a2a3992018-10-22 22:51:57 -0700314 LogEvent event1(83, 2000, 1000);
Howard Ro4078dd42018-09-27 17:41:08 -0700315 std::map<int32_t, int32_t> int_map;
316 std::map<int32_t, int64_t> long_map;
Yangster-mace124e422018-08-16 10:30:28 -0700317 std::map<int32_t, std::string> string_map;
318 std::map<int32_t, float> float_map;
319
Howard Ro4078dd42018-09-27 17:41:08 -0700320 int_map[11] = 123;
321 int_map[22] = 345;
322
323 long_map[33] = 678L;
324 long_map[44] = 890L;
Yangster-mace124e422018-08-16 10:30:28 -0700325
326 string_map[1] = "test2";
327 string_map[2] = "test1";
328
329 float_map[111] = 2.2f;
330 float_map[222] = 1.1f;
331
Howard Ro1a2a3992018-10-22 22:51:57 -0700332 EXPECT_TRUE(event1.writeKeyValuePairs(0, // Logging side logs 0 uid.
333 int_map,
Howard Ro4078dd42018-09-27 17:41:08 -0700334 long_map,
335 string_map,
336 float_map));
Yangster-mace124e422018-08-16 10:30:28 -0700337 event1.init();
338
339 EXPECT_EQ(83, event1.GetTagId());
340 const auto& items = event1.getValues();
Howard Ro1a2a3992018-10-22 22:51:57 -0700341 EXPECT_EQ((size_t)17, items.size());
Yangster-mace124e422018-08-16 10:30:28 -0700342
343 const FieldValue& item0 = event1.getValues()[0];
Howard Ro1a2a3992018-10-22 22:51:57 -0700344 EXPECT_EQ(0x10000, item0.mField.getField());
Yangster-mace124e422018-08-16 10:30:28 -0700345 EXPECT_EQ(Type::INT, item0.mValue.getType());
Howard Ro1a2a3992018-10-22 22:51:57 -0700346 EXPECT_EQ(1000, item0.mValue.int_value);
Yangster-mace124e422018-08-16 10:30:28 -0700347
348 const FieldValue& item1 = event1.getValues()[1];
Howard Ro1a2a3992018-10-22 22:51:57 -0700349 EXPECT_EQ(0x2010201, item1.mField.getField());
Howard Ro4078dd42018-09-27 17:41:08 -0700350 EXPECT_EQ(Type::INT, item1.mValue.getType());
Howard Ro1a2a3992018-10-22 22:51:57 -0700351 EXPECT_EQ(11, item1.mValue.int_value);
Yangster-mace124e422018-08-16 10:30:28 -0700352
353 const FieldValue& item2 = event1.getValues()[2];
Howard Ro1a2a3992018-10-22 22:51:57 -0700354 EXPECT_EQ(0x2010282, item2.mField.getField());
Yangster-mace124e422018-08-16 10:30:28 -0700355 EXPECT_EQ(Type::INT, item2.mValue.getType());
Howard Ro1a2a3992018-10-22 22:51:57 -0700356 EXPECT_EQ(123, item2.mValue.int_value);
Yangster-mace124e422018-08-16 10:30:28 -0700357
358 const FieldValue& item3 = event1.getValues()[3];
Howard Ro1a2a3992018-10-22 22:51:57 -0700359 EXPECT_EQ(0x2010301, item3.mField.getField());
Howard Ro4078dd42018-09-27 17:41:08 -0700360 EXPECT_EQ(Type::INT, item3.mValue.getType());
Howard Ro1a2a3992018-10-22 22:51:57 -0700361 EXPECT_EQ(22, item3.mValue.int_value);
Yangster-mace124e422018-08-16 10:30:28 -0700362
363 const FieldValue& item4 = event1.getValues()[4];
Howard Ro1a2a3992018-10-22 22:51:57 -0700364 EXPECT_EQ(0x2010382, item4.mField.getField());
Yangster-mace124e422018-08-16 10:30:28 -0700365 EXPECT_EQ(Type::INT, item4.mValue.getType());
Howard Ro1a2a3992018-10-22 22:51:57 -0700366 EXPECT_EQ(345, item4.mValue.int_value);
Yangster-mace124e422018-08-16 10:30:28 -0700367
368 const FieldValue& item5 = event1.getValues()[5];
Howard Ro1a2a3992018-10-22 22:51:57 -0700369 EXPECT_EQ(0x2010401, item5.mField.getField());
370 EXPECT_EQ(Type::INT, item5.mValue.getType());
371 EXPECT_EQ(33, item5.mValue.int_value);
Yangster-mace124e422018-08-16 10:30:28 -0700372
373 const FieldValue& item6 = event1.getValues()[6];
Tej Singh2c96b5a2019-02-04 21:28:49 -0800374 EXPECT_EQ(0x2010483, item6.mField.getField());
Howard Ro1a2a3992018-10-22 22:51:57 -0700375 EXPECT_EQ(Type::LONG, item6.mValue.getType());
376 EXPECT_EQ(678L, item6.mValue.int_value);
Yangster-mace124e422018-08-16 10:30:28 -0700377
378 const FieldValue& item7 = event1.getValues()[7];
Howard Ro1a2a3992018-10-22 22:51:57 -0700379 EXPECT_EQ(0x2010501, item7.mField.getField());
380 EXPECT_EQ(Type::INT, item7.mValue.getType());
381 EXPECT_EQ(44, item7.mValue.int_value);
Yangster-mace124e422018-08-16 10:30:28 -0700382
383 const FieldValue& item8 = event1.getValues()[8];
Tej Singh2c96b5a2019-02-04 21:28:49 -0800384 EXPECT_EQ(0x2010583, item8.mField.getField());
Howard Ro1a2a3992018-10-22 22:51:57 -0700385 EXPECT_EQ(Type::LONG, item8.mValue.getType());
386 EXPECT_EQ(890L, item8.mValue.int_value);
Yangster-mace124e422018-08-16 10:30:28 -0700387
388 const FieldValue& item9 = event1.getValues()[9];
Howard Ro1a2a3992018-10-22 22:51:57 -0700389 EXPECT_EQ(0x2010601, item9.mField.getField());
390 EXPECT_EQ(Type::INT, item9.mValue.getType());
391 EXPECT_EQ(1, item9.mValue.int_value);
Yangster-mace124e422018-08-16 10:30:28 -0700392
393 const FieldValue& item10 = event1.getValues()[10];
Tej Singh2c96b5a2019-02-04 21:28:49 -0800394 EXPECT_EQ(0x2010684, item10.mField.getField());
Howard Ro1a2a3992018-10-22 22:51:57 -0700395 EXPECT_EQ(Type::STRING, item10.mValue.getType());
396 EXPECT_EQ("test2", item10.mValue.str_value);
Yangster-mace124e422018-08-16 10:30:28 -0700397
398 const FieldValue& item11 = event1.getValues()[11];
Howard Ro1a2a3992018-10-22 22:51:57 -0700399 EXPECT_EQ(0x2010701, item11.mField.getField());
400 EXPECT_EQ(Type::INT, item11.mValue.getType());
401 EXPECT_EQ(2, item11.mValue.int_value);
Howard Ro4078dd42018-09-27 17:41:08 -0700402
403 const FieldValue& item12 = event1.getValues()[12];
Tej Singh2c96b5a2019-02-04 21:28:49 -0800404 EXPECT_EQ(0x2010784, item12.mField.getField());
Howard Ro1a2a3992018-10-22 22:51:57 -0700405 EXPECT_EQ(Type::STRING, item12.mValue.getType());
406 EXPECT_EQ("test1", item12.mValue.str_value);
Howard Ro4078dd42018-09-27 17:41:08 -0700407
408 const FieldValue& item13 = event1.getValues()[13];
Howard Ro1a2a3992018-10-22 22:51:57 -0700409 EXPECT_EQ(0x2010801, item13.mField.getField());
410 EXPECT_EQ(Type::INT, item13.mValue.getType());
411 EXPECT_EQ(111, item13.mValue.int_value);
Howard Ro4078dd42018-09-27 17:41:08 -0700412
413 const FieldValue& item14 = event1.getValues()[14];
Tej Singh2c96b5a2019-02-04 21:28:49 -0800414 EXPECT_EQ(0x2010885, item14.mField.getField());
Howard Ro1a2a3992018-10-22 22:51:57 -0700415 EXPECT_EQ(Type::FLOAT, item14.mValue.getType());
416 EXPECT_EQ(2.2f, item14.mValue.float_value);
Howard Ro4078dd42018-09-27 17:41:08 -0700417
418 const FieldValue& item15 = event1.getValues()[15];
Howard Ro1a2a3992018-10-22 22:51:57 -0700419 EXPECT_EQ(0x2018901, item15.mField.getField());
420 EXPECT_EQ(Type::INT, item15.mValue.getType());
421 EXPECT_EQ(222, item15.mValue.int_value);
422
423 const FieldValue& item16 = event1.getValues()[16];
Tej Singh2c96b5a2019-02-04 21:28:49 -0800424 EXPECT_EQ(0x2018985, item16.mField.getField());
Howard Ro1a2a3992018-10-22 22:51:57 -0700425 EXPECT_EQ(Type::FLOAT, item16.mValue.getType());
426 EXPECT_EQ(1.1f, item16.mValue.float_value);
Yangster-mace124e422018-08-16 10:30:28 -0700427}
428
Yao Chen8a8d16c2018-02-08 14:50:40 -0800429TEST(LogEventTest, TestLogParsing2) {
430 LogEvent event1(1, 2000);
Yangster-mac20877162017-12-22 17:19:39 -0800431
Yao Chen9c1debe2018-02-19 14:39:19 -0800432 std::vector<AttributionNodeInternal> nodes;
Yangster-mac20877162017-12-22 17:19:39 -0800433
Yao Chen8a8d16c2018-02-08 14:50:40 -0800434 event1.write("hello");
Yangster-mac20877162017-12-22 17:19:39 -0800435
Yao Chen8a8d16c2018-02-08 14:50:40 -0800436 // repeated msg can be in the middle
Yao Chen9c1debe2018-02-19 14:39:19 -0800437 AttributionNodeInternal node1;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800438 node1.set_uid(1000);
439 node1.set_tag("tag1");
440 nodes.push_back(node1);
Yangster-mac20877162017-12-22 17:19:39 -0800441
Yao Chen9c1debe2018-02-19 14:39:19 -0800442 AttributionNodeInternal node2;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800443 node2.set_uid(2000);
444 node2.set_tag("tag2");
445 nodes.push_back(node2);
446 event1.write(nodes);
Yangster-mac20877162017-12-22 17:19:39 -0800447
Yao Chen8a8d16c2018-02-08 14:50:40 -0800448 event1.write((int32_t)10);
449 event1.write((int64_t)20);
450 event1.write((float)1.1);
451 event1.init();
Yangster-mac20877162017-12-22 17:19:39 -0800452
Yao Chen8a8d16c2018-02-08 14:50:40 -0800453 const auto& items = event1.getValues();
454 EXPECT_EQ((size_t)8, items.size());
455 EXPECT_EQ(1, event1.GetTagId());
Yangster-mac20877162017-12-22 17:19:39 -0800456
Yao Chen8a8d16c2018-02-08 14:50:40 -0800457 const FieldValue& item = event1.getValues()[0];
458 EXPECT_EQ(0x00010000, item.mField.getField());
459 EXPECT_EQ(Type::STRING, item.mValue.getType());
460 EXPECT_EQ("hello", item.mValue.str_value);
Yangster-mac20877162017-12-22 17:19:39 -0800461
Yao Chen8a8d16c2018-02-08 14:50:40 -0800462 const FieldValue& item0 = event1.getValues()[1];
463 EXPECT_EQ(0x2020101, item0.mField.getField());
464 EXPECT_EQ(Type::INT, item0.mValue.getType());
465 EXPECT_EQ(1000, item0.mValue.int_value);
Yangster-mac20877162017-12-22 17:19:39 -0800466
Yao Chen8a8d16c2018-02-08 14:50:40 -0800467 const FieldValue& item1 = event1.getValues()[2];
468 EXPECT_EQ(0x2020182, item1.mField.getField());
469 EXPECT_EQ(Type::STRING, item1.mValue.getType());
470 EXPECT_EQ("tag1", item1.mValue.str_value);
Yangster-mac20877162017-12-22 17:19:39 -0800471
Yao Chen8a8d16c2018-02-08 14:50:40 -0800472 const FieldValue& item2 = event1.getValues()[3];
473 EXPECT_EQ(0x2028201, item2.mField.getField());
474 EXPECT_EQ(Type::INT, item2.mValue.getType());
475 EXPECT_EQ(2000, item2.mValue.int_value);
Yangster-mac20877162017-12-22 17:19:39 -0800476
Yao Chen8a8d16c2018-02-08 14:50:40 -0800477 const FieldValue& item3 = event1.getValues()[4];
478 EXPECT_EQ(0x2028282, item3.mField.getField());
479 EXPECT_EQ(Type::STRING, item3.mValue.getType());
480 EXPECT_EQ("tag2", item3.mValue.str_value);
Yangster-mac20877162017-12-22 17:19:39 -0800481
Yao Chen8a8d16c2018-02-08 14:50:40 -0800482 const FieldValue& item5 = event1.getValues()[5];
483 EXPECT_EQ(0x30000, item5.mField.getField());
484 EXPECT_EQ(Type::INT, item5.mValue.getType());
485 EXPECT_EQ(10, item5.mValue.int_value);
Yangster-mac20877162017-12-22 17:19:39 -0800486
Yao Chen8a8d16c2018-02-08 14:50:40 -0800487 const FieldValue& item6 = event1.getValues()[6];
488 EXPECT_EQ(0x40000, item6.mField.getField());
489 EXPECT_EQ(Type::LONG, item6.mValue.getType());
490 EXPECT_EQ((int64_t)20, item6.mValue.long_value);
Yangster-mac20877162017-12-22 17:19:39 -0800491
Yao Chen8a8d16c2018-02-08 14:50:40 -0800492 const FieldValue& item7 = event1.getValues()[7];
493 EXPECT_EQ(0x50000, item7.mField.getField());
494 EXPECT_EQ(Type::FLOAT, item7.mValue.getType());
495 EXPECT_EQ((float)1.1, item7.mValue.float_value);
Yangster-mac20877162017-12-22 17:19:39 -0800496}
497
Yangster-mace124e422018-08-16 10:30:28 -0700498TEST(LogEventTest, TestKeyValuePairsEvent) {
Howard Ro4078dd42018-09-27 17:41:08 -0700499 std::map<int32_t, int32_t> int_map;
500 std::map<int32_t, int64_t> long_map;
Yangster-mac48b3d622018-08-18 12:38:11 -0700501 std::map<int32_t, std::string> string_map;
502 std::map<int32_t, float> float_map;
503
Howard Ro4078dd42018-09-27 17:41:08 -0700504 int_map[11] = 123;
505 int_map[22] = 345;
506
507 long_map[33] = 678L;
508 long_map[44] = 890L;
Yangster-mac48b3d622018-08-18 12:38:11 -0700509
510 string_map[1] = "test2";
511 string_map[2] = "test1";
512
513 float_map[111] = 2.2f;
514 float_map[222] = 1.1f;
515
Howard Ro4078dd42018-09-27 17:41:08 -0700516 LogEvent event1(83, 2000, 2001, 10001, int_map, long_map, string_map, float_map);
Yangster-mac48b3d622018-08-18 12:38:11 -0700517 event1.init();
518
519 EXPECT_EQ(83, event1.GetTagId());
520 EXPECT_EQ((int64_t)2000, event1.GetLogdTimestampNs());
521 EXPECT_EQ((int64_t)2001, event1.GetElapsedTimestampNs());
Howard Ro1a2a3992018-10-22 22:51:57 -0700522 EXPECT_EQ((int64_t)10001, event1.GetUid());
Yangster-mac48b3d622018-08-18 12:38:11 -0700523
524 const auto& items = event1.getValues();
Howard Ro4078dd42018-09-27 17:41:08 -0700525 EXPECT_EQ((size_t)17, items.size());
Yangster-mac48b3d622018-08-18 12:38:11 -0700526
527 const FieldValue& item0 = event1.getValues()[0];
528 EXPECT_EQ(0x00010000, item0.mField.getField());
529 EXPECT_EQ(Type::INT, item0.mValue.getType());
530 EXPECT_EQ(10001, item0.mValue.int_value);
531
532 const FieldValue& item1 = event1.getValues()[1];
533 EXPECT_EQ(0x2020101, item1.mField.getField());
534 EXPECT_EQ(Type::INT, item1.mValue.getType());
535 EXPECT_EQ(11, item1.mValue.int_value);
536
537 const FieldValue& item2 = event1.getValues()[2];
538 EXPECT_EQ(0x2020182, item2.mField.getField());
Howard Ro4078dd42018-09-27 17:41:08 -0700539 EXPECT_EQ(Type::INT, item2.mValue.getType());
540 EXPECT_EQ(123, item2.mValue.int_value);
Yangster-mac48b3d622018-08-18 12:38:11 -0700541
542 const FieldValue& item3 = event1.getValues()[3];
543 EXPECT_EQ(0x2020201, item3.mField.getField());
544 EXPECT_EQ(Type::INT, item3.mValue.getType());
545 EXPECT_EQ(22, item3.mValue.int_value);
546
547 const FieldValue& item4 = event1.getValues()[4];
548 EXPECT_EQ(0x2020282, item4.mField.getField());
Howard Ro4078dd42018-09-27 17:41:08 -0700549 EXPECT_EQ(Type::INT, item4.mValue.getType());
550 EXPECT_EQ(345, item4.mValue.int_value);
Yangster-mac48b3d622018-08-18 12:38:11 -0700551
552 const FieldValue& item5 = event1.getValues()[5];
553 EXPECT_EQ(0x2020301, item5.mField.getField());
554 EXPECT_EQ(Type::INT, item5.mValue.getType());
Howard Ro4078dd42018-09-27 17:41:08 -0700555 EXPECT_EQ(33, item5.mValue.int_value);
Yangster-mac48b3d622018-08-18 12:38:11 -0700556
557 const FieldValue& item6 = event1.getValues()[6];
Howard Roa5b0f1e2018-10-02 16:20:43 -0700558 EXPECT_EQ(0x2020383, item6.mField.getField());
Howard Ro4078dd42018-09-27 17:41:08 -0700559 EXPECT_EQ(Type::LONG, item6.mValue.getType());
560 EXPECT_EQ(678L, item6.mValue.long_value);
Yangster-mac48b3d622018-08-18 12:38:11 -0700561
562 const FieldValue& item7 = event1.getValues()[7];
563 EXPECT_EQ(0x2020401, item7.mField.getField());
564 EXPECT_EQ(Type::INT, item7.mValue.getType());
Howard Ro4078dd42018-09-27 17:41:08 -0700565 EXPECT_EQ(44, item7.mValue.int_value);
Yangster-mac48b3d622018-08-18 12:38:11 -0700566
567 const FieldValue& item8 = event1.getValues()[8];
Howard Roa5b0f1e2018-10-02 16:20:43 -0700568 EXPECT_EQ(0x2020483, item8.mField.getField());
Howard Ro4078dd42018-09-27 17:41:08 -0700569 EXPECT_EQ(Type::LONG, item8.mValue.getType());
570 EXPECT_EQ(890L, item8.mValue.long_value);
Yangster-mac48b3d622018-08-18 12:38:11 -0700571
572 const FieldValue& item9 = event1.getValues()[9];
573 EXPECT_EQ(0x2020501, item9.mField.getField());
574 EXPECT_EQ(Type::INT, item9.mValue.getType());
Howard Ro4078dd42018-09-27 17:41:08 -0700575 EXPECT_EQ(1, item9.mValue.int_value);
Yangster-mac48b3d622018-08-18 12:38:11 -0700576
577 const FieldValue& item10 = event1.getValues()[10];
Howard Roa5b0f1e2018-10-02 16:20:43 -0700578 EXPECT_EQ(0x2020584, item10.mField.getField());
Howard Ro4078dd42018-09-27 17:41:08 -0700579 EXPECT_EQ(Type::STRING, item10.mValue.getType());
580 EXPECT_EQ("test2", item10.mValue.str_value);
Yangster-mac48b3d622018-08-18 12:38:11 -0700581
582 const FieldValue& item11 = event1.getValues()[11];
Howard Ro4078dd42018-09-27 17:41:08 -0700583 EXPECT_EQ(0x2020601, item11.mField.getField());
Yangster-mac48b3d622018-08-18 12:38:11 -0700584 EXPECT_EQ(Type::INT, item11.mValue.getType());
Howard Ro4078dd42018-09-27 17:41:08 -0700585 EXPECT_EQ(2, item11.mValue.int_value);
Yangster-mac48b3d622018-08-18 12:38:11 -0700586
587 const FieldValue& item12 = event1.getValues()[12];
Howard Roa5b0f1e2018-10-02 16:20:43 -0700588 EXPECT_EQ(0x2020684, item12.mField.getField());
Howard Ro4078dd42018-09-27 17:41:08 -0700589 EXPECT_EQ(Type::STRING, item12.mValue.getType());
590 EXPECT_EQ("test1", item12.mValue.str_value);
591
592 const FieldValue& item13 = event1.getValues()[13];
593 EXPECT_EQ(0x2020701, item13.mField.getField());
594 EXPECT_EQ(Type::INT, item13.mValue.getType());
595 EXPECT_EQ(111, item13.mValue.int_value);
596
597 const FieldValue& item14 = event1.getValues()[14];
Howard Roa5b0f1e2018-10-02 16:20:43 -0700598 EXPECT_EQ(0x2020785, item14.mField.getField());
Howard Ro4078dd42018-09-27 17:41:08 -0700599 EXPECT_EQ(Type::FLOAT, item14.mValue.getType());
600 EXPECT_EQ(2.2f, item14.mValue.float_value);
601
602 const FieldValue& item15 = event1.getValues()[15];
603 EXPECT_EQ(0x2028801, item15.mField.getField());
604 EXPECT_EQ(Type::INT, item15.mValue.getType());
605 EXPECT_EQ(222, item15.mValue.int_value);
606
607 const FieldValue& item16 = event1.getValues()[16];
Howard Roa5b0f1e2018-10-02 16:20:43 -0700608 EXPECT_EQ(0x2028885, item16.mField.getField());
Howard Ro4078dd42018-09-27 17:41:08 -0700609 EXPECT_EQ(Type::FLOAT, item16.mValue.getType());
610 EXPECT_EQ(1.1f, item16.mValue.float_value);
Yangster-mac48b3d622018-08-18 12:38:11 -0700611}
612
Yao Chen8c433862018-10-24 14:09:20 -0700613TEST(LogEventTest, TestBinaryFieldAtom) {
614 Atom launcherAtom;
615 auto launcher_event = launcherAtom.mutable_launcher_event();
616 launcher_event->set_action(stats::launcher::LauncherAction::LONGPRESS);
617 launcher_event->set_src_state(stats::launcher::LauncherState::OVERVIEW);
618 launcher_event->set_dst_state(stats::launcher::LauncherState::ALLAPPS);
619
620 auto extension = launcher_event->mutable_extension();
621
622 auto src_target = extension->add_src_target();
623 src_target->set_type(stats::launcher::LauncherTarget_Type_ITEM_TYPE);
624 src_target->set_item(stats::launcher::LauncherTarget_Item_FOLDER_ICON);
625
626 auto dst_target = extension->add_dst_target();
627 dst_target->set_type(stats::launcher::LauncherTarget_Type_ITEM_TYPE);
628 dst_target->set_item(stats::launcher::LauncherTarget_Item_WIDGET);
629
630 string extension_str;
631 extension->SerializeToString(&extension_str);
632
633 LogEvent event1(Atom::kLauncherEventFieldNumber, 1000);
634
635 event1.write((int32_t)stats::launcher::LauncherAction::LONGPRESS);
636 event1.write((int32_t)stats::launcher::LauncherState::OVERVIEW);
637 event1.write((int64_t)stats::launcher::LauncherState::ALLAPPS);
Tej Singha02bfab2019-10-01 19:03:24 -0700638 event1.writeBytes(extension_str);
Yao Chen8c433862018-10-24 14:09:20 -0700639 event1.init();
640
641 ProtoOutputStream proto;
642 event1.ToProto(proto);
643
644 std::vector<uint8_t> outData;
645 outData.resize(proto.size());
646 size_t pos = 0;
Joe Onorato99598ee2019-02-11 15:55:13 +0000647 sp<ProtoReader> reader = proto.data();
648 while (reader->readBuffer() != NULL) {
649 size_t toRead = reader->currentToRead();
650 std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
Yao Chen8c433862018-10-24 14:09:20 -0700651 pos += toRead;
Joe Onorato99598ee2019-02-11 15:55:13 +0000652 reader->move(toRead);
Yao Chen8c433862018-10-24 14:09:20 -0700653 }
654
655 std::string result_str(outData.begin(), outData.end());
656 std::string orig_str;
657 launcherAtom.SerializeToString(&orig_str);
658
659 EXPECT_EQ(orig_str, result_str);
660}
661
Yao Chen8e6f9982018-11-29 09:39:45 -0800662TEST(LogEventTest, TestBinaryFieldAtom_empty) {
663 Atom launcherAtom;
664 auto launcher_event = launcherAtom.mutable_launcher_event();
665 launcher_event->set_action(stats::launcher::LauncherAction::LONGPRESS);
666 launcher_event->set_src_state(stats::launcher::LauncherState::OVERVIEW);
667 launcher_event->set_dst_state(stats::launcher::LauncherState::ALLAPPS);
Yao Chen8c433862018-10-24 14:09:20 -0700668
Yao Chen8e6f9982018-11-29 09:39:45 -0800669 // empty string.
670 string extension_str;
671
672 LogEvent event1(Atom::kLauncherEventFieldNumber, 1000);
673
674 event1.write((int32_t)stats::launcher::LauncherAction::LONGPRESS);
675 event1.write((int32_t)stats::launcher::LauncherState::OVERVIEW);
676 event1.write((int64_t)stats::launcher::LauncherState::ALLAPPS);
Tej Singha02bfab2019-10-01 19:03:24 -0700677 event1.writeBytes(extension_str);
Yao Chen8e6f9982018-11-29 09:39:45 -0800678 event1.init();
679
680 ProtoOutputStream proto;
681 event1.ToProto(proto);
682
683 std::vector<uint8_t> outData;
684 outData.resize(proto.size());
685 size_t pos = 0;
Joe Onorato99598ee2019-02-11 15:55:13 +0000686 sp<ProtoReader> reader = proto.data();
687 while (reader->readBuffer() != NULL) {
688 size_t toRead = reader->currentToRead();
689 std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
Yao Chen8e6f9982018-11-29 09:39:45 -0800690 pos += toRead;
Joe Onorato99598ee2019-02-11 15:55:13 +0000691 reader->move(toRead);
Yao Chen8e6f9982018-11-29 09:39:45 -0800692 }
693
694 std::string result_str(outData.begin(), outData.end());
695 std::string orig_str;
696 launcherAtom.SerializeToString(&orig_str);
697
698 EXPECT_EQ(orig_str, result_str);
699}
Yao Chen8c433862018-10-24 14:09:20 -0700700
Jeff Hamiltonfa2f91c2019-03-22 00:25:02 -0400701TEST(LogEventTest, TestWriteExperimentIdsToProto) {
702 std::vector<int64_t> expIds;
703 expIds.push_back(5038);
704 std::vector<uint8_t> proto;
705
706 writeExperimentIdsToProto(expIds, &proto);
707
708 EXPECT_EQ(proto.size(), 3);
709 // Proto wire format for field ID 1, varint
710 EXPECT_EQ(proto[0], 0x08);
711 // varint of 5038, 2 bytes long
712 EXPECT_EQ(proto[1], 0xae);
713 EXPECT_EQ(proto[2], 0x27);
714}
Ruchir Rastogi1fb525e2019-11-07 14:08:24 -0800715#endif // NEW_ENCODING_SCHEME
Jeff Hamiltonfa2f91c2019-03-22 00:25:02 -0400716
717
Yangster-mac20877162017-12-22 17:19:39 -0800718} // namespace statsd
719} // namespace os
720} // namespace android
721#else
722GTEST_LOG_(INFO) << "This test does nothing.\n";
Howard Ro4078dd42018-09-27 17:41:08 -0700723#endif