/luni/src/test/java/tests/java/sql/InsertFunctionalityTest.java

https://github.com/MIPS/libcore · Java · 292 lines · 227 code · 19 blank · 46 comment · 12 complexity · 8dc4a0e99db444b16bc5a5092b3d358f MD5 · raw file

  1. /*
  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. package tests.java.sql;
  17. import dalvik.annotation.KnownFailure;
  18. import dalvik.annotation.TestTargetClass;
  19. import dalvik.annotation.TestTargets;
  20. import dalvik.annotation.TestLevel;
  21. import dalvik.annotation.TestTargetNew;
  22. import java.sql.Connection;
  23. import java.sql.DatabaseMetaData;
  24. import java.sql.PreparedStatement;
  25. import java.sql.ResultSet;
  26. import java.sql.SQLException;
  27. import java.sql.Statement;
  28. import tests.support.Support_SQL;
  29. import tests.support.DatabaseCreator;
  30. import junit.extensions.TestSetup;
  31. import junit.framework.Test;
  32. import junit.framework.TestCase;
  33. import junit.framework.TestSuite;
  34. @TestTargetClass(Statement.class)
  35. public class InsertFunctionalityTest extends TestCase {
  36. private static Connection conn = null;
  37. private static Statement statement = null;
  38. public void setUp() throws Exception {
  39. super.setUp();
  40. Support_SQL.loadDriver();
  41. conn = Support_SQL.getConnection();
  42. statement = conn.createStatement();
  43. createTestTables();
  44. }
  45. public void tearDown() throws Exception {
  46. deleteTestTables();
  47. statement.close();
  48. conn.close();
  49. super.tearDown();
  50. }
  51. public void createTestTables() {
  52. try {
  53. DatabaseMetaData meta = conn.getMetaData();
  54. ResultSet userTab = meta.getTables(null, null, null, null);
  55. while (userTab.next()) {
  56. String tableName = userTab.getString("TABLE_NAME");
  57. if (tableName.equals(DatabaseCreator.PARENT_TABLE)) {
  58. statement
  59. .execute(DatabaseCreator.DROP_TABLE_PARENT);
  60. } else if (tableName
  61. .equals(DatabaseCreator.FKCASCADE_TABLE)) {
  62. statement
  63. .execute(DatabaseCreator.DROP_TABLE_FKCASCADE);
  64. } else if (tableName
  65. .equals(DatabaseCreator.FKSTRICT_TABLE)) {
  66. statement
  67. .execute(DatabaseCreator.DROP_TABLE_FKSTRICT);
  68. } else if (tableName
  69. .equals(DatabaseCreator.SIMPLE_TABLE1)) {
  70. statement
  71. .execute(DatabaseCreator.DROP_TABLE_SIMPLE1);
  72. } else if (tableName
  73. .equals(DatabaseCreator.SIMPLE_TABLE2)) {
  74. statement
  75. .execute(DatabaseCreator.DROP_TABLE_SIMPLE2);
  76. } else if (tableName
  77. .equals(DatabaseCreator.TEST_TABLE5)) {
  78. statement.execute(DatabaseCreator.DROP_TABLE5);
  79. }
  80. }
  81. userTab.close();
  82. statement.execute(DatabaseCreator.CREATE_TABLE_PARENT);
  83. statement.execute(DatabaseCreator.CREATE_TABLE_FKSTRICT);
  84. statement.execute(DatabaseCreator.CREATE_TABLE_FKCASCADE);
  85. statement.execute(DatabaseCreator.CREATE_TABLE_SIMPLE2);
  86. statement.execute(DatabaseCreator.CREATE_TABLE_SIMPLE1);
  87. statement.execute(DatabaseCreator.CREATE_TABLE5);
  88. } catch (SQLException e) {
  89. fail("Unexpected SQLException " + e.toString());
  90. }
  91. }
  92. public void deleteTestTables() {
  93. try {
  94. statement.execute(DatabaseCreator.DROP_TABLE_FKCASCADE);
  95. statement.execute(DatabaseCreator.DROP_TABLE_FKSTRICT);
  96. statement.execute(DatabaseCreator.DROP_TABLE_PARENT);
  97. statement.execute(DatabaseCreator.DROP_TABLE_SIMPLE2);
  98. statement.execute(DatabaseCreator.DROP_TABLE_SIMPLE1);
  99. statement.execute(DatabaseCreator.DROP_TABLE5);
  100. } catch (SQLException e) {
  101. fail("Unexpected SQLException " + e.toString());
  102. }
  103. }
  104. /**
  105. * @tests InsertFunctionalityTest#testInsert1(). Attempts to insert row into
  106. * table with integrity checking
  107. */
  108. @TestTargetNew(
  109. level = TestLevel.PARTIAL_COMPLETE,
  110. notes = "Functionality test: Attempts to insert row into table with integrity checking",
  111. method = "execute",
  112. args = {java.lang.String.class}
  113. )
  114. public void testInsert1() throws SQLException {
  115. DatabaseCreator.fillParentTable(conn);
  116. DatabaseCreator.fillFKStrictTable(conn);
  117. DatabaseCreator.fillFKCascadeTable(conn);
  118. statement.execute("INSERT INTO " + DatabaseCreator.FKSTRICT_TABLE
  119. + " VALUES(4, 1, 'testInsert')");
  120. statement.execute("INSERT INTO " + DatabaseCreator.FKCASCADE_TABLE
  121. + " VALUES(4, 1, 'testInsert')");
  122. }
  123. /**
  124. * @tests InsertFunctionalityTest#testInsert2(). Attempts to insert row into
  125. * table with integrity checking when row has incorrect foreign key
  126. * value - expecting SQLException
  127. */
  128. @TestTargetNew(
  129. level = TestLevel.PARTIAL_COMPLETE,
  130. notes = "Functionality test: Attempts to insert row into table with integrity checking when row has incorrect foreign key value - expecting SQLException",
  131. method = "execute",
  132. args = {java.lang.String.class}
  133. )
  134. public void testInsert2() throws SQLException {
  135. DatabaseCreator.fillParentTable(conn);
  136. DatabaseCreator.fillFKStrictTable(conn);
  137. DatabaseCreator.fillFKCascadeTable(conn);
  138. try {
  139. statement.execute("INSERT INTO " + DatabaseCreator.FKSTRICT_TABLE
  140. + " VALUES(4, 4, 'testInsert')");
  141. // TODO Foreign key functionality isn't supported
  142. // fail("expecting SQLException");
  143. } catch (SQLException ex) {
  144. // expected
  145. }
  146. try {
  147. statement.execute("INSERT INTO " + DatabaseCreator.FKCASCADE_TABLE
  148. + " VALUES(4, 4, 'testInsert')");
  149. // TODO Foreign key functionality isn't supported
  150. // fail("expecting SQLException");
  151. } catch (SQLException ex) {
  152. // expected
  153. }
  154. }
  155. /**
  156. * @tests InsertFunctionalityTest#testInsert3(). Tests INSERT ... SELECT
  157. * functionality
  158. */
  159. @TestTargets({
  160. @TestTargetNew(
  161. level = TestLevel.PARTIAL_COMPLETE,
  162. notes = "Functionality test: Tests INSERT ... SELECT functionality",
  163. method = "execute",
  164. args = {java.lang.String.class}
  165. ),
  166. @TestTargetNew(
  167. level = TestLevel.PARTIAL_COMPLETE,
  168. notes = "Functionality test: Tests INSERT ... SELECT functionality",
  169. method = "executeQuery",
  170. args = {java.lang.String.class}
  171. )
  172. })
  173. public void testInsert3() throws SQLException {
  174. DatabaseCreator.fillParentTable(conn);
  175. DatabaseCreator.fillFKStrictTable(conn);
  176. statement.execute("INSERT INTO " + DatabaseCreator.TEST_TABLE5
  177. + " SELECT id AS testId, value AS testValue " + "FROM "
  178. + DatabaseCreator.FKSTRICT_TABLE + " WHERE name_id = 1");
  179. ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
  180. + DatabaseCreator.TEST_TABLE5);
  181. r.next();
  182. assertEquals("Should be 2 rows", 2, r.getInt(1));
  183. r.close();
  184. }
  185. /**
  186. * @tests InsertFunctionalityTest#testInsert4(). Tests INSERT ... SELECT
  187. * with expressions in SELECT query
  188. */
  189. @TestTargets({
  190. @TestTargetNew(
  191. level = TestLevel.PARTIAL_COMPLETE,
  192. notes = "Functionality test: Tests INSERT ... SELECT with expressions in SELECT query",
  193. method = "execute",
  194. args = {java.lang.String.class}
  195. ),
  196. @TestTargetNew(
  197. level = TestLevel.PARTIAL_COMPLETE,
  198. notes = "Functionality test: Tests INSERT ... SELECT with expressions in SELECT query",
  199. method = "executeQuery",
  200. args = {java.lang.String.class}
  201. )
  202. })
  203. public void testInsert4() throws SQLException {
  204. DatabaseCreator.fillSimpleTable1(conn);
  205. statement.execute("INSERT INTO " + DatabaseCreator.SIMPLE_TABLE2
  206. + " SELECT id, speed*10 AS speed, size-1 AS size FROM "
  207. + DatabaseCreator.SIMPLE_TABLE1);
  208. ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
  209. + DatabaseCreator.SIMPLE_TABLE2 + " AS a JOIN "
  210. + DatabaseCreator.SIMPLE_TABLE1
  211. + " AS b ON a.speed = 10*b.speed AND a.size = b.size-1");
  212. r.next();
  213. assertEquals("Should be 2 rows", 2, r.getInt(1));
  214. r.close();
  215. }
  216. /**
  217. * @tests InsertFunctionalityTest#testInsert5(). Inserts multiple rows using
  218. * UNION ALL
  219. */
  220. @TestTargets({
  221. @TestTargetNew(
  222. level = TestLevel.PARTIAL_COMPLETE,
  223. notes = "Functionality test: Inserts multiple rows using UNION ALL",
  224. method = "execute",
  225. args = {java.lang.String.class}
  226. ),
  227. @TestTargetNew(
  228. level = TestLevel.PARTIAL_COMPLETE,
  229. notes = "Functionality test: Inserts multiple rows using UNION ALL",
  230. method = "executeQuery",
  231. args = {java.lang.String.class}
  232. )
  233. })
  234. public void testInsert5() throws SQLException {
  235. statement.execute("INSERT INTO " + DatabaseCreator.TEST_TABLE5
  236. + " SELECT 1 as testId, 2 as testValue "
  237. + "UNION SELECT 2 as testId, 3 as testValue "
  238. + "UNION SELECT 3 as testId, 4 as testValue");
  239. ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
  240. + DatabaseCreator.TEST_TABLE5);
  241. r.next();
  242. assertEquals("Should be 3 rows", 3, r.getInt(1));
  243. r.close();
  244. }
  245. /**
  246. * @tests InsertFunctionalityTest#testInsert6(). Tests INSERT with
  247. * PreparedStatement
  248. */
  249. @TestTargetNew(
  250. level = TestLevel.PARTIAL_COMPLETE,
  251. notes = "Functionality test: Tests INSERT with PreparedStatement",
  252. method = "executeQuery",
  253. args = {java.lang.String.class}
  254. )
  255. public void testInsertPrepared() throws SQLException {
  256. PreparedStatement stat = conn.prepareStatement("INSERT INTO "
  257. + DatabaseCreator.TEST_TABLE5 + " VALUES(?, ?)");
  258. stat.setInt(1, 1);
  259. stat.setString(2, "1");
  260. stat.execute();
  261. stat.setInt(1, 2);
  262. stat.setString(2, "3");
  263. stat.execute();
  264. ResultSet r = statement.executeQuery("SELECT COUNT(*) FROM "
  265. + DatabaseCreator.TEST_TABLE5
  266. + " WHERE (testId = 1 AND testValue = '1') "
  267. + "OR (testId = 2 AND testValue = '3')");
  268. r.next();
  269. assertEquals("Incorrect number of records", 2, r.getInt(1));
  270. r.close();
  271. stat.close();
  272. }
  273. }