1 package org.robolectric.shadows; 2 3 import static android.os.Build.VERSION_CODES.LOLLIPOP; 4 import static org.assertj.core.api.Assertions.assertThat; 5 import static org.mockito.Mockito.mock; 6 import static org.mockito.Mockito.verify; 7 import static org.robolectric.Shadows.shadowOf; 8 9 import android.content.IIntentSender; 10 import android.content.IntentSender; 11 import android.content.pm.PackageInstaller; 12 import android.os.Handler; 13 import java.io.OutputStream; 14 import org.junit.Before; 15 import org.junit.Test; 16 import org.junit.runner.RunWith; 17 import org.robolectric.RobolectricTestRunner; 18 import org.robolectric.RuntimeEnvironment; 19 import org.robolectric.annotation.Config; 20 import org.robolectric.util.ReflectionHelpers; 21 22 @RunWith(RobolectricTestRunner.class) 23 @Config(minSdk = LOLLIPOP) 24 public class ShadowPackageInstallerTest { 25 26 private static final String TEST_PACKAGE_NAME = "com.some.other.package"; 27 private static final String TEST_PACKAGE_LABEL = "My Little App"; 28 29 private PackageInstaller packageInstaller; 30 31 @Before 32 public void setUp() { 33 packageInstaller = RuntimeEnvironment.application.getPackageManager().getPackageInstaller(); 34 } 35 36 @Test 37 public void shouldBeNoInProcessSessionsOnRobolectricStartup() { 38 assertThat(packageInstaller.getAllSessions()).isEmpty(); 39 } 40 41 @Test 42 public void packageInstallerCreateAndAbandonSession() throws Exception { 43 PackageInstaller.SessionCallback mockCallback = mock(PackageInstaller.SessionCallback.class); 44 packageInstaller.registerSessionCallback(mockCallback, new Handler()); 45 46 int sessionId = packageInstaller.createSession(createSessionParams("packageName")); 47 48 PackageInstaller.SessionInfo sessionInfo = packageInstaller.getSessionInfo(sessionId); 49 assertThat(sessionInfo.isActive()).isTrue(); 50 51 assertThat(sessionInfo.appPackageName).isEqualTo("packageName"); 52 53 packageInstaller.abandonSession(sessionId); 54 55 assertThat(packageInstaller.getSessionInfo(sessionId)).isNull(); 56 assertThat(packageInstaller.getAllSessions()).isEmpty(); 57 58 verify(mockCallback).onCreated(sessionId); 59 verify(mockCallback).onFinished(sessionId, false); 60 } 61 62 @Test 63 public void packageInstallerOpenSession() throws Exception { 64 int sessionId = packageInstaller.createSession(createSessionParams("packageName")); 65 66 PackageInstaller.Session session = packageInstaller.openSession(sessionId); 67 68 assertThat(session).isNotNull(); 69 } 70 71 @Test(expected = SecurityException.class) 72 public void packageInstallerOpenSession_nonExistantSessionThrowsException() throws Exception { 73 PackageInstaller.Session session = packageInstaller.openSession(-99); 74 } 75 76 @Test // TODO: Initial implementation has a no-op OutputStream - complete this implementation. 77 public void sessionOpenWriteDoesNotThrowException() throws Exception { 78 int sessionId = packageInstaller.createSession(createSessionParams("packageName")); 79 PackageInstaller.Session session = packageInstaller.openSession(sessionId); 80 81 OutputStream filename = session.openWrite("filename", 0, 0); 82 filename.write(10); 83 } 84 85 @Test 86 public void sessionCommitSession_streamProperlyClosed() throws Exception { 87 int sessionId = packageInstaller.createSession(createSessionParams("packageName")); 88 PackageInstaller.Session session = packageInstaller.openSession(sessionId); 89 90 OutputStream outputStream = session.openWrite("filename", 0, 0); 91 outputStream.close(); 92 93 session.commit(new IntentSender(ReflectionHelpers.createNullProxy(IIntentSender.class))); 94 } 95 96 @Test(expected = SecurityException.class) 97 public void sessionCommitSession_streamStillOpen() throws Exception { 98 int sessionId = packageInstaller.createSession(createSessionParams("packageName")); 99 PackageInstaller.Session session = packageInstaller.openSession(sessionId); 100 101 session.openWrite("filename", 0, 0); 102 103 session.commit(new IntentSender(ReflectionHelpers.createNullProxy(IIntentSender.class))); 104 } 105 106 @Test 107 public void registerSessionCallback_sessionFails() throws Exception { 108 PackageInstaller.SessionCallback mockCallback = mock(PackageInstaller.SessionCallback.class); 109 packageInstaller.registerSessionCallback(mockCallback, new Handler()); 110 int sessionId = packageInstaller.createSession(createSessionParams("packageName")); 111 verify(mockCallback).onCreated(sessionId); 112 113 PackageInstaller.Session session = packageInstaller.openSession(sessionId); 114 115 OutputStream outputStream = session.openWrite("filename", 0, 0); 116 outputStream.close(); 117 118 session.abandon(); 119 120 assertThat(packageInstaller.getAllSessions()).isEmpty(); 121 122 verify(mockCallback).onFinished(sessionId, false); 123 } 124 125 @Test 126 public void registerSessionCallback_sessionSucceeds() throws Exception { 127 PackageInstaller.SessionCallback mockCallback = mock(PackageInstaller.SessionCallback.class); 128 packageInstaller.registerSessionCallback(mockCallback, new Handler()); 129 int sessionId = packageInstaller.createSession(createSessionParams("packageName")); 130 verify(mockCallback).onCreated(sessionId); 131 132 PackageInstaller.Session session = packageInstaller.openSession(sessionId); 133 134 OutputStream outputStream = session.openWrite("filename", 0, 0); 135 outputStream.close(); 136 137 session.commit(new IntentSender(ReflectionHelpers.createNullProxy(IIntentSender.class))); 138 139 shadowOf(packageInstaller).setSessionProgress(sessionId, 50.0f); 140 verify(mockCallback).onProgressChanged(sessionId, 50.0f); 141 142 verify(mockCallback).onFinished(sessionId, true); 143 } 144 145 private static PackageInstaller.SessionParams createSessionParams(String appPackageName) { 146 PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL); 147 params.setAppPackageName(appPackageName); 148 return params; 149 } 150 } 151