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