diff options
Diffstat (limited to 'packages/CMSettingsProvider/tests/src/org/cyanogenmod/cmsettings/tests/CMSettingsProviderDefaultsTest.java')
-rw-r--r-- | packages/CMSettingsProvider/tests/src/org/cyanogenmod/cmsettings/tests/CMSettingsProviderDefaultsTest.java | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/packages/CMSettingsProvider/tests/src/org/cyanogenmod/cmsettings/tests/CMSettingsProviderDefaultsTest.java b/packages/CMSettingsProvider/tests/src/org/cyanogenmod/cmsettings/tests/CMSettingsProviderDefaultsTest.java new file mode 100644 index 0000000..0142b4f --- /dev/null +++ b/packages/CMSettingsProvider/tests/src/org/cyanogenmod/cmsettings/tests/CMSettingsProviderDefaultsTest.java @@ -0,0 +1,272 @@ +/** + * Copyright (c) 2016, The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.cyanogenmod.cmsettings.tests; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.os.UserHandle; +import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; + +import java.util.ArrayList; + +import android.text.TextUtils; +import android.util.Log; +import android.util.TypedValue; +import cyanogenmod.providers.CMSettings; +import org.cyanogenmod.cmsettings.CMDatabaseHelper; +import org.cyanogenmod.cmsettings.CMSettingsProvider; +import org.cyanogenmod.cmsettings.R; + +/** + * Created by adnan on 1/25/16. + */ +public class CMSettingsProviderDefaultsTest extends AndroidTestCase { + private ContentResolver mContentResolver; + private boolean mHasMigratedSettings; + private Resources mRemoteResources; + + // These data structures are set up in a way that is easier for manual input of new defaults + private static ArrayList<Setting> SYSTEM_SETTINGS_DEFAULTS = new ArrayList<Setting>(); + private static ArrayList<Setting> SECURE_SETTINGS_DEFAULTS = new ArrayList<Setting>(); + private static ArrayList<Setting> GLOBAL_SETTINGS_DEFAULTS = new ArrayList<Setting>(); + + //SYSTEM + static { + SYSTEM_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.System.STATUS_BAR_QUICK_QS_PULLDOWN, + "R.integer.def_qs_quick_pulldown")); + SYSTEM_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.System.NOTIFICATION_LIGHT_BRIGHTNESS_LEVEL, + "R.integer.def_notification_brightness_level")); + SYSTEM_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.System.ENABLE_PEOPLE_LOOKUP, + "R.integer.def_people_lookup")); + SYSTEM_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.System.NOTIFICATION_LIGHT_MULTIPLE_LEDS_ENABLE, + "R.bool.def_notification_multiple_leds")); + SYSTEM_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.System.SYSTEM_PROFILES_ENABLED, + "R.bool.def_profiles_enabled")); + SYSTEM_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.System.NOTIFICATION_LIGHT_PULSE_CUSTOM_ENABLE, + "R.bool.def_notification_pulse_custom_enable")); + SYSTEM_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.System.SWAP_VOLUME_KEYS_ON_ROTATION, + "R.bool.def_swap_volume_keys_on_rotation")); + SYSTEM_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.System.NOTIFICATION_LIGHT_PULSE_CUSTOM_VALUES, + "R.string.def_notification_pulse_custom_value")); + } + + //SECURE + static { + SECURE_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, + "R.integer.def_force_show_navbar")); + SECURE_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Secure.ADVANCED_MODE, + "R.bool.def_advanced_mode")); + SECURE_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Secure.QS_USE_MAIN_TILES, + "R.bool.def_sysui_qs_main_tiles")); + SECURE_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Secure.STATS_COLLECTION, + "R.bool.def_stats_collection")); + SECURE_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Secure.LOCKSCREEN_VISUALIZER_ENABLED, + "R.bool.def_lockscreen_visualizer")); + SECURE_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Secure.DEFAULT_THEME_COMPONENTS, + "R.string.def_theme_components")); + SECURE_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Secure.DEFAULT_THEME_PACKAGE, + "R.string.def_theme_package")); + SECURE_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Secure.QS_TILES, + "R.string.def_qs_tiles")); + SECURE_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Secure.PROTECTED_COMPONENT_MANAGERS, + "R.string.def_protected_component_managers")); + } + + //GLOBAL + static { + GLOBAL_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Global.POWER_NOTIFICATIONS_ENABLED, + "R.bool.def_power_notifications_enabled")); + GLOBAL_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Global.POWER_NOTIFICATIONS_VIBRATE, + "R.bool.def_power_notifications_vibrate")); + GLOBAL_SETTINGS_DEFAULTS.add(new Setting( + CMSettings.Global.POWER_NOTIFICATIONS_RINGTONE, + "R.string.def_power_notifications_ringtone")); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + mContentResolver = getContext().getContentResolver(); + mHasMigratedSettings = getContext().getSharedPreferences(CMSettingsProvider.TAG, + Context.MODE_PRIVATE).getBoolean(CMSettingsProvider.PREF_HAS_MIGRATED_CM_SETTINGS, + false); + mRemoteResources = getRemoteResources("org.cyanogenmod.cmsettings"); + } + + @SmallTest + public void testVerifySystemSettingsDefault() { + if (verifyNotMigratedSettings()) { + for (Setting setting : SYSTEM_SETTINGS_DEFAULTS) { + verifyDefaultSettingForTable(setting, CMDatabaseHelper.CMTableNames.TABLE_SYSTEM); + } + } + } + + @SmallTest + public void testVerifySecureSettingsDefaults() { + if (verifyNotMigratedSettings()) { + for (Setting setting : SECURE_SETTINGS_DEFAULTS) { + verifyDefaultSettingForTable(setting, CMDatabaseHelper.CMTableNames.TABLE_SECURE); + } + } + } + + @SmallTest + public void testVerifyGlobalSettingsDefaults() { + if (verifyNotMigratedSettings()) { + for (Setting setting : GLOBAL_SETTINGS_DEFAULTS) { + verifyDefaultSettingForTable(setting, CMDatabaseHelper.CMTableNames.TABLE_GLOBAL); + } + } + } + + private boolean verifyNotMigratedSettings() { + return !mHasMigratedSettings; + } + + private void verifyDefaultSettingForTable(Setting setting, String table) { + TypedValue value = new TypedValue(); + try { + int identifier = mRemoteResources.getIdentifier( + setting.mDefResName, setting.mType, "org.cyanogenmod.cmsettings"); + mRemoteResources.getValue(identifier, value, true); + } catch (Resources.NotFoundException e) { + // Resource not found, can't verify because it probably wasn't loaded in + throw new AssertionError("Unable to find resource for " + setting.mKey); + } + + try { + switch (value.type) { + case TypedValue.TYPE_INT_DEC: + int actualValue = getIntForTable(setting, table); + try { + assertEquals(value.data, actualValue); + } catch (AssertionError e) { + throw new AssertionError("Compared value of " + setting.mKey + " expected " + + value.data + " got " + actualValue); + } + break; + case TypedValue.TYPE_INT_BOOLEAN: + int actualBooleanValue = getIntForTable(setting, table); + try { + //This is gross + //Boolean can be "true" as long as it isn't 0 + if (value.data != 0) { + value.data = 1; + } + assertEquals(value.data, actualBooleanValue); + } catch (AssertionError e) { + throw new AssertionError("Compared value of " + setting.mKey + " expected " + + value.data + " got " + actualBooleanValue); + } + break; + case TypedValue.TYPE_STRING: + if (!TextUtils.isEmpty(value.string)) { + //This should really be done as a parameterized test + String actualStringValue = getStringForTable(setting, table); + try { + assertEquals(value.string, actualStringValue); + } catch (AssertionError e) { + throw new AssertionError("Compared value of " + setting.mKey + + " expected " + value.string + " got " + actualStringValue); + } + } + break; + case TypedValue.TYPE_NULL: + break; + } + } catch (CMSettings.CMSettingNotFoundException e) { + e.printStackTrace(); + throw new AssertionError("Setting " + setting.mKey + " not found!"); + } + } + + private int getIntForTable(Setting setting, String table) + throws CMSettings.CMSettingNotFoundException { + switch (table) { + case CMDatabaseHelper.CMTableNames.TABLE_SYSTEM: + return CMSettings.System.getIntForUser(mContentResolver, setting.mKey, + UserHandle.USER_OWNER); + case CMDatabaseHelper.CMTableNames.TABLE_SECURE: + return CMSettings.Secure.getIntForUser(mContentResolver, setting.mKey, + UserHandle.USER_OWNER); + case CMDatabaseHelper.CMTableNames.TABLE_GLOBAL: + return CMSettings.Global.getIntForUser(mContentResolver, setting.mKey, + UserHandle.USER_OWNER); + default: + throw new AssertionError("Invalid or empty table!"); + } + } + + private String getStringForTable(Setting setting, String table) + throws CMSettings.CMSettingNotFoundException { + switch (table) { + case CMDatabaseHelper.CMTableNames.TABLE_SYSTEM: + return CMSettings.System.getStringForUser(mContentResolver, setting.mKey, + UserHandle.USER_OWNER); + case CMDatabaseHelper.CMTableNames.TABLE_SECURE: + return CMSettings.Secure.getStringForUser(mContentResolver, setting.mKey, + UserHandle.USER_OWNER); + case CMDatabaseHelper.CMTableNames.TABLE_GLOBAL: + return CMSettings.Global.getStringForUser(mContentResolver, setting.mKey, + UserHandle.USER_OWNER); + default: + throw new AssertionError("Invalid or empty table!"); + } + } + + private static class Setting { + public String mKey; + public String mDefResName; + public String mType; + + public Setting(String key, String defResId) { + mKey = key; + String[] parts = defResId.split("\\."); + mType = parts[1]; + mDefResName = parts[2]; + } + } + + private Resources getRemoteResources(String packageName) + throws PackageManager.NameNotFoundException { + PackageManager packageManager = mContext.getPackageManager(); + return packageManager.getResourcesForApplication(packageName); + } +} |