Cts test for to ensure data column is not updated.

Checks that the data column of the voicemail content table does not update
for insert or update operations on the voicemail provider.

Bug: 9674953
Change-Id: Id5e05e87ca21afba764d8a0e9fb8e8ab5dea8271
diff --git a/tests/tests/provider/src/android/provider/cts/VoicemailContractTest.java b/tests/tests/provider/src/android/provider/cts/VoicemailContractTest.java
index ffb60f4..34a546e 100644
--- a/tests/tests/provider/src/android/provider/cts/VoicemailContractTest.java
+++ b/tests/tests/provider/src/android/provider/cts/VoicemailContractTest.java
@@ -21,6 +21,7 @@
 import android.content.ContentValues;
 import android.database.Cursor;
 import android.net.Uri;
+import android.os.RemoteException;
 import android.provider.VoicemailContract;
 import android.provider.VoicemailContract.Status;
 import android.provider.VoicemailContract.Voicemails;
@@ -140,6 +141,66 @@
         cursor.close();
     }
 
+    // Data column should be automatically generated during insert.
+    public void testInsert_doesNotUpdateDataColumn() throws Exception {
+
+        final String newFilePath = "my/new/file/path";
+        final ContentValues value = buildContentValuesForNewVoicemail();
+        value.put(Voicemails._DATA, newFilePath);
+        mVoicemailProvider.insert(mVoicemailContentUri, value);
+
+        assertDataNotEquals(newFilePath);
+    }
+
+    public void testDataColumnUpdate_throwsIllegalArgumentException() throws Exception {
+
+        final ContentValues value = buildContentValuesForNewVoicemail();
+        final Uri uri = mVoicemailProvider.insert(mVoicemailContentUri, value);
+
+        // Test: update
+        final String newFilePath = "another/file/path";
+
+        value.clear();
+        value.put(Voicemails._DATA, newFilePath);
+        try {
+            mVoicemailProvider.update(uri, value, null, null);
+            fail("IllegalArgumentException expected but not thrown.");
+        } catch (IllegalArgumentException e) {
+            // pass
+        }
+
+        assertDataNotEquals(newFilePath);
+    }
+
+    private void assertDataNotEquals(String newFilePath) throws RemoteException {
+        // Make sure data value is not actually updated.
+        final Cursor cursor = mVoicemailProvider.query(mVoicemailContentUri,
+                new String[]{Voicemails._DATA}, null, null, null);
+        cursor.moveToNext();
+        final String data = cursor.getString(0);
+        assertFalse(data.equals(newFilePath));
+    }
+
+    private ContentValues buildContentValuesForNewVoicemail() {
+        final String insertCallsNumber = "0123456789";
+        final long insertCallsDuration = 120;
+        final String insertSourceData = "internal_id";
+        final String insertMimeType = "audio/mp3";
+        final long insertDate = 1324478862000L;
+
+        ContentValues value = new ContentValues();
+        value.put(Voicemails.NUMBER, insertCallsNumber);
+        value.put(Voicemails.DATE, insertDate);
+        value.put(Voicemails.DURATION, insertCallsDuration);
+        // Source package is expected to be inserted by the provider, if not set.
+        value.put(Voicemails.SOURCE_DATA, insertSourceData);
+        value.put(Voicemails.MIME_TYPE, insertMimeType);
+        value.put(Voicemails.IS_READ, false);
+        value.put(Voicemails.HAS_CONTENT, true);
+
+        return value;
+    }
+
     public void testStatusTable() throws Exception {
         final String[] STATUS_PROJECTION = new String[] {
                 Status._ID, Status.SOURCE_PACKAGE, Status.CONFIGURATION_STATE,