/*
* Copyright (C) 2012 uPhyca Inc.
*
* 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.uphyca.testing.junit3.dbunit;
import java.io.InputStream;
import org.dbunit.DBTestCase;
import org.dbunit.IDatabaseTester;
import org.dbunit.IOperationListener;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlProducer;
import org.dbunit.operation.DatabaseOperation;
import org.xml.sax.InputSource;
import android.content.ContentProvider;
import android.content.Context;
import android.test.ProviderTestCase2;
/**
* TestCase that uses a AndroidSQLiteDatabaseTester.
*/
public abstract class ProviderDBTestCase<T extends ContentProvider> extends ProviderTestCase2<T> {
private static final class DBTestCaseDelegate<T extends ContentProvider> extends DBTestCase {
private ProviderDBTestCase<T> owner;
public DBTestCaseDelegate(ProviderDBTestCase<T> owner) {
this.owner = owner;
}
@Override
protected IDatabaseTester newDatabaseTester() throws Exception {
return owner.newDatabaseTester();
}
@Override
protected IDataSet getDataSet() throws Exception {
return owner.getDataSet();
}
@Override
public void setUpDatabaseConfig(DatabaseConfig config) {
super.setUpDatabaseConfig(config);
}
@Override
public IDatabaseTester getDatabaseTester() throws Exception {
return super.getDatabaseTester();
}
@Override
public DatabaseOperation getSetUpOperation() throws Exception {
return super.getSetUpOperation();
}
@Override
public DatabaseOperation getTearDownOperation() throws Exception {
return super.getTearDownOperation();
}
@Override
public void setUp() throws Exception {
super.setUp();
}
@Override
public void tearDown() throws Exception {
super.tearDown();
}
@Override
public IOperationListener getOperationListener() {
return super.getOperationListener();
}
public IDatabaseConnection callGetConnection() throws Exception {
return getConnection();
}
}
private final DBTestCaseDelegate<T> mDBTestCase;
public ProviderDBTestCase(Class<T> providerClass,
String providerAuthority) {
super(providerClass, providerAuthority);
mDBTestCase = new DBTestCaseDelegate<T>(this);
}
/*
* (non-Javadoc)
*
* @see org.dbunit.DatabaseTestCase#newDatabaseTester()
*/
protected IDatabaseTester newDatabaseTester() throws Exception {
return new AndroidSQLiteDatabaseTester(getMockContext(), getDatabaseName());
}
/*
* (non-Javadoc)
*
* @see org.dbunit.DatabaseTestCase#getDataSet()
*/
protected abstract IDataSet getDataSet() throws Exception;
/**
* Returns the test database name.
*/
protected abstract String getDatabaseName();
/**
* Implements the code for create database.
* @param context
*/
protected abstract void onCreateDatabase(Context context);
/*
* (non-Javadoc)
*
* @see org.dbunit.DatabaseTestCase#setUpDatabaseConfig(org.dbunit.database.
* DatabaseConfig)
*/
protected void setUpDatabaseConfig(DatabaseConfig config) {
mDBTestCase.setUpDatabaseConfig(config);
}
/*
* (non-Javadoc)
*
* @see org.dbunit.DatabaseTestCase#getDatabaseTester()
*/
protected IDatabaseTester getDatabaseTester() throws Exception {
return mDBTestCase.getDatabaseTester();
}
/*
* (non-Javadoc)
*
* @see org.dbunit.DatabaseTestCase#getSetUpOperation()
*/
protected DatabaseOperation getSetUpOperation() throws Exception {
return mDBTestCase.getSetUpOperation();
}
/*
* (non-Javadoc)
*
* @see org.dbunit.DatabaseTestCase#getTearDownOperation()
*/
protected DatabaseOperation getTearDownOperation() throws Exception {
return mDBTestCase.getTearDownOperation();
}
/*
* (non-Javadoc)
*
* @see org.dbunit.DatabaseTestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
onCreateDatabase(getMockContext());
mDBTestCase.setUp();
}
/*
* (non-Javadoc)
*
* @see org.dbunit.DatabaseTestCase#tearDown()
*/
protected void tearDown() throws Exception {
mDBTestCase.tearDown();
super.tearDown();
}
/*
* (non-Javadoc)
*
* @see org.dbunit.DatabaseTestCase#getOperationListener()
*/
protected IOperationListener getOperationListener() {
return mDBTestCase.getOperationListener();
}
/*
* (non-Javadoc)
*
* @see org.dbunit.DatabaseTestCase#getConnection()
*/
public IDatabaseConnection getConnection() throws Exception {
IDatabaseConnection conn = mDBTestCase.callGetConnection();
//SQLite.JDBC only accepts fetch size 1.
//@see http://www.dbunit.org/properties.html
conn.getConfig().setProperty("http://www.dbunit.org/properties/fetchSize",
1);
return conn;
}
// /**
// * Gets the {@link IsolatedContext} created by this class during initialization.
// * @return The {@link IsolatedContext} instance
// */
// public IsolatedContext getMockContext() {
// return mDatabaseContext;
// }
protected IDataSet getFlatXmlDataSetFromRawResrouce(int id) throws DataSetException {
InputStream in = getContext().getResources().openRawResource(id);
FlatXmlProducer producer = new FlatXmlProducer(new InputSource(in), false);
return new FlatXmlDataSet(producer);
}
protected IDataSet getFlatXmlDataSetFromClasspathResrouce(String file) throws DataSetException {
InputStream in = getContext().getClassLoader().getResourceAsStream(file);
FlatXmlProducer producer = new FlatXmlProducer(new InputSource(in), false);
return new FlatXmlDataSet(producer);
}
}