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/VersionCollapser.h"
18
19 #include "test/Test.h"
20
21 using android::StringPiece;
22
23 namespace aapt {
24
BuildTableWithConfigs(const StringPiece & name,std::initializer_list<std::string> list)25 static std::unique_ptr<ResourceTable> BuildTableWithConfigs(
26 const StringPiece& name, std::initializer_list<std::string> list) {
27 test::ResourceTableBuilder builder;
28 for (const std::string& item : list) {
29 builder.AddSimple(name, test::ParseConfigOrDie(item));
30 }
31 return builder.Build();
32 }
33
TEST(VersionCollapserTest,CollapseVersions)34 TEST(VersionCollapserTest, CollapseVersions) {
35 std::unique_ptr<IAaptContext> context =
36 test::ContextBuilder().SetMinSdkVersion(7).Build();
37
38 const StringPiece res_name = "@android:string/foo";
39
40 std::unique_ptr<ResourceTable> table = BuildTableWithConfigs(
41 res_name,
42 {"land-v4", "land-v5", "sw600dp", "land-v6", "land-v14", "land-v21"});
43
44 VersionCollapser collapser;
45 ASSERT_TRUE(collapser.Consume(context.get(), table.get()));
46
47 // These should be removed.
48 EXPECT_EQ(nullptr,
49 test::GetValueForConfig<Id>(table.get(), res_name,
50 test::ParseConfigOrDie("land-v4")));
51 EXPECT_EQ(nullptr,
52 test::GetValueForConfig<Id>(table.get(), res_name,
53 test::ParseConfigOrDie("land-v5")));
54 // This one should be removed because it was renamed to 'land', with the
55 // version dropped.
56 EXPECT_EQ(nullptr,
57 test::GetValueForConfig<Id>(table.get(), res_name,
58 test::ParseConfigOrDie("land-v6")));
59
60 // These should remain.
61 EXPECT_NE(nullptr,
62 test::GetValueForConfig<Id>(table.get(), res_name,
63 test::ParseConfigOrDie("sw600dp")));
64
65 // 'land' should be present because it was renamed from 'land-v6'.
66 EXPECT_NE(nullptr,
67 test::GetValueForConfig<Id>(table.get(), res_name,
68 test::ParseConfigOrDie("land")));
69 EXPECT_NE(nullptr,
70 test::GetValueForConfig<Id>(table.get(), res_name,
71 test::ParseConfigOrDie("land-v14")));
72 EXPECT_NE(nullptr,
73 test::GetValueForConfig<Id>(table.get(), res_name,
74 test::ParseConfigOrDie("land-v21")));
75 }
76
TEST(VersionCollapserTest,CollapseVersionsWhenMinSdkIsHighest)77 TEST(VersionCollapserTest, CollapseVersionsWhenMinSdkIsHighest) {
78 std::unique_ptr<IAaptContext> context =
79 test::ContextBuilder().SetMinSdkVersion(21).Build();
80
81 const StringPiece res_name = "@android:string/foo";
82
83 std::unique_ptr<ResourceTable> table = BuildTableWithConfigs(
84 res_name, {"land-v4", "land-v5", "sw600dp", "land-v6", "land-v14",
85 "land-v21", "land-v22"});
86 VersionCollapser collapser;
87 ASSERT_TRUE(collapser.Consume(context.get(), table.get()));
88
89 // These should all be removed.
90 EXPECT_EQ(nullptr,
91 test::GetValueForConfig<Id>(table.get(), res_name,
92 test::ParseConfigOrDie("land-v4")));
93 EXPECT_EQ(nullptr,
94 test::GetValueForConfig<Id>(table.get(), res_name,
95 test::ParseConfigOrDie("land-v5")));
96 EXPECT_EQ(nullptr,
97 test::GetValueForConfig<Id>(table.get(), res_name,
98 test::ParseConfigOrDie("land-v6")));
99 EXPECT_EQ(nullptr,
100 test::GetValueForConfig<Id>(table.get(), res_name,
101 test::ParseConfigOrDie("land-v14")));
102
103 // These should remain.
104 EXPECT_NE(nullptr,
105 test::GetValueForConfig<Id>(
106 table.get(), res_name,
107 test::ParseConfigOrDie("sw600dp").CopyWithoutSdkVersion()));
108
109 // land-v21 should have been converted to land.
110 EXPECT_NE(nullptr,
111 test::GetValueForConfig<Id>(table.get(), res_name,
112 test::ParseConfigOrDie("land")));
113 // land-v22 should remain as-is.
114 EXPECT_NE(nullptr,
115 test::GetValueForConfig<Id>(table.get(), res_name,
116 test::ParseConfigOrDie("land-v22")));
117 }
118
119 } // namespace aapt
120