Home | History | Annotate | Download | only in shadows
      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