18a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen/* 28a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * Copyright (C) 2017 The Android Open Source Project 38a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * 48a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * Licensed under the Apache License, Version 2.0 (the "License"); 58a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * you may not use this file except in compliance with the License. 68a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * You may obtain a copy of the License at 78a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * 88a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * http://www.apache.org/licenses/LICENSE-2.0 98a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * 108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * Unless required by applicable law or agreed to in writing, software 118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * distributed under the License is distributed on an "AS IS" BASIS, 128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * See the License for the specific language governing permissions and 148a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * limitations under the License. 158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen */ 168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#include <gtest/gtest.h> 179c1debe330006b2b4d5c08a55905789c57369609Yao Chen#include "frameworks/base/cmds/statsd/src/stats_log.pb.h" 188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h" 198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#include "matchers/matcher_util.h" 209c1debe330006b2b4d5c08a55905789c57369609Yao Chen#include "src/logd/LogEvent.h" 218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#include "stats_log_util.h" 228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#include "stats_util.h" 238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#include "subscriber/SubscriberReporter.h" 248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#ifdef __ANDROID__ 268a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 278a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chennamespace android { 288a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chennamespace os { 298a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chennamespace statsd { 308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 318a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenTEST(AtomMatcherTest, TestFieldTranslation) { 328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen FieldMatcher matcher1; 338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen matcher1.set_field(10); 348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen FieldMatcher* child = matcher1.add_child(); 358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child->set_field(1); 368a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child->set_position(Position::ANY); 378a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child = child->add_child(); 398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child->set_field(1); 408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen vector<Matcher> output; 428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen translateFieldMatcher(matcher1, &output); 438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 448a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ((size_t)1, output.size()); 458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const auto& matcher12 = output[0]; 478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ((int32_t)10, matcher12.mMatcher.getTag()); 48e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)0x02010001, matcher12.mMatcher.getField()); 498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ((int32_t)0xff7f007f, matcher12.mMask); 508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} 518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 52e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-macTEST(AtomMatcherTest, TestFieldTranslation_ALL) { 538a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen FieldMatcher matcher1; 548a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen matcher1.set_field(10); 558a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen FieldMatcher* child = matcher1.add_child(); 568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child->set_field(1); 57e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac child->set_position(Position::ALL); 588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 598a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child = child->add_child(); 608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child->set_field(1); 618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 62e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac vector<Matcher> output; 63e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac translateFieldMatcher(matcher1, &output); 64e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac 65e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((size_t)1, output.size()); 66e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac 67e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac const auto& matcher12 = output[0]; 68e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)10, matcher12.mMatcher.getTag()); 69e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)0x02010001, matcher12.mMatcher.getField()); 70e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)0xff7f7f7f, matcher12.mMask); 71e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac} 72e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac 73e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-macTEST(AtomMatcherTest, TestFilter_ALL) { 74e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac FieldMatcher matcher1; 75e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac matcher1.set_field(10); 76e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac FieldMatcher* child = matcher1.add_child(); 77e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac child->set_field(1); 78e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac child->set_position(Position::ALL); 79e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac 80e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac child->add_child()->set_field(1); 81e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac child->add_child()->set_field(2); 82e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac 838a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child = matcher1.add_child(); 848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child->set_field(2); 858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen vector<Matcher> matchers; 878a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen translateFieldMatcher(matcher1, &matchers); 888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 899c1debe330006b2b4d5c08a55905789c57369609Yao Chen AttributionNodeInternal attribution_node1; 908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node1.set_uid(1111); 918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node1.set_tag("location1"); 928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 939c1debe330006b2b4d5c08a55905789c57369609Yao Chen AttributionNodeInternal attribution_node2; 948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node2.set_uid(2222); 958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node2.set_tag("location2"); 968a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 979c1debe330006b2b4d5c08a55905789c57369609Yao Chen AttributionNodeInternal attribution_node3; 988a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node3.set_uid(3333); 998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node3.set_tag("location3"); 1009c1debe330006b2b4d5c08a55905789c57369609Yao Chen std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2, 1019c1debe330006b2b4d5c08a55905789c57369609Yao Chen attribution_node3}; 1028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Set up the event 1048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen LogEvent event(10, 12345); 1058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen event.write(attribution_nodes); 1068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen event.write("some value"); 1078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Convert to a LogEvent 1088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen event.init(); 109e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac HashableDimensionKey output; 1108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen filterValues(matchers, event.getValues(), &output); 1128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 113e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((size_t)7, output.getValues().size()); 114e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)0x02010101, output.getValues()[0].mField.getField()); 115e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)1111, output.getValues()[0].mValue.int_value); 116e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)0x02010102, output.getValues()[1].mField.getField()); 117e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ("location1", output.getValues()[1].mValue.str_value); 118e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac 119e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)0x02010201, output.getValues()[2].mField.getField()); 120e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)2222, output.getValues()[2].mValue.int_value); 121e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)0x02010202, output.getValues()[3].mField.getField()); 122e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ("location2", output.getValues()[3].mValue.str_value); 123e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac 124e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)0x02010301, output.getValues()[4].mField.getField()); 125e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)3333, output.getValues()[4].mValue.int_value); 126e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)0x02010302, output.getValues()[5].mField.getField()); 127e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ("location3", output.getValues()[5].mValue.str_value); 128e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac 129e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ((int32_t)0x00020000, output.getValues()[6].mField.getField()); 130e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac EXPECT_EQ("some value", output.getValues()[6].mValue.str_value); 1318a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} 1328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenTEST(AtomMatcherTest, TestSubDimension) { 1348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen HashableDimensionKey dim; 1358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1368a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos1[] = {1, 1, 1}; 1378a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos2[] = {1, 1, 2}; 1388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos3[] = {1, 1, 3}; 1398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos4[] = {2, 0, 0}; 1408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field1(10, pos1, 2); 1418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field2(10, pos2, 2); 1428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field3(10, pos3, 2); 1448a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field4(10, pos4, 0); 1458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value1((int32_t)10025); 1478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value2("tag"); 1488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value11((int32_t)10026); 1508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value22("tag2"); 1518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.addValue(FieldValue(field1, value1)); 1538a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.addValue(FieldValue(field2, value2)); 1548a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1558a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen HashableDimensionKey subDim1; 1568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen subDim1.addValue(FieldValue(field1, value1)); 1578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen HashableDimensionKey subDim2; 1598a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen subDim1.addValue(FieldValue(field2, value2)); 1608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(dim.contains(dim)); 1628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(dim.contains(subDim1)); 1638a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(dim.contains(subDim2)); 1648a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen HashableDimensionKey subDim3; 1668a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen subDim3.addValue(FieldValue(field1, value11)); 1678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_FALSE(dim.contains(subDim3)); 1688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1698a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen HashableDimensionKey subDim4; 1708a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Empty dimension is always a sub dimension of other dimensions 1718a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(dim.contains(subDim4)); 1728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} 1738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenTEST(AtomMatcherTest, TestMetric2ConditionLink) { 1759c1debe330006b2b4d5c08a55905789c57369609Yao Chen AttributionNodeInternal attribution_node1; 1768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node1.set_uid(1111); 1778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node1.set_tag("location1"); 1788a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1799c1debe330006b2b4d5c08a55905789c57369609Yao Chen AttributionNodeInternal attribution_node2; 1808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node2.set_uid(2222); 1818a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node2.set_tag("location2"); 1828a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1839c1debe330006b2b4d5c08a55905789c57369609Yao Chen AttributionNodeInternal attribution_node3; 1848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node3.set_uid(3333); 1858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node3.set_tag("location3"); 1869c1debe330006b2b4d5c08a55905789c57369609Yao Chen std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2, 1879c1debe330006b2b4d5c08a55905789c57369609Yao Chen attribution_node3}; 1888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Set up the event 1908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen LogEvent event(10, 12345); 1918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen event.write(attribution_nodes); 1928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen event.write("some value"); 1938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Convert to a LogEvent 1948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen event.init(); 1958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1968a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen FieldMatcher whatMatcher; 1978a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen whatMatcher.set_field(10); 1988a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen FieldMatcher* child11 = whatMatcher.add_child(); 1998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child11->set_field(1); 2008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child11->set_position(Position::ANY); 2018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child11 = child11->add_child(); 2028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child11->set_field(1); 2038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen FieldMatcher conditionMatcher; 2058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen conditionMatcher.set_field(27); 2068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen FieldMatcher* child2 = conditionMatcher.add_child(); 2078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child2->set_field(2); 2088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child2->set_position(Position::LAST); 2098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child2 = child2->add_child(); 2118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen child2->set_field(2); 2128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Metric2Condition link; 2148a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen translateFieldMatcher(whatMatcher, &link.metricFields); 2168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen translateFieldMatcher(conditionMatcher, &link.conditionFields); 2178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ((size_t)1, link.metricFields.size()); 2198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ((int32_t)0x02010001, link.metricFields[0].mMatcher.getField()); 2208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ((int32_t)0xff7f007f, link.metricFields[0].mMask); 2218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ((int32_t)10, link.metricFields[0].mMatcher.getTag()); 2228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ((size_t)1, link.conditionFields.size()); 2248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ((int32_t)0x02028002, link.conditionFields[0].mMatcher.getField()); 2258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ((int32_t)0xff7f807f, link.conditionFields[0].mMask); 2268a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ((int32_t)27, link.conditionFields[0].mMatcher.getTag()); 2278a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} 2288a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2299def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macTEST(AtomMatcherTest, TestWriteDimensionPath) { 2309def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac for (auto position : {Position::ANY, Position::ALL, Position::FIRST, Position::LAST}) { 2319def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac FieldMatcher matcher1; 2329def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac matcher1.set_field(10); 2339def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac FieldMatcher* child = matcher1.add_child(); 2349def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac child->set_field(2); 2359def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac child->set_position(position); 2369def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac child->add_child()->set_field(1); 2379def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac child->add_child()->set_field(3); 2389def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2399def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac child = matcher1.add_child(); 2409def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac child->set_field(4); 2419def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2429def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac child = matcher1.add_child(); 2439def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac child->set_field(6); 2449def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac child->add_child()->set_field(2); 2459def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2469def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac vector<Matcher> matchers; 2479def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac translateFieldMatcher(matcher1, &matchers); 2489def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2499def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac android::util::ProtoOutputStream protoOut; 2509def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac writeDimensionPathToProto(matchers, &protoOut); 2519def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2529def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac vector<uint8_t> outData; 2539def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac outData.resize(protoOut.size()); 2549def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac size_t pos = 0; 2559def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac auto iter = protoOut.data(); 2569def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac while (iter.readBuffer() != NULL) { 2579def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac size_t toRead = iter.currentToRead(); 2589def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac std::memcpy(&(outData[pos]), iter.readBuffer(), toRead); 2599def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac pos += toRead; 2609def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac iter.rp()->move(toRead); 2619def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 2629def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2639def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac DimensionsValue result; 2649def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(true, result.ParseFromArray(&outData[0], outData.size())); 2659def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2669def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(10, result.field()); 2679def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(DimensionsValue::ValueCase::kValueTuple, result.value_case()); 2689def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(3, result.value_tuple().dimensions_value_size()); 2699def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2709def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const auto& dim1 = result.value_tuple().dimensions_value(0); 2719def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(2, dim1.field()); 2729def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(2, dim1.value_tuple().dimensions_value_size()); 2739def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2749def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const auto& dim11 = dim1.value_tuple().dimensions_value(0); 2759def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(1, dim11.field()); 2769def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2779def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const auto& dim12 = dim1.value_tuple().dimensions_value(1); 2789def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(3, dim12.field()); 2799def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2809def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const auto& dim2 = result.value_tuple().dimensions_value(1); 2819def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(4, dim2.field()); 2829def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2839def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const auto& dim3 = result.value_tuple().dimensions_value(2); 2849def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(6, dim3.field()); 2859def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(1, dim3.value_tuple().dimensions_value_size()); 2869def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const auto& dim31 = dim3.value_tuple().dimensions_value(0); 2879def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(2, dim31.field()); 2889def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 2899def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac} 2909def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 2918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenTEST(AtomMatcherTest, TestSubscriberDimensionWrite) { 2928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen HashableDimensionKey dim; 2938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos1[] = {1, 1, 1}; 2958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos2[] = {1, 1, 2}; 2968a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos3[] = {1, 1, 3}; 2978a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos4[] = {2, 0, 0}; 2988a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 2998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field1(10, pos1, 2); 3008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field2(10, pos2, 2); 3018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field3(10, pos3, 2); 3028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field4(10, pos4, 0); 3038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value1((int32_t)10025); 3058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value2("tag"); 3068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value3((int32_t)987654); 3078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value4((int32_t)99999); 3088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.addValue(FieldValue(field1, value1)); 3108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.addValue(FieldValue(field2, value2)); 3118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.addValue(FieldValue(field3, value3)); 3128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.addValue(FieldValue(field4, value4)); 3138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3148a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen SubscriberReporter::getStatsDimensionsValue(dim); 3158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // TODO: can't test anything here because SubscriberReport class doesn't have any read api. 3168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} 3178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenTEST(AtomMatcherTest, TestWriteDimensionToProto) { 3198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen HashableDimensionKey dim; 3208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos1[] = {1, 1, 1}; 3218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos2[] = {1, 1, 2}; 3228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos3[] = {1, 1, 3}; 3238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen int pos4[] = {2, 0, 0}; 3248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field1(10, pos1, 2); 3258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field2(10, pos2, 2); 3268a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field3(10, pos3, 2); 3278a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Field field4(10, pos4, 0); 3288a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3298a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value1((int32_t)10025); 3308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value2("tag"); 3318a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value3((int32_t)987654); 3328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Value value4((int32_t)99999); 3338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.addValue(FieldValue(field1, value1)); 3358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.addValue(FieldValue(field2, value2)); 3368a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.addValue(FieldValue(field3, value3)); 3378a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen dim.addValue(FieldValue(field4, value4)); 3388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::ProtoOutputStream protoOut; 3409def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac writeDimensionToProto(dim, nullptr /* include strings */, &protoOut); 3418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen vector<uint8_t> outData; 3438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen outData.resize(protoOut.size()); 3448a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen size_t pos = 0; 3458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen auto iter = protoOut.data(); 3468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen while (iter.readBuffer() != NULL) { 3478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen size_t toRead = iter.currentToRead(); 3488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen std::memcpy(&(outData[pos]), iter.readBuffer(), toRead); 3498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen pos += toRead; 3508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen iter.rp()->move(toRead); 3518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 3528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3538a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen DimensionsValue result; 3548a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(true, result.ParseFromArray(&outData[0], outData.size())); 3558a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(10, result.field()); 3568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(DimensionsValue::ValueCase::kValueTuple, result.value_case()); 3578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(2, result.value_tuple().dimensions_value_size()); 3588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3598a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const auto& dim1 = result.value_tuple().dimensions_value(0); 3608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(DimensionsValue::ValueCase::kValueTuple, dim1.value_case()); 3618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(3, dim1.value_tuple().dimensions_value_size()); 3628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3638a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const auto& dim11 = dim1.value_tuple().dimensions_value(0); 3648a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim11.value_case()); 3658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(10025, dim11.value_int()); 3668a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const auto& dim12 = dim1.value_tuple().dimensions_value(1); 3688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(DimensionsValue::ValueCase::kValueStr, dim12.value_case()); 3698a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ("tag", dim12.value_str()); 3708a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3718a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const auto& dim13 = dim1.value_tuple().dimensions_value(2); 3728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim13.value_case()); 3738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(987654, dim13.value_int()); 3748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3758a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const auto& dim2 = result.value_tuple().dimensions_value(1); 3768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim2.value_case()); 3778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(99999, dim2.value_int()); 3788a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} 3798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 3809def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macTEST(AtomMatcherTest, TestWriteDimensionLeafNodesToProto) { 3819def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac HashableDimensionKey dim; 3829def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac int pos1[] = {1, 1, 1}; 3839def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac int pos2[] = {1, 1, 2}; 3849def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac int pos3[] = {1, 1, 3}; 3859def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac int pos4[] = {2, 0, 0}; 3869def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac Field field1(10, pos1, 2); 3879def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac Field field2(10, pos2, 2); 3889def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac Field field3(10, pos3, 2); 3899def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac Field field4(10, pos4, 0); 3909def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 3919def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac Value value1((int32_t)10025); 3929def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac Value value2("tag"); 3939def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac Value value3((int32_t)987654); 3949def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac Value value4((int64_t)99999); 3959def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 3969def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac dim.addValue(FieldValue(field1, value1)); 3979def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac dim.addValue(FieldValue(field2, value2)); 3989def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac dim.addValue(FieldValue(field3, value3)); 3999def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac dim.addValue(FieldValue(field4, value4)); 4009def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 4019def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac android::util::ProtoOutputStream protoOut; 4029def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac writeDimensionLeafNodesToProto(dim, 1, nullptr /* include strings */, &protoOut); 4039def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 4049def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac vector<uint8_t> outData; 4059def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac outData.resize(protoOut.size()); 4069def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac size_t pos = 0; 4079def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac auto iter = protoOut.data(); 4089def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac while (iter.readBuffer() != NULL) { 4099def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac size_t toRead = iter.currentToRead(); 4109def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac std::memcpy(&(outData[pos]), iter.readBuffer(), toRead); 4119def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac pos += toRead; 4129def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac iter.rp()->move(toRead); 4139def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac } 4149def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 4159def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac DimensionsValueTuple result; 4169def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(true, result.ParseFromArray(&outData[0], outData.size())); 4179def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(4, result.dimensions_value_size()); 4189def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 4199def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const auto& dim1 = result.dimensions_value(0); 4209def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim1.value_case()); 4219def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(10025, dim1.value_int()); 4229def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 4239def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const auto& dim2 = result.dimensions_value(1); 4249def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(DimensionsValue::ValueCase::kValueStr, dim2.value_case()); 4259def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ("tag", dim2.value_str()); 4269def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 4279def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const auto& dim3 = result.dimensions_value(2); 4289def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim3.value_case()); 4299def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(987654, dim3.value_int()); 4309def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 4319def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac const auto& dim4 = result.dimensions_value(3); 4329def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(DimensionsValue::ValueCase::kValueLong, dim4.value_case()); 4339def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac EXPECT_EQ(99999, dim4.value_long()); 4349def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac} 4359def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac 4368a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenTEST(AtomMatcherTest, TestWriteAtomToProto) { 4379c1debe330006b2b4d5c08a55905789c57369609Yao Chen AttributionNodeInternal attribution_node1; 4388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node1.set_uid(1111); 4398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node1.set_tag("location1"); 4408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 4419c1debe330006b2b4d5c08a55905789c57369609Yao Chen AttributionNodeInternal attribution_node2; 4428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node2.set_uid(2222); 4438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen attribution_node2.set_tag("location2"); 4448a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 4459c1debe330006b2b4d5c08a55905789c57369609Yao Chen std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2}; 4468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 4478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Set up the event 4488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen LogEvent event(4, 12345); 4498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen event.write(attribution_nodes); 4508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen event.write((int32_t)999); 4518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen // Convert to a LogEvent 4528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen event.init(); 4538a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 4548a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::ProtoOutputStream protoOutput; 4558a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen writeFieldValueTreeToStream(event.GetTagId(), event.getValues(), &protoOutput); 4568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 4578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen vector<uint8_t> outData; 4588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen outData.resize(protoOutput.size()); 4598a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen size_t pos = 0; 4608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen auto iter = protoOutput.data(); 4618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen while (iter.readBuffer() != NULL) { 4628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen size_t toRead = iter.currentToRead(); 4638a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen std::memcpy(&(outData[pos]), iter.readBuffer(), toRead); 4648a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen pos += toRead; 4658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen iter.rp()->move(toRead); 4668a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 4678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 4688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Atom result; 4698a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(true, result.ParseFromArray(&outData[0], outData.size())); 4708a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(Atom::PushedCase::kBleScanResultReceived, result.pushed_case()); 4718a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen const auto& atom = result.ble_scan_result_received(); 4728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(2, atom.attribution_node_size()); 4738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(1111, atom.attribution_node(0).uid()); 4748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ("location1", atom.attribution_node(0).tag()); 4758a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ(2222, atom.attribution_node(1).uid()); 4768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_EQ("location2", atom.attribution_node(1).tag()); 4775caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu EXPECT_EQ(999, atom.num_results()); 4788a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} 4798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 4808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 4818a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} // namespace statsd 4828a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} // namespace os 4838a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen} // namespace android 4848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#else 4858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenGTEST_LOG_(INFO) << "This test does nothing.\n"; 4868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#endif