From aa3c30dfa2459fb093ac5d7075b5066f41b49f2e Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Tue, 23 May 2017 15:19:10 -0700 Subject: [PATCH] Add a way to clear cached provider for tests in Settings class. Bug: 38437704 Bug: 38433611 Test: manual Change-Id: Id2803359644bd68a158294b6d801fc9cd316fc9f --- core/java/android/provider/Settings.java | 34 +++++++++++++++++++ .../server/am/CoreSettingsObserverTest.java | 8 ++++- .../util/test/FakeSettingsProvider.java | 12 ++++++- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 52718fc2651bc..26cbfee7b061b 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1779,6 +1779,12 @@ public final class Settings { return mContentProvider; } } + + public void clearProviderForTest() { + synchronized (mLock) { + mContentProvider = null; + } + } } // Thread-safe. @@ -1994,6 +2000,16 @@ public final class Settings { if (c != null) c.close(); } } + + public void clearGenerationTrackerForTest() { + synchronized (NameValueCache.this) { + if (mGenerationTracker != null) { + mGenerationTracker.destroy(); + } + mValues.clear(); + mGenerationTracker = null; + } + } } /** @@ -2182,6 +2198,12 @@ public final class Settings { outKeySet.addAll(MOVED_TO_GLOBAL); } + /** @hide */ + public static void clearProviderForTest() { + sProviderHolder.clearProviderForTest(); + sNameValueCache.clearGenerationTrackerForTest(); + } + /** * Look up a name in the database. * @param resolver to access the database with @@ -4595,6 +4617,12 @@ public final class Settings { outKeySet.addAll(MOVED_TO_GLOBAL); } + /** @hide */ + public static void clearProviderForTest() { + sProviderHolder.clearProviderForTest(); + sNameValueCache.clearGenerationTrackerForTest(); + } + /** * Look up a name in the database. * @param resolver to access the database with @@ -10027,6 +10055,12 @@ public final class Settings { outKeySet.addAll(MOVED_TO_SECURE); } + /** @hide */ + public static void clearProviderForTest() { + sProviderHolder.clearProviderForTest(); + sNameValueCache.clearGenerationTrackerForTest(); + } + /** * Look up a name in the database. * @param resolver to access the database with diff --git a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java index 2f202d98647f3..da30c11be81a3 100644 --- a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java +++ b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java @@ -34,6 +34,7 @@ import android.test.mock.MockContentResolver; import com.android.internal.util.test.FakeSettingsProvider; import com.android.server.AppOpsService; +import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; @@ -59,7 +60,6 @@ import java.io.File; * Run: adb shell am instrument -e class com.android.server.am.CoreSettingsObserverTest -w \ * com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner */ -@Ignore @SmallTest @RunWith(AndroidJUnit4.class) public class CoreSettingsObserverTest { @@ -79,11 +79,17 @@ public class CoreSettingsObserverTest { @BeforeClass public static void setupOnce() { + FakeSettingsProvider.clearSettingsProvider(); CoreSettingsObserver.sSecureSettingToTypeMap.put(TEST_SETTING_SECURE_INT, int.class); CoreSettingsObserver.sGlobalSettingToTypeMap.put(TEST_SETTING_GLOBAL_FLOAT, float.class); CoreSettingsObserver.sSystemSettingToTypeMap.put(TEST_SETTING_SYSTEM_STRING, String.class); } + @AfterClass + public static void tearDownOnce() { + FakeSettingsProvider.clearSettingsProvider(); + } + @Before public void setUp() { MockitoAnnotations.initMocks(this); diff --git a/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProvider.java b/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProvider.java index 8ca849b8d37ee..e482708e385b4 100644 --- a/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProvider.java +++ b/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProvider.java @@ -54,7 +54,8 @@ import java.util.HashMap; * Note that this class cannot be used in the same process as real settings. This is because it * works by passing an alternate ContentResolver to Settings operations. Unfortunately, the Settings * class only fetches the content provider from the passed-in ContentResolver the first time it's - * used, and after that stores it in a per-process static. + * used, and after that stores it in a per-process static. If this needs to be used in this case, + * then call {@link #clearSettingsProvider()} before and after using this. * * TODO: evaluate implementing settings change notifications. This would require: * @@ -90,6 +91,15 @@ public class FakeSettingsProvider extends MockContentProvider { } } + /** + * This needs to be called before and after using the FakeSettingsProvider class. + */ + public static void clearSettingsProvider() { + Settings.Secure.clearProviderForTest(); + Settings.Global.clearProviderForTest(); + Settings.System.clearProviderForTest(); + } + public Bundle call(String method, String arg, Bundle extras) { // Methods are "GET_system", "GET_global", "PUT_secure", etc. String[] commands = method.split("_", 2);