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> ¶m) { 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, ¶ms); 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, ¶ms); 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, ¶ms); 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, ¶ms); 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, ¶ms); 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, ¶ms); 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, ¶ms); 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, ¶ms); 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