StressTest.java revision 79870d81001ab3dc70b3bce7dfcca70153a3a14f
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License.
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage tests.java.sql;
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestTargetClass;
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestTargets;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestLevel;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestTargetNew;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.Connection;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.DatabaseMetaData;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.Driver;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.PreparedStatement;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.ResultSet;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.SQLException;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.Statement;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Properties;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.logging.Level;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.logging.Logger;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport tests.support.DatabaseCreator;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport tests.support.Support_SQL;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport tests.support.ThreadPool;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project@TestTargetClass(Statement.class)
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class StressTest extends TestCase {
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Vector<Connection> vc = new Vector<Connection>();
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static Connection conn;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static Statement statement;
48c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann
49c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann    public void setUp() throws Exception {
5079870d81001ab3dc70b3bce7dfcca70153a3a14fUrs Grob        super.setUp();
51c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        Support_SQL.loadDriver();
52c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        conn = Support_SQL.getConnection();
53c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        statement = conn.createStatement();
54c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        createTestTables();
55c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        vc.clear();
56c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann    }
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
58c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann    protected void tearDown() throws Exception {
59c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        closeConnections();
60c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        statement.close();
61c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        conn.close();
62c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        super.tearDown();
63c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann    }
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
65c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann    private void createTestTables() {
66c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        try {
67c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann            DatabaseMetaData meta = conn.getMetaData();
68c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann            ResultSet userTab = meta.getTables(null, null, null, null);
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann            while (userTab.next()) {
71c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann                String tableName = userTab.getString("TABLE_NAME");
72c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann                if (tableName.equals(DatabaseCreator.TEST_TABLE2)) {
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    statement.execute(DatabaseCreator.DROP_TABLE2);
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
76c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann            statement.execute(DatabaseCreator.CREATE_TABLE2);
77c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        } catch (SQLException sql) {
78c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann            fail("Unexpected SQLException " + sql.toString());
79c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        }
80c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        return;
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann    private void dropTestTables() {
84c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        try {
85c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann            statement.execute(DatabaseCreator.DROP_TABLE2);
86c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        } catch (SQLException sql) {
87c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann            fail("Unexpected SQLException " + sql.toString());
88c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        }
89c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann        return;
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
91c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann
92c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//    /**
93c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//     * @see junit.framework.TestCase#setUp()
94c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//     */
95c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//    @Override
96c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//    protected void setUp() throws Exception {
97c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//        super.setUp();
98c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//        vc.clear();
99c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//    }
100c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//
101c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//    /**
102c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//     * @see junit.framework.TestCase#tearDown()
103c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//     */
104c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//    @Override
105c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//    protected void tearDown() throws Exception {
106c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//        closeConnections();
107c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//        statement.execute("DELETE FROM " + DatabaseCreator.TEST_TABLE2);
108c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//        super.tearDown();
109c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann//    }
110c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests StressTest#testManyConnectionsUsingOneThread(). Create many
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *        connections to the DataBase using one thread.
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "connect",
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clazz = Driver.class,
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {String.class, Properties.class}
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testManyConnectionsUsingOneThread() {
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int maxConnections = getConnectionNum();
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            openConnections(maxConnections);
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals("Incorrect number of created connections",
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    maxConnections, vc.size());
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected Exception " + e.toString());
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests StressTest#testManyConnectionsUsingManyThreads(). Create many
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *        connections to the DataBase using some threads.
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "Stress test: Create many connections to the DataBase using some threads",
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "connect",
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clazz = Driver.class,
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {String.class, Properties.class}
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testManyConnectionsUsingManyThreads() {
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int numTasks = getConnectionNum();
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ThreadPool threadPool = new ThreadPool(numTasks);
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // run example tasks
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < numTasks; i++) {
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            threadPool.runTask(createTask(i));
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // close the pool and wait for all tasks to finish.
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        threadPool.join();
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Unable to create a connection", numTasks, vc.size());
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (numTasks != Support_SQL.sqlMaxConnections) {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // try to create connection n + 1
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Connection c = Support_SQL.getConnection();
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                c.close();
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("It is possible to create more than " + numTasks
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        + "connections");
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (SQLException sql) {
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // expected
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests StressTest#testInsertOfManyRowsUsingOneThread(). Insert a lot of
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *        records to the Database using a maximum number of connections.
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "connect",
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clazz = Driver.class,
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {String.class, Properties.class}
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testInsertOfManyRowsUsingOneThread() {
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Logger.global
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .info("java.sql stress test: single thread and many operations.");
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int maxConnections = getConnectionNum();
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Logger.global.info("Opening " + maxConnections + " to database "
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + Support_SQL.getFilename());
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        openConnections(maxConnections);
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int tasksPerConnection = Support_SQL.sqlMaxTasks / maxConnections;
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Logger.global.info("TasksPerConnection =  " + Support_SQL.sqlMaxTasks
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + " by (maxConnections) " + maxConnections + " = "
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + tasksPerConnection);
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int pk = 1;
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < vc.size(); ++i) {
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Logger.global.info(" creating " + tasksPerConnection
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    + "tasks for Connection " + i);
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Connection c = vc.elementAt(i);
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int j = 0; j < tasksPerConnection; ++j) {
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                insertNewRecord(c, pk++);
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ResultSet rs = statement
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .executeQuery("SELECT COUNT(*) as counter FROM "
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            + DatabaseCreator.TEST_TABLE2);
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertTrue("RecordSet is empty", rs.next());
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals("Incorrect number of records", tasksPerConnection
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    * maxConnections, rs.getInt("counter"));
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            rs.close();
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SQLException sql) {
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected SQLException " + sql.toString());
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "connect",
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            clazz = Driver.class,
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {String.class, Properties.class}
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testInsertOfManyRowsUsingManyThreads() {
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Logger.global.info("java.sql stress test: multiple threads and many operations.");
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int numConnections = getConnectionNum();
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int tasksPerConnection = Support_SQL.sqlMaxTasks / numConnections;
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Logger.global.info("Opening "+numConnections+" to database "+Support_SQL.getFilename());
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ThreadPool threadPool = new ThreadPool(numConnections);
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < numConnections; ++i) {
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Logger.global.info(" creating "+tasksPerConnection+ " tasks for Connection "+i);
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            threadPool.runTask(insertTask(numConnections, i));
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // close the pool and wait for all tasks to finish.
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        threadPool.join();
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Unable to create a connection", numConnections, vc.size());
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ResultSet rs = statement
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .executeQuery("SELECT COUNT(*) as counter FROM "
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            + DatabaseCreator.TEST_TABLE2);
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertTrue("RecordSet is empty", rs.next());
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals("Incorrect number of records", tasksPerConnection
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    * numConnections, rs.getInt("counter"));
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            rs.close();
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SQLException sql) {
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected SQLException " + sql.toString());
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int getConnectionNum() {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int num = Support_SQL.sqlMaxConnections;
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int mc = conn.getMetaData().getMaxConnections();
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (mc != 0) {
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (num != mc) {
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    System.err.println("Will be used no more than " + mc
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            + " connections to the DataBase");
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                num = mc;
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SQLException sql) {
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected SQLException " + sql.toString());
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return num;
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void openConnections(int maxConnections) {
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int i = 0;
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (; i < maxConnections; ++i) {
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Connection c = Support_SQL.getConnection();
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (c == null) {
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    assertEquals("Unable to create a connection",
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            maxConnections, i);
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                vc.add(c);
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SQLException sql) {
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals("Unable to create a connection", maxConnections, i);
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return;
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void closeConnections() {
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int i = 0;
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (; i < vc.size(); ++i) {
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                vc.elementAt(i).close();
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SQLException sql) {
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals("Unable to close a connection", vc.size(), i);
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return;
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Runnable createTask(final int taskID) {
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new Runnable() {
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void run() {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    Connection c = Support_SQL.getConnection();
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (c == null) {
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return;
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    synchronized (this) {
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        vc.add(c);
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (SQLException sql) {
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // nothing to do
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        };
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Runnable insertTask(final int numConnections, final int taskID) {
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new Runnable() {
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void run() {
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    Connection c = Support_SQL.getConnection();
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (c == null) {
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return;
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    synchronized (this) {
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        vc.add(c);
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    int tasksPerConnection = Support_SQL.sqlMaxTasks
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            / numConnections;
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    for (int i = 0; i < tasksPerConnection; ++i) {
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        insertNewRecord(c, (i + 1) + tasksPerConnection
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                * taskID);
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (SQLException sql) {
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // do nothing
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        };
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void insertNewRecord(Connection c, int pk) {
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String query = "INSERT INTO " + DatabaseCreator.TEST_TABLE2
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + "(finteger, ftext, fcharacter, fdecimal, fnumeric,"
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + " fsmallint, ffloat, freal, fdouble, fdate, ftime)"
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            PreparedStatement ps = c.prepareStatement(query);
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.setInt(1, pk);
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.setString(2, "text");
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.setString(3, "chr");
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.setFloat(4, 0.1f);
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.setFloat(5, 0.2f);
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.setShort(6, (short) 3);
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.setFloat(7, 0.4f);
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.setDouble(8, 0.5);
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.setDouble(9, 0.6);
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.setDate(10, new java.sql.Date(System.currentTimeMillis()));
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.setTime(11, new java.sql.Time(System.currentTimeMillis()));
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.execute();
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ps.close();
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SQLException sql) {
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected SQLException " + sql.toString());
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return;
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
372