• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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