/* * Copyright (C) 2017 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 "optimize/MultiApkGenerator.h" #include #include "gmock/gmock.h" #include "gtest/gtest.h" #include "LoadedApk.h" #include "ResourceTable.h" #include "configuration/ConfigurationParser.h" #include "filter/Filter.h" #include "flatten/Archive.h" #include "flatten/TableFlattener.h" #include "process/IResourceTableConsumer.h" #include "test/Context.h" #include "test/Test.h" namespace aapt { namespace { using ::aapt::configuration::Abi; using ::aapt::configuration::Artifact; using ::aapt::configuration::PostProcessingConfiguration; using ::testing::Eq; using ::testing::Return; using ::testing::_; class MockApk : public LoadedApk { public: MockApk(std::unique_ptr table) : LoadedApk({"test.apk"}, {}, std::move(table)){}; MOCK_METHOD5(WriteToArchive, bool(IAaptContext*, ResourceTable*, const TableFlattenerOptions&, FilterChain*, IArchiveWriter*)); }; TEST(MultiApkGeneratorTest, FromBaseApk) { std::unique_ptr table = test::ResourceTableBuilder() .AddFileReference("android:drawable/icon", "res/drawable-mdpi/icon.png", test::ParseConfigOrDie("mdpi")) .AddFileReference("android:drawable/icon", "res/drawable-hdpi/icon.png", test::ParseConfigOrDie("hdpi")) .AddFileReference("android:drawable/icon", "res/drawable-xhdpi/icon.png", test::ParseConfigOrDie("xhdpi")) .AddFileReference("android:drawable/icon", "res/drawable-xxhdpi/icon.png", test::ParseConfigOrDie("xxhdpi")) .AddSimple("android:string/one") .Build(); MockApk apk{std::move(table)}; EXPECT_CALL(apk, WriteToArchive(_, _, _, _, _)).Times(0); test::Context ctx; PostProcessingConfiguration empty_config; TableFlattenerOptions table_flattener_options; MultiApkGenerator generator{&apk, &ctx}; EXPECT_TRUE(generator.FromBaseApk("out", empty_config, table_flattener_options)); Artifact x64 = test::ArtifactBuilder() .SetName("${basename}.x64.apk") .SetAbiGroup("x64") .SetLocaleGroup("en") .SetDensityGroup("xhdpi") .Build(); Artifact intel = test::ArtifactBuilder() .SetName("${basename}.intel.apk") .SetAbiGroup("intel") .SetLocaleGroup("europe") .SetDensityGroup("large") .Build(); auto config = test::PostProcessingConfigurationBuilder() .SetLocaleGroup("en", {"en"}) .SetLocaleGroup("europe", {"en", "fr", "de", "es"}) .SetAbiGroup("x64", {Abi::kX86_64}) .SetAbiGroup("intel", {Abi::kX86_64, Abi::kX86}) .SetDensityGroup("xhdpi", {"xhdpi"}) .SetDensityGroup("large", {"xhdpi", "xxhdpi", "xxxhdpi"}) .AddArtifact(x64) .AddArtifact(intel) .Build(); // Called once for each artifact. EXPECT_CALL(apk, WriteToArchive(Eq(&ctx), _, _, _, _)).Times(2).WillRepeatedly(Return(true)); EXPECT_TRUE(generator.FromBaseApk("out", config, table_flattener_options)); } } // namespace } // namespace aapt