//-----------------------------------------------------------------------------
// Copyright (c) 2017, 2022, Oracle and/or its affiliates.
//
// This software is dual-licensed to you under the Universal Permissive License
// (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl and Apache License
// 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose
// either license.
//
// If you elect to accept the software under the Apache License, Version 2.0,
// the following applies:
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// test_1800_misc.c
// Test suite of miscellenous test cases.
//-----------------------------------------------------------------------------
#include "TestLib.h"
//-----------------------------------------------------------------------------
// dpiTest_1800_miscChangePwd() [INTERNAL]
// Call dpiConn_changePassword() and create a new connection using the new
// password to verify that the password was indeed changed (no error).
//-----------------------------------------------------------------------------
int dpiTest_1800_miscChangePwd(dpiTestCase *testCase, dpiTestParams *params)
{
const char *newpwd = "newpwd";
dpiContext *context;
dpiConn *conn;
// get first connection and change password
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiConn_changePassword(conn, params->mainUserName,
params->mainUserNameLength, params->mainPassword,
params->mainPasswordLength, newpwd, strlen(newpwd)) < 0)
return dpiTestCase_setFailedFromError(testCase);
// get second connection and change password back
dpiTestSuite_getContext(&context);
if (dpiConn_create(context, params->mainUserName,
params->mainUserNameLength, newpwd, strlen(newpwd),
params->connectString, params->connectStringLength, NULL, NULL,
&conn) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiConn_changePassword(conn, params->mainUserName,
params->mainUserNameLength, newpwd, strlen(newpwd),
params->mainPassword, params->mainPasswordLength) < 0)
return dpiTestCase_setFailedFromError(testCase);
dpiConn_release(conn);
return DPI_SUCCESS;
}
//-----------------------------------------------------------------------------
// dpiTest_1801_miscPing() [INTERNAL]
// call dpiConn_ping() (no error)
//-----------------------------------------------------------------------------
int dpiTest_1801_miscPing(dpiTestCase *testCase, dpiTestParams *params)
{
dpiConn *conn;
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
if (dpiConn_ping(conn) < 0)
return dpiTestCase_setFailedFromError(testCase);
return DPI_SUCCESS;
}
//-----------------------------------------------------------------------------
// dpiTest_1802_fetchColAsXMLType() [INTERNAL]
// Prepare and execute a query which fetches an XMLType object and verify
// that it is returned as a string (no error).
//-----------------------------------------------------------------------------
int dpiTest_1802_fetchColAsXMLType(dpiTestCase *testCase, dpiTestParams *params)
{
const char *sql = "select XMLElement(\"String\", StringCol) from "
"TestStrings where IntCol = 1";
const char *expectedValue = "String 1";
dpiNativeTypeNum nativeTypeNum;
uint32_t bufferRowIndex;
dpiData *strColValue;
dpiConn *conn;
dpiStmt *stmt;
int found;
// get connection
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
// prepare select statement and execute it
if (dpiConn_prepareStmt(conn, 0, sql, strlen(sql), NULL, 0, &stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, NULL) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_fetch(stmt, &found, &bufferRowIndex) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_getQueryValue(stmt, 1, &nativeTypeNum, &strColValue) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiTestCase_expectStringEqual(testCase, strColValue->value.asBytes.ptr,
strColValue->value.asBytes.length, expectedValue,
strlen(expectedValue)) < 0)
return dpiTestCase_setFailedFromError(testCase);
// cleanup
if (dpiStmt_release(stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
return DPI_SUCCESS;
}
//-----------------------------------------------------------------------------
// dpiTest_1803_insertDataIntoXMLColAndVerify() [INTERNAL]
// Insert data into XMLCol. Fetch the data from XMLCol and verify(no error).
//-----------------------------------------------------------------------------
int dpiTest_1803_insertDataIntoXMLColAndVerify(dpiTestCase *testCase,
dpiTestParams *params)
{
const char *selectSql = "select XMLCol from TestXML where IntCol = 1";
const char *insertSql =
"insert into TestXML (IntCol, XMLCol) values (1, :1)";
const char *truncateSql = "truncate table TestXML";
dpiNativeTypeNum nativeTypeNum;
dpiData xmlData, *fetchedData;
uint32_t bufferRowIndex, i;
char xmlVal[1038], *ptr;
dpiConn *conn;
dpiStmt *stmt;
int found;
// get connection
if (dpiTestCase_getConnection(testCase, &conn) < 0)
return DPI_FAILURE;
// truncate table
if (dpiConn_prepareStmt(conn, 0, truncateSql, strlen(truncateSql), NULL, 0,
&stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, NULL) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_release(stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
// generate random XML string
strcpy(xmlVal, "");
ptr = xmlVal + strlen(xmlVal);
for (i = 0; i < 1024; i++)
*ptr++ = 'A' + (rand() % 26);
strcpy(ptr, "");
// perform insert
if (dpiConn_prepareStmt(conn, 0, insertSql, strlen(insertSql), NULL, 0,
&stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
dpiData_setBytes(&xmlData, xmlVal, strlen(xmlVal));
if (dpiStmt_bindValueByPos(stmt, 1, DPI_NATIVE_TYPE_BYTES, &xmlData) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, NULL) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_release(stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
// fetch the data and compare
if (dpiConn_prepareStmt(conn, 0, selectSql, strlen(selectSql), NULL, 0,
&stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_execute(stmt, DPI_MODE_EXEC_DEFAULT, NULL) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_fetch(stmt, &found, &bufferRowIndex) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_getQueryValue(stmt, 1, &nativeTypeNum, &fetchedData) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiTestCase_expectStringEqual(testCase, fetchedData->value.asBytes.ptr,
fetchedData->value.asBytes.length - 1, xmlVal, strlen(xmlVal)) < 0)
return dpiTestCase_setFailedFromError(testCase);
if (dpiStmt_release(stmt) < 0)
return dpiTestCase_setFailedFromError(testCase);
return DPI_SUCCESS;
}
//-----------------------------------------------------------------------------
// dpiTest_1804_verifySetNullAndGetIsNull()
// Verify dpiData_setNull() and dpiData_getIsNull() are working properly
// (no error).
//-----------------------------------------------------------------------------
int dpiTest_1804_verifySetNullAndGetIsNull(dpiTestCase *testCase,
dpiTestParams *params)
{
dpiData data;
dpiData_setNull(&data);
if (dpiTestCase_expectUintEqual(testCase, dpiData_getIsNull(&data), 1) < 0)
return DPI_FAILURE;
dpiData_setInt64(&data, 5);
if (dpiTestCase_expectUintEqual(testCase, dpiData_getIsNull(&data), 0) < 0)
return DPI_FAILURE;
return DPI_SUCCESS;
}
//-----------------------------------------------------------------------------
// main()
//-----------------------------------------------------------------------------
int main(int argc, char **argv)
{
dpiTestSuite_initialize(1800);
dpiTestSuite_addCase(dpiTest_1800_miscChangePwd,
"change password and verify (no error)");
dpiTestSuite_addCase(dpiTest_1801_miscPing,
"dpiConn_ping() (no error)");
dpiTestSuite_addCase(dpiTest_1802_fetchColAsXMLType,
"fetch an XMLType object as a string");
dpiTestSuite_addCase(dpiTest_1803_insertDataIntoXMLColAndVerify,
"insert data into table containing XMLType and verify fetch");
dpiTestSuite_addCase(dpiTest_1804_verifySetNullAndGetIsNull,
"verify dpiData_setNull() & dpiData_getIsNull()");
dpiTestSuite_run();
return 0;
}