1069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim/*
2069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim * Copyright 2018 The Android Open Source Project
3069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim *
4069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim * Licensed under the Apache License, Version 2.0 (the "License");
5069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim * you may not use this file except in compliance with the License.
6069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim * You may obtain a copy of the License at
7069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim *
8069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim *      http://www.apache.org/licenses/LICENSE-2.0
9069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim *
10069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim * Unless required by applicable law or agreed to in writing, software
11069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim * distributed under the License is distributed on an "AS IS" BASIS,
12069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim * See the License for the specific language governing permissions and
14069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim * limitations under the License.
15069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim */
16069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
17069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim#define __C2_GENERATE_GLOBAL_VARS__
18069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
19069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim#include <set>
20069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
21069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim#include <gtest/gtest.h>
22069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
23069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim#include <C2ParamDef.h>
24069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
253bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar#include <media/stagefright/foundation/ABuffer.h>
263bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar#include <media/stagefright/foundation/hexdump.h>
27069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim#include <ReflectedParamUpdater.h>
28069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
29069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimnamespace android {
30069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
31069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimnamespace {
32069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
33069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimenum {
34069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    kParamIndexTestStart = 0x1000,
35069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    kParamIndexInt,
36069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    kParamIndexString,
37069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    kParamIndexComposite,
383bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    kParamIndexFlexString,
39069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
40069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    kParamIndexLong = C2Param::TYPE_INDEX_VENDOR_START,
41069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim};
42069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
43069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtypedef C2GlobalParam<C2Info, C2Int32Value, kParamIndexInt> C2IntInfo;
44069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtypedef C2GlobalParam<C2Info, C2Int64Value, kParamIndexLong> C2LongInfo;
45069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
46069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimstruct C2FixedSizeStringStruct {
473bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    char value[12];
48069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
49069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    DEFINE_AND_DESCRIBE_BASE_C2STRUCT(FixedSizeString)
50069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    C2FIELD(value, "value")
51069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim};
52069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtypedef C2GlobalParam<C2Info, C2FixedSizeStringStruct, kParamIndexString> C2StringInfo;
53069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
54069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimstruct C2CompositeStruct {
55069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    int32_t i32;
56069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    uint64_t u64;
573bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    char str[12];
583bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    uint8_t blob[8];
593bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    uint8_t flexBlob[];
60069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
613bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    C2CompositeStruct() = default;
623bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar
633bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    DEFINE_AND_DESCRIBE_BASE_FLEX_C2STRUCT(Composite, flexBlob)
64069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    C2FIELD(i32, "i32")
65069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    C2FIELD(u64, "u64")
66069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    C2FIELD(str, "str")
673bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    C2FIELD(blob, "blob")
683bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    C2FIELD(flexBlob, "flex-blob")
69069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim};
703bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnarstatic_assert(C2CompositeStruct::FLEX_SIZE == 1, "");
713bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnarstatic_assert(_C2FlexHelper<C2CompositeStruct>::FLEX_SIZE == 1, "");
72069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtypedef C2GlobalParam<C2Info, C2CompositeStruct, kParamIndexComposite> C2CompositeInfo;
73069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
743bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnartypedef C2GlobalParam<C2Info, C2StringValue, kParamIndexFlexString> C2FlexStringInfo;
753bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar
76069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim#define SUPPORTED_TYPES   \
77069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    C2IntInfo,            \
78069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    C2LongInfo,           \
79069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    C2StringInfo,         \
803bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    C2CompositeInfo,      \
813bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    C2FlexStringInfo
82069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
83069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<typename... TYPES> struct describe_impl;
84069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<typename T, typename... TYPES> struct describe_impl<T, TYPES...> {
85069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    static std::unique_ptr<C2StructDescriptor> describe(C2Param::CoreIndex index) {
86069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim        if (index == T::CORE_INDEX) {
87069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            return std::make_unique<C2StructDescriptor>(T::CORE_INDEX, T::FieldList());
88069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim        } else {
89069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            return describe_impl<TYPES...>::describe(index);
90069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim        }
91069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    }
92069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim};
93069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
94069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<> struct describe_impl<> {
95069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    static std::unique_ptr<C2StructDescriptor> describe(C2Param::CoreIndex) {
96069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim        return nullptr;
97069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    }
98069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim};
99069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
100069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<typename T> const char *GetName()        { return nullptr; }
101069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<> const char *GetName<C2IntInfo>()       { return "int"; }
102069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<> const char *GetName<C2LongInfo>()      { return "long"; }
103069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<> const char *GetName<C2StringInfo>()    { return "string"; }
104069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<> const char *GetName<C2CompositeInfo>() { return "composite"; }
1053bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnartemplate<> const char *GetName<C2FlexStringInfo>() { return "flex-string"; }
106069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
107069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<typename... TYPES> struct fill_descriptors_impl;
108069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<typename T, typename... TYPES> struct fill_descriptors_impl<T, TYPES...> {
109069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    static void fill(std::vector<std::shared_ptr<C2ParamDescriptor>> *vec) {
110069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim        fill_descriptors_impl<TYPES...>::fill(vec);
111069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim        vec->push_back(std::make_shared<C2ParamDescriptor>(
112069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim                T::PARAM_TYPE, C2ParamDescriptor::IS_PERSISTENT, GetName<T>()));
113069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    }
114069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim};
115069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
116069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<> struct fill_descriptors_impl<> {
117069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    static void fill(std::vector<std::shared_ptr<C2ParamDescriptor>> *) {}
118069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim};
119069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
120069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimtemplate<typename T> T *CastParam(const std::unique_ptr<C2Param> &param) {
121069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    return (T *)param.get();
122069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim}
123069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
124069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimclass ParamReflector : public C2ParamReflector {
125069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimpublic:
126069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    ParamReflector() = default;
127069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    ~ParamReflector() override = default;
128069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
129069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    std::unique_ptr<C2StructDescriptor> describe(C2Param::CoreIndex paramIndex) const override {
130069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim        return describe_impl<SUPPORTED_TYPES>::describe(paramIndex);
131069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    }
132069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim};
133069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
134069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim}  // namespace
135069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
136069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimclass ReflectedParamUpdaterTest : public ::testing::Test {
137069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kimpublic:
138069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    ReflectedParamUpdaterTest() : mReflector(new ParamReflector) {
139069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim        fill_descriptors_impl<SUPPORTED_TYPES>::fill(&mDescriptors);
140069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    }
141069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
142069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    std::shared_ptr<C2ParamReflector> mReflector;
143069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    std::vector<std::shared_ptr<C2ParamDescriptor>> mDescriptors;
144069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim};
145069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
146069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik KimTEST_F(ReflectedParamUpdaterTest, SingleValueTest) {
147069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    ReflectedParamUpdater updater;
148069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
1493bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ReflectedParamUpdater::Dict msg;
1503bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("int.value", int32_t(12));
1513bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("vendor.long.value", int64_t(34));
152069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
153069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.addParamDesc(mReflector, mDescriptors);
154069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
155069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    std::vector<C2Param::Index> indices;
156069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.getParamIndicesFromMessage(msg, &indices);
1573bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
158069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2IntInfo::PARAM_TYPE; }));
1593bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
160069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2LongInfo::PARAM_TYPE; }));
1613bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
162069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2StringInfo::PARAM_TYPE; }));
1633bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
164069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2CompositeInfo::PARAM_TYPE; }));
1653bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
1663bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar            [](const auto &value) { return (uint32_t)value == C2FlexStringInfo::PARAM_TYPE; }));
167069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
168069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    std::vector<std::unique_ptr<C2Param>> params;
169069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    params.emplace_back(new C2IntInfo);
170069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    params.emplace_back(new C2LongInfo);
1713bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, CastParam<C2IntInfo>(params[0])->value);
1723bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, CastParam<C2LongInfo>(params[1])->value);
173069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
174069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.updateParamsFromMessage(msg, &params);
1753bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(12, CastParam<C2IntInfo>(params[0])->value);
1763bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(34, CastParam<C2LongInfo>(params[1])->value);
1773bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar
1783bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    C2Value c2Value;
1793bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    int32_t int32Value = 0;
1803bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    int64_t int64Value = 0;
1813bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg = updater.getParams(params);
1823bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ASSERT_EQ(1u, msg.count("int.value"));
1833bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(true, msg["int.value"].find(&c2Value));
1843bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(true, c2Value.get(&int32Value));
1853bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(12, int32Value);
1863bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar
1873bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ASSERT_EQ(1u, msg.count("vendor.long.value"));
1883bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(true, msg["vendor.long.value"].find(&c2Value));
1893bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(true, c2Value.get(&int64Value));
1903bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(34, int64Value);
191069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim}
192069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
193069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik KimTEST_F(ReflectedParamUpdaterTest, StringTest) {
194069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    ReflectedParamUpdater updater;
195069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
1963bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ReflectedParamUpdater::Dict msg;
1973bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("string.value", AString("56"));
1983bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("flex-string.value", AString("Some string"));
199069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.addParamDesc(mReflector, mDescriptors);
200069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
201069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    std::vector<C2Param::Index> indices;
202069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.getParamIndicesFromMessage(msg, &indices);
2033bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
204069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2IntInfo::PARAM_TYPE; }));
2053bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
206069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2LongInfo::PARAM_TYPE; }));
2073bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
208069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2StringInfo::PARAM_TYPE; }));
2093bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
210069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2CompositeInfo::PARAM_TYPE; }));
2113bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
2123bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar            [](const auto &value) { return (uint32_t)value == C2FlexStringInfo::PARAM_TYPE; }));
213069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
214069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    std::vector<std::unique_ptr<C2Param>> params;
215069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    params.emplace_back(new C2StringInfo);
2163bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, CastParam<C2StringInfo>(params[0])->value[0]);
2173bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    params.emplace_back(C2FlexStringInfo::AllocUnique(0));
2183bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0u, CastParam<C2FlexStringInfo>(params[1])->flexCount());
2193bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    char *flexStringData = &CastParam<C2FlexStringInfo>(params[1])->m.value[0];
220069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
221069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.updateParamsFromMessage(msg, &params);
2223bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_STREQ("56", CastParam<C2StringInfo>(params[0])->value);
2233bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(12u, CastParam<C2FlexStringInfo>(params[0])->flexCount());
2243bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_STREQ("Some string", CastParam<C2FlexStringInfo>(params[1])->m.value);
2253bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_NE(flexStringData, &CastParam<C2FlexStringInfo>(params[1])->m.value[0]);
2263bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    flexStringData = &CastParam<C2FlexStringInfo>(params[1])->m.value[0];
2273bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar
2283bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    // verify truncation and in-place update
2293bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg["string.value"] = ReflectedParamUpdater::Value(AString("1234567890ABCDE"));
2303bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg["flex-string.value"] = ReflectedParamUpdater::Value(AString("abc"));
2313bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    updater.updateParamsFromMessage(msg, &params);
2323bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_STREQ("1234567890A", CastParam<C2StringInfo>(params[0])->value);
2333bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(4u, CastParam<C2FlexStringInfo>(params[1])->flexCount());
2343bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_STREQ("abc", CastParam<C2FlexStringInfo>(params[1])->m.value);
2353bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(flexStringData, &CastParam<C2FlexStringInfo>(params[1])->m.value[0]);
2363bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar
2373bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    AString strValue;
2383bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg = updater.getParams(params);
2393bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ASSERT_EQ(1u, msg.count("string.value"));
2403bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(true, msg["string.value"].find(&strValue));
2413bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_STREQ("1234567890A", strValue.c_str());
2423bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar
2433bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ASSERT_EQ(1u, msg.count("flex-string.value"));
2443bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(true, msg["flex-string.value"].find(&strValue));
2453bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_STREQ("abc", strValue.c_str());
246069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim}
247069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
248069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik KimTEST_F(ReflectedParamUpdaterTest, CompositeTest) {
249069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    ReflectedParamUpdater updater;
250069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
2513bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ReflectedParamUpdater::Dict msg;
2523bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("composite.i32", int32_t(78));
2533bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("composite.u64", int64_t(910));
2543bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("composite.str", AString("1112"));
2553bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("composite.blob", ABuffer::CreateAsCopy("buffer08", 8));
2563bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("composite.flex-blob", ABuffer::CreateAsCopy("flex-buffer-14", 14));
257069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
258069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.addParamDesc(mReflector, mDescriptors);
259069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
260069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    std::vector<C2Param::Index> indices;
261069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.getParamIndicesFromMessage(msg, &indices);
2623bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
263069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2IntInfo::PARAM_TYPE; }));
2643bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
265069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2LongInfo::PARAM_TYPE; }));
2663bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
267069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2StringInfo::PARAM_TYPE; }));
2683bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
269069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2CompositeInfo::PARAM_TYPE; }));
270069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
271069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    std::vector<std::unique_ptr<C2Param>> params;
2723bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    params.emplace_back(C2CompositeInfo::AllocUnique(0));
2733bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, CastParam<C2CompositeInfo>(params[0])->m.i32);
2743bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0u, CastParam<C2CompositeInfo>(params[0])->m.u64);
2753bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, CastParam<C2CompositeInfo>(params[0])->m.str[0]);
2763bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, memcmp("\0\0\0\0\0\0\0\0", CastParam<C2CompositeInfo>(params[0])->m.blob, 8));
2773bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0u, CastParam<C2CompositeInfo>(params[0])->flexCount());
2783bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    uint8_t *flexBlobData = &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0];
279069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
280069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.updateParamsFromMessage(msg, &params);
2813bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(78, CastParam<C2CompositeInfo>(params[0])->m.i32);
2823bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(910u, CastParam<C2CompositeInfo>(params[0])->m.u64);
2833bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_STREQ("1112", CastParam<C2CompositeInfo>(params[0])->m.str);
2843bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, memcmp("buffer08", CastParam<C2CompositeInfo>(params[0])->m.blob, 8));
2853bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    AString hex;
2863bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    hexdump(CastParam<C2CompositeInfo>(params[0])->m.blob, 8, 0, &hex);
2873bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    printf("%s\n", hex.c_str());
2883bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ASSERT_EQ(14u, CastParam<C2CompositeInfo>(params[0])->flexCount());
2893bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, memcmp("flex-buffer-14", CastParam<C2CompositeInfo>(params[0])->m.flexBlob, 14));
2903bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_NE(flexBlobData, &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0]);
2913bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    flexBlobData = &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0];
2923bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar
2933bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    // test setting and zero extending shorter blob than allowed
2943bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.clear();
2953bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("composite.blob", ABuffer::CreateAsCopy("buf05", 5));
2963bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    updater.updateParamsFromMessage(msg, &params);
2973bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, memcmp("buf05\0\0\0", CastParam<C2CompositeInfo>(params[0])->m.blob, 8));
2983bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ASSERT_EQ(14u, CastParam<C2CompositeInfo>(params[0])->flexCount());
2993bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, memcmp("flex-buffer-14", CastParam<C2CompositeInfo>(params[0])->m.flexBlob, 14));
3003bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(flexBlobData, &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0]);
3013bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar
3023bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    // test setting and trimming larger blob than allowed
3033bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.clear();
3043bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("composite.blob", ABuffer::CreateAsCopy("ReallyLongBuffer", 16));
3053bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    updater.updateParamsFromMessage(msg, &params);
3063bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, memcmp("ReallyLo", CastParam<C2CompositeInfo>(params[0])->m.blob, 8));
3073bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ASSERT_EQ(14u, CastParam<C2CompositeInfo>(params[0])->flexCount());
3083bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, memcmp("flex-buffer-14", CastParam<C2CompositeInfo>(params[0])->m.flexBlob, 14));
3093bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(flexBlobData, &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0]);
3103bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar
3113bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    // test trimming flex blob in-place
3123bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.clear();
3133bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("composite.flex-blob", ABuffer::CreateAsCopy("buf05", 5));
3143bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    updater.updateParamsFromMessage(msg, &params);
3153bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ASSERT_EQ(5u, CastParam<C2CompositeInfo>(params[0])->flexCount());
3163bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, memcmp("buf05", CastParam<C2CompositeInfo>(params[0])->m.flexBlob, 5));
3173bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(flexBlobData, &CastParam<C2CompositeInfo>(params[0])->m.flexBlob[0]);
318069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim}
319069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
320069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik KimTEST_F(ReflectedParamUpdaterTest, CompositePartialTest) {
321069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    ReflectedParamUpdater updater;
322069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
3233bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    ReflectedParamUpdater::Dict msg;
3243bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("composite.i32", C2Value(1314));
3253bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    msg.emplace("composite.str", AString("1516"));
326069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
327069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.addParamDesc(mReflector, mDescriptors);
328069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
329069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    std::vector<C2Param::Index> indices;
330069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.getParamIndicesFromMessage(msg, &indices);
3313bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
332069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2IntInfo::PARAM_TYPE; }));
3333bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
334069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2LongInfo::PARAM_TYPE; }));
3353bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, std::count_if(indices.begin(), indices.end(),
336069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2StringInfo::PARAM_TYPE; }));
3373bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(1, std::count_if(indices.begin(), indices.end(),
338069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim            [](const auto &value) { return (uint32_t)value == C2CompositeInfo::PARAM_TYPE; }));
339069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
340069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    std::vector<std::unique_ptr<C2Param>> params;
3413bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    params.emplace_back(C2CompositeInfo::AllocUnique(12u));
3423bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, CastParam<C2CompositeInfo>(params[0])->m.i32);
3433bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0u, CastParam<C2CompositeInfo>(params[0])->m.u64);
3443bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0, CastParam<C2CompositeInfo>(params[0])->m.str[0]);
345069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
346069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim    updater.updateParamsFromMessage(msg, &params);
3473bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(1314, CastParam<C2CompositeInfo>(params[0])->m.i32);
3483bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_EQ(0u, CastParam<C2CompositeInfo>(params[0])->m.u64);
3493bce60a27e0b0a996e42bd2c9e5bf60373db2780Lajos Molnar    EXPECT_STREQ("1516", CastParam<C2CompositeInfo>(params[0])->m.str);
350069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim}
351069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim
352069f7358a56620fca51d26dfb7b1c02a5501c703Wonsik Kim} // namespace android
353