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