/* * Copyright (C) 2022 The Android Open Source 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 com.android.systemui.util import android.content.SharedPreferences import androidx.test.filters.SmallTest import androidx.test.runner.AndroidJUnit4 import com.android.systemui.SysuiTestCase import com.android.systemui.util.mockito.eq import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.anyString import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations @SmallTest @RunWith(AndroidJUnit4::class) class FakeSharedPreferencesTest : SysuiTestCase() { @Mock private lateinit var listener: SharedPreferences.OnSharedPreferenceChangeListener private lateinit var sharedPreferences: SharedPreferences @Before fun setUp() { MockitoAnnotations.initMocks(this) sharedPreferences = FakeSharedPreferences() } @Test fun testGetString_default() { val default = "default" val result = sharedPreferences.getString("key", default) assertThat(result).isEqualTo(default) } @Test fun testGetStringSet_default() { val default = setOf("one", "two") val result = sharedPreferences.getStringSet("key", default) assertThat(result).isEqualTo(default) } @Test fun testGetInt_default() { val default = 10 val result = sharedPreferences.getInt("key", default) assertThat(result).isEqualTo(default) } @Test fun testGetLong_default() { val default = 11L val result = sharedPreferences.getLong("key", default) assertThat(result).isEqualTo(default) } @Test fun testGetFloat_default() { val default = 1.3f val result = sharedPreferences.getFloat("key", default) assertThat(result).isEqualTo(default) } @Test fun testGetBoolean_default() { val default = true val result = sharedPreferences.getBoolean("key", default) assertThat(result).isEqualTo(default) } @Test fun testPutValuesAndRetrieve() { val editor = sharedPreferences.edit() val data = listOf>( Data( "keyString", "value", SharedPreferences.Editor::putString, { getString(it, "") } ), Data( "keyStringSet", setOf("one", "two"), SharedPreferences.Editor::putStringSet, { getStringSet(it, emptySet()) } ), Data("keyInt", 10, SharedPreferences.Editor::putInt, { getInt(it, 0) }), Data("keyLong", 11L, SharedPreferences.Editor::putLong, { getLong(it, 0L) }), Data( "keyFloat", 1.3f, SharedPreferences.Editor::putFloat, { getFloat(it, 0f) } ), Data( "keyBoolean", true, SharedPreferences.Editor::putBoolean, { getBoolean(it, false) } ) ) data.fold(editor) { ed, d -> d.set(ed) } editor.commit() data.forEach { assertThat(it.get(sharedPreferences)).isEqualTo(it.value) } } @Test fun testContains() { sharedPreferences.edit().putInt("key", 10).commit() assertThat(sharedPreferences.contains("key")).isTrue() assertThat(sharedPreferences.contains("other")).isFalse() } @Test fun testOverwrite() { sharedPreferences.edit().putInt("key", 10).commit() sharedPreferences.edit().putInt("key", 11).commit() assertThat(sharedPreferences.getInt("key", 0)).isEqualTo(11) } @Test fun testDeleteString() { sharedPreferences.edit().putString("key", "value").commit() sharedPreferences.edit().putString("key", null).commit() assertThat(sharedPreferences.contains("key")).isFalse() } @Test fun testDeleteAndReplaceString() { sharedPreferences.edit().putString("key", "value").commit() sharedPreferences.edit().putString("key", "other").putString("key", null).commit() assertThat(sharedPreferences.getString("key", "")).isEqualTo("other") } @Test fun testDeleteStringSet() { sharedPreferences.edit().putStringSet("key", setOf("one")).commit() sharedPreferences.edit().putStringSet("key", setOf("two")).commit() assertThat(sharedPreferences.getStringSet("key", emptySet())).isEqualTo(setOf("two")) } @Test fun testClear() { sharedPreferences.edit().putInt("keyInt", 1).putString("keyString", "a").commit() sharedPreferences.edit().clear().commit() assertThat(sharedPreferences.contains("keyInt")).isFalse() assertThat(sharedPreferences.contains("keyString")).isFalse() } @Test fun testClearAndWrite() { sharedPreferences.edit().putInt("key", 10).commit() sharedPreferences.edit().putInt("key", 11).clear().commit() assertThat(sharedPreferences.getInt("key", 0)).isEqualTo(11) } @Test fun testListenerNotifiedOnChanges() { sharedPreferences.registerOnSharedPreferenceChangeListener(listener) sharedPreferences.edit().putInt("keyInt", 10).putString("keyString", "value").commit() verify(listener).onSharedPreferenceChanged(sharedPreferences, "keyInt") verify(listener).onSharedPreferenceChanged(sharedPreferences, "keyString") verifyNoMoreInteractions(listener) } @Test fun testListenerNotifiedOnClear() { sharedPreferences.edit().putInt("keyInt", 10).commit() sharedPreferences.registerOnSharedPreferenceChangeListener(listener) sharedPreferences.edit().clear().commit() verify(listener).onSharedPreferenceChanged(sharedPreferences, null) verifyNoMoreInteractions(listener) } @Test fun testListenerNotifiedOnRemoval() { sharedPreferences.edit() .putString("keyString", "a") .putStringSet("keySet", setOf("a")) .commit() sharedPreferences.registerOnSharedPreferenceChangeListener(listener) sharedPreferences.edit().putString("keyString", null).putStringSet("keySet", null).commit() verify(listener).onSharedPreferenceChanged(sharedPreferences, "keyString") verify(listener).onSharedPreferenceChanged(sharedPreferences, "keySet") verifyNoMoreInteractions(listener) } @Test fun testListenerUnregistered() { sharedPreferences.registerOnSharedPreferenceChangeListener(listener) sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener) sharedPreferences.edit().putInt("key", 10).commit() verify(listener, never()).onSharedPreferenceChanged(eq(sharedPreferences), anyString()) } @Test fun testSharedPreferencesOnlyModifiedOnCommit() { sharedPreferences.edit().putInt("key", 10) assertThat(sharedPreferences.contains("key")).isFalse() } private data class Data( val key: String, val value: T, private val setter: SharedPreferences.Editor.(String, T) -> SharedPreferences.Editor, private val getter: SharedPreferences.(String) -> T ) { fun set(editor: SharedPreferences.Editor): SharedPreferences.Editor { return editor.setter(key, value) } fun get(sharedPreferences: SharedPreferences): T { return sharedPreferences.getter(key) } } }