blob: bb9e6f6fe885aac3e8404913c8ae9eda49a767f4 [file] [log] [blame]
Michal Karpinski2c37b082018-01-18 16:14:27 +00001/*
Al Suttonb0067fb2019-08-16 10:34:46 +01002 * Copyright (C) 2019 The Android Open Source Project
Michal Karpinski2c37b082018-01-18 16:14:27 +00003 *
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
Al Suttonb0067fb2019-08-16 10:34:46 +010017package android.provider.settings.validators;
Michal Karpinski2c37b082018-01-18 16:14:27 +000018
Amin Shaikhbb588792019-04-02 18:07:40 -040019import static com.google.common.truth.Truth.assertThat;
20
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +000021import static org.junit.Assert.assertFalse;
22import static org.junit.Assert.assertTrue;
Annie Meng5d26b8c2018-05-17 16:00:16 +010023import static org.junit.Assert.fail;
Michal Karpinski2c37b082018-01-18 16:14:27 +000024
25import android.platform.test.annotations.Presubmit;
Al Suttonb0067fb2019-08-16 10:34:46 +010026import android.provider.Settings;
Al Sutton0833b2e2019-08-22 16:21:30 +010027import android.provider.settings.backup.GlobalSettings;
28import android.provider.settings.backup.SecureSettings;
29import android.provider.settings.backup.SystemSettings;
Tadashi G. Takaokab4470f22019-01-15 18:29:15 +090030
31import androidx.test.filters.SmallTest;
32import androidx.test.runner.AndroidJUnit4;
Michal Karpinski2c37b082018-01-18 16:14:27 +000033
Amin Shaikhbb588792019-04-02 18:07:40 -040034import org.json.JSONException;
35import org.json.JSONObject;
Michal Karpinski2c37b082018-01-18 16:14:27 +000036import org.junit.Test;
37import org.junit.runner.RunWith;
38
Michal Karpinski5db1e432018-01-18 20:10:24 +000039import java.util.Map;
40
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +000041/**
42 * Tests that ensure all backed up settings have non-null validators. Also, common validators
43 * are tested.
44 */
Michal Karpinski2c37b082018-01-18 16:14:27 +000045@Presubmit
46@RunWith(AndroidJUnit4.class)
47@SmallTest
48public class SettingsValidatorsTest {
49
50 @Test
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +000051 public void testNonNegativeIntegerValidator() {
52 assertTrue(SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR.validate("1"));
53 assertTrue(SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR.validate("0"));
54 assertFalse(SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR.validate("-1"));
55 assertFalse(SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR.validate("rectangle"));
56 }
57
58 @Test
Annie Mengeed1b812018-05-21 16:34:52 +010059 public void testNonNegativeIntegerValidator_onNullValue_returnsFalse() {
60 assertFalse(SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR.validate(null));
61 }
62
63 @Test
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +000064 public void testAnyIntegerValidator() {
65 assertTrue(SettingsValidators.ANY_INTEGER_VALIDATOR.validate("1"));
66 assertTrue(SettingsValidators.ANY_INTEGER_VALIDATOR.validate("0"));
67 assertTrue(SettingsValidators.ANY_INTEGER_VALIDATOR.validate("-1"));
68 assertFalse(SettingsValidators.ANY_INTEGER_VALIDATOR.validate("rectangle"));
69 }
70
71 @Test
Annie Mengeed1b812018-05-21 16:34:52 +010072 public void testAnyIntegerValidator_onNullValue_returnsFalse() {
73 assertFalse(SettingsValidators.ANY_INTEGER_VALIDATOR.validate(null));
74 }
75
76 @Test
77 public void testUriValidator_onNullValue_returnsTrue() {
78 assertTrue(SettingsValidators.URI_VALIDATOR.validate(null));
79 }
80
81 @Test
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +000082 public void testComponentNameValidator() {
83 assertTrue(SettingsValidators.COMPONENT_NAME_VALIDATOR.validate(
Stefanote66c1c32018-08-28 16:51:08 +010084 "com.android.localtransport/.LocalTransport"));
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +000085 assertFalse(SettingsValidators.COMPONENT_NAME_VALIDATOR.validate("rectangle"));
86 }
87
88 @Test
Annie Mengeed1b812018-05-21 16:34:52 +010089 public void testComponentNameValidator_onNullValue_returnsFalse() {
Annie Meng5d26b8c2018-05-17 16:00:16 +010090 assertFalse(SettingsValidators.COMPONENT_NAME_VALIDATOR.validate(null));
91 }
92
93 @Test
Annie Mengeed1b812018-05-21 16:34:52 +010094 public void testLenientIpAddressValidator_onNullValue_returnsFalse() {
95 assertFalse(SettingsValidators.LENIENT_IP_ADDRESS_VALIDATOR.validate(null));
96 }
97
98 @Test
Annie Meng44511792018-05-17 18:49:24 +010099 public void testNullableComponentNameValidator_onValidComponentName_returnsTrue() {
100 assertTrue(SettingsValidators.NULLABLE_COMPONENT_NAME_VALIDATOR.validate(
Stefanote66c1c32018-08-28 16:51:08 +0100101 "com.android.localtransport/.LocalTransport"));
Annie Meng44511792018-05-17 18:49:24 +0100102 }
103
104 @Test
105 public void testNullableComponentNameValidator_onInvalidComponentName_returnsFalse() {
106 assertFalse(SettingsValidators.NULLABLE_COMPONENT_NAME_VALIDATOR.validate(
107 "rectangle"));
108 }
109
110 @Test
111 public void testNullableComponentNameValidator_onNullValue_returnsTrue() {
112 assertTrue(SettingsValidators.NULLABLE_COMPONENT_NAME_VALIDATOR.validate(null));
113 }
114
115 @Test
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000116 public void testLocaleValidator() {
117 assertTrue(SettingsValidators.LOCALE_VALIDATOR.validate("en_US"));
118 assertTrue(SettingsValidators.LOCALE_VALIDATOR.validate("es"));
119 assertFalse(SettingsValidators.LOCALE_VALIDATOR.validate("rectangle"));
120 }
121
122 @Test
Annie Mengeed1b812018-05-21 16:34:52 +0100123 public void testLocaleValidator_onNullValue_returnsFalse() {
124 assertFalse(SettingsValidators.LOCALE_VALIDATOR.validate(null));
125 }
126
127 @Test
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000128 public void testPackageNameValidator() {
129 assertTrue(SettingsValidators.PACKAGE_NAME_VALIDATOR.validate(
130 "com.google.android"));
131 assertFalse(SettingsValidators.PACKAGE_NAME_VALIDATOR.validate("com.google.@android"));
132 assertFalse(SettingsValidators.PACKAGE_NAME_VALIDATOR.validate(".com.google.android"));
133 assertFalse(SettingsValidators.PACKAGE_NAME_VALIDATOR.validate(".com.google.5android"));
134 }
135
136 @Test
Annie Mengeed1b812018-05-21 16:34:52 +0100137 public void testPackageNameValidator_onNullValue_returnsFalse() {
138 assertFalse(SettingsValidators.PACKAGE_NAME_VALIDATOR.validate(null));
139 }
140
141 @Test
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000142 public void testDiscreteValueValidator() {
143 String[] beerTypes = new String[]{"Ale", "American IPA", "Stout"};
Al Suttonb0067fb2019-08-16 10:34:46 +0100144 Validator v = new DiscreteValueValidator(beerTypes);
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000145 assertTrue(v.validate("Ale"));
146 assertTrue(v.validate("American IPA"));
147 assertTrue(v.validate("Stout"));
148 assertFalse(v.validate("Cider")); // just juice pretending to be beer
149 }
150
151 @Test
Annie Mengeed1b812018-05-21 16:34:52 +0100152 public void testDiscreteValueValidator_onNullValue_returnsFalse() {
153 String[] discreteTypes = new String[]{"Type1", "Type2"};
Al Suttonb0067fb2019-08-16 10:34:46 +0100154 Validator v = new DiscreteValueValidator(discreteTypes);
Annie Mengeed1b812018-05-21 16:34:52 +0100155
156 assertFalse(v.validate(null));
157 }
158
159 @Test
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000160 public void testInclusiveIntegerRangeValidator() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100161 Validator v = new InclusiveIntegerRangeValidator(0, 5);
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000162 assertTrue(v.validate("0"));
163 assertTrue(v.validate("2"));
164 assertTrue(v.validate("5"));
165 assertFalse(v.validate("-1"));
166 assertFalse(v.validate("6"));
167 }
168
169 @Test
Annie Mengeed1b812018-05-21 16:34:52 +0100170 public void testInclusiveIntegerRangeValidator_onNullValue_returnsFalse() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100171 Validator v = new InclusiveIntegerRangeValidator(0, 5);
Annie Mengeed1b812018-05-21 16:34:52 +0100172
173 assertFalse(v.validate(null));
174 }
175
176 @Test
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000177 public void testInclusiveFloatRangeValidator() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100178 Validator v = new InclusiveFloatRangeValidator(0.0f, 5.0f);
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000179 assertTrue(v.validate("0.0"));
180 assertTrue(v.validate("2.0"));
181 assertTrue(v.validate("5.0"));
182 assertFalse(v.validate("-1.0"));
183 assertFalse(v.validate("6.0"));
184 }
185
186 @Test
Annie Mengeed1b812018-05-21 16:34:52 +0100187 public void testInclusiveFloatRangeValidator_onNullValue_returnsFalse() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100188 Validator v = new InclusiveFloatRangeValidator(0.0f, 5.0f);
Annie Mengeed1b812018-05-21 16:34:52 +0100189
190 assertFalse(v.validate(null));
191 }
192
193 @Test
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000194 public void testComponentNameListValidator() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100195 Validator v = new ComponentNameListValidator(",");
Stefanote66c1c32018-08-28 16:51:08 +0100196 assertTrue(v.validate("com.android.localtransport/.LocalTransport,"
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000197 + "com.google.android.gms/.backup.migrate.service.D2dTransport"));
198 assertFalse(v.validate("com.google.5android,android"));
199 }
200
201 @Test
Annie Mengeed1b812018-05-21 16:34:52 +0100202 public void testComponentNameListValidator_onNullValue_returnsFalse() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100203 Validator v = new ComponentNameListValidator(",");
Annie Mengeed1b812018-05-21 16:34:52 +0100204
205 assertFalse(v.validate(null));
206 }
207
208 @Test
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000209 public void testPackageNameListValidator() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100210 Validator v = new PackageNameListValidator(",");
Stefanote66c1c32018-08-28 16:51:08 +0100211 assertTrue(v.validate("com.android.localtransport.LocalTransport,com.google.android.gms"));
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000212 assertFalse(v.validate("5com.android.internal.backup.LocalTransport,android"));
213 }
214
Annie Mengeed1b812018-05-21 16:34:52 +0100215 @Test
216 public void testPackageNameListValidator_onNullValue_returnsFalse() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100217 Validator v = new PackageNameListValidator(",");
Annie Mengeed1b812018-05-21 16:34:52 +0100218
219 assertFalse(v.validate(null));
220 }
221
222 @Test
223 public void dateFormatValidator_onNullValue_returnsFalse() {
Al Sutton91f89d02019-08-16 12:56:57 +0100224 assertFalse(SettingsValidators.DATE_FORMAT_VALIDATOR.validate(null));
Annie Mengeed1b812018-05-21 16:34:52 +0100225 }
Michal Karpinski6fe6c8e2018-01-24 15:40:09 +0000226
227 @Test
Amin Shaikhbb588792019-04-02 18:07:40 -0400228 public void testJSONObjectValidator() throws JSONException {
229 Validator v = SettingsValidators.JSON_OBJECT_VALIDATOR;
230
231 assertThat(v.validate(new JSONObject().toString())).isTrue();
232 assertThat(v.validate("{}")).isTrue();
233 assertThat(v.validate(new JSONObject().put("foo", "bar").toString()))
234 .isTrue();
235 assertThat(v.validate("{\"foo\": \"bar\"}")).isTrue();
236
237 assertThat(v.validate("random string")).isFalse();
238 assertThat(v.validate("random: string")).isFalse();
239 assertThat(v.validate("{random: }")).isFalse();
240 }
241
242 @Test
243 public void testJSONObjectValidator_onNullValue_returnsFalse() {
Al Sutton91f89d02019-08-16 12:56:57 +0100244 assertFalse(SettingsValidators.JSON_OBJECT_VALIDATOR.validate(null));
Amin Shaikhbb588792019-04-02 18:07:40 -0400245 }
246
247 @Test
248 public void testJSONObjectValidator_onEmptyString_returnsFalse() {
Al Sutton91f89d02019-08-16 12:56:57 +0100249 assertFalse(SettingsValidators.JSON_OBJECT_VALIDATOR.validate(""));
Amin Shaikhbb588792019-04-02 18:07:40 -0400250 }
251
252 @Test
Michal Karpinski2c37b082018-01-18 16:14:27 +0000253 public void ensureAllBackedUpSystemSettingsHaveValidators() {
Al Sutton0833b2e2019-08-22 16:21:30 +0100254 String offenders = getOffenders(concat(SystemSettings.SETTINGS_TO_BACKUP,
Al Sutton91f89d02019-08-16 12:56:57 +0100255 Settings.System.LEGACY_RESTORE_SETTINGS), SystemSettingsValidators.VALIDATORS);
Michal Karpinski5db1e432018-01-18 20:10:24 +0000256
257 failIfOffendersPresent(offenders, "Settings.System");
258 }
259
260 @Test
Al Sutton867ded22019-08-08 12:14:23 +0100261 public void testTTSListValidator_withValidInput_returnsTrue() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100262 assertTrue(
263 SettingsValidators.TTS_LIST_VALIDATOR.validate(
264 "com.foo.ttsengine:en-US,com.bar.ttsengine:es_ES"));
Al Sutton867ded22019-08-08 12:14:23 +0100265 }
266
267 @Test
268 public void testTTSListValidator_withInvalidInput_returnsFalse() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100269 assertFalse(
270 SettingsValidators.TTS_LIST_VALIDATOR.validate(
271 "com.foo.ttsengine:eng-USA,INVALID"));
Al Sutton867ded22019-08-08 12:14:23 +0100272 }
273
274 @Test
275 public void testTTSListValidator_withEmptyInput_returnsFalse() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100276 assertFalse(SettingsValidators.TTS_LIST_VALIDATOR.validate(""));
Al Sutton867ded22019-08-08 12:14:23 +0100277 }
278
279 @Test
280 public void testTTSListValidator_withNullInput_returnsFalse() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100281 assertFalse(SettingsValidators.TTS_LIST_VALIDATOR.validate(null));
Al Sutton867ded22019-08-08 12:14:23 +0100282 }
283
284 @Test
285 public void testTileListValidator_withValidInput_returnsTrue() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100286 assertTrue(SettingsValidators.TILE_LIST_VALIDATOR.validate("1,2,3,4"));
Al Sutton867ded22019-08-08 12:14:23 +0100287 }
288
289 @Test
290 public void testTileListValidator_withMissingValue_returnsFalse() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100291 assertFalse(SettingsValidators.TILE_LIST_VALIDATOR.validate("1,,3"));
Al Sutton867ded22019-08-08 12:14:23 +0100292 }
293
294 @Test
295 public void testTileListValidator_withNullInput_returnsFalse() {
Al Suttonb0067fb2019-08-16 10:34:46 +0100296 assertFalse(SettingsValidators.TILE_LIST_VALIDATOR.validate(null));
Al Sutton867ded22019-08-08 12:14:23 +0100297 }
298
299 @Test
Rhed Jaof211ff62019-11-27 22:53:44 +0800300 public void testAccessibilityShortcutTargetValidator() {
301 assertTrue(SettingsValidators.ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR.validate(
302 "com.google.android/.AccessibilityShortcutTarget"));
303 assertTrue(SettingsValidators.ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR.validate(
304 "com.google.android"));
305 assertTrue(SettingsValidators.ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR.validate(
306 "com.google.android/.AccessibilityShortcutTarget:com.google.android"));
307 assertFalse(SettingsValidators.ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR.validate(
308 "com.google.android/.AccessibilityShortcutTarget:com.google.@android"));
309 }
310
311 @Test
Michal Karpinski5db1e432018-01-18 20:10:24 +0000312 public void ensureAllBackedUpGlobalSettingsHaveValidators() {
Al Sutton0833b2e2019-08-22 16:21:30 +0100313 String offenders = getOffenders(concat(GlobalSettings.SETTINGS_TO_BACKUP,
Al Sutton91f89d02019-08-16 12:56:57 +0100314 Settings.Global.LEGACY_RESTORE_SETTINGS), GlobalSettingsValidators.VALIDATORS);
Michal Karpinski5db1e432018-01-18 20:10:24 +0000315
316 failIfOffendersPresent(offenders, "Settings.Global");
317 }
318
Michal Karpinski964943a2018-01-19 16:28:26 +0000319 @Test
320 public void ensureAllBackedUpSecureSettingsHaveValidators() {
Al Sutton0833b2e2019-08-22 16:21:30 +0100321 String offenders = getOffenders(concat(SecureSettings.SETTINGS_TO_BACKUP,
Al Sutton91f89d02019-08-16 12:56:57 +0100322 Settings.Secure.LEGACY_RESTORE_SETTINGS), SecureSettingsValidators.VALIDATORS);
Michal Karpinski964943a2018-01-19 16:28:26 +0000323
324 failIfOffendersPresent(offenders, "Settings.Secure");
325 }
326
Michal Karpinski5db1e432018-01-18 20:10:24 +0000327 private void failIfOffendersPresent(String offenders, String settingsType) {
328 if (offenders.length() > 0) {
329 fail("All " + settingsType + " settings that are backed up have to have a non-null"
330 + " validator, but those don't: " + offenders);
331 }
332 }
333
334 private String getOffenders(String[] settingsToBackup, Map<String, Validator> validators) {
Michal Karpinski2c37b082018-01-18 16:14:27 +0000335 StringBuilder offenders = new StringBuilder();
Michal Karpinski5db1e432018-01-18 20:10:24 +0000336 for (String setting : settingsToBackup) {
337 if (validators.get(setting) == null) {
Michal Karpinski2c37b082018-01-18 16:14:27 +0000338 offenders.append(setting).append(" ");
339 }
340 }
Michal Karpinski5db1e432018-01-18 20:10:24 +0000341 return offenders.toString();
Michal Karpinski2c37b082018-01-18 16:14:27 +0000342 }
Michal Karpinski964943a2018-01-19 16:28:26 +0000343
344 private String[] concat(String[] first, String[] second) {
345 if (second == null || second.length == 0) {
346 return first;
347 }
348 final int firstLen = first.length;
349 final int secondLen = second.length;
350 String[] both = new String[firstLen + secondLen];
351 System.arraycopy(first, 0, both, 0, firstLen);
352 System.arraycopy(second, 0, both, firstLen, secondLen);
353 return both;
354 }
Michal Karpinski2c37b082018-01-18 16:14:27 +0000355}