diff --git a/packages/shared_preferences/shared_preferences_android/android/src/test/java/io/flutter/plugins/sharedpreferences/LegacySharedPreferencesTest.java b/packages/shared_preferences/shared_preferences_android/android/src/test/java/io/flutter/plugins/sharedpreferences/LegacySharedPreferencesTest.java deleted file mode 100644 index c9e1c8344367..000000000000 --- a/packages/shared_preferences/shared_preferences_android/android/src/test/java/io/flutter/plugins/sharedpreferences/LegacySharedPreferencesTest.java +++ /dev/null @@ -1,369 +0,0 @@ -// Copyright 2013 The Flutter Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.sharedpreferences; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.mockito.Mockito.anyInt; -import static org.mockito.Mockito.anyString; - -import android.content.Context; -import android.content.SharedPreferences; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import io.flutter.embedding.engine.plugins.FlutterPlugin; -import io.flutter.plugin.common.BinaryMessenger; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.Mockito; - -public class LegacySharedPreferencesTest { - - LegacySharedPreferencesPlugin plugin; - - @Mock BinaryMessenger mockMessenger; - @Mock FlutterPlugin.FlutterPluginBinding flutterPluginBinding; - - @Before - public void before() { - Context context = Mockito.mock(Context.class); - SharedPreferences sharedPrefs = new FakeSharedPreferences(); - - mockMessenger = Mockito.mock(BinaryMessenger.class); - flutterPluginBinding = Mockito.mock(FlutterPlugin.FlutterPluginBinding.class); - - Mockito.when(flutterPluginBinding.getBinaryMessenger()).thenReturn(mockMessenger); - Mockito.when(flutterPluginBinding.getApplicationContext()).thenReturn(context); - Mockito.when(context.getSharedPreferences(anyString(), anyInt())).thenReturn(sharedPrefs); - - plugin = new LegacySharedPreferencesPlugin(new ListEncoder()); - plugin.onAttachedToEngine(flutterPluginBinding); - } - - private static final Map data = new HashMap<>(); - - static { - data.put("Language", "Java"); - data.put("Counter", 0L); - data.put("Pie", 3.14); - data.put("Names", Arrays.asList("Flutter", "Dart").toString()); - data.put("NewToFlutter", false); - data.put("flutter.Language", "Java"); - data.put("flutter.Counter", 0L); - data.put("flutter.Pie", 3.14); - data.put("flutter.Names", Arrays.asList("Flutter", "Dart").toString()); - data.put("flutter.NewToFlutter", false); - data.put("prefix.Language", "Java"); - data.put("prefix.Counter", 0L); - data.put("prefix.Pie", 3.14); - data.put("prefix.Names", Arrays.asList("Flutter", "Dart").toString()); - data.put("prefix.NewToFlutter", false); - } - - @Test - public void getAll() { - assertEquals(plugin.getAll("", null).size(), 0); - - addData(); - - Map flutterData = plugin.getAll("flutter.", null); - - assertEquals(flutterData.size(), 5); - assertEquals(flutterData.get("flutter.Language"), "Java"); - assertEquals(flutterData.get("flutter.Counter"), 0L); - assertEquals(flutterData.get("flutter.Pie"), 3.14); - assertEquals(flutterData.get("flutter.Names"), Arrays.asList("Flutter", "Dart").toString()); - assertEquals(flutterData.get("flutter.NewToFlutter"), false); - - Map allData = plugin.getAll("", null); - - assertEquals(allData, data); - } - - @Test - public void allowList() { - assertEquals(plugin.getAll("", null).size(), 0); - - addData(); - - final List allowList = Collections.singletonList("flutter.Language"); - - Map allData = plugin.getAll("flutter.", allowList); - - assertEquals(allData.size(), 1); - assertEquals(allData.get("flutter.Language"), "Java"); - assertNull(allData.get("flutter.Counter")); - - allData = plugin.getAll("", allowList); - - assertEquals(allData.size(), 1); - assertEquals(allData.get("flutter.Language"), "Java"); - assertNull(allData.get("flutter.Counter")); - - allData = plugin.getAll("prefix.", allowList); - - assertEquals(allData.size(), 0); - assertNull(allData.get("flutter.Language")); - } - - @Test - public void setString() { - final String key = "language"; - final String value = "Java"; - plugin.setString(key, value); - Map flutterData = plugin.getAll("", null); - assertEquals(flutterData.get(key), value); - } - - @Test - public void setInt() { - final String key = "Counter"; - final long value = 0L; - plugin.setInt(key, value); - Map flutterData = plugin.getAll("", null); - assertEquals(flutterData.get(key), value); - } - - @Test - public void setDouble() { - final String key = "Pie"; - final double value = 3.14; - plugin.setDouble(key, value); - Map flutterData = plugin.getAll("", null); - assertEquals(flutterData.get(key), value); - } - - @Test - public void setEncodedStringListSetsAndGetsString() { - final String key = "Names"; - final String value = Arrays.asList("Flutter", "Dart").toString(); - plugin.setEncodedStringList(key, value); - Map flutterData = plugin.getAll("", null); - assertEquals(flutterData.get(key), value); - } - - @Test - public void setBool() { - final String key = "NewToFlutter"; - final boolean value = false; - plugin.setBool(key, value); - Map flutterData = plugin.getAll("", null); - assertEquals(flutterData.get(key), value); - } - - @Test - public void clearWithNoAllowList() { - addData(); - - assertEquals(plugin.getAll("", null).size(), 15); - - plugin.clear("flutter.", null); - - assertEquals(plugin.getAll("", null).size(), 10); - } - - @Test - public void clearWithAllowList() { - addData(); - - assertEquals(plugin.getAll("", null).size(), 15); - - plugin.clear("flutter.", Collections.singletonList("flutter.Language")); - - assertEquals(plugin.getAll("", null).size(), 14); - } - - @Test - public void clearAll() { - addData(); - - assertEquals(plugin.getAll("", null).size(), 15); - - plugin.clear("", null); - - assertEquals(plugin.getAll("", null).size(), 0); - } - - @Test - public void testRemove() { - final String key = "NewToFlutter"; - final boolean value = true; - plugin.setBool(key, value); - assert (plugin.getAll("", null).containsKey(key)); - plugin.remove(key); - assertFalse(plugin.getAll("", null).containsKey(key)); - } - - private void addData() { - plugin.setString("Language", "Java"); - plugin.setInt("Counter", 0L); - plugin.setDouble("Pie", 3.14); - plugin.setEncodedStringList("Names", Arrays.asList("Flutter", "Dart").toString()); - plugin.setBool("NewToFlutter", false); - plugin.setString("flutter.Language", "Java"); - plugin.setInt("flutter.Counter", 0L); - plugin.setDouble("flutter.Pie", 3.14); - plugin.setEncodedStringList("flutter.Names", Arrays.asList("Flutter", "Dart").toString()); - plugin.setBool("flutter.NewToFlutter", false); - plugin.setString("prefix.Language", "Java"); - plugin.setInt("prefix.Counter", 0L); - plugin.setDouble("prefix.Pie", 3.14); - plugin.setEncodedStringList("prefix.Names", Arrays.asList("Flutter", "Dart").toString()); - plugin.setBool("prefix.NewToFlutter", false); - } - - /** A dummy implementation for tests for use with FakeSharedPreferences */ - public static class FakeSharedPreferencesEditor implements SharedPreferences.Editor { - private final Map sharedPrefData; - - FakeSharedPreferencesEditor(@NonNull Map data) { - sharedPrefData = data; - } - - @Override - public @NonNull SharedPreferences.Editor putString( - @NonNull String key, @Nullable String value) { - sharedPrefData.put(key, value); - return this; - } - - @Override - public @NonNull SharedPreferences.Editor putStringSet( - @NonNull String key, @Nullable Set values) { - sharedPrefData.put(key, values); - return this; - } - - @Override - public @NonNull SharedPreferences.Editor putBoolean(@NonNull String key, boolean value) { - sharedPrefData.put(key, value); - return this; - } - - @Override - public @NonNull SharedPreferences.Editor putInt(@NonNull String key, int value) { - sharedPrefData.put(key, value); - return this; - } - - @Override - public @NonNull SharedPreferences.Editor putLong(@NonNull String key, long value) { - sharedPrefData.put(key, value); - return this; - } - - @Override - public @NonNull SharedPreferences.Editor putFloat(@NonNull String key, float value) { - sharedPrefData.put(key, value); - return this; - } - - @Override - public @NonNull SharedPreferences.Editor remove(@NonNull String key) { - sharedPrefData.remove(key); - return this; - } - - @Override - public boolean commit() { - return true; - } - - @Override - public void apply() { - throw new UnsupportedOperationException("This method is not implemented for testing"); - } - - @Override - public @NonNull SharedPreferences.Editor clear() { - throw new UnsupportedOperationException("This method is not implemented for testing"); - } - } - - /** A dummy implementation of SharedPreferences for tests that store values in memory. */ - private static class FakeSharedPreferences implements SharedPreferences { - - Map sharedPrefData = new HashMap<>(); - - @Override - public @NonNull Map getAll() { - return sharedPrefData; - } - - @Override - public @NonNull SharedPreferences.Editor edit() { - return new FakeSharedPreferencesEditor(sharedPrefData); - } - - // All methods below are not implemented. - @Override - public boolean contains(@NonNull String key) { - throw new UnsupportedOperationException("This method is not implemented for testing"); - } - - @Override - public boolean getBoolean(@NonNull String key, boolean defValue) { - throw new UnsupportedOperationException("This method is not implemented for testing"); - } - - @Override - public float getFloat(@NonNull String key, float defValue) { - throw new UnsupportedOperationException("This method is not implemented for testing"); - } - - @Override - public int getInt(@NonNull String key, int defValue) { - throw new UnsupportedOperationException("This method is not implemented for testing"); - } - - @Override - public long getLong(@NonNull String key, long defValue) { - throw new UnsupportedOperationException("This method is not implemented for testing"); - } - - @Override - public @NonNull String getString(@NonNull String key, @Nullable String defValue) { - throw new UnsupportedOperationException("This method is not implemented for testing"); - } - - @Override - public @NonNull Set getStringSet(@NonNull String key, @Nullable Set defValues) { - throw new UnsupportedOperationException("This method is not implemented for testing"); - } - - @Override - public void registerOnSharedPreferenceChangeListener( - @NonNull SharedPreferences.OnSharedPreferenceChangeListener listener) { - throw new UnsupportedOperationException("This method is not implemented for testing"); - } - - @Override - public void unregisterOnSharedPreferenceChangeListener( - @NonNull SharedPreferences.OnSharedPreferenceChangeListener listener) { - throw new UnsupportedOperationException("This method is not implemented for testing"); - } - } - - /** A dummy implementation of SharedPreferencesListEncoder for tests that store List. */ - static class ListEncoder implements SharedPreferencesListEncoder { - @Override - public @NonNull String encode(@NonNull List list) { - return String.join(";-;", list); - } - - @Override - public @NonNull List decode(@NonNull String listString) { - return Arrays.asList(listString.split(";-;")); - } - } -} diff --git a/packages/shared_preferences/shared_preferences_android/android/src/test/kotlin/io/flutter/plugins/sharedpreferences/LegacySharedPreferencesTest.kt b/packages/shared_preferences/shared_preferences_android/android/src/test/kotlin/io/flutter/plugins/sharedpreferences/LegacySharedPreferencesTest.kt new file mode 100644 index 000000000000..1b401cf8f9af --- /dev/null +++ b/packages/shared_preferences/shared_preferences_android/android/src/test/kotlin/io/flutter/plugins/sharedpreferences/LegacySharedPreferencesTest.kt @@ -0,0 +1,332 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package io.flutter.plugins.sharedpreferences + +import android.content.Context +import android.content.SharedPreferences +import android.content.SharedPreferences.OnSharedPreferenceChangeListener +import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding +import io.flutter.plugin.common.BinaryMessenger +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.ArgumentMatchers +import org.mockito.Mockito + +class LegacySharedPreferencesTest { + private lateinit var plugin: LegacySharedPreferencesPlugin + + private lateinit var mockMessenger: BinaryMessenger + + private lateinit var flutterPluginBinding: FlutterPluginBinding + + @Before + fun before() { + val context = Mockito.mock(Context::class.java) + val sharedPrefs: SharedPreferences = FakeSharedPreferences() + + mockMessenger = Mockito.mock(BinaryMessenger::class.java) + flutterPluginBinding = Mockito.mock(FlutterPluginBinding::class.java) + + Mockito.`when`(flutterPluginBinding.binaryMessenger).thenReturn(mockMessenger) + Mockito.`when`(flutterPluginBinding.applicationContext).thenReturn(context) + Mockito.`when`( + context.getSharedPreferences(ArgumentMatchers.anyString(), ArgumentMatchers.anyInt())) + .thenReturn(sharedPrefs) + + plugin = LegacySharedPreferencesPlugin(ListEncoder()) + plugin.onAttachedToEngine(flutterPluginBinding) + } + + @Test + fun getAll() { + assertEquals(0, plugin.getAll("", null).size) + + addData() + + val flutterData: Map = plugin.getAll("flutter.", null) + + assertEquals(5, flutterData.size) + assertEquals("Kotlin", flutterData["flutter.Language"]) + assertEquals(0L, flutterData["flutter.Counter"]) + assertEquals(3.14, flutterData["flutter.Pie"]) + assertEquals(listOf("Flutter", "Dart").toString(), flutterData["flutter.Names"]) + assertEquals(false, flutterData["flutter.NewToFlutter"]) + + val allData: Map = plugin.getAll("", null) + + assertEquals(data, allData) + } + + @Test + fun allowList() { + assertEquals(0, plugin.getAll("", null).size) + + addData() + + val allowList = listOf("flutter.Language") + + var allData: Map = plugin.getAll("flutter.", allowList) + + assertEquals(1, allData.size) + assertEquals("Kotlin", allData["flutter.Language"]) + assertNull(allData["flutter.Counter"]) + + allData = plugin.getAll("", allowList) + + assertEquals(1, allData.size) + assertEquals("Kotlin", allData["flutter.Language"]) + assertNull(allData["flutter.Counter"]) + + allData = plugin.getAll("prefix.", allowList) + + assertEquals(0, allData.size) + assertNull(allData["flutter.Language"]) + } + + @Test + fun setString() { + val key = "language" + val value = "Kotlin" + plugin.setString(key, value) + val flutterData: Map = plugin.getAll("", null) + assertEquals(value, flutterData[key]) + } + + @Test + fun setInt() { + val key = "Counter" + val value = 0L + plugin.setInt(key, value) + val flutterData: Map = plugin.getAll("", null) + assertEquals(value, flutterData[key]) + } + + @Test + fun setDouble() { + val key = "Pie" + val value = 3.14 + plugin.setDouble(key, value) + val flutterData: Map = plugin.getAll("", null) + assertEquals(value, flutterData[key]) + } + + @Test + fun setEncodedStringListSetsAndGetsString() { + val key = "Names" + val value = listOf("Flutter", "Dart").toString() + plugin.setEncodedStringList(key, value) + val flutterData: Map = plugin.getAll("", null) + assertEquals(value, flutterData[key]) + } + + @Test + fun setBool() { + val key = "NewToFlutter" + val value = false + plugin.setBool(key, value) + val flutterData: Map = plugin.getAll("", null) + assertEquals(value, flutterData[key]) + } + + @Test + fun clearWithNoAllowList() { + addData() + + assertEquals(15, plugin.getAll("", null).size) + + plugin.clear("flutter.", null) + + assertEquals(10, plugin.getAll("", null).size) + } + + @Test + fun clearWithAllowList() { + addData() + + assertEquals(15, plugin.getAll("", null).size) + + plugin.clear("flutter.", listOf("flutter.Language")) + + assertEquals(14, plugin.getAll("", null).size) + } + + @Test + fun clearAll() { + addData() + + assertEquals(15, plugin.getAll("", null).size) + + plugin.clear("", null) + + assertEquals(0, plugin.getAll("", null).size) + } + + @Test + fun testRemove() { + val key = "NewToFlutter" + val value = true + plugin.setBool(key, value) + assertTrue(plugin.getAll("", null).containsKey(key)) + plugin.remove(key) + assertFalse(plugin.getAll("", null).containsKey(key)) + } + + private fun addData() { + plugin.setString("Language", "Kotlin") + plugin.setInt("Counter", 0L) + plugin.setDouble("Pie", 3.14) + plugin.setEncodedStringList("Names", listOf("Flutter", "Dart").toString()) + plugin.setBool("NewToFlutter", false) + plugin.setString("flutter.Language", "Kotlin") + plugin.setInt("flutter.Counter", 0L) + plugin.setDouble("flutter.Pie", 3.14) + plugin.setEncodedStringList("flutter.Names", listOf("Flutter", "Dart").toString()) + plugin.setBool("flutter.NewToFlutter", false) + plugin.setString("prefix.Language", "Kotlin") + plugin.setInt("prefix.Counter", 0L) + plugin.setDouble("prefix.Pie", 3.14) + plugin.setEncodedStringList("prefix.Names", listOf("Flutter", "Dart").toString()) + plugin.setBool("prefix.NewToFlutter", false) + } + + /** A dummy implementation for tests for use with FakeSharedPreferences */ + private class FakeSharedPreferencesEditor + constructor(private val sharedPrefData: MutableMap) : SharedPreferences.Editor { + override fun putString(key: String, value: String?): SharedPreferences.Editor { + sharedPrefData[key] = value + return this + } + + override fun putStringSet(key: String, values: Set?): SharedPreferences.Editor { + sharedPrefData[key] = values + return this + } + + override fun putBoolean(key: String, value: Boolean): SharedPreferences.Editor { + sharedPrefData[key] = value + return this + } + + override fun putInt(key: String, value: Int): SharedPreferences.Editor { + sharedPrefData[key] = value + return this + } + + override fun putLong(key: String, value: Long): SharedPreferences.Editor { + sharedPrefData[key] = value + return this + } + + override fun putFloat(key: String, value: Float): SharedPreferences.Editor { + sharedPrefData[key] = value + return this + } + + override fun remove(key: String): SharedPreferences.Editor { + sharedPrefData.remove(key) + return this + } + + override fun commit(): Boolean { + return true + } + + override fun apply() { + throw UnsupportedOperationException("This method is not implemented for testing") + } + + override fun clear(): SharedPreferences.Editor { + throw UnsupportedOperationException("This method is not implemented for testing") + } + } + + /** A dummy implementation of SharedPreferences for tests that store values in memory. */ + private class FakeSharedPreferences : SharedPreferences { + val sharedPrefData = mutableMapOf() + + override fun getAll(): Map { + return sharedPrefData + } + + override fun edit(): SharedPreferences.Editor { + return FakeSharedPreferencesEditor(sharedPrefData) + } + + // All methods below are not implemented. + override fun contains(key: String): Boolean { + throw UnsupportedOperationException("This method is not implemented for testing") + } + + override fun getBoolean(key: String, defValue: Boolean): Boolean { + throw UnsupportedOperationException("This method is not implemented for testing") + } + + override fun getFloat(key: String, defValue: Float): Float { + throw UnsupportedOperationException("This method is not implemented for testing") + } + + override fun getInt(key: String, defValue: Int): Int { + throw UnsupportedOperationException("This method is not implemented for testing") + } + + override fun getLong(key: String, defValue: Long): Long { + throw UnsupportedOperationException("This method is not implemented for testing") + } + + override fun getString(key: String, defValue: String?): String { + throw UnsupportedOperationException("This method is not implemented for testing") + } + + override fun getStringSet(key: String, defValues: Set?): Set { + throw UnsupportedOperationException("This method is not implemented for testing") + } + + override fun registerOnSharedPreferenceChangeListener( + listener: OnSharedPreferenceChangeListener + ) { + throw UnsupportedOperationException("This method is not implemented for testing") + } + + override fun unregisterOnSharedPreferenceChangeListener( + listener: OnSharedPreferenceChangeListener + ) { + throw UnsupportedOperationException("This method is not implemented for testing") + } + } + + /** A dummy implementation of SharedPreferencesListEncoder for tests that store List. */ + internal class ListEncoder : SharedPreferencesListEncoder { + override fun encode(list: List): String { + return list.joinToString(separator = ";-;") + } + + override fun decode(listString: String): List { + return listString.split(";-;") + } + } + + companion object { + private val data = + mapOf( + "Language" to "Kotlin", + "Counter" to 0L, + "Pie" to 3.14, + "Names" to listOf("Flutter", "Dart").toString(), + "NewToFlutter" to false, + "flutter.Language" to "Kotlin", + "flutter.Counter" to 0L, + "flutter.Pie" to 3.14, + "flutter.Names" to listOf("Flutter", "Dart").toString(), + "flutter.NewToFlutter" to false, + "prefix.Language" to "Kotlin", + "prefix.Counter" to 0L, + "prefix.Pie" to 3.14, + "prefix.Names" to listOf("Flutter", "Dart").toString(), + "prefix.NewToFlutter" to false) + } +}