Add tests for the api of GetLaunchIntentSenderForPackage

Bug: 175336608
Test: atest android.content.pm.cts.PackageManagerTest
Change-Id: I4e1e79fc9598a46e3afb4cfaeaaca1cb0d14c8d9
diff --git a/tests/tests/content/AndroidManifest.xml b/tests/tests/content/AndroidManifest.xml
index ea3b4ab..55b0a6a 100644
--- a/tests/tests/content/AndroidManifest.xml
+++ b/tests/tests/content/AndroidManifest.xml
@@ -368,7 +368,6 @@
              android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.INFO"/>
             </intent-filter>
         </activity>
         <!--Test for PackageManager-->
@@ -392,6 +391,7 @@
              android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.INFO"/>
                 <category android:name="android.intent.category.HOME"/>
                 <category android:name="android.intent.category.DEFAULT"/>
             </intent-filter>
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
index 1703a91..4f242b5 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
@@ -47,10 +47,13 @@
 import static org.testng.Assert.assertThrows;
 
 import android.annotation.NonNull;
+import android.app.Activity;
+import android.app.Instrumentation;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.IntentSender;
 import android.content.cts.MockActivity;
 import android.content.cts.MockContentProvider;
 import android.content.cts.MockReceiver;
@@ -116,6 +119,7 @@
 
     private Context mContext;
     private PackageManager mPackageManager;
+    private Instrumentation mInstrumentation;
     private static final String PACKAGE_NAME = "android.content.cts";
     private static final String CONTENT_PKG_NAME = "android.content.cts";
     private static final String APPLICATION_NAME = "android.content.cts.MockApplication";
@@ -137,6 +141,7 @@
             "android.content.cts.permission.TEST_DYNAMIC";
     // Number of activities/activity-alias in AndroidManifest
     private static final int NUM_OF_ACTIVITIES_IN_MANIFEST = 12;
+    public static final int TIMEOUT = 5000;
 
     private static final String SHIM_APEX_PACKAGE_NAME = "com.android.apex.cts.shim";
 
@@ -145,6 +150,8 @@
             MATCH_APEX, MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS};
 
     private static final String SAMPLE_APK_BASE = "/data/local/tmp/cts/content/";
+    private static final String EMPTY_APP_APK = SAMPLE_APK_BASE
+            + "CtsContentEmptyTestApp.apk";
     private static final String LONG_PACKAGE_NAME_APK = SAMPLE_APK_BASE
             + "CtsContentLongPackageNameTestApp.apk";
     private static final String LONG_SHARED_USER_ID_APK = SAMPLE_APK_BASE
@@ -163,6 +170,7 @@
     public void setup() throws Exception {
         mContext = InstrumentationRegistry.getContext();
         mPackageManager = mContext.getPackageManager();
+        mInstrumentation = InstrumentationRegistry.getInstrumentation();
     }
 
     @After
@@ -1440,4 +1448,61 @@
     private void uninstallPackage(String packageName) {
         SystemUtil.runShellCommand("pm uninstall " + packageName);
     }
+
+    @Test
+    public void testGetLaunchIntentSenderForPackage() throws Exception {
+        final Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
+                LauncherMockActivity.class.getName(), null /* result */, false /* block */);
+        mInstrumentation.addMonitor(monitor);
+
+        try {
+            final IntentSender intentSender = mPackageManager.getLaunchIntentSenderForPackage(
+                    PACKAGE_NAME);
+            assertThat(intentSender.getCreatorPackage()).isEqualTo(PACKAGE_NAME);
+            assertThat(intentSender.getCreatorUid()).isEqualTo(mContext.getApplicationInfo().uid);
+
+            intentSender.sendIntent(mContext, 0 /* code */, null /* intent */,
+                    null /* onFinished */, null /* handler */);
+            final Activity activity = monitor.waitForActivityWithTimeout(TIMEOUT);
+            assertThat(activity).isNotNull();
+            activity.finish();
+        } finally {
+            mInstrumentation.removeMonitor(monitor);
+        }
+    }
+
+    @Test(expected = IntentSender.SendIntentException.class)
+    public void testGetLaunchIntentSenderForPackage_noMainActivity() throws Exception {
+        assertThat(installPackage(EMPTY_APP_APK)).isTrue();
+        final PackageInfo packageInfo = mPackageManager.getPackageInfo(EMPTY_APP_PACKAGE_NAME,
+                0 /* flags */);
+        assertThat(packageInfo.packageName).isEqualTo(EMPTY_APP_PACKAGE_NAME);
+        final Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setPackage(EMPTY_APP_PACKAGE_NAME);
+        assertThat(mPackageManager.queryIntentActivities(intent, 0 /* flags */)).isEmpty();
+
+        final IntentSender intentSender = mPackageManager.getLaunchIntentSenderForPackage(
+                EMPTY_APP_PACKAGE_NAME);
+        assertThat(intentSender.getCreatorPackage()).isEqualTo(PACKAGE_NAME);
+        assertThat(intentSender.getCreatorUid()).isEqualTo(mContext.getApplicationInfo().uid);
+
+        intentSender.sendIntent(mContext, 0 /* code */, null /* intent */,
+                null /* onFinished */, null /* handler */);
+    }
+
+    @Test(expected = IntentSender.SendIntentException.class)
+    public void testGetLaunchIntentSenderForPackage_packageNotExist() throws Exception {
+        try {
+            mPackageManager.getPackageInfo(EMPTY_APP_PACKAGE_NAME, 0 /* flags */);
+            fail(EMPTY_APP_PACKAGE_NAME + " should not exist in the device");
+        } catch (NameNotFoundException e) {
+        }
+        final IntentSender intentSender = mPackageManager.getLaunchIntentSenderForPackage(
+                EMPTY_APP_PACKAGE_NAME);
+        assertThat(intentSender.getCreatorPackage()).isEqualTo(PACKAGE_NAME);
+        assertThat(intentSender.getCreatorUid()).isEqualTo(mContext.getApplicationInfo().uid);
+
+        intentSender.sendIntent(mContext, 0 /* code */, null /* intent */,
+                null /* onFinished */, null /* handler */);
+    }
 }