blob: 01d6140d768d5e7642d3e1a1d58f73f9ba33bed2 [file] [log] [blame]
The Android Open Source Projectb5de22c2012-04-01 00:00:00 -07001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package tests.java.sql;
18
19import dalvik.annotation.KnownFailure;
20
21import java.sql.Connection;
22import java.sql.DatabaseMetaData;
23import java.sql.PreparedStatement;
24import java.sql.ResultSet;
25import java.sql.SQLException;
26import java.sql.Statement;
27
28import tests.support.DatabaseCreator;
29import tests.support.Support_SQL;
30
31import junit.extensions.TestSetup;
32import junit.framework.Test;
33import junit.framework.TestCase;
34import junit.framework.TestSuite;
35
36public class UpdateFunctionalityTest2 extends TestCase {
37
38 private static Connection conn = null;
39
40 private static Statement statement = null;
41
42 public void setUp() throws Exception {
43 super.setUp();
44 Support_SQL.loadDriver();
45 try {
46 conn = Support_SQL.getConnection();
47 statement = conn.createStatement();
48 createTestTables();
49 } catch (SQLException e) {
50 fail("Unexpected SQLException " + e.toString());
51 }
52 DatabaseCreator.fillParentTable(conn);
53 DatabaseCreator.fillSimpleTable3(conn);
54 DatabaseCreator.fillSimpleTable1(conn);
55 }
56
57 public void tearDown() throws Exception {
58 deleteTestTables();
59 statement.close();
60 conn.close();
61 super.tearDown();
62 }
63
64 private void createTestTables() {
65 try {
66 DatabaseMetaData meta = conn.getMetaData();
67 ResultSet userTab = meta.getTables(null, null, null, null);
68
69 while (userTab.next()) {
70 String tableName = userTab.getString("TABLE_NAME");
71 if (tableName.equals(DatabaseCreator.PARENT_TABLE)) {
72 statement
73 .execute(DatabaseCreator.DROP_TABLE_PARENT);
74 } else if (tableName
75 .equals(DatabaseCreator.FKCASCADE_TABLE)) {
76 statement
77 .execute(DatabaseCreator.DROP_TABLE_FKCASCADE);
78 } else if (tableName
79 .equals(DatabaseCreator.FKSTRICT_TABLE)) {
80 statement
81 .execute(DatabaseCreator.DROP_TABLE_FKSTRICT);
82 } else if (tableName
83 .equals(DatabaseCreator.SIMPLE_TABLE1)) {
84 statement
85 .execute(DatabaseCreator.DROP_TABLE_SIMPLE1);
86 } else if (tableName
87 .equals(DatabaseCreator.SIMPLE_TABLE3)) {
88 statement
89 .execute(DatabaseCreator.DROP_TABLE_SIMPLE3);
90 } else if (tableName
91 .equals(DatabaseCreator.TEST_TABLE5)) {
92 statement.execute(DatabaseCreator.DROP_TABLE5);
93 }
94 }
95 userTab.close();
96 statement.execute(DatabaseCreator.CREATE_TABLE_PARENT);
97 statement.execute(DatabaseCreator.CREATE_TABLE_FKSTRICT);
98 statement.execute(DatabaseCreator.CREATE_TABLE_FKCASCADE);
99 statement.execute(DatabaseCreator.CREATE_TABLE_SIMPLE3);
100 statement.execute(DatabaseCreator.CREATE_TABLE_SIMPLE1);
101 statement.execute(DatabaseCreator.CREATE_TABLE5);
102 } catch (SQLException e) {
103 fail("Unexpected SQLException " + e.toString());
104 }
105 }
106
107 private void deleteTestTables() {
108 try {
109 statement.execute(DatabaseCreator.DROP_TABLE_FKCASCADE);
110 statement.execute(DatabaseCreator.DROP_TABLE_FKSTRICT);
111 statement.execute(DatabaseCreator.DROP_TABLE_PARENT);
112 statement.execute(DatabaseCreator.DROP_TABLE_SIMPLE3);
113 statement.execute(DatabaseCreator.DROP_TABLE_SIMPLE1);
114 statement.execute(DatabaseCreator.DROP_TABLE5);
115 } catch (SQLException e) {
116 fail("Unexpected SQLException " + e.toString());
117 }
118 }
119
120 /**
121 * UpdateFunctionalityTest2#testUpdate1(). Updates row with no
122 * referencing ones and RESTRICT action
123 */
124 public void testUpdate1() throws SQLException {
125 DatabaseCreator.fillFKStrictTable(conn);
126 statement.execute("UPDATE " + DatabaseCreator.PARENT_TABLE
127 + " SET id = 4 WHERE id = 3");
128 }
129
130 /**
131 * UpdateFunctionalityTest2#testUpdate2(). Attempts to update row
132 * with referencing ones and RESTRICT action - expecting SQLException
133 *
134 * TODO not supported
135 */
136 @KnownFailure("not supported")
137 public void testUpdate2() throws SQLException {
138 DatabaseCreator.fillFKStrictTable(conn);
139 try {
140 statement.executeUpdate("UPDATE " + DatabaseCreator.PARENT_TABLE
141 + " SET id = 5 WHERE id = 1;");
142 fail("expecting SQLException");
143 } catch (SQLException ex) {
144 // expected
145
146 }
147 }
148
149 /**
150 * UpdateFunctionalityTest2#testUpdate3(). Deletes all referencing
151 * rows and then updates referenced one
152 */
153 public void testUpdate3() throws SQLException {
154 DatabaseCreator.fillFKStrictTable(conn);
155 statement.execute("DELETE FROM " + DatabaseCreator.FKSTRICT_TABLE
156 + " WHERE name_id = 1;");
157 statement.execute("UPDATE " + DatabaseCreator.PARENT_TABLE
158 + " SET id = 5 WHERE id = 1;");
159 }
160
161 /**
162 * UpdateFunctionalityTest2#testUpdate4(). Attempts to set incorrect
163 * foreign key value - expecting SQLException
164 *
165 * TODO foreign key functionality is not supported
166 */
167 @KnownFailure("not supported")
168 public void testUpdate4() throws SQLException {
169 DatabaseCreator.fillFKStrictTable(conn);
170 try {
171 statement.executeUpdate("UPDATE " + DatabaseCreator.FKSTRICT_TABLE
172 + " SET name_id = 6 WHERE name_id = 2");
173 fail("expecting SQLException");
174 } catch (SQLException ex) {
175 // expected
176 }
177 }
178
179 /**
180 * UpdateFunctionalityTest2#testUpdate5(). Updates row with
181 * referencing ones and CASCADE action - expecting that all
182 * referencing rows will also be updated
183 */
184 public void testUpdate5() throws SQLException {
185 DatabaseCreator.fillFKCascadeTable(conn);
186 statement.executeUpdate("UPDATE " + DatabaseCreator.PARENT_TABLE
187 + " SET id = 5 WHERE id = 1;");
188
189 ResultSet r = statement.executeQuery("SELECT COUNT(*) " + "FROM "
190 + DatabaseCreator.FKCASCADE_TABLE + " WHERE name_id = 1;");
191 r.next();
192 assertEquals("Should be 2 rows", 2, r.getInt(1));
193 r = statement.executeQuery("SELECT COUNT(*) " + "FROM "
194 + DatabaseCreator.FKCASCADE_TABLE + " WHERE name_id = 5;");
195 r.next();
196 assertEquals("Should be 0 rows", 0, r.getInt(1));
197 r.close();
198 }
199
200 /**
201 * UpdateFunctionalityTest2#testUpdate6(). Attempts to set incorrect
202 * foreign key value to row with CASCADE action - expecting
203 * SQLException
204 *
205 * TODO Foreign key functionality is not supported
206 */
207 @KnownFailure("not supported")
208 public void testUpdate6() throws SQLException {
209 DatabaseCreator.fillFKCascadeTable(conn);
210 try {
211 statement.executeUpdate("UPDATE " + DatabaseCreator.FKCASCADE_TABLE
212 + " SET name_id = 6 WHERE name_id = 2");
213 fail("expecting SQLException");
214 } catch (SQLException ex) {
215 // expected
216 }
217 }
218
219 /**
220 * UpdateFunctionalityTest2#testUpdate7(). Updates table using
221 * subquery in WHERE clause
222 *
223 * TODO Foreign key functionality is not supported
224 */
225 @KnownFailure("not supported")
226 public void testUpdate7() throws SQLException {
227
228 DatabaseCreator.fillFKStrictTable(conn);
229 statement.executeUpdate("UPDATE " + DatabaseCreator.FKSTRICT_TABLE
230 + " SET value = 'updated' WHERE name_id = ANY (SELECT id FROM "
231 + DatabaseCreator.PARENT_TABLE + " WHERE id > 1)");
232 ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
233 + DatabaseCreator.FKSTRICT_TABLE + " WHERE value = 'updated';");
234 r.next();
235 assertEquals("Should be 1 row", 1, r.getInt(1));
236 r.close();
237 }
238
239 /**
240 * UpdateFunctionalityTest2#testUpdate8(). Updates table using scalar
241 * subquery as new field value
242 */
243 public void testUpdate8() throws SQLException {
244 statement.executeUpdate("UPDATE " + DatabaseCreator.SIMPLE_TABLE3
245 + " SET speed = (SELECT MAX(speed) FROM "
246 + DatabaseCreator.SIMPLE_TABLE1
247 + ") WHERE id = (SELECT id FROM "
248 + DatabaseCreator.SIMPLE_TABLE1
249 + " WHERE speed = (SELECT MAX(speed) FROM "
250 + DatabaseCreator.SIMPLE_TABLE1 + "))");
251 ResultSet r = statement.executeQuery("SELECT id FROM "
252 + DatabaseCreator.SIMPLE_TABLE3
253 + " WHERE speed = (SELECT MAX(speed) FROM "
254 + DatabaseCreator.SIMPLE_TABLE1 + ");");
255 r.next();
256 assertEquals("Incorrect id updated", 1, r.getInt(1));
257 r.close();
258 }
259
260 /**
261 * UpdateFunctionalityTest2#testUpdate9(). Updates table using
262 * PreparedStatement
263 */
264 public void testUpdate9() throws SQLException {
265 DatabaseCreator.fillTestTable5(conn);
266 PreparedStatement stat = conn.prepareStatement("UPDATE "
267 + DatabaseCreator.TEST_TABLE5
268 + " SET testValue = ? WHERE testID = ?");
269 stat.setString(1, "1");
270 stat.setInt(2, 1);
271 stat.execute();
272 stat.setString(1, "2");
273 stat.setInt(2, 2);
274 stat.execute();
275 ResultSet r = statement.executeQuery("SELECT testId, testValue FROM "
276 + DatabaseCreator.TEST_TABLE5
277 + " WHERE testID < 3 ORDER BY testID");
278 while (r.next()) {
279 assertEquals("Incorrect value was returned", new Integer(r
280 .getInt(1)).toString(), r.getString(2));
281 }
282 r.close();
283 stat.close();
284 }
285}