diff --git a/ConnectionPoolTest.java b/ConnectionPoolTest.java new file mode 100644 index 0000000..182337f --- /dev/null +++ b/ConnectionPoolTest.java @@ -0,0 +1,116 @@ + + +/** + * Test class: Verify object pool manager functionality + * @author chuyang + * @version 1.0 + */ +public class ConnectionPoolTest { + + public ConnectionPoolManager m_ConnectionPoolManager; + + public ConnectionPoolTest(){ + + } + + @Override + public void finalize() throws Throwable { + + } + /** + * Main test method + * @param args + */ + public static void main(String[] args) { + System.out.println("=== Start Object Pool Manager Test ==="); + + // 1. Test initializing connection pool + System.out.println("\n1. Initialize connection pool"); + ConnectionPoolManager poolManager = new ConnectionPoolManager(2, 5, "jdbc:mysql://localhost:3306/testdb"); + System.out.println(poolManager.getPoolStatus()); + + // 2. Test borrowing connections + System.out.println("\n2. Test borrowing connections"); + DatabaseConnection conn1 = poolManager.borrowConnection(); + DatabaseConnection conn2 = poolManager.borrowConnection(); + DatabaseConnection conn3 = poolManager.borrowConnection(); // Should create new connection + System.out.println(poolManager.getPoolStatus()); + + // 3. Test returning connections + System.out.println("\n3. Test returning connections"); + poolManager.returnConnection(conn1); + System.out.println(poolManager.getPoolStatus()); + + // 4. Test reusing connections + System.out.println("\n4. Test reusing connections"); + DatabaseConnection conn4 = poolManager.borrowConnection(); // Should reuse just returned connection + System.out.println("Reused connection ID: " + conn4.getConnectionId()); + System.out.println(poolManager.getPoolStatus()); + + // 5. Test pool full condition + System.out.println("\n5. Test pool full condition"); + DatabaseConnection conn5 = poolManager.borrowConnection(); // Create 4th connection + DatabaseConnection conn6 = poolManager.borrowConnection(); // Create 5th connection (reach max capacity) + DatabaseConnection conn7 = poolManager.borrowConnection(); // Should return null as pool is full + System.out.println("Result of borrowing beyond max capacity: " + (conn7 == null ? "Pool is full, cannot borrow more connections" : "Successfully borrowed connection")); + System.out.println(poolManager.getPoolStatus()); + + // 6. Test shrinking pool + System.out.println("\n6. Test shrinking pool"); + // Return some connections for shrinking + poolManager.returnConnection(conn2); + poolManager.returnConnection(conn3); + poolManager.returnConnection(conn5); + poolManager.returnConnection(conn6); + System.out.println("Before shrink " + poolManager.getPoolStatus()); + poolManager.shrinkPool(); + System.out.println("After shrink " + poolManager.getPoolStatus()); + + // 7. Test thread safety (simple test) + System.out.println("\n7. Simple thread safety test"); + ConnectionPoolManager threadTestPool = new ConnectionPoolManager(3, 10, "jdbc:mysql://localhost:3306/testdb"); + + // Create several threads to borrow and return connections simultaneously + Thread[] threads = new Thread[5]; + for (int i = 0; i < threads.length; i++) { + final int threadId = i; + threads[i] = new Thread(() -> { + try { + System.out.println("Thread " + threadId + " borrowing connection"); + DatabaseConnection conn = threadTestPool.borrowConnection(); + if (conn != null) { + System.out.println("Thread " + threadId + " got connection: " + conn.getConnectionId()); + // Simulate using connection + Thread.sleep(200); + threadTestPool.returnConnection(conn); + System.out.println("Thread " + threadId + " returned connection: " + conn.getConnectionId()); + } + } catch (Exception e) { + e.printStackTrace(); + } + }); + threads[i].start(); + } + + // Wait for all threads to complete + for (Thread thread : threads) { + try { + thread.join(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + System.out.println("\nAfter thread test " + threadTestPool.getPoolStatus()); + + // 8. Test DatabaseConnection clone functionality + System.out.println("\n8. Test connection clone functionality"); + DatabaseConnection originalConn = new DatabaseConnection("original-clone-test", "jdbc:mysql://localhost:3306/clonedb"); + DatabaseConnection clonedConn = originalConn.clone(); + System.out.println("Original connection ID: " + originalConn.getConnectionId()); + System.out.println("Cloned connection ID: " + clonedConn.getConnectionId()); + System.out.println("Cloned connection URL: " + clonedConn.getDatabaseUrl()); + + System.out.println("\n=== Object Pool Manager Test Completed ==="); + } +} \ No newline at end of file