/*
* Microsoft JDBC Driver for SQL Server
*
* Copyright(c) Microsoft Corporation All rights reserved.
*
* This program is made available under the terms of the MIT License. See the LICENSE file in the project root for more information.
*/
package com.microsoft.sqlserver.jdbc.unit.statement;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.jupiter.api.Test;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.runner.RunWith;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
import com.microsoft.sqlserver.testframework.AbstractTest;
@RunWith(JUnitPlatform.class)
public class StatementCancellationTest extends AbstractTest {
private static final long DELAY_WAIT_MILLISECONDS = 10000;
private static final long CANCEL_WAIT_MILLISECONDS = 5000;
/**
* Tests Statement Cancellation works when MultiSubnetFailover is set to true
*/
@Test
public void setMultiSubnetFailoverToTrue() throws SQLException {
long timeStart = 0;
long timeEnd = 0;
try {
SQLServerDataSource ds = new SQLServerDataSource();
ds.setURL(connectionString);
ds.setMultiSubnetFailover(true);
try (Connection conn = ds.getConnection();) {
try (final Statement stmt = conn.createStatement()) {
final Thread cancellationThread = new Thread() {
public void run() {
try {
Thread.sleep(CANCEL_WAIT_MILLISECONDS);
stmt.cancel();
}
catch (Exception e) {
e.printStackTrace();
}
}
};
cancellationThread.setName("stmtCancel");
cancellationThread.start();
try {
timeStart = System.currentTimeMillis();
stmt.execute("WAITFOR DELAY '00:00:" + (DELAY_WAIT_MILLISECONDS / 1000) + "'");
}
catch (SQLException e) {
assertTrue(e.getMessage().startsWith("The query was canceled"), "Unexpected error message.");
}
}
}
}
finally {
timeEnd = System.currentTimeMillis();
long timeDifference = timeEnd - timeStart;
assertTrue(timeDifference >= CANCEL_WAIT_MILLISECONDS, "Cancellation failed.");
assertTrue(timeDifference < DELAY_WAIT_MILLISECONDS, "Cancellation failed.");
assertTrue((timeDifference - CANCEL_WAIT_MILLISECONDS) < 1000, "Cancellation failed.");
}
}
}