1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "optimize/ResourceDeduper.h" 18 19 #include "ResourceTable.h" 20 #include "test/Test.h" 21 22 using ::aapt::test::HasValue; 23 using ::android::ConfigDescription; 24 using ::testing::Not; 25 26 namespace aapt { 27 28 TEST(ResourceDeduperTest, SameValuesAreDeduped) { 29 std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); 30 const ConfigDescription default_config = {}; 31 const ConfigDescription ldrtl_config = test::ParseConfigOrDie("ldrtl"); 32 const ConfigDescription ldrtl_v21_config = test::ParseConfigOrDie("ldrtl-v21"); 33 const ConfigDescription en_config = test::ParseConfigOrDie("en"); 34 const ConfigDescription en_v21_config = test::ParseConfigOrDie("en-v21"); 35 // Chosen because this configuration is compatible with ldrtl/en. 36 const ConfigDescription land_config = test::ParseConfigOrDie("land"); 37 38 std::unique_ptr<ResourceTable> table = 39 test::ResourceTableBuilder() 40 .AddString("android:string/dedupe", ResourceId{}, default_config, "dedupe") 41 .AddString("android:string/dedupe", ResourceId{}, ldrtl_config, "dedupe") 42 .AddString("android:string/dedupe", ResourceId{}, land_config, "dedupe") 43 44 .AddString("android:string/dedupe2", ResourceId{}, default_config, "dedupe") 45 .AddString("android:string/dedupe2", ResourceId{}, ldrtl_config, "dedupe") 46 .AddString("android:string/dedupe2", ResourceId{}, ldrtl_v21_config, "keep") 47 .AddString("android:string/dedupe2", ResourceId{}, land_config, "dedupe") 48 49 .AddString("android:string/dedupe3", ResourceId{}, default_config, "dedupe") 50 .AddString("android:string/dedupe3", ResourceId{}, en_config, "dedupe") 51 .AddString("android:string/dedupe3", ResourceId{}, en_v21_config, "dedupe") 52 .Build(); 53 54 ASSERT_TRUE(ResourceDeduper().Consume(context.get(), table.get())); 55 EXPECT_THAT(table, Not(HasValue("android:string/dedupe", ldrtl_config))); 56 EXPECT_THAT(table, Not(HasValue("android:string/dedupe", land_config))); 57 58 EXPECT_THAT(table, HasValue("android:string/dedupe2", ldrtl_v21_config)); 59 EXPECT_THAT(table, Not(HasValue("android:string/dedupe2", ldrtl_config))); 60 61 EXPECT_THAT(table, HasValue("android:string/dedupe3", default_config)); 62 EXPECT_THAT(table, HasValue("android:string/dedupe3", en_config)); 63 EXPECT_THAT(table, Not(HasValue("android:string/dedupe3", en_v21_config))); 64 } 65 66 TEST(ResourceDeduperTest, DifferentValuesAreKept) { 67 std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); 68 const ConfigDescription default_config = {}; 69 const ConfigDescription ldrtl_config = test::ParseConfigOrDie("ldrtl"); 70 const ConfigDescription ldrtl_v21_config = test::ParseConfigOrDie("ldrtl-v21"); 71 // Chosen because this configuration is compatible with ldrtl. 72 const ConfigDescription land_config = test::ParseConfigOrDie("land"); 73 74 std::unique_ptr<ResourceTable> table = 75 test::ResourceTableBuilder() 76 .AddString("android:string/keep", ResourceId{}, default_config, "keep") 77 .AddString("android:string/keep", ResourceId{}, ldrtl_config, "keep") 78 .AddString("android:string/keep", ResourceId{}, ldrtl_v21_config, "keep2") 79 .AddString("android:string/keep", ResourceId{}, land_config, "keep2") 80 .Build(); 81 82 ASSERT_TRUE(ResourceDeduper().Consume(context.get(), table.get())); 83 EXPECT_THAT(table, HasValue("android:string/keep", ldrtl_config)); 84 EXPECT_THAT(table, HasValue("android:string/keep", ldrtl_v21_config)); 85 EXPECT_THAT(table, HasValue("android:string/keep", land_config)); 86 } 87 88 TEST(ResourceDeduperTest, LocalesValuesAreKept) { 89 std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); 90 const ConfigDescription default_config = {}; 91 const ConfigDescription fr_config = test::ParseConfigOrDie("fr"); 92 const ConfigDescription fr_rCA_config = test::ParseConfigOrDie("fr-rCA"); 93 94 std::unique_ptr<ResourceTable> table = 95 test::ResourceTableBuilder() 96 .AddString("android:string/keep", ResourceId{}, default_config, "keep") 97 .AddString("android:string/keep", ResourceId{}, fr_config, "keep") 98 .AddString("android:string/keep", ResourceId{}, fr_rCA_config, "keep") 99 .Build(); 100 101 ASSERT_TRUE(ResourceDeduper().Consume(context.get(), table.get())); 102 EXPECT_THAT(table, HasValue("android:string/keep", default_config)); 103 EXPECT_THAT(table, HasValue("android:string/keep", fr_config)); 104 EXPECT_THAT(table, HasValue("android:string/keep", fr_rCA_config)); 105 } 106 107 } // namespace aapt 108