1fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski/* 2fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * Copyright (C) 2016 The Android Open Source Project 3fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * 4fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * you may not use this file except in compliance with the License. 6fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * You may obtain a copy of the License at 7fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * 8fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * 10fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * Unless required by applicable law or agreed to in writing, software 11fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * See the License for the specific language governing permissions and 14fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * limitations under the License. 15fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski */ 16fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski 17d48944a745f9ed121e6bde22ef6feb3a44fbec39Adam Lesinski#include "optimize/VersionCollapser.h" 18ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 19fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski#include "test/Test.h" 20fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski 21d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiusing android::StringPiece; 22d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski 23fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinskinamespace aapt { 24fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski 25ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskistatic std::unique_ptr<ResourceTable> BuildTableWithConfigs( 26cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski const StringPiece& name, std::initializer_list<std::string> list) { 27cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::ResourceTableBuilder builder; 28cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski for (const std::string& item : list) { 29ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski builder.AddSimple(name, test::ParseConfigOrDie(item)); 30cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 31ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return builder.Build(); 32fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski} 33fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski 34fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam LesinskiTEST(VersionCollapserTest, CollapseVersions) { 35ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<IAaptContext> context = 36ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ContextBuilder().SetMinSdkVersion(7).Build(); 37cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 38ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const StringPiece res_name = "@android:string/foo"; 39cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 40ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<ResourceTable> table = BuildTableWithConfigs( 41ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski res_name, 42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski {"land-v4", "land-v5", "sw600dp", "land-v6", "land-v14", "land-v21"}); 43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 44cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski VersionCollapser collapser; 45ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ASSERT_TRUE(collapser.Consume(context.get(), table.get())); 46cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 47cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski // These should be removed. 48cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 49ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 50ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land-v4"))); 51cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 52ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 53ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land-v5"))); 54cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski // This one should be removed because it was renamed to 'land', with the 55cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski // version dropped. 56cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 57ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 58ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land-v6"))); 59cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 60cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski // These should remain. 61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_NE(nullptr, 62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 63ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("sw600dp"))); 64cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski // 'land' should be present because it was renamed from 'land-v6'. 66cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_NE(nullptr, 67ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 68ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land"))); 69cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_NE(nullptr, 70ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 71ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land-v14"))); 72ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, 73ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 74ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land-v21"))); 75fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski} 76fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski 77fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam LesinskiTEST(VersionCollapserTest, CollapseVersionsWhenMinSdkIsHighest) { 78ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<IAaptContext> context = 79ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ContextBuilder().SetMinSdkVersion(21).Build(); 80cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 81ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const StringPiece res_name = "@android:string/foo"; 82cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 83ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<ResourceTable> table = BuildTableWithConfigs( 84ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski res_name, {"land-v4", "land-v5", "sw600dp", "land-v6", "land-v14", 85ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski "land-v21", "land-v22"}); 86cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski VersionCollapser collapser; 87ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ASSERT_TRUE(collapser.Consume(context.get(), table.get())); 88cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 89cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski // These should all be removed. 90cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 91ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 92ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land-v4"))); 93cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 94ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 95ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land-v5"))); 96cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 97ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 98ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land-v6"))); 99cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 100ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 101ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land-v14"))); 102cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 103cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski // These should remain. 104cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_NE(nullptr, 105ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>( 106ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski table.get(), res_name, 107ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("sw600dp").CopyWithoutSdkVersion())); 108cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 109cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski // land-v21 should have been converted to land. 110ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, 111ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 112ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land"))); 113cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski // land-v22 should remain as-is. 114cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_NE(nullptr, 115ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::GetValueForConfig<Id>(table.get(), res_name, 116ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski test::ParseConfigOrDie("land-v22"))); 117fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski} 118fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski 119cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 120