replicant-vendor_cmsdk/packages/CMSettingsProvider/tests/src/org/cyanogenmod/cmsettings/tests/CMSettingsProviderDefaultsT...

276 lines
12 KiB
Java

/**
* 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"));
SYSTEM_SETTINGS_DEFAULTS.add(new Setting(
CMSettings.System.STATUS_BAR_BATTERY_STYLE,
"R.integer.def_battery_style"));
SYSTEM_SETTINGS_DEFAULTS.add(new Setting(
CMSettings.System.CONNECTED_LINE_IDENTIFICATION,
"R.bool.def_connected_line_identification"));
}
//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.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);
}
}