/*
 * Copyright (C) 2007 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 tests.SQLite;

import SQLite.Exception;
import SQLite.JDBCDriver;
import dalvik.annotation.TestTargetClass;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;


/**
 * Tests the SQLite.JDBCDriver.
 */
@TestTargetClass(JDBCDriver.class)
public class JDBCDriverFunctionalTest extends AbstractSqlTest {



    /**
     * The SQLite db file.
     */
    private  File dbFile = null;

    private String connectionURL = "empty";

    /**
     * Sets up an unit test by loading the SQLite.JDBCDriver, getting two
     * connections and calling the setUp method of the super class.
     * @throws Exception
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws Exception
     * @throws Exception
     * @throws Exception
     * @throws Exception
     * @throws Exception
     */
    @Override
    public void setUp() throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException, Exception { // the Exception class needs to be fully
        // qualified since there is an Exception
        // class in the SQLite package.

        super.setUp();
    }

    /**
     * Tears down an unit test by calling the tearDown method of the super class
     * and deleting the SQLite test db file.
     */
    @Override
    protected void tearDown() throws SQLException {
        super.tearDown();
        dbFile.delete();
    }


    @Override
    protected String getConnectionURL() {
        if (connectionURL.equals("empty")) {
            String tmp = System.getProperty("java.io.tmpdir");
            File tmpDir = new File(tmp);
            if (tmpDir.isDirectory()) {
                try {
                    dbFile = File.createTempFile("JDBCDriverFunctionalTest",
                            ".db", tmpDir);
                } catch (IOException e) {
                    System.err.println("error creating temporary DB file.");
                }
                dbFile.deleteOnExit();
            } else {
                System.err.println("java.io.tmpdir does not exist");
            }

            connectionURL = "jdbc:sqlite:/" + dbFile.getPath();

        }

        return connectionURL;
    }

    @Override
    protected String getDriverClassName() {
        return "SQLite.JDBCDriver";
    }

    @Override
    protected int getTransactionIsolation() {
        return Connection.TRANSACTION_SERIALIZABLE;
    }


}
