You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.9 KiB
140 lines
4.9 KiB
/*
|
|
* Copyright (C) 2021 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <android-base/file.h>
|
|
#include <gtest/gtest.h>
|
|
#include <idmap2/FabricatedOverlay.h>
|
|
|
|
#include <fstream>
|
|
#include <utility>
|
|
|
|
namespace android::idmap2 {
|
|
|
|
TEST(FabricatedOverlayTests, OverlayInfo) {
|
|
auto overlay =
|
|
FabricatedOverlay::Builder("com.example.overlay", "SandTheme", "com.example.target")
|
|
.SetOverlayable("TestResources")
|
|
.Build();
|
|
|
|
ASSERT_TRUE(overlay);
|
|
auto container = FabricatedOverlayContainer::FromOverlay(std::move(*overlay));
|
|
auto info = container->FindOverlayInfo("SandTheme");
|
|
ASSERT_TRUE(info);
|
|
EXPECT_EQ("SandTheme", (*info).name);
|
|
EXPECT_EQ("TestResources", (*info).target_name);
|
|
|
|
info = container->FindOverlayInfo("OceanTheme");
|
|
ASSERT_FALSE(info);
|
|
}
|
|
|
|
TEST(FabricatedOverlayTests, SetResourceValue) {
|
|
auto overlay =
|
|
FabricatedOverlay::Builder("com.example.overlay", "SandTheme", "com.example.target")
|
|
.SetResourceValue("com.example.target:integer/int1", Res_value::TYPE_INT_DEC, 1U)
|
|
.SetResourceValue("com.example.target.split:integer/int2", Res_value::TYPE_INT_DEC, 2U)
|
|
.SetResourceValue("string/int3", Res_value::TYPE_REFERENCE, 0x7f010000)
|
|
.Build();
|
|
ASSERT_TRUE(overlay);
|
|
auto container = FabricatedOverlayContainer::FromOverlay(std::move(*overlay));
|
|
auto info = container->FindOverlayInfo("SandTheme");
|
|
ASSERT_TRUE(info);
|
|
ASSERT_TRUE((*info).target_name.empty());
|
|
|
|
auto crc = (*container).GetCrc();
|
|
ASSERT_TRUE(crc) << crc.GetErrorMessage();
|
|
EXPECT_NE(0U, *crc);
|
|
|
|
auto pairs = container->GetOverlayData(*info);
|
|
ASSERT_TRUE(pairs);
|
|
EXPECT_FALSE(pairs->string_pool_data.has_value());
|
|
ASSERT_EQ(3U, pairs->pairs.size());
|
|
|
|
auto& it = pairs->pairs[0];
|
|
ASSERT_EQ("com.example.target:integer/int1", it.resource_name);
|
|
auto entry = std::get_if<TargetValue>(&it.value);
|
|
ASSERT_NE(nullptr, entry);
|
|
ASSERT_EQ(1U, entry->data_value);
|
|
ASSERT_EQ(Res_value::TYPE_INT_DEC, entry->data_type);
|
|
|
|
it = pairs->pairs[1];
|
|
ASSERT_EQ("com.example.target:string/int3", it.resource_name);
|
|
entry = std::get_if<TargetValue>(&it.value);
|
|
ASSERT_NE(nullptr, entry);
|
|
ASSERT_EQ(0x7f010000, entry->data_value);
|
|
ASSERT_EQ(Res_value::TYPE_REFERENCE, entry->data_type);
|
|
|
|
it = pairs->pairs[2];
|
|
ASSERT_EQ("com.example.target.split:integer/int2", it.resource_name);
|
|
entry = std::get_if<TargetValue>(&it.value);
|
|
ASSERT_NE(nullptr, entry);
|
|
ASSERT_EQ(2U, entry->data_value);
|
|
ASSERT_EQ(Res_value::TYPE_INT_DEC, entry->data_type);
|
|
}
|
|
|
|
TEST(FabricatedOverlayTests, SetResourceValueBadArgs) {
|
|
{
|
|
auto builder =
|
|
FabricatedOverlay::Builder("com.example.overlay", "SandTheme", "com.example.target")
|
|
.SetResourceValue("int1", Res_value::TYPE_INT_DEC, 1U);
|
|
ASSERT_FALSE(builder.Build());
|
|
}
|
|
{
|
|
auto builder =
|
|
FabricatedOverlay::Builder("com.example.overlay", "SandTheme", "com.example.target")
|
|
.SetResourceValue("com.example.target:int2", Res_value::TYPE_INT_DEC, 1U);
|
|
ASSERT_FALSE(builder.Build());
|
|
}
|
|
}
|
|
|
|
TEST(FabricatedOverlayTests, SerializeAndDeserialize) {
|
|
auto overlay =
|
|
FabricatedOverlay::Builder("com.example.overlay", "SandTheme", "com.example.target")
|
|
.SetOverlayable("TestResources")
|
|
.SetResourceValue("com.example.target:integer/int1", Res_value::TYPE_INT_DEC, 1U)
|
|
.Build();
|
|
ASSERT_TRUE(overlay);
|
|
TemporaryFile tf;
|
|
std::ofstream out(tf.path);
|
|
ASSERT_TRUE((*overlay).ToBinaryStream(out));
|
|
out.close();
|
|
|
|
auto container = OverlayResourceContainer::FromPath(tf.path);
|
|
ASSERT_TRUE(container) << container.GetErrorMessage();
|
|
EXPECT_EQ(tf.path, (*container)->GetPath());
|
|
|
|
auto crc = (*container)->GetCrc();
|
|
ASSERT_TRUE(crc) << crc.GetErrorMessage();
|
|
EXPECT_NE(0U, *crc);
|
|
|
|
auto info = (*container)->FindOverlayInfo("SandTheme");
|
|
ASSERT_TRUE(info) << info.GetErrorMessage();
|
|
EXPECT_EQ("SandTheme", (*info).name);
|
|
EXPECT_EQ("TestResources", (*info).target_name);
|
|
|
|
auto pairs = (*container)->GetOverlayData(*info);
|
|
ASSERT_TRUE(pairs) << pairs.GetErrorMessage();
|
|
EXPECT_EQ(1U, pairs->pairs.size());
|
|
|
|
auto& it = pairs->pairs[0];
|
|
ASSERT_EQ("com.example.target:integer/int1", it.resource_name);
|
|
auto entry = std::get_if<TargetValue>(&it.value);
|
|
ASSERT_NE(nullptr, entry);
|
|
EXPECT_EQ(1U, entry->data_value);
|
|
EXPECT_EQ(Res_value::TYPE_INT_DEC, entry->data_type);
|
|
}
|
|
|
|
} // namespace android::idmap2
|