Add CTS for enterprise SIP lookup

It's mostly the same thing as the phone lookup, but the internal behavior is
slightly different.  Make sure the returned photo URIs are actually valid
and readable.

Bug 20687987

Change-Id: Ief6742b30a9b44e7752305f5ca6f8453f2cf7b97
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
index b76d9e4..77ecfe1 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
@@ -31,11 +31,13 @@
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.Photo;
+import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.PhoneLookup;
 import android.provider.ContactsContract.RawContacts;
 import android.test.AndroidTestCase;
 
 import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -49,20 +51,26 @@
     private static final String PRIMARY_CONTACT_DISPLAY_NAME = "Primary";
     private static final String PRIMARY_CONTACT_PHONE = "00000001";
     private static final String PRIMARY_CONTACT_EMAIL = "one@primary.com";
+    private static final String PRIMARY_CONTACT_SIP = "foo@sip";
+
     // details of a sample managed contact
     private static final String MANAGED_CONTACT_DISPLAY_NAME = "Managed";
     private static final String MANAGED_CONTACT_PHONE = "6891999";
     private static final String MANAGED_CONTACT_EMAIL = "one@managed.com";
+    private static final String MANAGED_CONTACT_SIP = "bar@sip";
+
     // details of a sample primary and a sample managed contact, with the same phone & email
     private static final String PRIMARY_CONTACT_DISPLAY_NAME_2 = "PrimaryShared";
     private static final String MANAGED_CONTACT_DISPLAY_NAME_2 = "ManagedShared";
     private static final String SHARED_CONTACT_PHONE = "00000002";
     private static final String SHARED_CONTACT_EMAIL = "shared@shared.com";
+    private static final String SHARED_CONTACT_SIP = "baz@sip";
 
     private DevicePolicyManager mDevicePolicyManager;
     private ContentResolver mResolver;
 
-    private static class ContactInfo {
+    private class ContactInfo { // Not static to access outer world.
+
         String contactId;
         String displayName;
         String photoUri;
@@ -78,8 +86,14 @@
             this.photoId = photoId;
         }
 
-        private boolean hasPhotoUri() {
-            return photoUri != null && photoThumbnailUri != null;
+        private void assertNoPhotoUri() {
+            assertNull(photoUri);
+            assertNull(photoThumbnailUri);
+        }
+
+        private void assertPhotoUrisReadable() throws IOException {
+            assertPhotoUriReadable(photoUri);
+            assertPhotoUriReadable(photoThumbnailUri);
         }
 
         private boolean hasPhotoId() {
@@ -100,19 +114,19 @@
         assertFalse(isManagedProfile());
         // Do not insert to primary contact
         insertContact(PRIMARY_CONTACT_DISPLAY_NAME, PRIMARY_CONTACT_PHONE,
-                PRIMARY_CONTACT_EMAIL, 0);
+                PRIMARY_CONTACT_EMAIL, PRIMARY_CONTACT_SIP, 0);
 
         ContactInfo contactInfo = getContactInfo(PRIMARY_CONTACT_PHONE);
         assertNotNull(contactInfo);
         assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
 
         contactInfo = getContactInfoFromEmail(PRIMARY_CONTACT_EMAIL);
         assertNotNull(contactInfo);
         assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
 
@@ -125,19 +139,20 @@
         insertContact(MANAGED_CONTACT_DISPLAY_NAME,
                 MANAGED_CONTACT_PHONE,
                 MANAGED_CONTACT_EMAIL,
+                MANAGED_CONTACT_SIP,
                 com.android.cts.managedprofile.R.raw.ic_contact_picture);
 
         ContactInfo contactInfo = getContactInfo(MANAGED_CONTACT_PHONE);
         assertNotNull(contactInfo);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         assertTrue(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
 
         contactInfo = getContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
         assertNotNull(contactInfo);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         assertTrue(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
@@ -145,21 +160,23 @@
     public void testPrimaryProfileDuplicatedPhoneEmailContact_insertedAndfound() throws
             RemoteException, OperationApplicationException, NotFoundException, IOException {
         assertFalse(isManagedProfile());
-        insertContact(PRIMARY_CONTACT_DISPLAY_NAME_2, SHARED_CONTACT_PHONE,
+        insertContact(PRIMARY_CONTACT_DISPLAY_NAME_2,
+                SHARED_CONTACT_PHONE,
                 SHARED_CONTACT_EMAIL,
+                SHARED_CONTACT_SIP,
                 com.android.cts.managedprofile.R.raw.ic_contact_picture);
 
         ContactInfo contactInfo = getContactInfo(SHARED_CONTACT_PHONE);
         assertNotNull(contactInfo);
         assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         assertTrue(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
 
         contactInfo = getContactInfoFromEmail(SHARED_CONTACT_EMAIL);
         assertNotNull(contactInfo);
         assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         assertTrue(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
@@ -168,57 +185,73 @@
             RemoteException, OperationApplicationException, NotFoundException, IOException {
         assertTrue(isManagedProfile());
         insertContact(MANAGED_CONTACT_DISPLAY_NAME_2, SHARED_CONTACT_PHONE,
-                SHARED_CONTACT_EMAIL, 0);
+                SHARED_CONTACT_EMAIL, SHARED_CONTACT_SIP , 0);
 
         ContactInfo contactInfo = getContactInfo(SHARED_CONTACT_PHONE);
         assertNotNull(contactInfo);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
 
         contactInfo = getContactInfoFromEmail(SHARED_CONTACT_EMAIL);
         assertNotNull(contactInfo);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testPrimaryProfileEnterprisePhoneLookup_canAccessEnterpriseContact() {
+    public void testPrimaryProfileEnterprisePhoneLookup_canAccessEnterpriseContact()
+            throws IOException {
         assertFalse(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfo(MANAGED_CONTACT_PHONE);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         // Cannot get photo id in ENTERPRISE_CONTENT_FILTER_URI
         assertFalse(contactInfo.hasPhotoId());
         assertTrue(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testPrimaryProfileEnterpriseEmailLookup_canAccessEnterpriseContact() {
+    public void testPrimaryProfileEnterpriseSipLookup_canAccessEnterpriseContact()
+            throws IOException {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromSipAddress(MANAGED_CONTACT_SIP);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertFalse(contactInfo.hasPhotoId());
+
+        // Quirk: the _id column from the SIP lookup is actually of the data id, not the contact id.
+        // assertTrue(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testPrimaryProfileEnterpriseEmailLookup_canAccessEnterpriseContact()
+            throws IOException {
         assertFalse(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         // Cannot get photo id in ENTERPRISE_CONTENT_FILTER_URI
         assertFalse(contactInfo.hasPhotoId());
         assertTrue(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testPrimaryProfileEnterprisePhoneLookupDuplicated_canAccessPrimaryContact() {
+    public void testPrimaryProfileEnterprisePhoneLookupDuplicated_canAccessPrimaryContact()
+            throws IOException {
         assertFalse(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfo(SHARED_CONTACT_PHONE);
         assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         assertTrue(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testPrimaryProfileEnterpriseEmailLookupDuplicated_canAccessPrimaryContact() {
+    public void testPrimaryProfileEnterpriseEmailLookupDuplicated_canAccessPrimaryContact()
+            throws IOException {
         assertFalse(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(SHARED_CONTACT_EMAIL);
         assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         assertTrue(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
@@ -227,7 +260,7 @@
         assertTrue(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfo(SHARED_CONTACT_PHONE);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
@@ -236,12 +269,11 @@
         assertTrue(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(SHARED_CONTACT_EMAIL);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
 
-
     public void testPrimaryProfilePhoneLookup_canNotAccessEnterpriseContact() {
         assertFalse(isManagedProfile());
         ContactInfo contactInfo = getContactInfo(MANAGED_CONTACT_PHONE);
@@ -258,7 +290,7 @@
         assertFalse(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfo(PRIMARY_CONTACT_PHONE);
         assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
@@ -267,25 +299,27 @@
         assertFalse(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(PRIMARY_CONTACT_EMAIL);
         assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testManagedProfileEnterprisePhoneLookup_canAccessEnterpriseContact() {
+    public void testManagedProfileEnterprisePhoneLookup_canAccessEnterpriseContact()
+            throws IOException {
         assertTrue(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfo(MANAGED_CONTACT_PHONE);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         assertTrue(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testManagedProfileEnterpriseEmailLookup_canAccessEnterpriseContact() {
+    public void testManagedProfileEnterpriseEmailLookup_canAccessEnterpriseContact()
+            throws IOException {
         assertTrue(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         assertTrue(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
@@ -358,12 +392,8 @@
         return mDevicePolicyManager.isProfileOwnerApp(adminPackage);
     }
 
-    private void insertContact(String displayName, String phoneNumber, int photoResId) throws
-            RemoteException, OperationApplicationException, NotFoundException, IOException {
-        insertContact(displayName, phoneNumber, null, photoResId);
-    }
-
-    private void insertContact(String displayName, String phoneNumber, String email, int photoResId)
+    private void insertContact(String displayName, String phoneNumber, String email,
+            String sipAddress, int photoResId)
             throws RemoteException, OperationApplicationException, NotFoundException, IOException {
         ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
         ops.add(ContentProviderOperation
@@ -403,26 +433,50 @@
                 .withValue(ContactsContract.CommonDataKinds.Email.TYPE,
                         Email.TYPE_WORK)
                 .build());
+        ops.add(ContentProviderOperation
+                .newInsert(ContactsContract.Data.CONTENT_URI)
+                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
+                .withValue(
+                        ContactsContract.Data.MIMETYPE,
+                        ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE)
+                .withValue(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS,
+                        sipAddress)
+                .withValue(ContactsContract.CommonDataKinds.SipAddress.TYPE,
+                        ContactsContract.CommonDataKinds.SipAddress.TYPE_WORK)
+                .build());
 
         if (photoResId != 0) {
             InputStream phoneInputStream = mContext.getResources().openRawResource(photoResId);
-            byte[] rawPhoto = getByteFromStream(phoneInputStream);
-            ops.add(ContentProviderOperation
-                    .newInsert(ContactsContract.Data.CONTENT_URI)
-                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
-                    .withValue(
-                            ContactsContract.Data.MIMETYPE,
-                            ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
-                    .withValue(Photo.PHOTO, rawPhoto)
-                    .build());
+            try {
+                byte[] rawPhoto = getByteFromStream(phoneInputStream);
+                ops.add(ContentProviderOperation
+                        .newInsert(ContactsContract.Data.CONTENT_URI)
+                        .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
+                        .withValue(
+                                ContactsContract.Data.MIMETYPE,
+                                ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
+                        .withValue(Photo.PHOTO, rawPhoto)
+                        .build());
+            } finally {
+                phoneInputStream.close();
+            }
         }
 
         mResolver.applyBatch(ContactsContract.AUTHORITY, ops);
     }
 
     private ContactInfo getContactInfoFromUri(Uri phoneLookupUri, String phoneNumber) {
-        Uri uri = Uri.withAppendedPath(phoneLookupUri,
-                Uri.encode(phoneNumber));
+        return getContactInfoFromPhoneLookup(Uri.withAppendedPath(phoneLookupUri,
+                        Uri.encode(phoneNumber)), /* forSip =*/ false);
+    }
+
+    private ContactInfo getContactInfoFromSipUri(Uri phoneLookupUri, String sipAddress) {
+        return getContactInfoFromPhoneLookup(
+                phoneLookupUri.buildUpon().appendEncodedPath(sipAddress).appendQueryParameter(
+                        PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, "1").build(), /* forSip =*/ true);
+    }
+
+    private ContactInfo getContactInfoFromPhoneLookup(Uri uri, boolean isForSip) {
         Cursor cursor = mResolver.query(uri,
                 new String[] {
                         PhoneLookup._ID, PhoneLookup.DISPLAY_NAME, PhoneLookup.PHOTO_URI,
@@ -490,6 +544,11 @@
                 phoneNumber);
     }
 
+    private ContactInfo getEnterpriseContactInfoFromSipAddress(String phoneNumber) {
+        return getContactInfoFromSipUri(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
+                phoneNumber);
+    }
+
     private ContactInfo getEnterpriseContactInfoFromEmail(String email) {
         return getContactInfoFromEmailUri(Email.ENTERPRISE_CONTENT_LOOKUP_URI, email);
     }
@@ -520,4 +579,18 @@
     private boolean isEnterpriseContactId(String contactId) {
         return ContactsContract.Contacts.isEnterpriseContactId(Long.valueOf(contactId));
     }
+
+    private void assertPhotoUriReadable(String uri) throws IOException {
+        assertNotNull(uri);
+        final InputStream is = mResolver.openInputStream(Uri.parse(uri));
+        try {
+            // Make sure it's readabe.  Don't have to read all content.
+            is.read();
+        } finally {
+            try {
+                is.close();
+            } catch (IOException ignore) {
+            }
+        }
+    }
 }
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
index bb8cd3f..3954bda 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
@@ -294,6 +294,10 @@
                     "testPrimaryProfileEnterprisePhoneLookupDuplicated_canAccessPrimaryContact",
                     0));
 
+            // Make sure SIP enterprise lookup works too.
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterpriseSipLookup_canAccessEnterpriseContact", 0));
+
             // Managed user cannot use ordinary phone/email lookup api to access primary contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
                     "testManagedProfilePhoneLookup_canNotAccessPrimaryContact", mUserId));