FieldValue_test.cpp revision 5caaa9d8542585e537ac762c35879eb42dd6bbb4
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
2298a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenTEST(AtomMatcherTest, TestSubscriberDimensionWrite) {
2308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    HashableDimensionKey dim;
2318a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int pos1[] = {1, 1, 1};
2338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int pos2[] = {1, 1, 2};
2348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int pos3[] = {1, 1, 3};
2358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int pos4[] = {2, 0, 0};
2368a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2378a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Field field1(10, pos1, 2);
2388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Field field2(10, pos2, 2);
2398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Field field3(10, pos3, 2);
2408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Field field4(10, pos4, 0);
2418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Value value1((int32_t)10025);
2438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Value value2("tag");
2448a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Value value3((int32_t)987654);
2458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Value value4((int32_t)99999);
2468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    dim.addValue(FieldValue(field1, value1));
2488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    dim.addValue(FieldValue(field2, value2));
2498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    dim.addValue(FieldValue(field3, value3));
2508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    dim.addValue(FieldValue(field4, value4));
2518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    SubscriberReporter::getStatsDimensionsValue(dim);
2538a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    // TODO: can't test anything here because SubscriberReport class doesn't have any read api.
2548a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
2558a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenTEST(AtomMatcherTest, TestWriteDimensionToProto) {
2578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    HashableDimensionKey dim;
2588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int pos1[] = {1, 1, 1};
2598a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int pos2[] = {1, 1, 2};
2608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int pos3[] = {1, 1, 3};
2618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int pos4[] = {2, 0, 0};
2628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Field field1(10, pos1, 2);
2638a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Field field2(10, pos2, 2);
2648a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Field field3(10, pos3, 2);
2658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Field field4(10, pos4, 0);
2668a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Value value1((int32_t)10025);
2688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Value value2("tag");
2698a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Value value3((int32_t)987654);
2708a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Value value4((int32_t)99999);
2718a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    dim.addValue(FieldValue(field1, value1));
2738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    dim.addValue(FieldValue(field2, value2));
2748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    dim.addValue(FieldValue(field3, value3));
2758a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    dim.addValue(FieldValue(field4, value4));
2768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    android::util::ProtoOutputStream protoOut;
2788a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    writeDimensionToProto(dim, &protoOut);
2798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    vector<uint8_t> outData;
2818a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    outData.resize(protoOut.size());
2828a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    size_t pos = 0;
2838a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    auto iter = protoOut.data();
2848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    while (iter.readBuffer() != NULL) {
2858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        size_t toRead = iter.currentToRead();
2868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        std::memcpy(&(outData[pos]), iter.readBuffer(), toRead);
2878a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        pos += toRead;
2888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        iter.rp()->move(toRead);
2898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
2908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    DimensionsValue result;
2928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(true, result.ParseFromArray(&outData[0], outData.size()));
2938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(10, result.field());
2948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(DimensionsValue::ValueCase::kValueTuple, result.value_case());
2958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(2, result.value_tuple().dimensions_value_size());
2968a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2978a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    const auto& dim1 = result.value_tuple().dimensions_value(0);
2988a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(DimensionsValue::ValueCase::kValueTuple, dim1.value_case());
2998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(3, dim1.value_tuple().dimensions_value_size());
3008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    const auto& dim11 = dim1.value_tuple().dimensions_value(0);
3028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim11.value_case());
3038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(10025, dim11.value_int());
3048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    const auto& dim12 = dim1.value_tuple().dimensions_value(1);
3068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(DimensionsValue::ValueCase::kValueStr, dim12.value_case());
3078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ("tag", dim12.value_str());
3088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    const auto& dim13 = dim1.value_tuple().dimensions_value(2);
3108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim13.value_case());
3118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(987654, dim13.value_int());
3128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    const auto& dim2 = result.value_tuple().dimensions_value(1);
3148a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(DimensionsValue::ValueCase::kValueInt, dim2.value_case());
3158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(99999, dim2.value_int());
3168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
3178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenTEST(AtomMatcherTest, TestWriteAtomToProto) {
3199c1debe330006b2b4d5c08a55905789c57369609Yao Chen    AttributionNodeInternal attribution_node1;
3208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    attribution_node1.set_uid(1111);
3218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    attribution_node1.set_tag("location1");
3228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3239c1debe330006b2b4d5c08a55905789c57369609Yao Chen    AttributionNodeInternal attribution_node2;
3248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    attribution_node2.set_uid(2222);
3258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    attribution_node2.set_tag("location2");
3268a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3279c1debe330006b2b4d5c08a55905789c57369609Yao Chen    std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2};
3288a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3298a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    // Set up the event
3308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    LogEvent event(4, 12345);
3318a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    event.write(attribution_nodes);
3328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    event.write((int32_t)999);
3338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    // Convert to a LogEvent
3348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    event.init();
3358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3368a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    android::util::ProtoOutputStream protoOutput;
3378a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    writeFieldValueTreeToStream(event.GetTagId(), event.getValues(), &protoOutput);
3388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    vector<uint8_t> outData;
3408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    outData.resize(protoOutput.size());
3418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    size_t pos = 0;
3428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    auto iter = protoOutput.data();
3438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    while (iter.readBuffer() != NULL) {
3448a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        size_t toRead = iter.currentToRead();
3458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        std::memcpy(&(outData[pos]), iter.readBuffer(), toRead);
3468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        pos += toRead;
3478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        iter.rp()->move(toRead);
3488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
3498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    Atom result;
3518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(true, result.ParseFromArray(&outData[0], outData.size()));
3528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(Atom::PushedCase::kBleScanResultReceived, result.pushed_case());
3538a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    const auto& atom = result.ble_scan_result_received();
3548a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(2, atom.attribution_node_size());
3558a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(1111, atom.attribution_node(0).uid());
3568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ("location1", atom.attribution_node(0).tag());
3578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ(2222, atom.attribution_node(1).uid());
3588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    EXPECT_EQ("location2", atom.attribution_node(1).tag());
3595caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    EXPECT_EQ(999, atom.num_results());
3608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
3618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3638a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}  // namespace statsd
3648a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}  // namespace os
3658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}  // namespace android
3668a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#else
3678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao ChenGTEST_LOG_(INFO) << "This test does nothing.\n";
3688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen#endif