php-sqlsrv/test/functional/pdo_sqlsrv/pdo_azure_ad_access_token.phpt
Jenny Tam e51380612d
Adding supporting for Azure AD access token (#837)
* Adding supporting for Azure AD access token

* Added more comments for the AD access token skipif files

* Save the pointer to access token struct until after connecting

* Clear the access token data before freeing the memory

* Added a reference as per review
2018-09-06 11:32:04 -07:00

157 lines
4.7 KiB
PHP

--TEST--
Test some basics of Azure AD Access Token support
--DESCRIPTION--
This test also expects certain exceptions to be thrown under some conditions.
--SKIPIF--
<?php require('skipif.inc');
require('skipif_azure_ad_acess_token.inc'); ?>
--FILE--
<?php
require_once("MsCommon_mid-refactor.inc");
function verifyErrorMessage($exception, $expectedError, $msg)
{
if (strpos($exception->getMessage(), $expectedError) === false) {
echo "AzureAD access token test: expected to fail with $msg\n";
print_r($exception->getMessage());
echo "\n";
}
}
function connectWithEmptyAccessToken($server)
{
$dummyToken = '';
$expectedError = 'The Azure AD Access Token is empty. Expected a byte string.';
$connectionInfo = "AccessToken = $dummyToken;";
$testCase = 'empty token';
try {
$conn = new PDO("sqlsrv:server = $server; $connectionInfo");
echo $message . $testCase . PHP_EOL;
} catch(PDOException $e) {
verifyErrorMessage($e, $expectedError, $testCase);
}
unset($connectionInfo);
}
function connectWithInvalidOptions($server)
{
$dummyToken = 'abcde';
$expectedError = 'When using Azure AD Access Token, the connection string must not contain UID, PWD, or Authentication keywords.';
$message = 'AzureAD access token test: expected to fail with ';
$uid = '';
$connectionInfo = "AccessToken = $dummyToken;";
$testCase = 'empty UID provided';
try {
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid);
echo $message . $testCase . PHP_EOL;
} catch(PDOException $e) {
verifyErrorMessage($e, $expectedError, $testCase);
}
unset($connectionInfo);
$pwd = '';
$connectionInfo = "AccessToken = $dummyToken;";
$testCase = 'empty PWD provided';
try {
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", null, $pwd);
echo $message . $testCase . PHP_EOL;
} catch(PDOException $e) {
verifyErrorMessage($e, $expectedError, $testCase);
}
unset($connectionInfo);
$uid = 'uid';
$connectionInfo = "AccessToken = $dummyToken;";
$testCase = 'UID provided';
try {
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid);
echo $message . $testCase . PHP_EOL;
} catch(PDOException $e) {
verifyErrorMessage($e, $expectedError, $testCase);
}
unset($connectionInfo);
$pwd = '';
$connectionInfo = "AccessToken = $dummyToken;";
$testCase = 'PWD provided';
try {
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", null, $pwd);
echo $message . $testCase . PHP_EOL;
} catch(PDOException $e) {
verifyErrorMessage($e, $expectedError, $testCase);
}
unset($connectionInfo);
$connectionInfo = "Authentication = SqlPassword; AccessToken = $dummyToken;";
$testCase = 'Authentication keyword';
try {
$conn = new PDO("sqlsrv:server = $server; $connectionInfo");
echo $message . $testCase . PHP_EOL;
} catch(PDOException $e) {
verifyErrorMessage($e, $expectedError, $testCase);
}
unset($connectionInfo);
}
function simpleTest($conn)
{
// Create table
$tableName = 'Simple';
$col1 = 'Some simple string value';
dropTable($conn, $tableName);
$query = "CREATE TABLE $tableName(ID INT IDENTITY(1,1), COL1 VARCHAR(25))";
$stmt = $conn->query($query);
// Insert one row
$query = "INSERT INTO $tableName VALUES ('$col1')";
$stmt = $conn->query($query);
// Fetch data
$query = "SELECT * FROM $tableName";
$stmt = $conn->query($query);
$result = $stmt->fetch(PDO::FETCH_NUM);
$id = $result[0];
if ($id != 1) {
echo "AzureAD access token test: fetched id $id unexpected\n";
}
$field = $result[1];
if ($field !== $col1) {
echo "AzureAD access token test: fetched value $field unexpected\n";
}
dropTable($conn, $tableName);
}
// First test some error conditions
require_once('MsSetup.inc');
connectWithInvalidOptions($server);
// Then, test with an empty access token
connectWithEmptyAccessToken($server);
// Next, test with a valid access token and perform some simple tasks
require_once('access_token.inc');
try {
if ($adServer != 'TARGET_AD_SERVER' && $accToken != 'TARGET_ACCESS_TOKEN') {
$connectionInfo = "Database = $adDatabase; AccessToken = $accToken;";
$conn = new PDO("sqlsrv:server = $adServer; $connectionInfo");
$conn->setAttribute(PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE, true);
simpleTest($conn);
unset($conn);
}
} catch(PDOException $e) {
print_r( $e->getMessage() );
echo PHP_EOL;
}
echo "Done\n";
?>
--EXPECT--
Done