From a263ee6a0e23656da1738dff9c3f8460e8666032 Mon Sep 17 00:00:00 2001 From: Tony Mantler Date: Mon, 31 Jul 2017 10:58:18 -0700 Subject: [PATCH] Refactor SystemPropPoker Bug: 62442606 Test: SystemPropPokerTest Change-Id: I67d6e16ec4d637d94b3adcf240ea6b5a45438ad9 --- .../development/SystemPropPoker.java | 98 +++++++++++++++++++ .../development/SystemPropPokerTest.java | 81 +++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 packages/SettingsLib/src/com/android/settingslib/development/SystemPropPoker.java create mode 100644 packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/SystemPropPokerTest.java diff --git a/packages/SettingsLib/src/com/android/settingslib/development/SystemPropPoker.java b/packages/SettingsLib/src/com/android/settingslib/development/SystemPropPoker.java new file mode 100644 index 000000000000..628d0d08b526 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/development/SystemPropPoker.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2017 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.settingslib.development; + +import android.os.AsyncTask; +import android.os.IBinder; +import android.os.Parcel; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.support.annotation.NonNull; +import android.support.annotation.VisibleForTesting; +import android.util.Log; + +public class SystemPropPoker { + private static final String TAG = "SystemPropPoker"; + + private static final SystemPropPoker sInstance = new SystemPropPoker(); + + private boolean mBlockPokes = false; + + private SystemPropPoker() {} + + @NonNull + public static SystemPropPoker getInstance() { + return sInstance; + } + + public void blockPokes() { + mBlockPokes = true; + } + + public void unblockPokes() { + mBlockPokes = false; + } + + public void poke() { + if (!mBlockPokes) { + createPokerTask().execute(); + } + } + + @VisibleForTesting + PokerTask createPokerTask() { + return new PokerTask(); + } + + public static class PokerTask extends AsyncTask { + + @VisibleForTesting + String[] listServices() { + return ServiceManager.listServices(); + } + + @VisibleForTesting + IBinder checkService(String service) { + return ServiceManager.checkService(service); + } + + @Override + protected Void doInBackground(Void... params) { + String[] services = listServices(); + if (services == null) { + Log.e(TAG, "There are no services, how odd"); + return null; + } + for (String service : services) { + IBinder obj = checkService(service); + if (obj != null) { + Parcel data = Parcel.obtain(); + try { + obj.transact(IBinder.SYSPROPS_TRANSACTION, data, null, 0); + } catch (RemoteException e) { + // Ignore + } catch (Exception e) { + Log.i(TAG, "Someone wrote a bad service '" + service + + "' that doesn't like to be poked", e); + } + data.recycle(); + } + } + return null; + } + } +} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/SystemPropPokerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/SystemPropPokerTest.java new file mode 100644 index 000000000000..fa7961be7979 --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/SystemPropPokerTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2017 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.settingslib.development; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import android.os.IBinder; +import android.os.Parcel; + +import com.android.settingslib.SettingsLibRobolectricTestRunner; +import com.android.settingslib.TestConfig; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.robolectric.annotation.Config; + +@RunWith(SettingsLibRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class SystemPropPokerTest { + + @Spy + private SystemPropPoker mSystemPropPoker; + @Spy + private SystemPropPoker.PokerTask mPokerTask; + @Mock + private IBinder mMockBinder; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + doReturn(mPokerTask).when(mSystemPropPoker).createPokerTask(); + doReturn(new String[] {"testService"}).when(mPokerTask).listServices(); + doReturn(mMockBinder).when(mPokerTask).checkService("testService"); + doReturn(true).when(mMockBinder) + .transact(anyInt(), any(Parcel.class), nullable(Parcel.class), anyInt()); + } + + @Test + public void testPoke() throws Exception { + mSystemPropPoker.poke(); + verify(mMockBinder, atLeastOnce()) + .transact(anyInt(), any(Parcel.class), nullable(Parcel.class), anyInt()); + } + + @Test + public void testPokeBlocking() throws Exception { + mSystemPropPoker.blockPokes(); + mSystemPropPoker.poke(); + verify(mMockBinder, never()) + .transact(anyInt(), any(Parcel.class), nullable(Parcel.class), anyInt()); + mSystemPropPoker.unblockPokes(); + mSystemPropPoker.poke(); + verify(mMockBinder, atLeastOnce()) + .transact(anyInt(), any(Parcel.class), nullable(Parcel.class), anyInt()); + } +}