Redesigned some tests based on recent test results (#992)
This commit is contained in:
parent
7e0bf91eec
commit
ac59cfd56a
|
@ -1026,7 +1026,7 @@ void core_sqlsrv_sensitivity_metadata( _Inout_ sqlsrv_stmt* stmt TSRMLS_DC )
|
||||||
throw core::CoreException();
|
throw core::CoreException();
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK_CUSTOM_ERROR(true, stmt, SQLSRV_ERROR_DATA_CLASSIFICATION_FAILED, "Unexpected SQL Error state") {
|
CHECK_CUSTOM_ERROR(true, stmt, SQLSRV_ERROR_DATA_CLASSIFICATION_FAILED, "Check if ODBC driver or the server supports the Data Classification feature.") {
|
||||||
throw core::CoreException();
|
throw core::CoreException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ function testConnAttrCases()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function testNotAvailable($conn, $tableName, $isSupported)
|
function testNotAvailable($conn, $tableName, $isSupported, $driverCapable)
|
||||||
{
|
{
|
||||||
// If supported, the query should return a column with no classification
|
// If supported, the query should return a column with no classification
|
||||||
$options = array(PDO::SQLSRV_ATTR_DATA_CLASSIFICATION => true);
|
$options = array(PDO::SQLSRV_ATTR_DATA_CLASSIFICATION => true);
|
||||||
|
@ -66,25 +66,31 @@ function testNotAvailable($conn, $tableName, $isSupported)
|
||||||
$stmt->execute();
|
$stmt->execute();
|
||||||
|
|
||||||
$notAvailableErr = '*Failed to retrieve Data Classification Sensitivity Metadata. If the driver and the server both support the Data Classification feature, check whether the query returns columns with classification information.';
|
$notAvailableErr = '*Failed to retrieve Data Classification Sensitivity Metadata. If the driver and the server both support the Data Classification feature, check whether the query returns columns with classification information.';
|
||||||
|
|
||||||
|
$unexpectedErrorState = '*Failed to retrieve Data Classification Sensitivity Metadata: Check if ODBC driver or the server supports the Data Classification feature.';
|
||||||
|
|
||||||
|
$error = ($driverCapable) ? $notAvailableErr : $unexpectedErrorState;
|
||||||
try {
|
try {
|
||||||
$metadata = $stmt->getColumnMeta(0);
|
$metadata = $stmt->getColumnMeta(0);
|
||||||
echo "testNotAvailable: expected getColumnMeta to fail\n";
|
echo "testNotAvailable: expected getColumnMeta to fail\n";
|
||||||
} catch (PDOException $e) {
|
} catch (PDOException $e) {
|
||||||
if (!fnmatch($notAvailableErr, $e->getMessage())) {
|
if (!fnmatch($error, $e->getMessage())) {
|
||||||
echo "testNotAvailable: exception unexpected\n";
|
echo "testNotAvailable: exception unexpected\n";
|
||||||
var_dump($e->getMessage());
|
var_dump($e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isDataClassSupported($conn)
|
function isDataClassSupported($conn, &$driverCapable)
|
||||||
{
|
{
|
||||||
// Check both SQL Server version and ODBC driver version
|
// Check both SQL Server version and ODBC driver version
|
||||||
$msodbcsqlVer = $conn->getAttribute(PDO::ATTR_CLIENT_VERSION)["DriverVer"];
|
$msodbcsqlVer = $conn->getAttribute(PDO::ATTR_CLIENT_VERSION)["DriverVer"];
|
||||||
$version = explode(".", $msodbcsqlVer);
|
$version = explode(".", $msodbcsqlVer);
|
||||||
|
|
||||||
// ODBC Driver must be 17.2 or above
|
// ODBC Driver must be 17.2 or above
|
||||||
|
$driverCapable = true;
|
||||||
if ($version[0] < 17 || $version[1] < 2) {
|
if ($version[0] < 17 || $version[1] < 2) {
|
||||||
|
$driverCapable = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,7 +244,8 @@ try {
|
||||||
testConnAttrCases();
|
testConnAttrCases();
|
||||||
|
|
||||||
$conn = connect();
|
$conn = connect();
|
||||||
$isSupported = isDataClassSupported($conn);
|
$driverCapable = true;
|
||||||
|
$isSupported = isDataClassSupported($conn, $driverCapable);
|
||||||
|
|
||||||
// Create a test table
|
// Create a test table
|
||||||
$tableName = 'pdoPatients';
|
$tableName = 'pdoPatients';
|
||||||
|
@ -274,7 +281,7 @@ try {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test another error condition
|
// Test another error condition
|
||||||
testNotAvailable($conn, $tableName, $isSupported);
|
testNotAvailable($conn, $tableName, $isSupported, $driverCapable);
|
||||||
|
|
||||||
// Run the query without data classification metadata
|
// Run the query without data classification metadata
|
||||||
$tsql = "SELECT * FROM $tableName";
|
$tsql = "SELECT * FROM $tableName";
|
||||||
|
|
|
@ -10,7 +10,7 @@ PHPT_EXEC=true
|
||||||
<?php
|
<?php
|
||||||
$dataClassKey = 'Data Classification';
|
$dataClassKey = 'Data Classification';
|
||||||
|
|
||||||
function testErrorCases($conn, $tableName, $isSupported)
|
function testErrorCases($conn, $tableName, $isSupported, $driverCapable)
|
||||||
{
|
{
|
||||||
// This function will check two error cases:
|
// This function will check two error cases:
|
||||||
// (1) if supported, the query should return a column with no classification
|
// (1) if supported, the query should return a column with no classification
|
||||||
|
@ -22,13 +22,17 @@ function testErrorCases($conn, $tableName, $isSupported)
|
||||||
}
|
}
|
||||||
|
|
||||||
$notAvailableErr = '*Failed to retrieve Data Classification Sensitivity Metadata. If the driver and the server both support the Data Classification feature, check whether the query returns columns with classification information.';
|
$notAvailableErr = '*Failed to retrieve Data Classification Sensitivity Metadata. If the driver and the server both support the Data Classification feature, check whether the query returns columns with classification information.';
|
||||||
|
|
||||||
|
$unexpectedErrorState = '*Failed to retrieve Data Classification Sensitivity Metadata: Check if ODBC driver or the server supports the Data Classification feature.';
|
||||||
|
|
||||||
|
$error = ($driverCapable) ? $notAvailableErr : $unexpectedErrorState;
|
||||||
|
|
||||||
$metadata = sqlsrv_field_metadata($stmt);
|
$metadata = sqlsrv_field_metadata($stmt);
|
||||||
if ($metadata) {
|
if ($metadata) {
|
||||||
echo "testErrorCases (1): expected sqlsrv_field_metadata to fail\n";
|
echo "testErrorCases (1): expected sqlsrv_field_metadata to fail\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fnmatch($notAvailableErr, sqlsrv_errors()[0]['message'])) {
|
if (!fnmatch($error, sqlsrv_errors()[0]['message'])) {
|
||||||
var_dump(sqlsrv_errors());
|
var_dump(sqlsrv_errors());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,14 +53,16 @@ function testErrorCases($conn, $tableName, $isSupported)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isDataClassSupported($conn)
|
function isDataClassSupported($conn, &$driverCapable)
|
||||||
{
|
{
|
||||||
// Check both SQL Server version and ODBC driver version
|
// Check both SQL Server version and ODBC driver version
|
||||||
$msodbcsqlVer = sqlsrv_client_info($conn)['DriverVer'];
|
$msodbcsqlVer = sqlsrv_client_info($conn)['DriverVer'];
|
||||||
$version = explode(".", $msodbcsqlVer);
|
$version = explode(".", $msodbcsqlVer);
|
||||||
|
|
||||||
// ODBC Driver must be 17.2 or above
|
// ODBC Driver must be 17.2 or above
|
||||||
|
$driverCapable = true;
|
||||||
if ($version[0] < 17 || $version[1] < 2) {
|
if ($version[0] < 17 || $version[1] < 2) {
|
||||||
|
$driverCapable = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,7 +227,8 @@ if (!$conn) {
|
||||||
fatalError("Failed to connect.\n");
|
fatalError("Failed to connect.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
$isSupported = isDataClassSupported($conn);
|
$driverCapable = true;
|
||||||
|
$isSupported = isDataClassSupported($conn, $driverCapable);
|
||||||
|
|
||||||
// Create a test table
|
// Create a test table
|
||||||
$tableName = 'srvPatients';
|
$tableName = 'srvPatients';
|
||||||
|
@ -262,7 +269,7 @@ if ($isSupported) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
testErrorCases($conn, $tableName, $isSupported);
|
testErrorCases($conn, $tableName, $isSupported, $driverCapable);
|
||||||
|
|
||||||
// Run the query without data classification metadata
|
// Run the query without data classification metadata
|
||||||
$tsql = "SELECT * FROM $tableName";
|
$tsql = "SELECT * FROM $tableName";
|
||||||
|
|
|
@ -9,25 +9,42 @@ Intentionally provide an invalid server name and set LoginTimeout. Verify the ti
|
||||||
|
|
||||||
$serverName = "WRONG_SERVER_NAME";
|
$serverName = "WRONG_SERVER_NAME";
|
||||||
|
|
||||||
$t0 = microtime(true);
|
// Based on the following reference, a login timeout of less than approximately 10 seconds
|
||||||
|
|
||||||
// Based on the following reference, a login timeout of less than approximately 10 seconds
|
|
||||||
// is not reliable. The defaut is 15 seconds so we fix it at 20 seconds.
|
// is not reliable. The defaut is 15 seconds so we fix it at 20 seconds.
|
||||||
// https://docs.microsoft.com/sql/connect/odbc/windows/features-of-the-microsoft-odbc-driver-for-sql-server-on-windows
|
// https://docs.microsoft.com/sql/connect/odbc/windows/features-of-the-microsoft-odbc-driver-for-sql-server-on-windows
|
||||||
|
|
||||||
$timeout = 20;
|
$timeout = 20;
|
||||||
$conn = sqlsrv_connect($serverName , array("LoginTimeout" => $timeout));
|
$maxAttempts = 3;
|
||||||
|
$numAttempts = 0;
|
||||||
|
$leeway = 1.0;
|
||||||
|
$missed = false;
|
||||||
|
|
||||||
$t1 = microtime(true);
|
do {
|
||||||
|
$t0 = microtime(true);
|
||||||
|
|
||||||
$elapsed = $t1 - $t0;
|
$conn = sqlsrv_connect($serverName , array("LoginTimeout" => $timeout));
|
||||||
$diff = abs($elapsed - $timeout);
|
$numAttempts++;
|
||||||
|
|
||||||
if ($elapsed < $timeout || $diff > 1.0) {
|
$t1 = microtime(true);
|
||||||
echo "Connection failed at $elapsed secs. Leeway is 1.0 sec but the difference is $diff\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
print "Done";
|
// Sometimes time elapsed might be less than expected timeout, such as 19.99*
|
||||||
|
// something, but 1.0 second leeway should be reasonable
|
||||||
|
$elapsed = $t1 - $t0;
|
||||||
|
$diff = abs($elapsed - $timeout);
|
||||||
|
|
||||||
|
$missed = ($diff > $leeway);
|
||||||
|
if ($missed) {
|
||||||
|
if ($numAttempts == $maxAttempts) {
|
||||||
|
echo "Connection failed at $elapsed secs. Leeway is $leeway sec but the difference is $diff\n";
|
||||||
|
} else {
|
||||||
|
// The test will fail but this helps us decide if this test should be redesigned
|
||||||
|
echo "$numAttempts\t";
|
||||||
|
sleep(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while ($missed && $numAttempts < $maxAttempts);
|
||||||
|
|
||||||
|
print "Done\n";
|
||||||
?>
|
?>
|
||||||
--EXPECT--
|
--EXPECT--
|
||||||
Done
|
Done
|
||||||
|
|
Loading…
Reference in a new issue