Fixed a few EmailProvider omissions; added tests
* EmailProvider query wasn't handling queries for deleted messages * EmailProvider wasn't catching exceptions on some 'drop table' ops * Added tests of synced messages (delete and update)
This commit is contained in:
parent
2ed5063274
commit
ddc871d9ed
|
@ -284,9 +284,12 @@ public class EmailProvider extends ContentProvider {
|
|||
}
|
||||
|
||||
static void upgradeMessageTable(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||
db.execSQL("drop table " + Message.TABLE_NAME);
|
||||
db.execSQL("drop table " + Message.UPDATED_TABLE_NAME);
|
||||
db.execSQL("drop table " + Message.DELETED_TABLE_NAME);
|
||||
try {
|
||||
db.execSQL("drop table " + Message.TABLE_NAME);
|
||||
db.execSQL("drop table " + Message.UPDATED_TABLE_NAME);
|
||||
db.execSQL("drop table " + Message.DELETED_TABLE_NAME);
|
||||
} catch (SQLException e) {
|
||||
}
|
||||
createMessageTable(db);
|
||||
}
|
||||
|
||||
|
@ -414,12 +417,13 @@ public class EmailProvider extends ContentProvider {
|
|||
}
|
||||
|
||||
static void upgradeBodyTable(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||
db.execSQL("drop table " + Body.TABLE_NAME);
|
||||
try {
|
||||
db.execSQL("drop table " + Body.TABLE_NAME);
|
||||
} catch (SQLException e) {
|
||||
}
|
||||
createBodyTable(db);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private final int mDatabaseVersion = DATABASE_VERSION;
|
||||
private final int mBodyDatabaseVersion = BODY_DATABASE_VERSION;
|
||||
|
||||
|
@ -537,8 +541,7 @@ public class EmailProvider extends ContentProvider {
|
|||
// 5) Detach the Body database
|
||||
attachBodyDb = true;
|
||||
getBodyDatabase(context);
|
||||
String bodyFileName = context.getDatabasePath(BODY_DATABASE_NAME)
|
||||
.getAbsolutePath();
|
||||
String bodyFileName = mBodyDatabase.getPath();
|
||||
db.execSQL("attach \"" + bodyFileName + "\" as BodyDatabase");
|
||||
db.beginTransaction();
|
||||
if (match != MESSAGE_ID) {
|
||||
|
@ -725,6 +728,7 @@ public class EmailProvider extends ContentProvider {
|
|||
switch (match) {
|
||||
case BODY:
|
||||
case MESSAGE:
|
||||
case DELETED_MESSAGE:
|
||||
case UPDATED_MESSAGE:
|
||||
case ATTACHMENT:
|
||||
case MAILBOX:
|
||||
|
@ -735,6 +739,7 @@ public class EmailProvider extends ContentProvider {
|
|||
break;
|
||||
case BODY_ID:
|
||||
case MESSAGE_ID:
|
||||
case DELETED_MESSAGE_ID:
|
||||
case UPDATED_MESSAGE_ID:
|
||||
case ATTACHMENT_ID:
|
||||
case MAILBOX_ID:
|
||||
|
|
|
@ -20,8 +20,11 @@ import com.android.email.provider.EmailContent.Account;
|
|||
import com.android.email.provider.EmailContent.Body;
|
||||
import com.android.email.provider.EmailContent.Mailbox;
|
||||
import com.android.email.provider.EmailContent.Message;
|
||||
import com.android.email.provider.EmailContent.MessageColumns;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.ContentUris;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
|
@ -253,6 +256,148 @@ public class ProviderTests extends ProviderTestCase2<EmailProvider> {
|
|||
assertEquals(0, numMessages);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test delete synced message
|
||||
* TODO: body
|
||||
* TODO: attachments
|
||||
*/
|
||||
public void testSyncedMessageDelete() {
|
||||
Account account1 = setupAccount("synced-message-delete", true);
|
||||
long account1Id = account1.mId;
|
||||
Mailbox box1 = setupMailbox("box1", account1Id, true);
|
||||
long box1Id = box1.mId;
|
||||
Message message1 = setupMessage("message1", account1Id, box1Id, false, true);
|
||||
long message1Id = message1.mId;
|
||||
Message message2 = setupMessage("message2", account1Id, box1Id, false, true);
|
||||
long message2Id = message2.mId;
|
||||
|
||||
String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND "
|
||||
+ EmailContent.MessageColumns.MAILBOX_KEY + "=?";
|
||||
String[] selArgs = new String[] {
|
||||
String.valueOf(account1Id), String.valueOf(box1Id)
|
||||
};
|
||||
|
||||
// make sure there are two messages
|
||||
int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
|
||||
assertEquals(2, numMessages);
|
||||
|
||||
// make sure we start with no synced deletions
|
||||
numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
|
||||
selArgs);
|
||||
assertEquals(0, numMessages);
|
||||
|
||||
// now delete one of them SYNCED
|
||||
Uri uri = ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message1Id);
|
||||
mMockContext.getContentResolver().delete(uri, null, null);
|
||||
|
||||
// make sure there's only one message now
|
||||
numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
|
||||
assertEquals(1, numMessages);
|
||||
|
||||
// make sure there's one synced deletion now
|
||||
numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
|
||||
selArgs);
|
||||
assertEquals(1, numMessages);
|
||||
|
||||
// now delete the other one NOT SYNCED
|
||||
uri = ContentUris.withAppendedId(Message.CONTENT_URI, message2Id);
|
||||
mMockContext.getContentResolver().delete(uri, null, null);
|
||||
|
||||
// make sure there are no messages now
|
||||
numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
|
||||
assertEquals(0, numMessages);
|
||||
|
||||
// make sure there's still one deletion now
|
||||
numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
|
||||
selArgs);
|
||||
assertEquals(1, numMessages);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test message update
|
||||
* TODO: body
|
||||
* TODO: attachments
|
||||
*/
|
||||
public void testMessageUpdate() {
|
||||
Account account1 = setupAccount("message-update", true);
|
||||
long account1Id = account1.mId;
|
||||
Mailbox box1 = setupMailbox("box1", account1Id, true);
|
||||
long box1Id = box1.mId;
|
||||
Message message1 = setupMessage("message1", account1Id, box1Id, false, true);
|
||||
long message1Id = message1.mId;
|
||||
Message message2 = setupMessage("message2", account1Id, box1Id, false, true);
|
||||
long message2Id = message2.mId;
|
||||
ContentResolver cr = mMockContext.getContentResolver();
|
||||
|
||||
String selection = EmailContent.MessageColumns.ACCOUNT_KEY + "=? AND "
|
||||
+ EmailContent.MessageColumns.MAILBOX_KEY + "=?";
|
||||
String[] selArgs = new String[] {
|
||||
String.valueOf(account1Id), String.valueOf(box1Id)
|
||||
};
|
||||
|
||||
// make sure there are two messages
|
||||
int numMessages = EmailContent.count(mMockContext, Message.CONTENT_URI, selection, selArgs);
|
||||
assertEquals(2, numMessages);
|
||||
|
||||
// change the first one
|
||||
Uri uri = ContentUris.withAppendedId(Message.CONTENT_URI, message1Id);
|
||||
ContentValues cv = new ContentValues();
|
||||
cv.put(MessageColumns.FROM_LIST, "from-list");
|
||||
cr.update(uri, cv, null, null);
|
||||
|
||||
// make sure there's no updated message
|
||||
numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
|
||||
selArgs);
|
||||
assertEquals(0, numMessages);
|
||||
|
||||
// get the message back from the provider, make sure the change "stuck"
|
||||
Message restoredMessage = Message.restoreMessageWithId(mMockContext, message1Id);
|
||||
assertEquals("from-list", restoredMessage.mFrom);
|
||||
|
||||
// change the second one
|
||||
uri = ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message2Id);
|
||||
cv = new ContentValues();
|
||||
cv.put(MessageColumns.FROM_LIST, "from-list");
|
||||
cr.update(uri, cv, null, null);
|
||||
|
||||
// make sure there's one updated message
|
||||
numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
|
||||
selArgs);
|
||||
assertEquals(1, numMessages);
|
||||
|
||||
// get the message back from the provider, make sure the change "stuck",
|
||||
// as before
|
||||
restoredMessage = Message.restoreMessageWithId(mMockContext, message2Id);
|
||||
assertEquals("from-list", restoredMessage.mFrom);
|
||||
|
||||
// get the original message back from the provider
|
||||
Cursor c = cr.query(Message.UPDATED_CONTENT_URI, Message.CONTENT_PROJECTION, null, null,
|
||||
null);
|
||||
try {
|
||||
assertTrue(c.moveToFirst());
|
||||
Message originalMessage = EmailContent.getContent(c, Message.class);
|
||||
// make sure this has the original value
|
||||
assertEquals("from message2", originalMessage.mFrom);
|
||||
// Should only be one
|
||||
assertFalse(c.moveToNext());
|
||||
} finally {
|
||||
c.close();
|
||||
}
|
||||
|
||||
// delete the second message
|
||||
cr.delete(ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, message2Id), null, null);
|
||||
|
||||
// hey, presto! the change should be gone
|
||||
numMessages = EmailContent.count(mMockContext, Message.UPDATED_CONTENT_URI, selection,
|
||||
selArgs);
|
||||
assertEquals(0, numMessages);
|
||||
|
||||
// and there should now be a deleted record
|
||||
numMessages = EmailContent.count(mMockContext, Message.DELETED_CONTENT_URI, selection,
|
||||
selArgs);
|
||||
assertEquals(1, numMessages);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: cascaded delete account
|
||||
* TODO: hostauth
|
||||
|
|
Loading…
Reference in New Issue