DO NOT MERGE: Move FakeSettingsProvider to a common location.
(cherry picked from commit 7df1a82802cdf842d07a86a80383c7d5ea7ae53a)
Test: runtest frameworks-util -c com.android.internal.util.test.FakeSettingsProviderTest
Test: runtest frameworks-services -c com.android.server.ConnectivityServiceTest
Test: runtest frameworks-services -c com.android.server.retaildemo.PreloadAppsInstallerTest
Test: runtest frameworks-services -c com.android.server.retaildemo.RetailDemoModeServiceTest
Bug: 31479480
Change-Id: I8d4d4de2937012dd33924f53e68f96241a9b2b4f
diff --git a/services/tests/servicestests/src/com/android/internal/util/FakeSettingsProvider.java b/services/tests/servicestests/src/com/android/internal/util/FakeSettingsProvider.java
deleted file mode 100644
index 808f4dd..0000000
--- a/services/tests/servicestests/src/com/android/internal/util/FakeSettingsProvider.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2016 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.internal.util;
-
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.Settings;
-import android.test.mock.MockContentProvider;
-import android.util.Log;
-
-import java.util.HashMap;
-
-/**
- * Fake for system settings.
- *
- * To use, ensure that the Context used by the test code returns a ContentResolver that uses this
- * provider for the Settings authority:
- *
- * class MyTestContext extends MockContext {
- * ...
- * private final MockContentResolver mContentResolver;
- * public MyTestContext(...) {
- * ...
- * mContentResolver = new MockContentResolver();
- * mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
- * }
- * ...
- * @Override
- * public ContentResolver getContentResolver() {
- * return mContentResolver;
- * }
- *
- * As long as the code under test is using the test Context, the actual code under test does not
- * need to be modified, and can access Settings using the normal static methods:
- *
- * Settings.Global.getInt(cr, "my_setting", 0); // Returns 0.
- * Settings.Global.putInt(cr, "my_setting", 5);
- * Settings.Global.getInt(cr, "my_setting", 0); // Returns 5.
- *
- * 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.
- *
- * TODO: evaluate implementing settings change notifications. This would require:
- *
- * 1. Making ContentResolver#registerContentObserver non-final and overriding it in
- * MockContentResolver.
- * 2. Making FakeSettingsProvider take a ContentResolver argument.
- * 3. Calling ContentResolver#notifyChange(getUriFor(table, arg), ...) on every settings change.
- */
-public class FakeSettingsProvider extends MockContentProvider {
-
- private static final String TAG = FakeSettingsProvider.class.getSimpleName();
- private static final boolean DBG = false;
- private static final String[] TABLES = { "system", "secure", "global" };
-
- private final HashMap<String, HashMap<String, String>> mTables = new HashMap<>();
-
- public FakeSettingsProvider() {
- for (int i = 0; i < TABLES.length; i++) {
- mTables.put(TABLES[i], new HashMap<String, String>());
- }
- }
-
- private Uri getUriFor(String table, String key) {
- switch (table) {
- case "system":
- return Settings.System.getUriFor(key);
- case "secure":
- return Settings.Secure.getUriFor(key);
- case "global":
- return Settings.Global.getUriFor(key);
- default:
- throw new UnsupportedOperationException("Unknown settings table " + table);
- }
- }
-
- public Bundle call(String method, String arg, Bundle extras) {
- // Methods are "GET_system", "GET_global", "PUT_secure", etc.
- String[] commands = method.split("_", 2);
- String op = commands[0];
- String table = commands[1];
-
- Bundle out = new Bundle();
- String value;
- switch (op) {
- case "GET":
- value = mTables.get(table).get(arg);
- if (value != null) {
- if (DBG) {
- Log.d(TAG, String.format("Returning fake setting %s.%s = %s",
- table, arg, value));
- }
- out.putString(Settings.NameValueTable.VALUE, value);
- }
- break;
- case "PUT":
- value = extras.getString(Settings.NameValueTable.VALUE, null);
- if (DBG) {
- Log.d(TAG, String.format("Inserting fake setting %s.%s = %s",
- table, arg, value));
- }
- if (value != null) {
- mTables.get(table).put(arg, value);
- } else {
- mTables.get(table).remove(arg);
- }
- break;
- default:
- throw new UnsupportedOperationException("Unknown command " + method);
- }
-
- return out;
- }
-}
diff --git a/services/tests/servicestests/src/com/android/internal/util/FakeSettingsProviderTest.java b/services/tests/servicestests/src/com/android/internal/util/FakeSettingsProviderTest.java
deleted file mode 100644
index 05de0a5..0000000
--- a/services/tests/servicestests/src/com/android/internal/util/FakeSettingsProviderTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2016 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.internal.util;
-
-import android.content.ContentResolver;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.provider.Settings;
-import android.test.AndroidTestCase;
-import android.test.mock.MockContentResolver;
-import android.test.mock.MockContext;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.Suppress;
-import android.util.Log;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Unit tests for FakeSettingsProvider.
- */
-public class FakeSettingsProviderTest extends AndroidTestCase {
-
- private MockContentResolver mCr;
-
- @Override
- public void setUp() throws Exception {
- mCr = new MockContentResolver();
- mCr.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
- }
-
- @SmallTest
- public void testBasicOperation() throws Exception {
- String settingName = Settings.System.SCREEN_BRIGHTNESS;
-
- try {
- Settings.System.getInt(mCr, settingName);
- fail("FakeSettingsProvider should start off empty.");
- } catch (Settings.SettingNotFoundException expected) {}
-
- // Check that fake settings can be written and read back.
- Settings.System.putInt(mCr, settingName, 123);
- assertEquals(123, Settings.System.getInt(mCr, settingName));
- }
-}
diff --git a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java
index 826aeeb..5160b95 100644
--- a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java
@@ -75,8 +75,8 @@
import android.util.Log;
import android.util.LogPrinter;
-import com.android.internal.util.FakeSettingsProvider;
import com.android.internal.util.WakeupMessage;
+import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.connectivity.NetworkAgentInfo;
import com.android.server.connectivity.NetworkMonitor;
import com.android.server.connectivity.NetworkMonitor.CaptivePortalProbeResult;