fdroid-client/app/src/test/java/org/fdroid/fdroid/PreferencesTest.java

161 lines
7.0 KiB
Java

/*
* Copyright (C) 2018 Senecto Limited
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.fdroid.fdroid;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowLog;
import java.util.Map;
import androidx.preference.PreferenceManager;
import androidx.test.core.app.ApplicationProvider;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class)
public class PreferencesTest {
private static final String TAG = "PreferencesTest";
private static final Context CONTEXT = ApplicationProvider.getApplicationContext();
private SharedPreferences defaults;
/**
* Manually read the {@code preferences.xml} defaults to a separate
* instance. Clear the preference state before each test so that each
* test starts as if it was a first time install.
*/
@Before
public void setup() {
ShadowLog.stream = System.out;
defaults = getSharedPreferences(CONTEXT);
assertTrue(defaults.getAll().size() > 0);
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(CONTEXT);
Log.d(TAG, "Clearing DefaultSharedPreferences containing: " + sharedPreferences.getAll().size());
sharedPreferences.edit().clear().commit();
assertEquals(0, sharedPreferences.getAll().size());
SharedPreferences defaultValueSp = CONTEXT.getSharedPreferences(PreferenceManager.KEY_HAS_SET_DEFAULT_VALUES,
Context.MODE_PRIVATE);
defaultValueSp.edit().remove(PreferenceManager.KEY_HAS_SET_DEFAULT_VALUES).commit();
}
public static SharedPreferences getSharedPreferences(Context context) {
String sharedPreferencesName = context.getPackageName() + "_preferences_defaults";
PreferenceManager pm = new PreferenceManager(context);
pm.setSharedPreferencesName(sharedPreferencesName);
pm.setSharedPreferencesMode(Context.MODE_PRIVATE);
pm.inflateFromResource(context, R.xml.preferences, null);
return pm.getSharedPreferences();
}
/**
* Check that the defaults are being set when using
* {@link PreferenceManager#getDefaultSharedPreferences(Context)}, and that
* the values match. {@link Preferences#Preferences(Context)} sets the
* values of {@link Preferences#PREF_LOCAL_REPO_NAME} and
* {@link Preferences#PREF_AUTO_DOWNLOAD_INSTALL_UPDATES} dynamically, so
* there are two more preferences.
*/
@Test
public void testSetDefaultValues() {
Preferences.setupForTests(CONTEXT);
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(CONTEXT);
assertEquals(defaults.getAll().size() + 2, sharedPreferences.getAll().size());
assertTrue(sharedPreferences.contains(Preferences.PREF_LOCAL_REPO_NAME));
assertTrue(sharedPreferences.contains(Preferences.PREF_AUTO_DOWNLOAD_INSTALL_UPDATES));
Map<String, ?> entries = sharedPreferences.getAll();
for (Map.Entry<String, ?> entry : defaults.getAll().entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
assertTrue(sharedPreferences.contains(entry.getKey()));
assertEquals(entries.get(key), value);
}
String key = Preferences.PREF_EXPERT;
boolean defaultValue = defaults.getBoolean(key, false);
sharedPreferences.edit().putBoolean(key, !defaultValue).commit();
assertNotEquals(defaultValue, sharedPreferences.getBoolean(key, false));
}
@Test
public void testMethodsUseDefaults() {
Preferences.setupForTests(CONTEXT);
Preferences preferences = Preferences.get();
assertEquals(defaults.getBoolean(Preferences.PREF_EXPERT, false),
preferences.expertMode());
assertEquals(defaults.getBoolean(Preferences.PREF_FORCE_TOUCH_APPS, false),
preferences.isForceOldIndexEnabled());
assertEquals(defaults.getBoolean(Preferences.PREF_FORCE_OLD_INDEX, false),
preferences.isForceOldIndexEnabled());
assertEquals(defaults.getBoolean(Preferences.PREF_PREVENT_SCREENSHOTS, false),
preferences.preventScreenshots());
assertEquals(defaults.getStringSet(Preferences.PREF_SHOW_ANTI_FEATURES, null),
preferences.showAppsWithAntiFeatures());
assertEquals(defaults.getBoolean(Preferences.PREF_SHOW_INCOMPAT_VERSIONS, false),
preferences.showIncompatibleVersions());
assertEquals(defaults.getBoolean(Preferences.PREF_UPDATE_NOTIFICATION_ENABLED, false),
preferences.isUpdateNotificationEnabled());
assertEquals(Long.parseLong(defaults.getString(Preferences.PREF_KEEP_CACHE_TIME, null)),
preferences.getKeepCacheTime());
assertEquals(Preferences.Theme.valueOf(defaults.getString(Preferences.PREF_THEME, null)),
preferences.getTheme());
// now test setting the prefs
boolean defaultValue = defaults.getBoolean(Preferences.PREF_EXPERT, false);
preferences.setExpertMode(!defaultValue);
assertNotEquals(defaultValue, preferences.expertMode());
}
/**
* When {@link Preferences#Preferences(Context)} calls
* {@link PreferenceManager#setDefaultValues(Context, int, boolean)}, any
* existing preference values should not be overridden.
*/
@Test
public void testMigrationWithSetDefaultValues() {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(CONTEXT);
long testValue = (long) (Math.random() * Long.MAX_VALUE);
String testValueString = String.valueOf(testValue);
assertNotEquals(testValueString, defaults.getString(Preferences.PREF_KEEP_CACHE_TIME, "not a long"));
sharedPreferences.edit().putString(Preferences.PREF_KEEP_CACHE_TIME, testValueString).commit();
Preferences.setupForTests(CONTEXT);
assertEquals(testValue, Preferences.get().getKeepCacheTime());
assertNotEquals(Long.parseLong(defaults.getString(Preferences.PREF_KEEP_CACHE_TIME, null)),
Preferences.get().getKeepCacheTime());
}
}