Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 1 | // 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 | |
| 21 | namespace android { |
| 22 | namespace os { |
| 23 | namespace statsd { |
| 24 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 25 | TEST(LogEventTest, TestLogParsing) { |
| 26 | LogEvent event1(1, 2000); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 27 | |
Yao Chen | 9c1debe | 2018-02-19 14:39:19 -0800 | [diff] [blame] | 28 | std::vector<AttributionNodeInternal> nodes; |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 29 | |
Yao Chen | 9c1debe | 2018-02-19 14:39:19 -0800 | [diff] [blame] | 30 | AttributionNodeInternal node1; |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 31 | node1.set_uid(1000); |
| 32 | node1.set_tag("tag1"); |
| 33 | nodes.push_back(node1); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 34 | |
Yao Chen | 9c1debe | 2018-02-19 14:39:19 -0800 | [diff] [blame] | 35 | AttributionNodeInternal node2; |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 36 | node2.set_uid(2000); |
| 37 | node2.set_tag("tag2"); |
| 38 | nodes.push_back(node2); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 39 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 40 | event1.write(nodes); |
| 41 | event1.write("hello"); |
| 42 | event1.write((int32_t)10); |
| 43 | event1.write((int64_t)20); |
| 44 | event1.write((float)1.1); |
| 45 | event1.init(); |
| 46 | |
| 47 | const auto& items = event1.getValues(); |
| 48 | EXPECT_EQ((size_t)8, items.size()); |
| 49 | EXPECT_EQ(1, event1.GetTagId()); |
| 50 | |
| 51 | const FieldValue& item0 = event1.getValues()[0]; |
| 52 | EXPECT_EQ(0x2010101, item0.mField.getField()); |
| 53 | EXPECT_EQ(Type::INT, item0.mValue.getType()); |
| 54 | EXPECT_EQ(1000, item0.mValue.int_value); |
| 55 | |
| 56 | const FieldValue& item1 = event1.getValues()[1]; |
| 57 | EXPECT_EQ(0x2010182, item1.mField.getField()); |
| 58 | EXPECT_EQ(Type::STRING, item1.mValue.getType()); |
| 59 | EXPECT_EQ("tag1", item1.mValue.str_value); |
| 60 | |
| 61 | const FieldValue& item2 = event1.getValues()[2]; |
| 62 | EXPECT_EQ(0x2018201, item2.mField.getField()); |
| 63 | EXPECT_EQ(Type::INT, item2.mValue.getType()); |
| 64 | EXPECT_EQ(2000, item2.mValue.int_value); |
| 65 | |
| 66 | const FieldValue& item3 = event1.getValues()[3]; |
| 67 | EXPECT_EQ(0x2018282, item3.mField.getField()); |
| 68 | EXPECT_EQ(Type::STRING, item3.mValue.getType()); |
| 69 | EXPECT_EQ("tag2", item3.mValue.str_value); |
| 70 | |
| 71 | const FieldValue& item4 = event1.getValues()[4]; |
| 72 | EXPECT_EQ(0x20000, item4.mField.getField()); |
| 73 | EXPECT_EQ(Type::STRING, item4.mValue.getType()); |
| 74 | EXPECT_EQ("hello", item4.mValue.str_value); |
| 75 | |
| 76 | const FieldValue& item5 = event1.getValues()[5]; |
| 77 | EXPECT_EQ(0x30000, item5.mField.getField()); |
| 78 | EXPECT_EQ(Type::INT, item5.mValue.getType()); |
| 79 | EXPECT_EQ(10, item5.mValue.int_value); |
| 80 | |
| 81 | const FieldValue& item6 = event1.getValues()[6]; |
| 82 | EXPECT_EQ(0x40000, item6.mField.getField()); |
| 83 | EXPECT_EQ(Type::LONG, item6.mValue.getType()); |
| 84 | EXPECT_EQ((int64_t)20, item6.mValue.long_value); |
| 85 | |
| 86 | const FieldValue& item7 = event1.getValues()[7]; |
| 87 | EXPECT_EQ(0x50000, item7.mField.getField()); |
| 88 | EXPECT_EQ(Type::FLOAT, item7.mValue.getType()); |
| 89 | EXPECT_EQ((float)1.1, item7.mValue.float_value); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 90 | } |
| 91 | |
Yangster-mac | e124e42 | 2018-08-16 10:30:28 -0700 | [diff] [blame^] | 92 | TEST(LogEventTest, TestKeyValuePairsAtomParsing) { |
| 93 | LogEvent event1(83, 2000); |
| 94 | std::map<int32_t, int64_t> int_map; |
| 95 | std::map<int32_t, std::string> string_map; |
| 96 | std::map<int32_t, float> float_map; |
| 97 | |
| 98 | int_map[11] = 123L; |
| 99 | int_map[22] = 345L; |
| 100 | |
| 101 | string_map[1] = "test2"; |
| 102 | string_map[2] = "test1"; |
| 103 | |
| 104 | float_map[111] = 2.2f; |
| 105 | float_map[222] = 1.1f; |
| 106 | |
| 107 | EXPECT_TRUE(event1.writeKeyValuePairs(int_map, string_map, float_map)); |
| 108 | event1.init(); |
| 109 | |
| 110 | EXPECT_EQ(83, event1.GetTagId()); |
| 111 | const auto& items = event1.getValues(); |
| 112 | EXPECT_EQ((size_t)12, items.size()); |
| 113 | |
| 114 | const FieldValue& item0 = event1.getValues()[0]; |
| 115 | EXPECT_EQ(0x2010101, item0.mField.getField()); |
| 116 | EXPECT_EQ(Type::INT, item0.mValue.getType()); |
| 117 | EXPECT_EQ(11, item0.mValue.int_value); |
| 118 | |
| 119 | const FieldValue& item1 = event1.getValues()[1]; |
| 120 | EXPECT_EQ(0x2010182, item1.mField.getField()); |
| 121 | EXPECT_EQ(Type::LONG, item1.mValue.getType()); |
| 122 | EXPECT_EQ(123L, item1.mValue.long_value); |
| 123 | |
| 124 | const FieldValue& item2 = event1.getValues()[2]; |
| 125 | EXPECT_EQ(0x2010201, item2.mField.getField()); |
| 126 | EXPECT_EQ(Type::INT, item2.mValue.getType()); |
| 127 | EXPECT_EQ(22, item2.mValue.int_value); |
| 128 | |
| 129 | const FieldValue& item3 = event1.getValues()[3]; |
| 130 | EXPECT_EQ(0x2010282, item3.mField.getField()); |
| 131 | EXPECT_EQ(Type::LONG, item3.mValue.getType()); |
| 132 | EXPECT_EQ(345L, item3.mValue.long_value); |
| 133 | |
| 134 | const FieldValue& item4 = event1.getValues()[4]; |
| 135 | EXPECT_EQ(0x2010301, item4.mField.getField()); |
| 136 | EXPECT_EQ(Type::INT, item4.mValue.getType()); |
| 137 | EXPECT_EQ(1, item4.mValue.int_value); |
| 138 | |
| 139 | const FieldValue& item5 = event1.getValues()[5]; |
| 140 | EXPECT_EQ(0x2010383, item5.mField.getField()); |
| 141 | EXPECT_EQ(Type::STRING, item5.mValue.getType()); |
| 142 | EXPECT_EQ("test2", item5.mValue.str_value); |
| 143 | |
| 144 | const FieldValue& item6 = event1.getValues()[6]; |
| 145 | EXPECT_EQ(0x2010401, item6.mField.getField()); |
| 146 | EXPECT_EQ(Type::INT, item6.mValue.getType()); |
| 147 | EXPECT_EQ(2, item6.mValue.int_value); |
| 148 | |
| 149 | const FieldValue& item7 = event1.getValues()[7]; |
| 150 | EXPECT_EQ(0x2010483, item7.mField.getField()); |
| 151 | EXPECT_EQ(Type::STRING, item7.mValue.getType()); |
| 152 | EXPECT_EQ("test1", item7.mValue.str_value); |
| 153 | |
| 154 | const FieldValue& item8 = event1.getValues()[8]; |
| 155 | EXPECT_EQ(0x2010501, item8.mField.getField()); |
| 156 | EXPECT_EQ(Type::INT, item8.mValue.getType()); |
| 157 | EXPECT_EQ(111, item8.mValue.int_value); |
| 158 | |
| 159 | const FieldValue& item9 = event1.getValues()[9]; |
| 160 | EXPECT_EQ(0x2010584, item9.mField.getField()); |
| 161 | EXPECT_EQ(Type::FLOAT, item9.mValue.getType()); |
| 162 | EXPECT_EQ(2.2f, item9.mValue.float_value); |
| 163 | |
| 164 | const FieldValue& item10 = event1.getValues()[10]; |
| 165 | EXPECT_EQ(0x2018601, item10.mField.getField()); |
| 166 | EXPECT_EQ(Type::INT, item10.mValue.getType()); |
| 167 | EXPECT_EQ(222, item10.mValue.int_value); |
| 168 | |
| 169 | const FieldValue& item11 = event1.getValues()[11]; |
| 170 | EXPECT_EQ(0x2018684, item11.mField.getField()); |
| 171 | EXPECT_EQ(Type::FLOAT, item11.mValue.getType()); |
| 172 | EXPECT_EQ(1.1f, item11.mValue.float_value); |
| 173 | } |
| 174 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 175 | TEST(LogEventTest, TestLogParsing2) { |
| 176 | LogEvent event1(1, 2000); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 177 | |
Yao Chen | 9c1debe | 2018-02-19 14:39:19 -0800 | [diff] [blame] | 178 | std::vector<AttributionNodeInternal> nodes; |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 179 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 180 | event1.write("hello"); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 181 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 182 | // repeated msg can be in the middle |
Yao Chen | 9c1debe | 2018-02-19 14:39:19 -0800 | [diff] [blame] | 183 | AttributionNodeInternal node1; |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 184 | node1.set_uid(1000); |
| 185 | node1.set_tag("tag1"); |
| 186 | nodes.push_back(node1); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 187 | |
Yao Chen | 9c1debe | 2018-02-19 14:39:19 -0800 | [diff] [blame] | 188 | AttributionNodeInternal node2; |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 189 | node2.set_uid(2000); |
| 190 | node2.set_tag("tag2"); |
| 191 | nodes.push_back(node2); |
| 192 | event1.write(nodes); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 193 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 194 | event1.write((int32_t)10); |
| 195 | event1.write((int64_t)20); |
| 196 | event1.write((float)1.1); |
| 197 | event1.init(); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 198 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 199 | const auto& items = event1.getValues(); |
| 200 | EXPECT_EQ((size_t)8, items.size()); |
| 201 | EXPECT_EQ(1, event1.GetTagId()); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 202 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 203 | const FieldValue& item = event1.getValues()[0]; |
| 204 | EXPECT_EQ(0x00010000, item.mField.getField()); |
| 205 | EXPECT_EQ(Type::STRING, item.mValue.getType()); |
| 206 | EXPECT_EQ("hello", item.mValue.str_value); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 207 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 208 | const FieldValue& item0 = event1.getValues()[1]; |
| 209 | EXPECT_EQ(0x2020101, item0.mField.getField()); |
| 210 | EXPECT_EQ(Type::INT, item0.mValue.getType()); |
| 211 | EXPECT_EQ(1000, item0.mValue.int_value); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 212 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 213 | const FieldValue& item1 = event1.getValues()[2]; |
| 214 | EXPECT_EQ(0x2020182, item1.mField.getField()); |
| 215 | EXPECT_EQ(Type::STRING, item1.mValue.getType()); |
| 216 | EXPECT_EQ("tag1", item1.mValue.str_value); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 217 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 218 | const FieldValue& item2 = event1.getValues()[3]; |
| 219 | EXPECT_EQ(0x2028201, item2.mField.getField()); |
| 220 | EXPECT_EQ(Type::INT, item2.mValue.getType()); |
| 221 | EXPECT_EQ(2000, item2.mValue.int_value); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 222 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 223 | const FieldValue& item3 = event1.getValues()[4]; |
| 224 | EXPECT_EQ(0x2028282, item3.mField.getField()); |
| 225 | EXPECT_EQ(Type::STRING, item3.mValue.getType()); |
| 226 | EXPECT_EQ("tag2", item3.mValue.str_value); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 227 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 228 | const FieldValue& item5 = event1.getValues()[5]; |
| 229 | EXPECT_EQ(0x30000, item5.mField.getField()); |
| 230 | EXPECT_EQ(Type::INT, item5.mValue.getType()); |
| 231 | EXPECT_EQ(10, item5.mValue.int_value); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 232 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 233 | const FieldValue& item6 = event1.getValues()[6]; |
| 234 | EXPECT_EQ(0x40000, item6.mField.getField()); |
| 235 | EXPECT_EQ(Type::LONG, item6.mValue.getType()); |
| 236 | EXPECT_EQ((int64_t)20, item6.mValue.long_value); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 237 | |
Yao Chen | 8a8d16c | 2018-02-08 14:50:40 -0800 | [diff] [blame] | 238 | const FieldValue& item7 = event1.getValues()[7]; |
| 239 | EXPECT_EQ(0x50000, item7.mField.getField()); |
| 240 | EXPECT_EQ(Type::FLOAT, item7.mValue.getType()); |
| 241 | EXPECT_EQ((float)1.1, item7.mValue.float_value); |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 242 | } |
| 243 | |
Yangster-mac | e124e42 | 2018-08-16 10:30:28 -0700 | [diff] [blame^] | 244 | TEST(LogEventTest, TestKeyValuePairsEvent) { |
Yangster-mac | 48b3d62 | 2018-08-18 12:38:11 -0700 | [diff] [blame] | 245 | std::map<int32_t, int64_t> int_map; |
| 246 | std::map<int32_t, std::string> string_map; |
| 247 | std::map<int32_t, float> float_map; |
| 248 | |
| 249 | int_map[11] = 123L; |
| 250 | int_map[22] = 345L; |
| 251 | |
| 252 | string_map[1] = "test2"; |
| 253 | string_map[2] = "test1"; |
| 254 | |
| 255 | float_map[111] = 2.2f; |
| 256 | float_map[222] = 1.1f; |
| 257 | |
| 258 | LogEvent event1(83, 2000, 2001, 10001, int_map, string_map, float_map); |
| 259 | event1.init(); |
| 260 | |
| 261 | EXPECT_EQ(83, event1.GetTagId()); |
| 262 | EXPECT_EQ((int64_t)2000, event1.GetLogdTimestampNs()); |
| 263 | EXPECT_EQ((int64_t)2001, event1.GetElapsedTimestampNs()); |
| 264 | |
| 265 | const auto& items = event1.getValues(); |
| 266 | EXPECT_EQ((size_t)13, items.size()); |
| 267 | |
| 268 | const FieldValue& item0 = event1.getValues()[0]; |
| 269 | EXPECT_EQ(0x00010000, item0.mField.getField()); |
| 270 | EXPECT_EQ(Type::INT, item0.mValue.getType()); |
| 271 | EXPECT_EQ(10001, item0.mValue.int_value); |
| 272 | |
| 273 | const FieldValue& item1 = event1.getValues()[1]; |
| 274 | EXPECT_EQ(0x2020101, item1.mField.getField()); |
| 275 | EXPECT_EQ(Type::INT, item1.mValue.getType()); |
| 276 | EXPECT_EQ(11, item1.mValue.int_value); |
| 277 | |
| 278 | const FieldValue& item2 = event1.getValues()[2]; |
| 279 | EXPECT_EQ(0x2020182, item2.mField.getField()); |
| 280 | EXPECT_EQ(Type::LONG, item2.mValue.getType()); |
| 281 | EXPECT_EQ(123L, item2.mValue.long_value); |
| 282 | |
| 283 | const FieldValue& item3 = event1.getValues()[3]; |
| 284 | EXPECT_EQ(0x2020201, item3.mField.getField()); |
| 285 | EXPECT_EQ(Type::INT, item3.mValue.getType()); |
| 286 | EXPECT_EQ(22, item3.mValue.int_value); |
| 287 | |
| 288 | const FieldValue& item4 = event1.getValues()[4]; |
| 289 | EXPECT_EQ(0x2020282, item4.mField.getField()); |
| 290 | EXPECT_EQ(Type::LONG, item4.mValue.getType()); |
| 291 | EXPECT_EQ(345L, item4.mValue.long_value); |
| 292 | |
| 293 | const FieldValue& item5 = event1.getValues()[5]; |
| 294 | EXPECT_EQ(0x2020301, item5.mField.getField()); |
| 295 | EXPECT_EQ(Type::INT, item5.mValue.getType()); |
| 296 | EXPECT_EQ(1, item5.mValue.int_value); |
| 297 | |
| 298 | const FieldValue& item6 = event1.getValues()[6]; |
| 299 | EXPECT_EQ(0x2020383, item6.mField.getField()); |
| 300 | EXPECT_EQ(Type::STRING, item6.mValue.getType()); |
| 301 | EXPECT_EQ("test2", item6.mValue.str_value); |
| 302 | |
| 303 | const FieldValue& item7 = event1.getValues()[7]; |
| 304 | EXPECT_EQ(0x2020401, item7.mField.getField()); |
| 305 | EXPECT_EQ(Type::INT, item7.mValue.getType()); |
| 306 | EXPECT_EQ(2, item7.mValue.int_value); |
| 307 | |
| 308 | const FieldValue& item8 = event1.getValues()[8]; |
| 309 | EXPECT_EQ(0x2020483, item8.mField.getField()); |
| 310 | EXPECT_EQ(Type::STRING, item8.mValue.getType()); |
| 311 | EXPECT_EQ("test1", item8.mValue.str_value); |
| 312 | |
| 313 | const FieldValue& item9 = event1.getValues()[9]; |
| 314 | EXPECT_EQ(0x2020501, item9.mField.getField()); |
| 315 | EXPECT_EQ(Type::INT, item9.mValue.getType()); |
| 316 | EXPECT_EQ(111, item9.mValue.int_value); |
| 317 | |
| 318 | const FieldValue& item10 = event1.getValues()[10]; |
| 319 | EXPECT_EQ(0x2020584, item10.mField.getField()); |
| 320 | EXPECT_EQ(Type::FLOAT, item10.mValue.getType()); |
| 321 | EXPECT_EQ(2.2f, item10.mValue.float_value); |
| 322 | |
| 323 | const FieldValue& item11 = event1.getValues()[11]; |
| 324 | EXPECT_EQ(0x2028601, item11.mField.getField()); |
| 325 | EXPECT_EQ(Type::INT, item11.mValue.getType()); |
| 326 | EXPECT_EQ(222, item11.mValue.int_value); |
| 327 | |
| 328 | const FieldValue& item12 = event1.getValues()[12]; |
| 329 | EXPECT_EQ(0x2028684, item12.mField.getField()); |
| 330 | EXPECT_EQ(Type::FLOAT, item12.mValue.getType()); |
| 331 | EXPECT_EQ(1.1f, item12.mValue.float_value); |
| 332 | } |
| 333 | |
Yangster-mac | 2087716 | 2017-12-22 17:19:39 -0800 | [diff] [blame] | 334 | |
| 335 | } // namespace statsd |
| 336 | } // namespace os |
| 337 | } // namespace android |
| 338 | #else |
| 339 | GTEST_LOG_(INFO) << "This test does nothing.\n"; |
| 340 | #endif |