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:
Andrew Stadler 2009-06-29 23:08:40 -07:00
parent 2ed5063274
commit ddc871d9ed
2 changed files with 158 additions and 8 deletions

View File

@ -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:

View File

@ -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