1fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski/*
2fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * Copyright (C) 2014 The Android Open Source Project
3fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski *
4fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * you may not use this file except in compliance with the License.
6fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * You may obtain a copy of the License at
7fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski *
8fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski *
10fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * See the License for the specific language governing permissions and
14fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski * limitations under the License.
15fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski */
16fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
17fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski#include <androidfw/ResourceTypes.h>
18fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski#include <utils/String8.h>
19fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski#include <gtest/gtest.h>
20fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
21fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski#include "AaptConfig.h"
22fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski#include "ResourceFilter.h"
23fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski#include "ConfigDescription.h"
24fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
25fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinskiusing android::String8;
26fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
27fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski// In this context, 'Axis' represents a particular field in the configuration,
28fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski// such as language or density.
29fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
30fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiTEST(WeakResourceFilterTest, EmptyFilterMatchesAnything) {
31fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    WeakResourceFilter filter;
32fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ASSERT_EQ(NO_ERROR, filter.parse(String8("")));
33fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
34fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ConfigDescription config;
35fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.density = 320;
36fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
37fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    EXPECT_TRUE(filter.match(config));
38fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
39fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.language[0] = 'f';
40fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.language[1] = 'r';
41fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
42fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    EXPECT_TRUE(filter.match(config));
43fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski}
44fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
45fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiTEST(WeakResourceFilterTest, MatchesConfigWithUnrelatedAxis) {
46fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    WeakResourceFilter filter;
47fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ASSERT_EQ(NO_ERROR, filter.parse(String8("fr")));
48fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
49fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ConfigDescription config;
50fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.density = 320;
51fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
52fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    EXPECT_TRUE(filter.match(config));
53fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski}
54fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
55fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiTEST(WeakResourceFilterTest, MatchesConfigWithSameValueAxis) {
56fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    WeakResourceFilter filter;
57fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ASSERT_EQ(NO_ERROR, filter.parse(String8("fr")));
58fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
59fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ConfigDescription config;
60fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.language[0] = 'f';
61fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.language[1] = 'r';
62fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
63fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    EXPECT_TRUE(filter.match(config));
64fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski}
65fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
66fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiTEST(WeakResourceFilterTest, MatchesConfigWithSameValueAxisAndOtherUnrelatedAxis) {
67fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    WeakResourceFilter filter;
68fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ASSERT_EQ(NO_ERROR, filter.parse(String8("fr")));
69fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
70fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ConfigDescription config;
71fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.language[0] = 'f';
72fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.language[1] = 'r';
73fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.density = 320;
74fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
75fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    EXPECT_TRUE(filter.match(config));
76fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski}
77fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
78a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam LesinskiTEST(WeakResourceFilterTest, MatchesConfigWithOneMatchingAxis) {
79a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    WeakResourceFilter filter;
80a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    ASSERT_EQ(NO_ERROR, filter.parse(String8("fr_FR,sw360dp,normal,en_US")));
81a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski
82a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    ConfigDescription config;
83a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    config.language[0] = 'e';
84a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    config.language[1] = 'n';
85a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski
86a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    EXPECT_TRUE(filter.match(config));
87a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski}
88a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski
89fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiTEST(WeakResourceFilterTest, DoesNotMatchConfigWithDifferentValueAxis) {
90fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    WeakResourceFilter filter;
91fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ASSERT_EQ(NO_ERROR, filter.parse(String8("fr")));
92fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
93fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ConfigDescription config;
94fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.language[0] = 'd';
95fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.language[1] = 'e';
96fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
97fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    EXPECT_FALSE(filter.match(config));
98fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski}
99fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
100a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam LesinskiTEST(WeakResourceFilterTest, DoesNotMatchWhenOneQualifierIsExplicitlyNotMatched) {
101a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    WeakResourceFilter filter;
102a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    ASSERT_EQ(NO_ERROR, filter.parse(String8("fr_FR,en_US,normal,large,xxhdpi,sw320dp")));
103a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski
104a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    ConfigDescription config;
105a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    config.language[0] = 'f';
106a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    config.language[1] = 'r';
107a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    config.smallestScreenWidthDp = 600;
108a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    config.version = 13;
109a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski
110a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    EXPECT_FALSE(filter.match(config));
111a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski}
112a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski
113a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam LesinskiTEST(WeakResourceFilterTest, MatchesSmallestWidthWhenSmaller) {
114a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    WeakResourceFilter filter;
115a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    ASSERT_EQ(NO_ERROR, filter.parse(String8("sw600dp")));
116a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski
117a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    ConfigDescription config;
118a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    config.language[0] = 'f';
119a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    config.language[1] = 'r';
120a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    config.smallestScreenWidthDp = 320;
121a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    config.version = 13;
122a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski
123a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski    EXPECT_TRUE(filter.match(config));
124a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski}
125a5cc002bfe7ca8a6536549189b44e7143c8611dcAdam Lesinski
126fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiTEST(WeakResourceFilterTest, MatchesConfigWithSameLanguageButNoRegionSpecified) {
127fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    WeakResourceFilter filter;
128fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ASSERT_EQ(NO_ERROR, filter.parse(String8("de-rDE")));
129fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
130fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ConfigDescription config;
131fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.language[0] = 'd';
132fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.language[1] = 'e';
133fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
134fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    EXPECT_TRUE(filter.match(config));
135fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski}
136fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
137fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiTEST(WeakResourceFilterTest, ParsesStandardLocaleOnlyString) {
138fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    WeakResourceFilter filter;
139fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    EXPECT_EQ(NO_ERROR, filter.parse(String8("de_DE")));
140fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski}
141fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
142fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiTEST(WeakResourceFilterTest, IgnoresVersion) {
143fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    WeakResourceFilter filter;
144fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ASSERT_EQ(NO_ERROR, filter.parse(String8("normal-v4")));
145fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
146fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ConfigDescription config;
147fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.smallestScreenWidthDp = 600;
148fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    config.version = 13;
149fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
150fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    // The configs don't match on any axis besides version, which should be ignored.
151fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    EXPECT_TRUE(filter.match(config));
152fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski}
153fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
154fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam LesinskiTEST(WeakResourceFilterTest, MatchesConfigWithRegion) {
155fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    WeakResourceFilter filter;
156fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ASSERT_EQ(NO_ERROR, filter.parse(String8("kok,kok_IN,kok_419")));
157fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
158fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ConfigDescription config;
159fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    AaptLocaleValue val;
160fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    ASSERT_TRUE(val.initFromFilterString(String8("kok_IN")));
161fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    val.writeTo(&config);
162fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
163fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski    EXPECT_TRUE(filter.match(config));
164fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski}
165fab50875b98e8274ac8ee44b38ba42521bbbf1f9Adam Lesinski
16627f69f4e06961fdecd1078b2292d764a157e5e1cAdam LesinskiTEST(StrongResourceFilterTest, MatchesDensities) {
16727f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    ConfigDescription config;
16827f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    config.density = 160;
16927f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    config.version = 4;
17027f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    std::set<ConfigDescription> configs;
17127f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    configs.insert(config);
17227f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski
17327f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    StrongResourceFilter filter(configs);
17427f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski
17527f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    ConfigDescription expectedConfig;
17627f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    expectedConfig.density = 160;
17727f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    expectedConfig.version = 4;
17827f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    ASSERT_TRUE(filter.match(expectedConfig));
17927f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski}
18027f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski
18127f69f4e06961fdecd1078b2292d764a157e5e1cAdam LesinskiTEST(StrongResourceFilterTest, MatchOnlyMdpiAndExcludeAllOthers) {
18227f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    std::set<ConfigDescription> configsToMatch;
18327f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    ConfigDescription config;
18427f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    config.density = 160;
18527f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    config.version = 4;
18627f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    configsToMatch.insert(config);
18727f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski
18827f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    std::set<ConfigDescription> configsToNotMatch;
18927f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    config.density = 480;
19027f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    configsToNotMatch.insert(config);
19127f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski
19227f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    AndResourceFilter filter;
19327f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    filter.addFilter(new InverseResourceFilter(new StrongResourceFilter(configsToNotMatch)));
19427f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    filter.addFilter(new StrongResourceFilter(configsToMatch));
19527f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski
19627f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    ConfigDescription expectedConfig;
19727f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    expectedConfig.density = 160;
19827f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    expectedConfig.version = 4;
19927f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski    ASSERT_TRUE(filter.match(expectedConfig));
20027f69f4e06961fdecd1078b2292d764a157e5e1cAdam Lesinski}
201