diff options
| author | 2017-09-01 14:10:38 +0000 | |
|---|---|---|
| committer | 2017-09-01 14:10:38 +0000 | |
| commit | d27f7ffc2dcf3f40eb444786f23e2c51ec70549b (patch) | |
| tree | 3ed071a663621f26efdbc32c2da2d03652d68a0a | |
| parent | 8c6fe753dd89985400c4ce0181916ae8db6bb872 (diff) | |
| parent | 19e122754f5d234f1b3f33d3b921be37b0bfb63a (diff) | |
Merge "Add more tests for TransportManager."
| -rw-r--r-- | services/robotests/src/com/android/server/backup/TransportManagerTest.java | 391 | ||||
| -rw-r--r-- | services/robotests/src/com/android/server/backup/testing/ShadowContextImplForBackup.java (renamed from services/robotests/src/com/android/server/backup/testing/ShadowContextImplWithBindServiceAsUser.java) | 18 | ||||
| -rw-r--r-- | services/robotests/src/com/android/server/backup/testing/TransportBoundListenerStub.java | 13 |
3 files changed, 379 insertions, 43 deletions
diff --git a/services/robotests/src/com/android/server/backup/TransportManagerTest.java b/services/robotests/src/com/android/server/backup/TransportManagerTest.java index 510fdba5fdf2..f345da2b548c 100644 --- a/services/robotests/src/com/android/server/backup/TransportManagerTest.java +++ b/services/robotests/src/com/android/server/backup/TransportManagerTest.java @@ -18,6 +18,8 @@ package com.android.server.backup; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; + import android.content.ComponentName; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -30,13 +32,13 @@ import android.platform.test.annotations.Presubmit; import com.android.server.backup.testing.BackupTransportStub; import com.android.server.backup.testing.DefaultPackageManagerWithQueryIntentServicesAsUser; import com.android.server.backup.testing.ShadowBackupTransportStub; -import com.android.server.backup.testing.ShadowContextImplWithBindServiceAsUser; +import com.android.server.backup.testing.ShadowContextImplForBackup; import com.android.server.backup.testing.TransportBoundListenerStub; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; @@ -56,31 +58,20 @@ import java.util.List; manifest = Config.NONE, sdk = 23, shadows = { - ShadowContextImplWithBindServiceAsUser.class, + ShadowContextImplForBackup.class, ShadowBackupTransportStub.class } ) @Presubmit public class TransportManagerTest { private static final String PACKAGE_NAME = "some.package.name"; - private static final String TRANSPORT1_NAME = "transport1.name"; - private static final String TRANSPORT2_NAME = "transport2.name"; - private static final List<String> TRANSPORTS_NAMES = Arrays.asList( - TRANSPORT1_NAME, TRANSPORT2_NAME); - private static final ComponentName TRANSPORT1_COMPONENT_NAME = new ComponentName(PACKAGE_NAME, - TRANSPORT1_NAME); - private static final ComponentName TRANSPORT2_COMPONENT_NAME = new ComponentName(PACKAGE_NAME, - TRANSPORT2_NAME); - private static final List<ComponentName> TRANSPORTS_COMPONENT_NAMES = Arrays.asList( - TRANSPORT1_COMPONENT_NAME, TRANSPORT2_COMPONENT_NAME); + private static final String ANOTHER_PACKAGE_NAME = "another.package.name"; - private RobolectricPackageManager mPackageManager; + private TransportInfo mTransport1; + private TransportInfo mTransport2; - @Mock private IBinder mTransport1BinderMock; - @Mock private IBinder mTransport2BinderMock; + private RobolectricPackageManager mPackageManager; - private final BackupTransportStub mTransport1Stub = new BackupTransportStub(TRANSPORT1_NAME); - private final BackupTransportStub mTransport2Stub = new BackupTransportStub(TRANSPORT2_NAME); private final TransportBoundListenerStub mTransportBoundListenerStub = new TransportBoundListenerStub(true); @@ -93,38 +84,71 @@ public class TransportManagerTest { RuntimeEnvironment.getAppResourceLoader()); RuntimeEnvironment.setRobolectricPackageManager(mPackageManager); - ShadowContextImplWithBindServiceAsUser.sComponentBinderMap.put(TRANSPORT1_COMPONENT_NAME, - mTransport1BinderMock); - ShadowContextImplWithBindServiceAsUser.sComponentBinderMap.put(TRANSPORT2_COMPONENT_NAME, - mTransport2BinderMock); - ShadowBackupTransportStub.sBinderTransportMap.put(mTransport1BinderMock, mTransport1Stub); - ShadowBackupTransportStub.sBinderTransportMap.put(mTransport2BinderMock, mTransport2Stub); + mTransport1 = new TransportInfo(PACKAGE_NAME, "transport1.name"); + mTransport2 = new TransportInfo(PACKAGE_NAME, "transport2.name"); + + ShadowContextImplForBackup.sComponentBinderMap.put(mTransport1.componentName, + mTransport1.binder); + ShadowContextImplForBackup.sComponentBinderMap.put(mTransport2.componentName, + mTransport2.binder); + ShadowBackupTransportStub.sBinderTransportMap.put(mTransport1.binder, mTransport1.stub); + ShadowBackupTransportStub.sBinderTransportMap.put(mTransport2.binder, mTransport2.stub); + } + + @After + public void tearDown() throws Exception { + ShadowContextImplForBackup.resetBackupShadowState(); } @Test public void onPackageAdded_bindsToAllTransports() throws Exception { - setUpPackageWithTransports(PACKAGE_NAME, TRANSPORTS_NAMES, + setUpPackageWithTransports(PACKAGE_NAME, Arrays.asList(mTransport1, mTransport2), + ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); + + TransportManager transportManager = new TransportManager( + RuntimeEnvironment.application.getApplicationContext(), + new HashSet<>(Arrays.asList( + mTransport1.componentName, mTransport2.componentName)), + null /* defaultTransport */, + mTransportBoundListenerStub, + ShadowLooper.getMainLooper()); + transportManager.onPackageAdded(PACKAGE_NAME); + + assertThat(transportManager.getAllTransportComponents()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.componentName, mTransport2.componentName)); + assertThat(transportManager.getBoundTransportNames()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.name, mTransport2.name)); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport1.stub)).isTrue(); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport2.stub)).isTrue(); + } + + @Test + public void onPackageAdded_oneTransportUnavailable_bindsToOnlyOneTransport() throws Exception { + setUpPackageWithTransports(PACKAGE_NAME, Arrays.asList(mTransport1, mTransport2), ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); + ShadowContextImplForBackup.sUnbindableComponents.add(mTransport1.componentName); + TransportManager transportManager = new TransportManager( RuntimeEnvironment.application.getApplicationContext(), - new HashSet<>(TRANSPORTS_COMPONENT_NAMES), + new HashSet<>(Arrays.asList( + mTransport1.componentName, mTransport2.componentName)), null /* defaultTransport */, mTransportBoundListenerStub, ShadowLooper.getMainLooper()); transportManager.onPackageAdded(PACKAGE_NAME); assertThat(transportManager.getAllTransportComponents()).asList().containsExactlyElementsIn( - TRANSPORTS_COMPONENT_NAMES); + Collections.singleton(mTransport2.componentName)); assertThat(transportManager.getBoundTransportNames()).asList().containsExactlyElementsIn( - TRANSPORTS_NAMES); - assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport1Stub)).isTrue(); - assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport2Stub)).isTrue(); + Collections.singleton(mTransport2.name)); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport1.stub)).isFalse(); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport2.stub)).isTrue(); } @Test public void onPackageAdded_whitelistIsNull_doesNotBindToTransports() throws Exception { - setUpPackageWithTransports(PACKAGE_NAME, TRANSPORTS_NAMES, + setUpPackageWithTransports(PACKAGE_NAME, Arrays.asList(mTransport1, mTransport2), ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); TransportManager transportManager = new TransportManager( @@ -143,32 +167,33 @@ public class TransportManagerTest { @Test public void onPackageAdded_onlyOneTransportWhitelisted_onlyConnectsToWhitelistedTransport() throws Exception { - setUpPackageWithTransports(PACKAGE_NAME, TRANSPORTS_NAMES, + setUpPackageWithTransports(PACKAGE_NAME, Arrays.asList(mTransport1, mTransport2), ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); TransportManager transportManager = new TransportManager( RuntimeEnvironment.application.getApplicationContext(), - new HashSet<>(Collections.singleton(TRANSPORT2_COMPONENT_NAME)), + new HashSet<>(Collections.singleton(mTransport2.componentName)), null /* defaultTransport */, mTransportBoundListenerStub, ShadowLooper.getMainLooper()); transportManager.onPackageAdded(PACKAGE_NAME); assertThat(transportManager.getAllTransportComponents()).asList().containsExactlyElementsIn( - Collections.singleton(TRANSPORT2_COMPONENT_NAME)); + Collections.singleton(mTransport2.componentName)); assertThat(transportManager.getBoundTransportNames()).asList().containsExactlyElementsIn( - Collections.singleton(TRANSPORT2_NAME)); - assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport1Stub)).isFalse(); - assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport2Stub)).isTrue(); + Collections.singleton(mTransport2.name)); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport1.stub)).isFalse(); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport2.stub)).isTrue(); } @Test public void onPackageAdded_appIsNotPrivileged_doesNotBindToTransports() throws Exception { - setUpPackageWithTransports(PACKAGE_NAME, TRANSPORTS_NAMES, 0); + setUpPackageWithTransports(PACKAGE_NAME, Arrays.asList(mTransport1, mTransport2), 0); TransportManager transportManager = new TransportManager( RuntimeEnvironment.application.getApplicationContext(), - new HashSet<>(TRANSPORTS_COMPONENT_NAMES), + new HashSet<>(Arrays.asList( + mTransport1.componentName, mTransport2.componentName)), null /* defaultTransport */, mTransportBoundListenerStub, ShadowLooper.getMainLooper()); @@ -179,7 +204,220 @@ public class TransportManagerTest { assertThat(mTransportBoundListenerStub.isCalled()).isFalse(); } - private void setUpPackageWithTransports(String packageName, List<String> transportNames, + @Test + public void onPackageRemoved_transportsUnbound() throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + transportManager.onPackageRemoved(PACKAGE_NAME); + + assertThat(transportManager.getAllTransportComponents()).isEmpty(); + assertThat(transportManager.getBoundTransportNames()).isEmpty(); + } + + @Test + public void onPackageRemoved_incorrectPackageName_nothingHappens() throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + transportManager.onPackageRemoved(ANOTHER_PACKAGE_NAME); + + assertThat(transportManager.getAllTransportComponents()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.componentName, mTransport2.componentName)); + assertThat(transportManager.getBoundTransportNames()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.name, mTransport2.name)); + } + + @Test + public void onPackageChanged_oneComponentChanged_onlyOneTransportRebound() throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + transportManager.onPackageChanged(PACKAGE_NAME, new String[]{mTransport2.name}); + + assertThat(transportManager.getAllTransportComponents()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.componentName, mTransport2.componentName)); + assertThat(transportManager.getBoundTransportNames()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.name, mTransport2.name)); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport1.stub)).isFalse(); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport2.stub)).isTrue(); + } + + @Test + public void onPackageChanged_nothingChanged_noTransportsRebound() throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + transportManager.onPackageChanged(PACKAGE_NAME, new String[0]); + + assertThat(transportManager.getAllTransportComponents()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.componentName, mTransport2.componentName)); + assertThat(transportManager.getBoundTransportNames()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.name, mTransport2.name)); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport1.stub)).isFalse(); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport2.stub)).isFalse(); + } + + @Test + public void onPackageChanged_unexpectedComponentChanged_noTransportsRebound() throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + transportManager.onPackageChanged(PACKAGE_NAME, new String[]{"unexpected.component"}); + + assertThat(transportManager.getAllTransportComponents()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.componentName, mTransport2.componentName)); + assertThat(transportManager.getBoundTransportNames()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.name, mTransport2.name)); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport1.stub)).isFalse(); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport2.stub)).isFalse(); + } + + @Test + public void onPackageChanged_transportsRebound() throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + transportManager.onPackageChanged(PACKAGE_NAME, new String[]{mTransport2.name}); + + assertThat(transportManager.getAllTransportComponents()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.componentName, mTransport2.componentName)); + assertThat(transportManager.getBoundTransportNames()).asList().containsExactlyElementsIn( + Arrays.asList(mTransport1.name, mTransport2.name)); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport1.stub)).isFalse(); + assertThat(mTransportBoundListenerStub.isCalledForTransport(mTransport2.stub)).isTrue(); + } + + @Test + public void getTransportBinder_returnsCorrectBinder() throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + assertThat(transportManager.getTransportBinder(mTransport1.name)).isEqualTo( + mTransport1.stub); + assertThat(transportManager.getTransportBinder(mTransport2.name)).isEqualTo( + mTransport2.stub); + } + + @Test + public void getTransportBinder_incorrectTransportName_returnsNull() throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + assertThat(transportManager.getTransportBinder("incorrect.transport")).isNull(); + } + + @Test + public void getTransportBinder_oneTransportUnavailable_returnsCorrectBinder() throws Exception { + TransportManager transportManager = + createTransportManagerAndSetUpTransports(Collections.singletonList(mTransport2), + Collections.singletonList(mTransport1), mTransport1.name); + + assertThat(transportManager.getTransportBinder(mTransport1.name)).isNull(); + assertThat(transportManager.getTransportBinder(mTransport2.name)).isEqualTo( + mTransport2.stub); + } + + @Test + public void getCurrentTransport_selectTransportNotCalled_returnsDefaultTransport() + throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + assertThat(transportManager.getCurrentTransportName()).isEqualTo(mTransport1.name); + } + + @Test + public void getCurrentTransport_selectTransportCalled_returnsCorrectTransport() + throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + assertThat(transportManager.getCurrentTransportName()).isEqualTo(mTransport1.name); + + transportManager.selectTransport(mTransport2.name); + + assertThat(transportManager.getCurrentTransportName()).isEqualTo(mTransport2.name); + } + + @Test + public void getCurrentTransportBinder_returnsCorrectBinder() throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + assertThat(transportManager.getCurrentTransportBinder()).isEqualTo(mTransport1.stub); + } + + @Test + public void getCurrentTransportBinder_transportNotBound_returnsNull() throws Exception { + TransportManager transportManager = + createTransportManagerAndSetUpTransports(Collections.singletonList(mTransport2), + Collections.singletonList(mTransport1), mTransport2.name); + + transportManager.selectTransport(mTransport1.name); + + assertThat(transportManager.getCurrentTransportBinder()).isNull(); + } + + @Test + public void getTransportName_returnsCorrectTransportName() throws Exception { + TransportManager transportManager = createTransportManagerAndSetUpTransports( + Arrays.asList(mTransport1, mTransport2), mTransport1.name); + + assertThat(transportManager.getTransportName(mTransport1.stub)).isEqualTo(mTransport1.name); + assertThat(transportManager.getTransportName(mTransport2.stub)).isEqualTo(mTransport2.name); + } + + @Test + public void getTransportName_transportNotBound_returnsNull() throws Exception { + TransportManager transportManager = + createTransportManagerAndSetUpTransports(Collections.singletonList(mTransport2), + Collections.singletonList(mTransport1), mTransport1.name); + + assertThat(transportManager.getTransportName(mTransport1.stub)).isNull(); + assertThat(transportManager.getTransportName(mTransport2.stub)).isEqualTo(mTransport2.name); + } + + @Test + public void getTransportWhitelist_returnsCorrectWhiteList() throws Exception { + TransportManager transportManager = new TransportManager( + RuntimeEnvironment.application.getApplicationContext(), + new HashSet<>(Arrays.asList(mTransport1.componentName, mTransport2.componentName)), + mTransport1.name, + mTransportBoundListenerStub, + ShadowLooper.getMainLooper()); + + assertThat(transportManager.getTransportWhitelist()).containsExactlyElementsIn( + Arrays.asList(mTransport1.componentName, mTransport2.componentName)); + } + + @Test + public void getTransportWhitelist_whiteListIsNull_returnsEmptyArray() throws Exception { + TransportManager transportManager = new TransportManager( + RuntimeEnvironment.application.getApplicationContext(), + null /* whitelist */, + mTransport1.name, + mTransportBoundListenerStub, + ShadowLooper.getMainLooper()); + + assertThat(transportManager.getTransportWhitelist()).isEmpty(); + } + + @Test + public void selectTransport_setsTransportCorrectlyAndReturnsPreviousTransport() + throws Exception { + TransportManager transportManager = new TransportManager( + RuntimeEnvironment.application.getApplicationContext(), + null /* whitelist */, + mTransport1.name, + mTransportBoundListenerStub, + ShadowLooper.getMainLooper()); + + assertThat(transportManager.selectTransport(mTransport2.name)).isEqualTo(mTransport1.name); + assertThat(transportManager.selectTransport(mTransport1.name)).isEqualTo(mTransport2.name); + } + + private void setUpPackageWithTransports(String packageName, List<TransportInfo> transports, int flags) throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.packageName = packageName; @@ -189,11 +427,11 @@ public class TransportManagerTest { mPackageManager.addPackage(packageInfo); List<ResolveInfo> transportsInfo = new ArrayList<>(); - for (String transportName : transportNames) { + for (TransportInfo transport : transports) { ResolveInfo info = new ResolveInfo(); info.serviceInfo = new ServiceInfo(); info.serviceInfo.packageName = packageName; - info.serviceInfo.name = transportName; + info.serviceInfo.name = transport.name; transportsInfo.add(info); } @@ -203,4 +441,73 @@ public class TransportManagerTest { mPackageManager.addResolveInfoForIntent(intent, transportsInfo); } + private TransportManager createTransportManagerAndSetUpTransports( + List<TransportInfo> availableTransports, String defaultTransportName) throws Exception { + return createTransportManagerAndSetUpTransports(availableTransports, + Collections.<TransportInfo>emptyList(), defaultTransportName); + } + + private TransportManager createTransportManagerAndSetUpTransports( + List<TransportInfo> availableTransports, List<TransportInfo> unavailableTransports, + String defaultTransportName) + throws Exception { + List<String> availableTransportsNames = new ArrayList<>(); + List<ComponentName> availableTransportsComponentNames = new ArrayList<>(); + for (TransportInfo transport : availableTransports) { + availableTransportsNames.add(transport.name); + availableTransportsComponentNames.add(transport.componentName); + } + + List<ComponentName> allTransportsComponentNames = new ArrayList<>(); + allTransportsComponentNames.addAll(availableTransportsComponentNames); + for (TransportInfo transport : unavailableTransports) { + allTransportsComponentNames.add(transport.componentName); + } + + for (TransportInfo transport : unavailableTransports) { + ShadowContextImplForBackup.sUnbindableComponents.add(transport.componentName); + } + + setUpPackageWithTransports(PACKAGE_NAME, Arrays.asList(mTransport1, mTransport2), + ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); + + TransportManager transportManager = new TransportManager( + RuntimeEnvironment.application.getApplicationContext(), + new HashSet<>(allTransportsComponentNames), + defaultTransportName, + mTransportBoundListenerStub, + ShadowLooper.getMainLooper()); + transportManager.onPackageAdded(PACKAGE_NAME); + + assertThat(transportManager.getAllTransportComponents()).asList().containsExactlyElementsIn( + availableTransportsComponentNames); + assertThat(transportManager.getBoundTransportNames()).asList().containsExactlyElementsIn( + availableTransportsNames); + for (TransportInfo transport : availableTransports) { + assertThat(mTransportBoundListenerStub.isCalledForTransport(transport.stub)).isTrue(); + } + for (TransportInfo transport : unavailableTransports) { + assertThat(mTransportBoundListenerStub.isCalledForTransport(transport.stub)).isFalse(); + } + + mTransportBoundListenerStub.resetState(); + + return transportManager; + } + + private static class TransportInfo { + public final String packageName; + public final String name; + public final ComponentName componentName; + public final BackupTransportStub stub; + public final IBinder binder; + + TransportInfo(String packageName, String name) { + this.packageName = packageName; + this.name = name; + this.componentName = new ComponentName(packageName, name); + this.stub = new BackupTransportStub(name); + this.binder = mock(IBinder.class); + } + } } diff --git a/services/robotests/src/com/android/server/backup/testing/ShadowContextImplWithBindServiceAsUser.java b/services/robotests/src/com/android/server/backup/testing/ShadowContextImplForBackup.java index 77424294b1e0..c3975db3057f 100644 --- a/services/robotests/src/com/android/server/backup/testing/ShadowContextImplWithBindServiceAsUser.java +++ b/services/robotests/src/com/android/server/backup/testing/ShadowContextImplForBackup.java @@ -29,20 +29,36 @@ import org.robolectric.shadows.ShadowApplication; import org.robolectric.shadows.ShadowContextImpl; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; /** * Implementation of ContextImpl shadow, handling bindServiceAsUser(). */ @Implements(className = ShadowContextImpl.CLASS_NAME) -public class ShadowContextImplWithBindServiceAsUser extends ShadowContextImpl { +public class ShadowContextImplForBackup extends ShadowContextImpl { public static Map<ComponentName, IBinder> sComponentBinderMap = new HashMap<>(); + public static Set<ComponentName> sUnbindableComponents = new HashSet<>(); @Implementation public boolean bindServiceAsUser(@RequiresPermission Intent service, ServiceConnection conn, int flags, UserHandle user) { + if (sUnbindableComponents.contains(service.getComponent())) { + return false; + } + ShadowApplication.getInstance().setComponentNameAndServiceForBindService( service.getComponent(), sComponentBinderMap.get(service.getComponent())); return bindService(service, conn, flags); } + + + /** + * Resets backup-related shadow state. + */ + public static void resetBackupShadowState() { + sComponentBinderMap.clear(); + sUnbindableComponents.clear(); + } } diff --git a/services/robotests/src/com/android/server/backup/testing/TransportBoundListenerStub.java b/services/robotests/src/com/android/server/backup/testing/TransportBoundListenerStub.java index e9f5978cc6d0..84ac2c212854 100644 --- a/services/robotests/src/com/android/server/backup/testing/TransportBoundListenerStub.java +++ b/services/robotests/src/com/android/server/backup/testing/TransportBoundListenerStub.java @@ -41,11 +41,24 @@ public class TransportBoundListenerStub implements return mAlwaysReturnSuccess; } + /** + * Returns whether the listener was called for the specified transport at least once. + */ public boolean isCalledForTransport(IBackupTransport binder) { return mTransportsCalledFor.contains(binder); } + /** + * Returns whether the listener was called at least once. + */ public boolean isCalled() { return !mTransportsCalledFor.isEmpty(); } + + /** + * Resets listener calls. + */ + public void resetState() { + mTransportsCalledFor.clear(); + } } |