Home | History | Annotate | Download | only in provider
      1 /*
      2  * Copyright (C) 2018 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 package android.provider;
     18 
     19 import static org.junit.Assert.assertFalse;
     20 import static org.junit.Assert.assertTrue;
     21 import static org.junit.Assert.fail;
     22 
     23 import android.platform.test.annotations.Presubmit;
     24 import android.provider.SettingsValidators.Validator;
     25 import android.support.test.filters.SmallTest;
     26 import android.support.test.runner.AndroidJUnit4;
     27 
     28 import org.junit.Test;
     29 import org.junit.runner.RunWith;
     30 
     31 import java.util.Map;
     32 
     33 /**
     34  * Tests that ensure all backed up settings have non-null validators. Also, common validators
     35  * are tested.
     36  */
     37 @Presubmit
     38 @RunWith(AndroidJUnit4.class)
     39 @SmallTest
     40 public class SettingsValidatorsTest {
     41 
     42     @Test
     43     public void testNonNegativeIntegerValidator() {
     44         assertTrue(SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR.validate("1"));
     45         assertTrue(SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR.validate("0"));
     46         assertFalse(SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR.validate("-1"));
     47         assertFalse(SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR.validate("rectangle"));
     48     }
     49 
     50     @Test
     51     public void testNonNegativeIntegerValidator_onNullValue_returnsFalse() {
     52         assertFalse(SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR.validate(null));
     53     }
     54 
     55     @Test
     56     public void testAnyIntegerValidator() {
     57         assertTrue(SettingsValidators.ANY_INTEGER_VALIDATOR.validate("1"));
     58         assertTrue(SettingsValidators.ANY_INTEGER_VALIDATOR.validate("0"));
     59         assertTrue(SettingsValidators.ANY_INTEGER_VALIDATOR.validate("-1"));
     60         assertFalse(SettingsValidators.ANY_INTEGER_VALIDATOR.validate("rectangle"));
     61     }
     62 
     63     @Test
     64     public void testAnyIntegerValidator_onNullValue_returnsFalse() {
     65         assertFalse(SettingsValidators.ANY_INTEGER_VALIDATOR.validate(null));
     66     }
     67 
     68     @Test
     69     public void testUriValidator_onNullValue_returnsTrue() {
     70         assertTrue(SettingsValidators.URI_VALIDATOR.validate(null));
     71     }
     72 
     73     @Test
     74     public void testComponentNameValidator() {
     75         assertTrue(SettingsValidators.COMPONENT_NAME_VALIDATOR.validate(
     76                 "android/com.android.internal.backup.LocalTransport"));
     77         assertFalse(SettingsValidators.COMPONENT_NAME_VALIDATOR.validate("rectangle"));
     78     }
     79 
     80     @Test
     81     public void testComponentNameValidator_onNullValue_returnsFalse() {
     82         assertFalse(SettingsValidators.COMPONENT_NAME_VALIDATOR.validate(null));
     83     }
     84 
     85     @Test
     86     public void testLenientIpAddressValidator_onNullValue_returnsFalse() {
     87         assertFalse(SettingsValidators.LENIENT_IP_ADDRESS_VALIDATOR.validate(null));
     88     }
     89 
     90     @Test
     91     public void testNullableComponentNameValidator_onValidComponentName_returnsTrue() {
     92         assertTrue(SettingsValidators.NULLABLE_COMPONENT_NAME_VALIDATOR.validate(
     93                 "android/com.android.internal.backup.LocalTransport"));
     94     }
     95 
     96     @Test
     97     public void testNullableComponentNameValidator_onInvalidComponentName_returnsFalse() {
     98         assertFalse(SettingsValidators.NULLABLE_COMPONENT_NAME_VALIDATOR.validate(
     99                 "rectangle"));
    100     }
    101 
    102     @Test
    103     public void testNullableComponentNameValidator_onNullValue_returnsTrue() {
    104         assertTrue(SettingsValidators.NULLABLE_COMPONENT_NAME_VALIDATOR.validate(null));
    105     }
    106 
    107     @Test
    108     public void testLocaleValidator() {
    109         assertTrue(SettingsValidators.LOCALE_VALIDATOR.validate("en_US"));
    110         assertTrue(SettingsValidators.LOCALE_VALIDATOR.validate("es"));
    111         assertFalse(SettingsValidators.LOCALE_VALIDATOR.validate("rectangle"));
    112     }
    113 
    114     @Test
    115     public void testLocaleValidator_onNullValue_returnsFalse() {
    116         assertFalse(SettingsValidators.LOCALE_VALIDATOR.validate(null));
    117     }
    118 
    119     @Test
    120     public void testPackageNameValidator() {
    121         assertTrue(SettingsValidators.PACKAGE_NAME_VALIDATOR.validate(
    122                 "com.google.android"));
    123         assertFalse(SettingsValidators.PACKAGE_NAME_VALIDATOR.validate("com.google.@android"));
    124         assertFalse(SettingsValidators.PACKAGE_NAME_VALIDATOR.validate(".com.google.android"));
    125         assertFalse(SettingsValidators.PACKAGE_NAME_VALIDATOR.validate(".com.google.5android"));
    126     }
    127 
    128     @Test
    129     public void testPackageNameValidator_onNullValue_returnsFalse() {
    130         assertFalse(SettingsValidators.PACKAGE_NAME_VALIDATOR.validate(null));
    131     }
    132 
    133     @Test
    134     public void testDiscreteValueValidator() {
    135         String[] beerTypes = new String[]{"Ale", "American IPA", "Stout"};
    136         Validator v = new SettingsValidators.DiscreteValueValidator(beerTypes);
    137         assertTrue(v.validate("Ale"));
    138         assertTrue(v.validate("American IPA"));
    139         assertTrue(v.validate("Stout"));
    140         assertFalse(v.validate("Cider")); // just juice pretending to be beer
    141     }
    142 
    143     @Test
    144     public void testDiscreteValueValidator_onNullValue_returnsFalse() {
    145         String[] discreteTypes = new String[]{"Type1", "Type2"};
    146         Validator v = new SettingsValidators.DiscreteValueValidator(discreteTypes);
    147 
    148         assertFalse(v.validate(null));
    149     }
    150 
    151     @Test
    152     public void testInclusiveIntegerRangeValidator() {
    153         Validator v = new SettingsValidators.InclusiveIntegerRangeValidator(0, 5);
    154         assertTrue(v.validate("0"));
    155         assertTrue(v.validate("2"));
    156         assertTrue(v.validate("5"));
    157         assertFalse(v.validate("-1"));
    158         assertFalse(v.validate("6"));
    159     }
    160 
    161     @Test
    162     public void testInclusiveIntegerRangeValidator_onNullValue_returnsFalse() {
    163         Validator v = new SettingsValidators.InclusiveIntegerRangeValidator(0, 5);
    164 
    165         assertFalse(v.validate(null));
    166     }
    167 
    168     @Test
    169     public void testInclusiveFloatRangeValidator() {
    170         Validator v = new SettingsValidators.InclusiveFloatRangeValidator(0.0f, 5.0f);
    171         assertTrue(v.validate("0.0"));
    172         assertTrue(v.validate("2.0"));
    173         assertTrue(v.validate("5.0"));
    174         assertFalse(v.validate("-1.0"));
    175         assertFalse(v.validate("6.0"));
    176     }
    177 
    178     @Test
    179     public void testInclusiveFloatRangeValidator_onNullValue_returnsFalse() {
    180         Validator v = new SettingsValidators.InclusiveFloatRangeValidator(0.0f, 5.0f);
    181 
    182         assertFalse(v.validate(null));
    183     }
    184 
    185     @Test
    186     public void testComponentNameListValidator() {
    187         Validator v = new SettingsValidators.ComponentNameListValidator(",");
    188         assertTrue(v.validate("android/com.android.internal.backup.LocalTransport,"
    189                 + "com.google.android.gms/.backup.migrate.service.D2dTransport"));
    190         assertFalse(v.validate("com.google.5android,android"));
    191     }
    192 
    193     @Test
    194     public void testComponentNameListValidator_onNullValue_returnsFalse() {
    195         Validator v = new SettingsValidators.ComponentNameListValidator(",");
    196 
    197         assertFalse(v.validate(null));
    198     }
    199 
    200     @Test
    201     public void testPackageNameListValidator() {
    202         Validator v = new SettingsValidators.PackageNameListValidator(",");
    203         assertTrue(v.validate("com.android.internal.backup.LocalTransport,com.google.android.gms"));
    204         assertFalse(v.validate("5com.android.internal.backup.LocalTransport,android"));
    205     }
    206 
    207     @Test
    208     public void testPackageNameListValidator_onNullValue_returnsFalse() {
    209         Validator v = new SettingsValidators.PackageNameListValidator(",");
    210 
    211         assertFalse(v.validate(null));
    212     }
    213 
    214     @Test
    215     public void dateFormatValidator_onNullValue_returnsFalse() {
    216         assertFalse(Settings.System.DATE_FORMAT_VALIDATOR.validate(null));
    217     }
    218 
    219     @Test
    220     public void ensureAllBackedUpSystemSettingsHaveValidators() {
    221         String offenders = getOffenders(concat(Settings.System.SETTINGS_TO_BACKUP,
    222                 Settings.System.LEGACY_RESTORE_SETTINGS), Settings.System.VALIDATORS);
    223 
    224         failIfOffendersPresent(offenders, "Settings.System");
    225     }
    226 
    227     @Test
    228     public void ensureAllBackedUpGlobalSettingsHaveValidators() {
    229         String offenders = getOffenders(concat(Settings.Global.SETTINGS_TO_BACKUP,
    230                 Settings.Global.LEGACY_RESTORE_SETTINGS), Settings.Global.VALIDATORS);
    231 
    232         failIfOffendersPresent(offenders, "Settings.Global");
    233     }
    234 
    235     @Test
    236     public void ensureAllBackedUpSecureSettingsHaveValidators() {
    237         String offenders = getOffenders(concat(Settings.Secure.SETTINGS_TO_BACKUP,
    238                 Settings.Secure.LEGACY_RESTORE_SETTINGS), Settings.Secure.VALIDATORS);
    239 
    240         failIfOffendersPresent(offenders, "Settings.Secure");
    241     }
    242 
    243     private void failIfOffendersPresent(String offenders, String settingsType) {
    244         if (offenders.length() > 0) {
    245             fail("All " + settingsType + " settings that are backed up have to have a non-null"
    246                     + " validator, but those don't: " + offenders);
    247         }
    248     }
    249 
    250     private String getOffenders(String[] settingsToBackup, Map<String, Validator> validators) {
    251         StringBuilder offenders = new StringBuilder();
    252         for (String setting : settingsToBackup) {
    253             if (validators.get(setting) == null) {
    254                 offenders.append(setting).append(" ");
    255             }
    256         }
    257         return offenders.toString();
    258     }
    259 
    260     private String[] concat(String[] first, String[] second) {
    261         if (second == null || second.length == 0) {
    262             return first;
    263         }
    264         final int firstLen = first.length;
    265         final int secondLen = second.length;
    266         String[] both = new String[firstLen + secondLen];
    267         System.arraycopy(first, 0, both, 0, firstLen);
    268         System.arraycopy(second, 0, both, firstLen, secondLen);
    269         return both;
    270     }
    271 }
    272