blob: 9e69d977f351866314301d5cab8b0cabda482a65 [file] [log] [blame]
Yao Chen8a8d16c2018-02-08 14:50:40 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#include <gtest/gtest.h>
Yao Chen9c1debe2018-02-19 14:39:19 -080017#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
Yao Chen8a8d16c2018-02-08 14:50:40 -080018#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
19#include "matchers/matcher_util.h"
Yao Chen9c1debe2018-02-19 14:39:19 -080020#include "src/logd/LogEvent.h"
Yao Chen8a8d16c2018-02-08 14:50:40 -080021#include "stats_log_util.h"
22#include "stats_util.h"
23#include "subscriber/SubscriberReporter.h"
24
25#ifdef __ANDROID__
26
Joe Onorato99598ee2019-02-11 15:55:13 +000027using android::util::ProtoReader;
28
Yao Chen8a8d16c2018-02-08 14:50:40 -080029namespace android {
30namespace os {
31namespace statsd {
32
33TEST(AtomMatcherTest, TestFieldTranslation) {
34 FieldMatcher matcher1;
35 matcher1.set_field(10);
36 FieldMatcher* child = matcher1.add_child();
37 child->set_field(1);
38 child->set_position(Position::ANY);
39
40 child = child->add_child();
41 child->set_field(1);
42
43 vector<Matcher> output;
44 translateFieldMatcher(matcher1, &output);
45
46 EXPECT_EQ((size_t)1, output.size());
47
48 const auto& matcher12 = output[0];
49 EXPECT_EQ((int32_t)10, matcher12.mMatcher.getTag());
Yangster-mace06cfd72018-03-10 23:22:59 -080050 EXPECT_EQ((int32_t)0x02010001, matcher12.mMatcher.getField());
Yao Chen8a8d16c2018-02-08 14:50:40 -080051 EXPECT_EQ((int32_t)0xff7f007f, matcher12.mMask);
52}
53
Yangster-mace06cfd72018-03-10 23:22:59 -080054TEST(AtomMatcherTest, TestFieldTranslation_ALL) {
Yao Chen8a8d16c2018-02-08 14:50:40 -080055 FieldMatcher matcher1;
56 matcher1.set_field(10);
57 FieldMatcher* child = matcher1.add_child();
58 child->set_field(1);
Yangster-mace06cfd72018-03-10 23:22:59 -080059 child->set_position(Position::ALL);
Yao Chen8a8d16c2018-02-08 14:50:40 -080060
61 child = child->add_child();
62 child->set_field(1);
63
Yangster-mace06cfd72018-03-10 23:22:59 -080064 vector<Matcher> output;
65 translateFieldMatcher(matcher1, &output);
66
67 EXPECT_EQ((size_t)1, output.size());
68
69 const auto& matcher12 = output[0];
70 EXPECT_EQ((int32_t)10, matcher12.mMatcher.getTag());
71 EXPECT_EQ((int32_t)0x02010001, matcher12.mMatcher.getField());
72 EXPECT_EQ((int32_t)0xff7f7f7f, matcher12.mMask);
73}
74
75TEST(AtomMatcherTest, TestFilter_ALL) {
76 FieldMatcher matcher1;
77 matcher1.set_field(10);
78 FieldMatcher* child = matcher1.add_child();
79 child->set_field(1);
80 child->set_position(Position::ALL);
81
82 child->add_child()->set_field(1);
83 child->add_child()->set_field(2);
84
Yao Chen8a8d16c2018-02-08 14:50:40 -080085 child = matcher1.add_child();
86 child->set_field(2);
87
88 vector<Matcher> matchers;
89 translateFieldMatcher(matcher1, &matchers);
90
Yao Chen9c1debe2018-02-19 14:39:19 -080091 AttributionNodeInternal attribution_node1;
Yao Chen8a8d16c2018-02-08 14:50:40 -080092 attribution_node1.set_uid(1111);
93 attribution_node1.set_tag("location1");
94
Yao Chen9c1debe2018-02-19 14:39:19 -080095 AttributionNodeInternal attribution_node2;
Yao Chen8a8d16c2018-02-08 14:50:40 -080096 attribution_node2.set_uid(2222);
97 attribution_node2.set_tag("location2");
98
Yao Chen9c1debe2018-02-19 14:39:19 -080099 AttributionNodeInternal attribution_node3;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800100 attribution_node3.set_uid(3333);
101 attribution_node3.set_tag("location3");
Yao Chen9c1debe2018-02-19 14:39:19 -0800102 std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2,
103 attribution_node3};
Yao Chen8a8d16c2018-02-08 14:50:40 -0800104
105 // Set up the event
106 LogEvent event(10, 12345);
107 event.write(attribution_nodes);
108 event.write("some value");
109 // Convert to a LogEvent
110 event.init();
Yangster-mace06cfd72018-03-10 23:22:59 -0800111 HashableDimensionKey output;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800112
113 filterValues(matchers, event.getValues(), &output);
114
Yangster-mace06cfd72018-03-10 23:22:59 -0800115 EXPECT_EQ((size_t)7, output.getValues().size());
116 EXPECT_EQ((int32_t)0x02010101, output.getValues()[0].mField.getField());
117 EXPECT_EQ((int32_t)1111, output.getValues()[0].mValue.int_value);
118 EXPECT_EQ((int32_t)0x02010102, output.getValues()[1].mField.getField());
119 EXPECT_EQ("location1", output.getValues()[1].mValue.str_value);
Yao Chen8a8d16c2018-02-08 14:50:40 -0800120
Yangster-mace06cfd72018-03-10 23:22:59 -0800121 EXPECT_EQ((int32_t)0x02010201, output.getValues()[2].mField.getField());
122 EXPECT_EQ((int32_t)2222, output.getValues()[2].mValue.int_value);
123 EXPECT_EQ((int32_t)0x02010202, output.getValues()[3].mField.getField());
124 EXPECT_EQ("location2", output.getValues()[3].mValue.str_value);
Yao Chen8a8d16c2018-02-08 14:50:40 -0800125
Yangster-mace06cfd72018-03-10 23:22:59 -0800126 EXPECT_EQ((int32_t)0x02010301, output.getValues()[4].mField.getField());
127 EXPECT_EQ((int32_t)3333, output.getValues()[4].mValue.int_value);
128 EXPECT_EQ((int32_t)0x02010302, output.getValues()[5].mField.getField());
129 EXPECT_EQ("location3", output.getValues()[5].mValue.str_value);
Yao Chen8a8d16c2018-02-08 14:50:40 -0800130
Yangster-mace06cfd72018-03-10 23:22:59 -0800131 EXPECT_EQ((int32_t)0x00020000, output.getValues()[6].mField.getField());
132 EXPECT_EQ("some value", output.getValues()[6].mValue.str_value);
Yao Chen8a8d16c2018-02-08 14:50:40 -0800133}
134
135TEST(AtomMatcherTest, TestSubDimension) {
136 HashableDimensionKey dim;
137
138 int pos1[] = {1, 1, 1};
139 int pos2[] = {1, 1, 2};
140 int pos3[] = {1, 1, 3};
141 int pos4[] = {2, 0, 0};
142 Field field1(10, pos1, 2);
143 Field field2(10, pos2, 2);
144
145 Field field3(10, pos3, 2);
146 Field field4(10, pos4, 0);
147
148 Value value1((int32_t)10025);
149 Value value2("tag");
150
151 Value value11((int32_t)10026);
152 Value value22("tag2");
153
154 dim.addValue(FieldValue(field1, value1));
155 dim.addValue(FieldValue(field2, value2));
156
157 HashableDimensionKey subDim1;
158 subDim1.addValue(FieldValue(field1, value1));
159
160 HashableDimensionKey subDim2;
161 subDim1.addValue(FieldValue(field2, value2));
162
163 EXPECT_TRUE(dim.contains(dim));
164 EXPECT_TRUE(dim.contains(subDim1));
165 EXPECT_TRUE(dim.contains(subDim2));
166
167 HashableDimensionKey subDim3;
168 subDim3.addValue(FieldValue(field1, value11));
169 EXPECT_FALSE(dim.contains(subDim3));
170
171 HashableDimensionKey subDim4;
172 // Empty dimension is always a sub dimension of other dimensions
173 EXPECT_TRUE(dim.contains(subDim4));
174}
175
176TEST(AtomMatcherTest, TestMetric2ConditionLink) {
Yao Chen9c1debe2018-02-19 14:39:19 -0800177 AttributionNodeInternal attribution_node1;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800178 attribution_node1.set_uid(1111);
179 attribution_node1.set_tag("location1");
180
Yao Chen9c1debe2018-02-19 14:39:19 -0800181 AttributionNodeInternal attribution_node2;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800182 attribution_node2.set_uid(2222);
183 attribution_node2.set_tag("location2");
184
Yao Chen9c1debe2018-02-19 14:39:19 -0800185 AttributionNodeInternal attribution_node3;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800186 attribution_node3.set_uid(3333);
187 attribution_node3.set_tag("location3");
Yao Chen9c1debe2018-02-19 14:39:19 -0800188 std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2,
189 attribution_node3};
Yao Chen8a8d16c2018-02-08 14:50:40 -0800190
191 // Set up the event
192 LogEvent event(10, 12345);
193 event.write(attribution_nodes);
194 event.write("some value");
195 // Convert to a LogEvent
196 event.init();
197
198 FieldMatcher whatMatcher;
199 whatMatcher.set_field(10);
200 FieldMatcher* child11 = whatMatcher.add_child();
201 child11->set_field(1);
202 child11->set_position(Position::ANY);
203 child11 = child11->add_child();
204 child11->set_field(1);
205
206 FieldMatcher conditionMatcher;
207 conditionMatcher.set_field(27);
208 FieldMatcher* child2 = conditionMatcher.add_child();
209 child2->set_field(2);
210 child2->set_position(Position::LAST);
211
212 child2 = child2->add_child();
213 child2->set_field(2);
214
215 Metric2Condition link;
216
217 translateFieldMatcher(whatMatcher, &link.metricFields);
218 translateFieldMatcher(conditionMatcher, &link.conditionFields);
219
220 EXPECT_EQ((size_t)1, link.metricFields.size());
221 EXPECT_EQ((int32_t)0x02010001, link.metricFields[0].mMatcher.getField());
222 EXPECT_EQ((int32_t)0xff7f007f, link.metricFields[0].mMask);
223 EXPECT_EQ((int32_t)10, link.metricFields[0].mMatcher.getTag());
224
225 EXPECT_EQ((size_t)1, link.conditionFields.size());
226 EXPECT_EQ((int32_t)0x02028002, link.conditionFields[0].mMatcher.getField());
227 EXPECT_EQ((int32_t)0xff7f807f, link.conditionFields[0].mMask);
228 EXPECT_EQ((int32_t)27, link.conditionFields[0].mMatcher.getTag());
229}
230
Yangster-mac9def8e32018-04-17 13:55:51 -0700231TEST(AtomMatcherTest, TestWriteDimensionPath) {
232 for (auto position : {Position::ANY, Position::ALL, Position::FIRST, Position::LAST}) {
233 FieldMatcher matcher1;
234 matcher1.set_field(10);
235 FieldMatcher* child = matcher1.add_child();
236 child->set_field(2);
237 child->set_position(position);
238 child->add_child()->set_field(1);
239 child->add_child()->set_field(3);
240
241 child = matcher1.add_child();
242 child->set_field(4);
243
244 child = matcher1.add_child();
245 child->set_field(6);
246 child->add_child()->set_field(2);
247
248 vector<Matcher> matchers;
249 translateFieldMatcher(matcher1, &matchers);
250
251 android::util::ProtoOutputStream protoOut;
252 writeDimensionPathToProto(matchers, &protoOut);
253
254 vector<uint8_t> outData;
255 outData.resize(protoOut.size());
256 size_t pos = 0;
Joe Onorato99598ee2019-02-11 15:55:13 +0000257 sp<ProtoReader> reader = protoOut.data();
258 while (reader->readBuffer() != NULL) {
259 size_t toRead = reader->currentToRead();
260 std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
Yangster-mac9def8e32018-04-17 13:55:51 -0700261 pos += toRead;
Joe Onorato99598ee2019-02-11 15:55:13 +0000262 reader->move(toRead);
Yangster-mac9def8e32018-04-17 13:55:51 -0700263 }
264
265 DimensionsValue result;
266 EXPECT_EQ(true, result.ParseFromArray(&outData[0], outData.size()));
267
268 EXPECT_EQ(10, result.field());
269 EXPECT_EQ(DimensionsValue::ValueCase::kValueTuple, result.value_case());
270 EXPECT_EQ(3, result.value_tuple().dimensions_value_size());
271
272 const auto& dim1 = result.value_tuple().dimensions_value(0);
273 EXPECT_EQ(2, dim1.field());
274 EXPECT_EQ(2, dim1.value_tuple().dimensions_value_size());
275
276 const auto& dim11 = dim1.value_tuple().dimensions_value(0);
277 EXPECT_EQ(1, dim11.field());
278
279 const auto& dim12 = dim1.value_tuple().dimensions_value(1);
280 EXPECT_EQ(3, dim12.field());
281
282 const auto& dim2 = result.value_tuple().dimensions_value(1);
283 EXPECT_EQ(4, dim2.field());
284
285 const auto& dim3 = result.value_tuple().dimensions_value(2);
286 EXPECT_EQ(6, dim3.field());
287 EXPECT_EQ(1, dim3.value_tuple().dimensions_value_size());
288 const auto& dim31 = dim3.value_tuple().dimensions_value(0);
289 EXPECT_EQ(2, dim31.field());
290 }
291}
292
Ruchir Rastogi56da4c32020-02-03 18:53:24 -0800293//TODO(b/149050405) Update this test for StatsDimensionValueParcel
294//TEST(AtomMatcherTest, TestSubscriberDimensionWrite) {
295// HashableDimensionKey dim;
296//
297// int pos1[] = {1, 1, 1};
298// int pos2[] = {1, 1, 2};
299// int pos3[] = {1, 1, 3};
300// int pos4[] = {2, 0, 0};
301//
302// Field field1(10, pos1, 2);
303// Field field2(10, pos2, 2);
304// Field field3(10, pos3, 2);
305// Field field4(10, pos4, 0);
306//
307// Value value1((int32_t)10025);
308// Value value2("tag");
309// Value value3((int32_t)987654);
310// Value value4((int32_t)99999);
311//
312// dim.addValue(FieldValue(field1, value1));
313// dim.addValue(FieldValue(field2, value2));
314// dim.addValue(FieldValue(field3, value3));
315// dim.addValue(FieldValue(field4, value4));
316//
317// SubscriberReporter::getStatsDimensionsValue(dim);
318// // TODO(b/110562792): can't test anything here because StatsDimensionsValue class doesn't
319// // have any read api.
320//}
Yao Chen8a8d16c2018-02-08 14:50:40 -0800321
322TEST(AtomMatcherTest, TestWriteDimensionToProto) {
323 HashableDimensionKey dim;
324 int pos1[] = {1, 1, 1};
325 int pos2[] = {1, 1, 2};
326 int pos3[] = {1, 1, 3};
327 int pos4[] = {2, 0, 0};
328 Field field1(10, pos1, 2);
329 Field field2(10, pos2, 2);
330 Field field3(10, pos3, 2);
331 Field field4(10, pos4, 0);
332
333 Value value1((int32_t)10025);
334 Value value2("tag");
335 Value value3((int32_t)987654);
336 Value value4((int32_t)99999);
337
338 dim.addValue(FieldValue(field1, value1));
339 dim.addValue(FieldValue(field2, value2));
340 dim.addValue(FieldValue(field3, value3));
341 dim.addValue(FieldValue(field4, value4));
342
343 android::util::ProtoOutputStream protoOut;
Yangster-mac9def8e32018-04-17 13:55:51 -0700344 writeDimensionToProto(dim, nullptr /* include strings */, &protoOut);
Yao Chen8a8d16c2018-02-08 14:50:40 -0800345
346 vector<uint8_t> outData;
347 outData.resize(protoOut.size());
348 size_t pos = 0;
Joe Onorato99598ee2019-02-11 15:55:13 +0000349 sp<ProtoReader> reader = protoOut.data();
350 while (reader->readBuffer() != NULL) {
351 size_t toRead = reader->currentToRead();
352 std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
Yao Chen8a8d16c2018-02-08 14:50:40 -0800353 pos += toRead;
Joe Onorato99598ee2019-02-11 15:55:13 +0000354 reader->move(toRead);
Yao Chen8a8d16c2018-02-08 14:50:40 -0800355 }
356
357 DimensionsValue result;
358 EXPECT_EQ(true, result.ParseFromArray(&outData[0], outData.size()));
359 EXPECT_EQ(10, result.field());
360 EXPECT_EQ(DimensionsValue::ValueCase::kValueTuple, result.value_case());
361 EXPECT_EQ(2, result.value_tuple().dimensions_value_size());
362
363 const auto& dim1 = result.value_tuple().dimensions_value(0);
364 EXPECT_EQ(DimensionsValue::ValueCase::kValueTuple, dim1.value_case());
365 EXPECT_EQ(3, dim1.value_tuple().dimensions_value_size());
366
367 const auto& dim11 = dim1.value_tuple().dimensions_value(0);
368 EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim11.value_case());
369 EXPECT_EQ(10025, dim11.value_int());
370
371 const auto& dim12 = dim1.value_tuple().dimensions_value(1);
372 EXPECT_EQ(DimensionsValue::ValueCase::kValueStr, dim12.value_case());
373 EXPECT_EQ("tag", dim12.value_str());
374
375 const auto& dim13 = dim1.value_tuple().dimensions_value(2);
376 EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim13.value_case());
377 EXPECT_EQ(987654, dim13.value_int());
378
379 const auto& dim2 = result.value_tuple().dimensions_value(1);
380 EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim2.value_case());
381 EXPECT_EQ(99999, dim2.value_int());
382}
383
Yangster-mac9def8e32018-04-17 13:55:51 -0700384TEST(AtomMatcherTest, TestWriteDimensionLeafNodesToProto) {
385 HashableDimensionKey dim;
386 int pos1[] = {1, 1, 1};
387 int pos2[] = {1, 1, 2};
388 int pos3[] = {1, 1, 3};
389 int pos4[] = {2, 0, 0};
390 Field field1(10, pos1, 2);
391 Field field2(10, pos2, 2);
392 Field field3(10, pos3, 2);
393 Field field4(10, pos4, 0);
394
395 Value value1((int32_t)10025);
396 Value value2("tag");
397 Value value3((int32_t)987654);
398 Value value4((int64_t)99999);
399
400 dim.addValue(FieldValue(field1, value1));
401 dim.addValue(FieldValue(field2, value2));
402 dim.addValue(FieldValue(field3, value3));
403 dim.addValue(FieldValue(field4, value4));
404
405 android::util::ProtoOutputStream protoOut;
406 writeDimensionLeafNodesToProto(dim, 1, nullptr /* include strings */, &protoOut);
407
408 vector<uint8_t> outData;
409 outData.resize(protoOut.size());
410 size_t pos = 0;
Joe Onorato99598ee2019-02-11 15:55:13 +0000411 sp<ProtoReader> reader = protoOut.data();
412 while (reader->readBuffer() != NULL) {
413 size_t toRead = reader->currentToRead();
414 std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
Yangster-mac9def8e32018-04-17 13:55:51 -0700415 pos += toRead;
Joe Onorato99598ee2019-02-11 15:55:13 +0000416 reader->move(toRead);
Yangster-mac9def8e32018-04-17 13:55:51 -0700417 }
418
419 DimensionsValueTuple result;
420 EXPECT_EQ(true, result.ParseFromArray(&outData[0], outData.size()));
421 EXPECT_EQ(4, result.dimensions_value_size());
422
423 const auto& dim1 = result.dimensions_value(0);
424 EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim1.value_case());
425 EXPECT_EQ(10025, dim1.value_int());
426
427 const auto& dim2 = result.dimensions_value(1);
428 EXPECT_EQ(DimensionsValue::ValueCase::kValueStr, dim2.value_case());
429 EXPECT_EQ("tag", dim2.value_str());
430
431 const auto& dim3 = result.dimensions_value(2);
432 EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim3.value_case());
433 EXPECT_EQ(987654, dim3.value_int());
434
435 const auto& dim4 = result.dimensions_value(3);
436 EXPECT_EQ(DimensionsValue::ValueCase::kValueLong, dim4.value_case());
437 EXPECT_EQ(99999, dim4.value_long());
438}
439
Yao Chen8a8d16c2018-02-08 14:50:40 -0800440TEST(AtomMatcherTest, TestWriteAtomToProto) {
Yao Chen9c1debe2018-02-19 14:39:19 -0800441 AttributionNodeInternal attribution_node1;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800442 attribution_node1.set_uid(1111);
443 attribution_node1.set_tag("location1");
444
Yao Chen9c1debe2018-02-19 14:39:19 -0800445 AttributionNodeInternal attribution_node2;
Yao Chen8a8d16c2018-02-08 14:50:40 -0800446 attribution_node2.set_uid(2222);
447 attribution_node2.set_tag("location2");
448
Yao Chen9c1debe2018-02-19 14:39:19 -0800449 std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2};
Yao Chen8a8d16c2018-02-08 14:50:40 -0800450
451 // Set up the event
452 LogEvent event(4, 12345);
453 event.write(attribution_nodes);
454 event.write((int32_t)999);
455 // Convert to a LogEvent
456 event.init();
457
458 android::util::ProtoOutputStream protoOutput;
459 writeFieldValueTreeToStream(event.GetTagId(), event.getValues(), &protoOutput);
460
461 vector<uint8_t> outData;
462 outData.resize(protoOutput.size());
463 size_t pos = 0;
Joe Onorato99598ee2019-02-11 15:55:13 +0000464 sp<ProtoReader> reader = protoOutput.data();
465 while (reader->readBuffer() != NULL) {
466 size_t toRead = reader->currentToRead();
467 std::memcpy(&(outData[pos]), reader->readBuffer(), toRead);
Yao Chen8a8d16c2018-02-08 14:50:40 -0800468 pos += toRead;
Joe Onorato99598ee2019-02-11 15:55:13 +0000469 reader->move(toRead);
Yao Chen8a8d16c2018-02-08 14:50:40 -0800470 }
471
472 Atom result;
473 EXPECT_EQ(true, result.ParseFromArray(&outData[0], outData.size()));
474 EXPECT_EQ(Atom::PushedCase::kBleScanResultReceived, result.pushed_case());
475 const auto& atom = result.ble_scan_result_received();
476 EXPECT_EQ(2, atom.attribution_node_size());
477 EXPECT_EQ(1111, atom.attribution_node(0).uid());
478 EXPECT_EQ("location1", atom.attribution_node(0).tag());
479 EXPECT_EQ(2222, atom.attribution_node(1).uid());
480 EXPECT_EQ("location2", atom.attribution_node(1).tag());
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800481 EXPECT_EQ(999, atom.num_results());
Yao Chen8a8d16c2018-02-08 14:50:40 -0800482}
483
tsaichristine3a83e812019-12-13 16:46:11 -0800484/*
485 * Test two Matchers is not a subset of one Matcher.
486 * Test one Matcher is subset of two Matchers.
487 */
488TEST(AtomMatcherTest, TestSubsetDimensions1) {
489 // Initialize first set of matchers
490 FieldMatcher matcher1;
491 matcher1.set_field(10);
492
493 FieldMatcher* child = matcher1.add_child();
494 child->set_field(1);
495 child->set_position(Position::ALL);
496 child->add_child()->set_field(1);
497 child->add_child()->set_field(2);
498
499 vector<Matcher> matchers1;
500 translateFieldMatcher(matcher1, &matchers1);
501 EXPECT_EQ(2, matchers1.size());
502
503 // Initialize second set of matchers
504 FieldMatcher matcher2;
505 matcher2.set_field(10);
506
507 child = matcher2.add_child();
508 child->set_field(1);
509 child->set_position(Position::ALL);
510 child->add_child()->set_field(1);
511
512 vector<Matcher> matchers2;
513 translateFieldMatcher(matcher2, &matchers2);
514 EXPECT_EQ(1, matchers2.size());
515
516 EXPECT_FALSE(subsetDimensions(matchers1, matchers2));
517 EXPECT_TRUE(subsetDimensions(matchers2, matchers1));
518}
519/*
520 * Test not a subset with one matching Matcher, one non-matching Matcher.
521 */
522TEST(AtomMatcherTest, TestSubsetDimensions2) {
523 // Initialize first set of matchers
524 FieldMatcher matcher1;
525 matcher1.set_field(10);
526
527 FieldMatcher* child = matcher1.add_child();
528 child->set_field(1);
529
530 child = matcher1.add_child();
531 child->set_field(2);
532
533 vector<Matcher> matchers1;
534 translateFieldMatcher(matcher1, &matchers1);
535
536 // Initialize second set of matchers
537 FieldMatcher matcher2;
538 matcher2.set_field(10);
539
540 child = matcher2.add_child();
541 child->set_field(1);
542
543 child = matcher2.add_child();
544 child->set_field(3);
545
546 vector<Matcher> matchers2;
547 translateFieldMatcher(matcher2, &matchers2);
548
549 EXPECT_FALSE(subsetDimensions(matchers1, matchers2));
550}
551
552/*
553 * Test not a subset if parent field is not equal.
554 */
555TEST(AtomMatcherTest, TestSubsetDimensions3) {
556 // Initialize first set of matchers
557 FieldMatcher matcher1;
558 matcher1.set_field(10);
559
560 FieldMatcher* child = matcher1.add_child();
561 child->set_field(1);
562
563 vector<Matcher> matchers1;
564 translateFieldMatcher(matcher1, &matchers1);
565
566 // Initialize second set of matchers
567 FieldMatcher matcher2;
568 matcher2.set_field(5);
569
570 child = matcher2.add_child();
571 child->set_field(1);
572
573 vector<Matcher> matchers2;
574 translateFieldMatcher(matcher2, &matchers2);
575
576 EXPECT_FALSE(subsetDimensions(matchers1, matchers2));
577}
578
579/*
580 * Test is subset with two matching Matchers.
581 */
582TEST(AtomMatcherTest, TestSubsetDimensions4) {
583 // Initialize first set of matchers
584 FieldMatcher matcher1;
585 matcher1.set_field(10);
586
587 FieldMatcher* child = matcher1.add_child();
588 child->set_field(1);
589
590 child = matcher1.add_child();
591 child->set_field(2);
592
593 vector<Matcher> matchers1;
594 translateFieldMatcher(matcher1, &matchers1);
595
596 // Initialize second set of matchers
597 FieldMatcher matcher2;
598 matcher2.set_field(10);
599
600 child = matcher2.add_child();
601 child->set_field(1);
602
603 child = matcher2.add_child();
604 child->set_field(2);
605
606 child = matcher2.add_child();
607 child->set_field(3);
608
609 vector<Matcher> matchers2;
610 translateFieldMatcher(matcher2, &matchers2);
611
612 EXPECT_TRUE(subsetDimensions(matchers1, matchers2));
613 EXPECT_FALSE(subsetDimensions(matchers2, matchers1));
614}
Yao Chen8a8d16c2018-02-08 14:50:40 -0800615
616} // namespace statsd
617} // namespace os
618} // namespace android
619#else
620GTEST_LOG_(INFO) << "This test does nothing.\n";
Yao Chen5bfffb52018-06-21 16:58:51 -0700621#endif