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 "link/Linkers.h"
18
19 #include "test/Test.h"
20
21 using ::android::ConfigDescription;
22
23 namespace aapt {
24
TEST(ProductFilterTest,SelectTwoProducts)25 TEST(ProductFilterTest, SelectTwoProducts) {
26 std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
27
28 const ConfigDescription land = test::ParseConfigOrDie("land");
29 const ConfigDescription port = test::ParseConfigOrDie("port");
30
31 ResourceTable table;
32 ASSERT_TRUE(table.AddResource(
33 NewResourceBuilder(test::ParseNameOrDie("android:string/one"))
34 .SetValue(test::ValueBuilder<Id>().SetSource(Source("land/default.xml")).Build(), land)
35 .Build(),
36 context->GetDiagnostics()));
37
38 ASSERT_TRUE(table.AddResource(
39 NewResourceBuilder(test::ParseNameOrDie("android:string/one"))
40 .SetValue(test::ValueBuilder<Id>().SetSource(Source("land/tablet.xml")).Build(), land,
41 "tablet")
42 .Build(),
43 context->GetDiagnostics()));
44
45 ASSERT_TRUE(table.AddResource(
46 NewResourceBuilder(test::ParseNameOrDie("android:string/one"))
47 .SetValue(test::ValueBuilder<Id>().SetSource(Source("port/default.xml")).Build(), port)
48 .Build(),
49 context->GetDiagnostics()));
50
51 ASSERT_TRUE(table.AddResource(
52 NewResourceBuilder(test::ParseNameOrDie("android:string/one"))
53 .SetValue(test::ValueBuilder<Id>().SetSource(Source("port/tablet.xml")).Build(), port,
54 "tablet")
55 .Build(),
56 context->GetDiagnostics()));
57
58 ProductFilter filter({"tablet"});
59 ASSERT_TRUE(filter.Consume(context.get(), &table));
60
61 EXPECT_EQ(nullptr, test::GetValueForConfigAndProduct<Id>(
62 &table, "android:string/one", land, ""));
63 EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<Id>(
64 &table, "android:string/one", land, "tablet"));
65 EXPECT_EQ(nullptr, test::GetValueForConfigAndProduct<Id>(
66 &table, "android:string/one", port, ""));
67 EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<Id>(
68 &table, "android:string/one", port, "tablet"));
69 }
70
TEST(ProductFilterTest,SelectDefaultProduct)71 TEST(ProductFilterTest, SelectDefaultProduct) {
72 std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
73
74 ResourceTable table;
75 ASSERT_TRUE(table.AddResource(
76 NewResourceBuilder(test::ParseNameOrDie("android:string/one"))
77 .SetValue(test::ValueBuilder<Id>().SetSource(Source("default.xml")).Build())
78 .Build(),
79 context->GetDiagnostics()));
80
81 ASSERT_TRUE(table.AddResource(
82 NewResourceBuilder(test::ParseNameOrDie("android:string/one"))
83 .SetValue(test::ValueBuilder<Id>().SetSource(Source("tablet.xml")).Build(), {}, "tablet")
84 .Build(),
85 context->GetDiagnostics()));
86 ;
87
88 ProductFilter filter(std::unordered_set<std::string>{});
89 ASSERT_TRUE(filter.Consume(context.get(), &table));
90
91 EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<Id>(
92 &table, "android:string/one",
93 ConfigDescription::DefaultConfig(), ""));
94 EXPECT_EQ(nullptr, test::GetValueForConfigAndProduct<Id>(
95 &table, "android:string/one",
96 ConfigDescription::DefaultConfig(), "tablet"));
97 }
98
TEST(ProductFilterTest,FailOnAmbiguousProduct)99 TEST(ProductFilterTest, FailOnAmbiguousProduct) {
100 std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
101
102 ResourceTable table;
103 ASSERT_TRUE(table.AddResource(
104 NewResourceBuilder(test::ParseNameOrDie("android:string/one"))
105 .SetValue(test::ValueBuilder<Id>().SetSource(Source("default.xml")).Build())
106 .Build(),
107 context->GetDiagnostics()));
108
109 ASSERT_TRUE(table.AddResource(
110 NewResourceBuilder(test::ParseNameOrDie("android:string/one"))
111 .SetValue(test::ValueBuilder<Id>().SetSource(Source("tablet.xml")).Build(), {}, "tablet")
112 .Build(),
113 context->GetDiagnostics()));
114
115 ASSERT_TRUE(table.AddResource(
116 NewResourceBuilder(test::ParseNameOrDie("android:string/one"))
117 .SetValue(test::ValueBuilder<Id>().SetSource(Source("no-sdcard.xml")).Build(), {},
118 "no-sdcard")
119 .Build(),
120 context->GetDiagnostics()));
121
122 ProductFilter filter({"tablet", "no-sdcard"});
123 ASSERT_FALSE(filter.Consume(context.get(), &table));
124 }
125
TEST(ProductFilterTest,FailOnMultipleDefaults)126 TEST(ProductFilterTest, FailOnMultipleDefaults) {
127 std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
128
129 ResourceTable table;
130 ASSERT_TRUE(
131 table.AddResource(NewResourceBuilder(test::ParseNameOrDie("android:string/one"))
132 .SetValue(test::ValueBuilder<Id>().SetSource(Source(".xml")).Build())
133 .Build(),
134 context->GetDiagnostics()));
135
136 ASSERT_TRUE(table.AddResource(
137 NewResourceBuilder(test::ParseNameOrDie("android:string/one"))
138 .SetValue(test::ValueBuilder<Id>().SetSource(Source("default.xml")).Build(), {},
139 "default")
140 .Build(),
141 context->GetDiagnostics()));
142
143 ProductFilter filter(std::unordered_set<std::string>{});
144 ASSERT_FALSE(filter.Consume(context.get(), &table));
145 }
146
147 } // namespace aapt
148