Skip to content

Commit

Permalink
Bring back migration because lib was released over the weekend
Browse files Browse the repository at this point in the history
  • Loading branch information
stanislavin committed Feb 13, 2017
1 parent 9515537 commit e60b425
Show file tree
Hide file tree
Showing 3 changed files with 196 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package org.infobip.mobile.messaging.dal.sqlite;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.test.InstrumentationTestCase;

import org.infobip.mobile.messaging.Message;
import org.skyscreamer.jsonassert.JSONAssert;

import java.util.List;

/**
* @author sslavin
* @since 02/02/2017.
*/

public class SqliteMessageMigrationTest extends InstrumentationTestCase {

private Context context;

private static final int OLD_DB_VERSION = 1; // See database versions in DatabaseHelperImpl
private static final String SQL_CREATE_OLD_TABLE = "CREATE TABLE " + DatabaseContract.Tables.MESSAGES + " (" +
DatabaseContract.MessageColumns.MESSAGE_ID + " TEXT PRIMARY KEY NOT NULL ON CONFLICT FAIL, " +
DatabaseContract.MessageColumns.TITLE + " TEXT, " +
DatabaseContract.MessageColumns.BODY + " TEXT, " +
DatabaseContract.MessageColumns.SOUND + " TEXT, " +
DatabaseContract.MessageColumns.VIBRATE + " INTEGER NOT NULL DEFAULT 1, " +
DatabaseContract.MessageColumns.ICON + " TEXT, " +
DatabaseContract.MessageColumns.SILENT + " INTEGER NOT NULL DEFAULT 0, " +
DatabaseContract.MessageColumns.CATEGORY + " TEXT, " +
DatabaseContract.MessageColumns.FROM + " TEXT, " +
DatabaseContract.MessageColumns.RECEIVED_TIMESTAMP + " INTEGER, " +
DatabaseContract.MessageColumns.SEEN_TIMESTAMP + " INTEGER, " +
DatabaseContract.MessageColumns.Deprecated.INTERNAL_DATA + " TEXT, " +
DatabaseContract.MessageColumns.CUSTOM_PAYLOAD + " TEXT, " +
DatabaseContract.MessageColumns.DESTINATION + " TEXT, " +
DatabaseContract.MessageColumns.STATUS + " TEXT," +
DatabaseContract.MessageColumns.STATUS_MESSAGE + " TEXT)";

@Override
protected void setUp() throws Exception {
super.setUp();

context = getInstrumentation().getContext();
context.deleteDatabase(DatabaseHelperImpl.DATABASE_NAME);
}

public void test_shouldMigrateMessages() throws Exception {
// Create SQLiteOpenHelper directly to perform raw operations on database
SQLiteOpenHelper sqLiteOpenHelper = new SQLiteOpenHelper(context, DatabaseHelperImpl.DATABASE_NAME, null, OLD_DB_VERSION) {
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_OLD_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
};

// Create content values for old message structure
ContentValues contentValues = new ContentValues();
contentValues.put(DatabaseContract.MessageColumns.MESSAGE_ID, "SomeMessageId");
contentValues.put(DatabaseContract.MessageColumns.TITLE, "SomeMessageTitle");
contentValues.put(DatabaseContract.MessageColumns.BODY, "SomeMessageBody");
contentValues.put(DatabaseContract.MessageColumns.SOUND, "SomeMessageSound");
contentValues.put(DatabaseContract.MessageColumns.VIBRATE, 1);
contentValues.put(DatabaseContract.MessageColumns.ICON, "SomeMessageIcon");
contentValues.put(DatabaseContract.MessageColumns.SILENT, 1);
contentValues.put(DatabaseContract.MessageColumns.CATEGORY, "SomeMessageCategory");
contentValues.put(DatabaseContract.MessageColumns.FROM, "SomeMessageFrom");
contentValues.put(DatabaseContract.MessageColumns.RECEIVED_TIMESTAMP, 1234L);
contentValues.put(DatabaseContract.MessageColumns.SEEN_TIMESTAMP, 5678L);
contentValues.put(DatabaseContract.MessageColumns.Deprecated.INTERNAL_DATA,
"{" +
" 'geo': [" +
" {" +
" 'radiusInMeters': 11000," +
" 'latitude': 59.95," +
" 'id': 'E763E42AAB76E5AE7CB67C7AFA63107D'," +
" 'title': 'Saint Petersburg'," +
" 'favorite': false," +
" 'longitude': 30.3" +
" }" +
" ]," +
" 'silent': {" +
" 'sound': 'default'," +
" 'vibrate': true," +
" 'body': 'geo test'" +
" }," +
" 'messageType': 'geo'," +
" 'campaignId': '37446'," +
" 'expiryTime': '2017-02-10T00:00:00+00:00'," +
" 'startTime': '2017-02-02T17:00:00+00:00'" +
"}");
contentValues.put(DatabaseContract.MessageColumns.CUSTOM_PAYLOAD,
"{" +
" 'stringValue':'SomeString'," +
" 'numberValue':1," +
" 'booleanValue':true" +
"}");
contentValues.put(DatabaseContract.MessageColumns.DESTINATION, "SomeMessageDestination");
contentValues.put(DatabaseContract.MessageColumns.STATUS, Message.Status.SUCCESS.name());
contentValues.put(DatabaseContract.MessageColumns.STATUS_MESSAGE, "SomeStatusMessage");

// Get writable
SQLiteDatabase db = sqLiteOpenHelper.getWritableDatabase();
db.insert(DatabaseContract.Tables.MESSAGES, null, contentValues);
db.close();

// Now create Database Helper
// upgrade shall be performed internally and we shall load new message
DatabaseHelper databaseHelper = new DatabaseHelperImpl(context);
List<SqliteMessage> messages = databaseHelper.findAll(SqliteMessage.class);

// Assert
assertEquals(1, messages.size());
assertEquals("SomeMessageId", messages.get(0).getMessageId());
assertEquals("SomeMessageTitle", messages.get(0).getTitle());
assertEquals("SomeMessageBody", messages.get(0).getBody());
assertEquals("SomeMessageSound", messages.get(0).getSound());
assertEquals(true, messages.get(0).isVibrate());
assertEquals("SomeMessageIcon", messages.get(0).getIcon());
assertEquals(true, messages.get(0).isSilent());
assertEquals("SomeMessageCategory", messages.get(0).getCategory());
assertEquals("SomeMessageFrom", messages.get(0).getFrom());
assertEquals(1234L, messages.get(0).getReceivedTimestamp());
assertEquals(5678L, messages.get(0).getSeenTimestamp());
assertNotNull(messages.get(0).getGeo());
assertNotNull(messages.get(0).getGeo().getAreasList());
assertEquals(1, messages.get(0).getGeo().getAreasList().size());
assertEquals(11000, messages.get(0).getGeo().getAreasList().get(0).getRadius().intValue());
assertEquals(59.95, messages.get(0).getGeo().getAreasList().get(0).getLatitude(), 0.01);
assertEquals(30.3, messages.get(0).getGeo().getAreasList().get(0).getLongitude(), 0.01);
assertEquals("E763E42AAB76E5AE7CB67C7AFA63107D", messages.get(0).getGeo().getAreasList().get(0).getId());
assertEquals("Saint Petersburg", messages.get(0).getGeo().getAreasList().get(0).getTitle());
JSONAssert.assertEquals("{" +
" 'stringValue':'SomeString'," +
" 'numberValue':1," +
" 'booleanValue':true" +
"}", messages.get(0).getCustomPayload(), true);
assertEquals("SomeMessageDestination", messages.get(0).getDestination());
assertEquals(Message.Status.SUCCESS, messages.get(0).getStatus());
assertEquals("SomeStatusMessage", messages.get(0).getStatusMessage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,14 @@ interface MessageColumns {
* [TEXT]
*/
String STATUS_MESSAGE = "status_message";

interface Deprecated {
/**
* Internal data json
* [TEXT]
*/
String INTERNAL_DATA = "internal_data";
}
}

interface DatabaseObject {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import android.util.Log;

import org.infobip.mobile.messaging.MobileMessagingLogger;
import org.infobip.mobile.messaging.api.support.util.StringUtils;
import org.infobip.mobile.messaging.dal.sqlite.DatabaseContract.DatabaseObject;
import org.infobip.mobile.messaging.dal.sqlite.DatabaseContract.MessageColumns;
import org.infobip.mobile.messaging.dal.sqlite.DatabaseContract.Tables;
Expand All @@ -27,12 +28,14 @@ public class DatabaseHelperImpl extends SQLiteOpenHelper implements DatabaseHelp

private static final Map<Class<? extends DatabaseObject>, DatabaseContract.DatabaseObject> databaseObjectsCache = new HashMap<>();

private static final int VER_2017_FEB_2 = 1; // First version
private static final int VER_2017_JAN_12 = 1; // Initial version
private static final int VER_2017_FEB_2 = 2; // Removed internal data and added geo column
private static final int VER_CURRENT = VER_2017_FEB_2;

private static final String DATABASE_NAME = "mm_infobip_database.db";
@SuppressWarnings("WeakerAccess")
static final String DATABASE_NAME = "mm_infobip_database.db";

private static final String SQL_CREATE_MESSAGES_TABLE = "CREATE TABLE " + Tables.MESSAGES + " (" +
static final String SQL_CREATE_MESSAGES_TABLE = "CREATE TABLE " + Tables.MESSAGES + " (" +
MessageColumns.MESSAGE_ID + " TEXT PRIMARY KEY NOT NULL ON CONFLICT FAIL, " +
MessageColumns.TITLE + " TEXT, " +
MessageColumns.BODY + " TEXT, " +
Expand All @@ -51,7 +54,7 @@ public class DatabaseHelperImpl extends SQLiteOpenHelper implements DatabaseHelp
MessageColumns.STATUS_MESSAGE + " TEXT)";

private final Context context;
private SQLiteDatabase db;
private final SQLiteDatabase db;

public DatabaseHelperImpl(Context context) {
super(context, DATABASE_NAME, null, VER_CURRENT);
Expand Down Expand Up @@ -82,7 +85,7 @@ public <T extends DatabaseContract.DatabaseObject> long countAll(Class<T> cls) {

@Override
public void save(DatabaseObject object) {
db.insertWithOnConflict(object.getTableName(), null, object.getContentValues(), SQLiteDatabase.CONFLICT_REPLACE);
db.insert(object.getTableName(), null, object.getContentValues());
}

@Override
Expand All @@ -103,7 +106,37 @@ public void onCreate(SQLiteDatabase db) {

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion != VER_CURRENT) {
int version = oldVersion;
if (version <= VER_2017_JAN_12) {

String messageColumns = StringUtils.join(",", MessageColumns.MESSAGE_ID, MessageColumns.TITLE,
MessageColumns.BODY, MessageColumns.SOUND, MessageColumns.VIBRATE, MessageColumns.ICON,
MessageColumns.SILENT, MessageColumns.CATEGORY, MessageColumns.FROM, MessageColumns.RECEIVED_TIMESTAMP,
MessageColumns.SEEN_TIMESTAMP, MessageColumns.GEO, MessageColumns.CUSTOM_PAYLOAD, MessageColumns.DESTINATION,
MessageColumns.STATUS, MessageColumns.STATUS_MESSAGE
);

String oldMessageColumns = StringUtils.join(",", MessageColumns.MESSAGE_ID, MessageColumns.TITLE,
MessageColumns.BODY, MessageColumns.SOUND, MessageColumns.VIBRATE, MessageColumns.ICON,
MessageColumns.SILENT, MessageColumns.CATEGORY, MessageColumns.FROM, MessageColumns.RECEIVED_TIMESTAMP,
MessageColumns.SEEN_TIMESTAMP, MessageColumns.Deprecated.INTERNAL_DATA, MessageColumns.CUSTOM_PAYLOAD, MessageColumns.DESTINATION,
MessageColumns.STATUS, MessageColumns.STATUS_MESSAGE
);

db.beginTransaction();
db.execSQL("ALTER TABLE " + Tables.MESSAGES + " RENAME TO tmp_" + Tables.MESSAGES);
db.execSQL(SQL_CREATE_MESSAGES_TABLE);
db.execSQL("INSERT INTO " + Tables.MESSAGES + "(" + messageColumns + ")" +
" SELECT " + oldMessageColumns +
" FROM tmp_" + Tables.MESSAGES);
db.execSQL("DROP TABLE tmp_" + Tables.MESSAGES);
db.setTransactionSuccessful();
db.endTransaction();

version = VER_2017_FEB_2;
}

if (version != VER_CURRENT) {
MobileMessagingLogger.e("SQLite DB version is not what expected: " + VER_CURRENT);
}
}
Expand Down

0 comments on commit e60b425

Please sign in to comment.