blob: 92381d975f0c3b40f36c3aa7d695a411d479981c [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.photos.data;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
import android.test.InstrumentationTestCase;
import com.android.photos.data.PhotoProvider.Accounts;
import com.android.photos.data.PhotoProvider.Albums;
import com.android.photos.data.PhotoProvider.Metadata;
import com.android.photos.data.PhotoProvider.Photos;
import java.io.File;
import java.io.IOException;
public class PhotoDatabaseTest extends InstrumentationTestCase {
private PhotoDatabase mDBHelper;
private static final String DB_NAME = "dummy.db";
private static final long PARENT_ID1 = 100;
private static final long PARENT_ID2 = 101;
@Override
protected void setUp() throws Exception {
super.setUp();
Context context = getInstrumentation().getTargetContext();
context.deleteDatabase(DB_NAME);
mDBHelper = new PhotoDatabase(context, DB_NAME);
}
@Override
protected void tearDown() throws Exception {
mDBHelper.close();
mDBHelper = null;
Context context = getInstrumentation().getTargetContext();
context.deleteDatabase(DB_NAME);
super.tearDown();
}
public void testCreateDatabase() throws IOException {
Context context = getInstrumentation().getTargetContext();
File dbFile = context.getDatabasePath(DB_NAME);
SQLiteDatabase db = getReadableDB();
db.beginTransaction();
db.endTransaction();
assertTrue(dbFile.exists());
}
public void testTables() {
validateTable(Metadata.TABLE, PhotoDatabaseUtils.PROJECTION_METADATA);
validateTable(Albums.TABLE, PhotoDatabaseUtils.PROJECTION_ALBUMS);
validateTable(Photos.TABLE, PhotoDatabaseUtils.PROJECTION_PHOTOS);
}
public void testAlbumsConstraints() {
SQLiteDatabase db = getWritableDB();
db.beginTransaction();
try {
long accountId = 100;
// Test NOT NULL constraint on name
assertFalse(PhotoDatabaseUtils.insertAlbum(db, null, null, Albums.VISIBILITY_PRIVATE,
accountId));
// test NOT NULL constraint on privacy
assertFalse(PhotoDatabaseUtils.insertAlbum(db, null, "hello", null, accountId));
// test NOT NULL constraint on account_id
assertFalse(PhotoDatabaseUtils.insertAlbum(db, null, "hello",
Albums.VISIBILITY_PRIVATE, null));
// Normal insert
assertTrue(PhotoDatabaseUtils.insertAlbum(db, PARENT_ID1, "hello",
Albums.VISIBILITY_PRIVATE, accountId));
long albumId = PhotoDatabaseUtils.queryAlbumIdFromParentId(db, PARENT_ID1);
// Assign a valid child
assertTrue(PhotoDatabaseUtils.insertAlbum(db, PARENT_ID2, "hello",
Albums.VISIBILITY_PRIVATE, accountId));
long otherAlbumId = PhotoDatabaseUtils.queryAlbumIdFromParentId(db, PARENT_ID2);
assertNotSame(albumId, otherAlbumId);
// This is a valid child of another album.
assertTrue(PhotoDatabaseUtils.insertAlbum(db, otherAlbumId, "hello",
Albums.VISIBILITY_PRIVATE, accountId));
// This isn't allowed due to uniqueness constraint (parent_id/name)
assertFalse(PhotoDatabaseUtils.insertAlbum(db, otherAlbumId, "hello",
Albums.VISIBILITY_PRIVATE, accountId));
} finally {
db.endTransaction();
}
}
public void testPhotosConstraints() {
SQLiteDatabase db = getWritableDB();
db.beginTransaction();
try {
int width = 100;
int height = 100;
long dateTaken = System.currentTimeMillis();
String mimeType = "test/test";
long accountId = 100;
// Test NOT NULL mime-type
assertFalse(PhotoDatabaseUtils.insertPhoto(db, width, height, dateTaken, null, null,
accountId));
// Test NOT NULL width
assertFalse(PhotoDatabaseUtils.insertPhoto(db, null, height, dateTaken, null, mimeType,
accountId));
// Test NOT NULL height
assertFalse(PhotoDatabaseUtils.insertPhoto(db, width, null, dateTaken, null, mimeType,
accountId));
// Test NOT NULL dateTaken
assertFalse(PhotoDatabaseUtils.insertPhoto(db, width, height, null, null, mimeType,
accountId));
// Test NOT NULL accountId
assertFalse(PhotoDatabaseUtils.insertPhoto(db, width, height, dateTaken, null,
mimeType, null));
// Test normal insert
assertTrue(PhotoDatabaseUtils.insertPhoto(db, width, height, dateTaken, null, mimeType,
accountId));
} finally {
db.endTransaction();
}
}
public void testMetadataConstraints() {
SQLiteDatabase db = getWritableDB();
db.beginTransaction();
try {
final String mimeType = "test/test";
PhotoDatabaseUtils.insertPhoto(db, 100, 100, 100L, PARENT_ID1, mimeType, 100L);
long photoId = PhotoDatabaseUtils.queryPhotoIdFromAlbumId(db, PARENT_ID1);
// Test NOT NULL PHOTO_ID constraint.
assertFalse(PhotoDatabaseUtils.insertMetadata(db, null, "foo", "bar"));
// Normal insert.
assertTrue(PhotoDatabaseUtils.insertMetadata(db, photoId, "foo", "bar"));
// Test uniqueness constraint.
assertFalse(PhotoDatabaseUtils.insertMetadata(db, photoId, "foo", "baz"));
} finally {
db.endTransaction();
}
}
public void testAccountsConstraints() {
SQLiteDatabase db = getWritableDB();
db.beginTransaction();
try {
assertFalse(PhotoDatabaseUtils.insertAccount(db, null));
assertTrue(PhotoDatabaseUtils.insertAccount(db, "hello"));
assertFalse(PhotoDatabaseUtils.insertAccount(db, "hello"));
} finally {
db.endTransaction();
}
}
public void testUpgrade() {
SQLiteDatabase db = getWritableDB();
db.beginTransaction();
try {
assertTrue(PhotoDatabaseUtils.insertAccount(db, "Hello"));
assertTrue(PhotoDatabaseUtils.insertAlbum(db, PARENT_ID1, "hello",
Albums.VISIBILITY_PRIVATE, 100L));
final String mimeType = "test/test";
assertTrue(PhotoDatabaseUtils.insertPhoto(db, 100, 100, 100L, PARENT_ID1, mimeType,
100L));
// Normal insert.
assertTrue(PhotoDatabaseUtils.insertMetadata(db, 100L, "foo", "bar"));
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
mDBHelper.close();
Context context = getInstrumentation().getTargetContext();
mDBHelper = new PhotoDatabase(context, DB_NAME, PhotoDatabase.DB_VERSION + 1);
db = getReadableDB();
assertEquals(0, DatabaseUtils.queryNumEntries(db, Accounts.TABLE));
assertEquals(0, DatabaseUtils.queryNumEntries(db, Photos.TABLE));
assertEquals(0, DatabaseUtils.queryNumEntries(db, Albums.TABLE));
assertEquals(0, DatabaseUtils.queryNumEntries(db, Metadata.TABLE));
}
private SQLiteDatabase getReadableDB() {
return mDBHelper.getReadableDatabase();
}
private SQLiteDatabase getWritableDB() {
return mDBHelper.getWritableDatabase();
}
private void validateTable(String table, String[] projection) {
SQLiteDatabase db = getReadableDB();
Cursor cursor = db.query(table, projection, null, null, null, null, null);
assertNotNull(cursor);
assertEquals(cursor.getCount(), 0);
assertEquals(cursor.getColumnCount(), projection.length);
for (int i = 0; i < projection.length; i++) {
assertEquals(cursor.getColumnName(i), projection[i]);
}
}
}