package com.alibaba.druid.bvt.pool;
import java.sql.Connection;
import java.sql.Savepoint;
import java.sql.Statement;
import org.junit.Assert;
import junit.framework.TestCase;
import com.alibaba.druid.mock.MockConnection;
import com.alibaba.druid.pool.DruidDataSource;
public class SavepointTest extends TestCase {
private DruidDataSource dataSource;
protected void setUp() throws Exception {
dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setTestOnBorrow(false);
dataSource.setInitialSize(1);
}
protected void tearDown() throws Exception {
dataSource.close();
}
public void test_multi_savepoint() throws Exception {
Connection conn = dataSource.getConnection();
MockConnection physicalConn = conn.unwrap(MockConnection.class);
Assert.assertEquals(true, conn.getAutoCommit());
Assert.assertEquals(true, physicalConn.getAutoCommit());
conn.setAutoCommit(false);
Assert.assertEquals(false, conn.getAutoCommit());
Assert.assertEquals(false, physicalConn.getAutoCommit());
Savepoint[] savepoints = new Savepoint[100];
for (int i = 0; i < savepoints.length; ++i) {
Statement stmt = conn.createStatement();
stmt.execute("insert t (" + i + ")");
stmt.close();
savepoints[i] = conn.setSavepoint();
Assert.assertEquals(i + 1, physicalConn.getSavepoints().size());
for (int j = 0; j <= i; ++j) {
Assert.assertTrue(physicalConn.getSavepoints().contains(savepoints[j]));
}
}
// rollback single
conn.rollback(savepoints[99]);
Assert.assertEquals(99, physicalConn.getSavepoints().size());
// release single
conn.releaseSavepoint(savepoints[97]);
Assert.assertEquals(98, physicalConn.getSavepoints().size());
// rollback multi
conn.rollback(savepoints[90]);
Assert.assertEquals(90, physicalConn.getSavepoints().size());
// rollback all
conn.rollback();
Assert.assertEquals(0, physicalConn.getSavepoints().size());
conn.close();
}
}