blob: 5d3316c11c57076dcfd2f3c426fab3f369712471 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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
*
* http://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.
*/
#include "odbc_suite.h"
#include <gmock/gmock-matchers.h>
#include <gtest/gtest.h>
using namespace ignite;
/**
* Test suite.
*/
class auth_test : public odbc_suite, public basic_auth_test_suite {
public:
/**
* Tear down.
*/
static void TearDownTestSuite() { set_authentication_enabled(false); }
/**
* Get node addresses and user credentials to use for tests.
*
* @return Addresses and credentials.
*/
static std::string get_auth_connection_string() {
return get_basic_connection_string() + "identity=" + CORRECT_USERNAME + ';' + "secret=" + CORRECT_PASSWORD
+ ';';
}
/**
* Get node addresses and user credentials with incorrect identity to use for tests.
*
* @return Addresses and credentials.
*/
static std::string get_incorrect_identity_auth_connection_string() {
return get_basic_connection_string() + "identity=" + INCORRECT_USERNAME + ';' + "secret=" + CORRECT_PASSWORD
+ ';';
}
/**
* Get node addresses and user credentials with incorrect secret to use for tests.
*
* @return Addresses and credentials.
*/
static std::string get_incorrect_secret_auth_connection_string() {
return get_basic_connection_string() + "identity=" + CORRECT_USERNAME + ';' + "secret=" + INCORRECT_PASSWORD
+ ';';
}
/**
* Get node addresses and user credentials with incorrect identity and secret to use for tests.
*
* @return Addresses and credentials.
*/
static std::string get_incorrect_auth_connection_string() {
return get_basic_connection_string() + "identity=" + INCORRECT_USERNAME + ';' + "secret=" + INCORRECT_PASSWORD
+ ';';
}
};
TEST_F(auth_test, connection_success) {
set_authentication_enabled(false);
odbc_connect(get_basic_connection_string());
}
TEST_F(auth_test, auth_connection_disabled_on_server) {
set_authentication_enabled(false);
EXPECT_NO_THROW(odbc_connect_throw(get_auth_connection_string()));
}
TEST_F(auth_test, odbc3_supported) {
set_authentication_enabled(false);
// Allocate an environment handle
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_env);
EXPECT_TRUE(m_env != SQL_NULL_HANDLE);
// We want ODBC 3.8 support
SQLSetEnvAttr(m_env, SQL_ATTR_ODBC_VERSION, reinterpret_cast<void *>(SQL_OV_ODBC3), 0);
// Allocate a connection handle
SQLAllocHandle(SQL_HANDLE_DBC, m_env, &m_conn);
EXPECT_TRUE(m_conn != SQL_NULL_HANDLE);
// Connect string
auto connect_str0 = to_sqlchar(get_basic_connection_string());
SQLCHAR out_str[ODBC_BUFFER_SIZE];
SQLSMALLINT out_str_len;
// Connecting to ODBC server.
SQLRETURN ret = SQLDriverConnect(m_conn, nullptr, &connect_str0[0], static_cast<SQLSMALLINT>(connect_str0.size()),
out_str, sizeof(out_str), &out_str_len, SQL_DRIVER_COMPLETE);
if (!SQL_SUCCEEDED(ret)) {
FAIL() << get_odbc_error_message(SQL_HANDLE_DBC, m_conn);
}
}
TEST_F(auth_test, username_no_auth) {
set_authentication_enabled(false);
EXPECT_NO_THROW(odbc_connect_throw(get_basic_connection_string()));
SQLCHAR buffer[ODBC_BUFFER_SIZE];
SQLSMALLINT resLen = 0;
SQLRETURN ret = SQLGetInfo(m_conn, SQL_USER_NAME, buffer, ODBC_BUFFER_SIZE, &resLen);
if (!SQL_SUCCEEDED(ret))
FAIL() << (get_odbc_error_message(SQL_HANDLE_DBC, m_conn));
EXPECT_EQ(std::string(""), std::string(reinterpret_cast<char *>(buffer)));
}
TEST_F(auth_test, username) {
set_authentication_enabled(true);
EXPECT_NO_THROW(odbc_connect_throw(get_auth_connection_string()));
SQLCHAR buffer[ODBC_BUFFER_SIZE];
SQLSMALLINT resLen = 0;
SQLRETURN ret = SQLGetInfo(m_conn, SQL_USER_NAME, buffer, ODBC_BUFFER_SIZE, &resLen);
if (!SQL_SUCCEEDED(ret))
FAIL() << (get_odbc_error_message(SQL_HANDLE_DBC, m_conn));
EXPECT_EQ(CORRECT_USERNAME, std::string(reinterpret_cast<char *>(buffer)));
}
TEST_F(auth_test, auth_connection_success) {
set_authentication_enabled(true);
EXPECT_NO_THROW(odbc_connect_throw(get_auth_connection_string()));
}
TEST_F(auth_test, auth_connection_disabled_on_client) {
set_authentication_enabled(true);
EXPECT_THROW(
try { odbc_connect_throw(get_basic_connection_string()); } catch (const ignite_error &e) {
EXPECT_THAT(e.what_str(), testing::HasSubstr("Authentication failed"));
throw;
},
ignite_error);
}
TEST_F(auth_test, auth_connection_incorrect_creds) {
set_authentication_enabled(true);
auto test_conn_str = [this](const std::string &conn_str) {
EXPECT_THROW(
try { odbc_connect_throw(conn_str); } catch (const ignite_error &e) {
EXPECT_THAT(e.what_str(), testing::HasSubstr("Authentication failed"));
throw;
},
ignite_error);
};
test_conn_str(get_incorrect_identity_auth_connection_string());
test_conn_str(get_incorrect_secret_auth_connection_string());
test_conn_str(get_incorrect_auth_connection_string());
}