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