blob: f760d1d6b5da235997377c4fc89524f238c13f0e [file] [log] [blame]
/*
* 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.java.sql;
import dalvik.annotation.KnownFailure;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargets;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetNew;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import tests.support.DatabaseCreator;
import tests.support.Support_SQL;
import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
@TestTargetClass(Statement.class)
public class DeleteFunctionalityTest extends TestCase {
private static Connection conn = null;
private static Statement statement = null;
public void setUp() throws Exception {
super.setUp();
Support_SQL.loadDriver();
conn = Support_SQL.getConnection();
statement = conn.createStatement();
createTestTables();
DatabaseCreator.fillParentTable(conn);
}
public void tearDown() throws Exception {
deleteTestTables();
statement.close();
conn.close();
super.tearDown();
}
public void createTestTables() {
try {
DatabaseMetaData meta = conn.getMetaData();
ResultSet userTab = meta.getTables(null, null, null, null);
while (userTab.next()) {
String tableName = userTab.getString("TABLE_NAME");
if (tableName.equals(DatabaseCreator.PARENT_TABLE)) {
statement
.execute(DatabaseCreator.DROP_TABLE_PARENT);
} else if (tableName
.equals(DatabaseCreator.FKCASCADE_TABLE)) {
statement
.execute(DatabaseCreator.DROP_TABLE_FKCASCADE);
} else if (tableName
.equals(DatabaseCreator.FKSTRICT_TABLE)) {
statement
.execute(DatabaseCreator.DROP_TABLE_FKSTRICT);
} else if (tableName
.equals(DatabaseCreator.TEST_TABLE5)) {
statement.execute(DatabaseCreator.DROP_TABLE5);
}
}
userTab.close();
statement.execute(DatabaseCreator.CREATE_TABLE_PARENT);
statement.execute(DatabaseCreator.CREATE_TABLE_FKSTRICT);
statement.execute(DatabaseCreator.CREATE_TABLE_FKCASCADE);
statement.execute(DatabaseCreator.CREATE_TABLE5);
} catch (SQLException e) {
fail("Unexpected SQLException " + e.toString());
}
}
public void deleteTestTables() {
try {
statement.execute(DatabaseCreator.DROP_TABLE_FKCASCADE);
statement.execute(DatabaseCreator.DROP_TABLE_FKSTRICT);
statement.execute(DatabaseCreator.DROP_TABLE_PARENT);
statement.execute(DatabaseCreator.DROP_TABLE5);
} catch (SQLException e) {
fail("Unexpected SQLException " + e.toString());
}
}
/**
* @tests DeleteFunctionalityTest#testDelete1(). Deletes row with no
* referencing ones and RESTRICT action
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Functionality test: Deletes row with no referencing ones and RESTRICT action",
method = "execute",
args = {java.lang.String.class}
)
public void testDelete1() throws SQLException {
DatabaseCreator.fillFKStrictTable(conn);
statement.execute("DELETE FROM " + DatabaseCreator.PARENT_TABLE
+ " WHERE id = 3;");
}
/**
* @tests DeleteFunctionalityTest#testDelete2(). Attempts to delete row with
* referencing ones and RESTRICT action - expecting SQLException
* TODO foreign key functionality is not supported
*/
/* public void testDelete2() throws SQLException {
DatabaseCreator.fillFKStrictTable(conn);
try {
statement.execute("DELETE FROM " + DatabaseCreator.PARENT_TABLE
+ " WHERE id = 1;");
fail("expecting SQLException");
} catch (SQLException ex) {
// expected
}
}
*/
/**
* @tests DeleteFunctionalityTest#testDelete3(). Deletes all referencing
* rows and then deletes referenced one
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Functionality test: Deletes all referencing rows and then deletes referenced one",
method = "execute",
args = {java.lang.String.class}
)
public void testDelete3() throws SQLException {
statement.execute("DELETE FROM " + DatabaseCreator.FKSTRICT_TABLE
+ " WHERE name_id = 1;");
statement.execute("DELETE FROM " + DatabaseCreator.FKSTRICT_TABLE
+ " WHERE id = 1;");
}
/**
* @tests DeleteFunctionalityTest#testDelete4(). Deletes row with no
* referencing ones and CASCADE action
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Functionality test: Deletes row with no referencing ones and CASCADE action",
method = "execute",
args = {java.lang.String.class}
)
public void testDelete4() throws SQLException {
DatabaseCreator.fillFKCascadeTable(conn);
statement.execute("DELETE FROM " + DatabaseCreator.PARENT_TABLE
+ " WHERE id = 3;");
}
/**
* @tests DeleteFunctionalityTest#testDelete5(). Attempts to delete row with
* referencing ones and CASCADE action - expecting all referencing
* rows will also be deleted
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Functionality test: Attempts to delete row with referencing ones and CASCADE action - expecting all referencing rows will also be deleted",
method = "execute",
args = {java.lang.String.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Functionality test: Attempts to delete row with referencing ones and CASCADE action - expecting all referencing rows will also be deleted",
method = "executeQuery",
args = {java.lang.String.class}
)
})
public void testDelete5() throws SQLException {
statement.execute("DELETE FROM " + DatabaseCreator.PARENT_TABLE
+ " WHERE id = 1;");
ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
+ DatabaseCreator.FKCASCADE_TABLE + " WHERE name_id = 1;");
r.next();
assertEquals("Should be no rows", 0, r.getInt(1));
r.close();
}
/**
* @tests DeleteFunctionalityTest#testDelete6().
* TODO Foreign key functionality is not supported
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Deletes rows using subquery in WHERE clause with foreign keys. Foreign keys not supported.",
method = "execute",
args = {String.class}
)
@KnownFailure("not supported")
public void testDelete6() throws SQLException {
DatabaseCreator.fillFKStrictTable(conn);
statement.execute("DELETE FROM " + DatabaseCreator.FKSTRICT_TABLE
+ " WHERE name_id = ANY (SELECT id FROM "
+ DatabaseCreator.PARENT_TABLE + " WHERE id > 1)");
ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
+ DatabaseCreator.FKSTRICT_TABLE + " WHERE name_id = 1;");
r.next();
assertEquals("Should be 2 rows", 2, r.getInt(1));
r.close();
}
/**
* @tests DeleteFunctionalityTest#testDelete7(). Deletes rows using
* PreparedStatement
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Functionality test: Deletes rows using PreparedStatement",
method = "executeQuery",
args = {java.lang.String.class}
)
public void testDelete7() throws SQLException {
DatabaseCreator.fillTestTable5(conn);
PreparedStatement stat = conn.prepareStatement("DELETE FROM "
+ DatabaseCreator.TEST_TABLE5 + " WHERE testID = ?");
stat.setInt(1, 1);
stat.execute();
stat.setInt(1, 2);
stat.execute();
ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
+ DatabaseCreator.TEST_TABLE5 + " WHERE testID < 3 ");
r.next();
assertEquals(0, r.getInt(1));
r.close();
stat.close();
}
}