package org.robolectric.shadows; import android.content.IIntentSender; import android.content.IntentSender; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.os.Build; import android.os.Handler; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.TestRunners; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; import java.io.OutputStream; import java.util.LinkedList; import java.util.List; import static android.os.Build.VERSION_CODES.LOLLIPOP; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.robolectric.Shadows.shadowOf; @RunWith(TestRunners.MultiApiSelfTest.class) @Config(minSdk = LOLLIPOP) public class ShadowPackageInstallerTest { private static final String TEST_PACKAGE_NAME = "com.some.other.package"; private static final String TEST_PACKAGE_LABEL = "My Little App"; private PackageInstaller packageInstaller; @Before public void setUp() { packageInstaller = RuntimeEnvironment.application.getPackageManager().getPackageInstaller(); } @Test public void shouldBeNoInProcessSessionsOnRobolectricStartup() { assertThat(packageInstaller.getAllSessions()).isEmpty(); } @Test public void packageInstallerCreateSession() throws Exception { int sessionId = packageInstaller.createSession(createSessionParams("packageName")); PackageInstaller.SessionInfo sessionInfo = packageInstaller.getSessionInfo(sessionId); assertThat(sessionInfo.isActive()).isTrue(); assertThat(sessionInfo.appPackageName).isEqualTo("packageName"); packageInstaller.abandonSession(sessionId); assertThat(packageInstaller.getSessionInfo(sessionId)).isNull(); } @Test public void packageInstallerOpenSession() throws Exception { int sessionId = packageInstaller.createSession(createSessionParams("packageName")); PackageInstaller.Session session = packageInstaller.openSession(sessionId); assertThat(session).isNotNull(); } @Test(expected = SecurityException.class) public void packageInstallerOpenSession_nonExistantSessionThrowsException() throws Exception { PackageInstaller.Session session = packageInstaller.openSession(-99); } @Test // TODO: Initial implementation has a no-op OutputStream - complete this implementation. public void sessionOpenWriteDoesNotThrowException() throws Exception { int sessionId = packageInstaller.createSession(createSessionParams("packageName")); PackageInstaller.Session session = packageInstaller.openSession(sessionId); OutputStream filename = session.openWrite("filename", 0, 0); filename.write(10); } @Test public void sessionCommitSession_streamProperlyClosed() throws Exception { int sessionId = packageInstaller.createSession(createSessionParams("packageName")); PackageInstaller.Session session = packageInstaller.openSession(sessionId); OutputStream outputStream = session.openWrite("filename", 0, 0); outputStream.close(); session.commit(new IntentSender(ReflectionHelpers.createNullProxy(IIntentSender.class))); } @Test(expected = SecurityException.class) public void sessionCommitSession_streamStillOpen() throws Exception { int sessionId = packageInstaller.createSession(createSessionParams("packageName")); PackageInstaller.Session session = packageInstaller.openSession(sessionId); session.openWrite("filename", 0, 0); session.commit(new IntentSender(ReflectionHelpers.createNullProxy(IIntentSender.class))); } @Test public void registerSessionCallback_sessionFails() throws Exception { PackageInstaller.SessionCallback mockCallback = mock(PackageInstaller.SessionCallback.class); packageInstaller.registerSessionCallback(mockCallback, new Handler()); int sessionId = packageInstaller.createSession(createSessionParams("packageName")); verify(mockCallback).onCreated(sessionId); PackageInstaller.Session session = packageInstaller.openSession(sessionId); OutputStream outputStream = session.openWrite("filename", 0, 0); outputStream.close(); session.commit(new IntentSender(ReflectionHelpers.createNullProxy(IIntentSender.class))); shadowOf(packageInstaller).setSessionFails(sessionId); verify(mockCallback).onFinished(sessionId, false); } @Test public void registerSessionCallback_sessionSucceeds() throws Exception { PackageInstaller.SessionCallback mockCallback = mock(PackageInstaller.SessionCallback.class); packageInstaller.registerSessionCallback(mockCallback, new Handler()); int sessionId = packageInstaller.createSession(createSessionParams("packageName")); verify(mockCallback).onCreated(sessionId); PackageInstaller.Session session = packageInstaller.openSession(sessionId); OutputStream outputStream = session.openWrite("filename", 0, 0); outputStream.close(); session.commit(new IntentSender(ReflectionHelpers.createNullProxy(IIntentSender.class))); shadowOf(packageInstaller).setSessionProgress(sessionId, 50.0f); verify(mockCallback).onProgressChanged(sessionId, 50.0f); shadowOf(packageInstaller).setSessionSucceeds(sessionId); verify(mockCallback).onFinished(sessionId, true); } private static PackageInstaller.SessionParams createSessionParams(String appPackageName) { PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL); params.setAppPackageName(appPackageName); return params; } }