diff options
Diffstat (limited to 'src/lib/pgsql/tests/pgsql_basics.cc')
-rw-r--r-- | src/lib/pgsql/tests/pgsql_basics.cc | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/lib/pgsql/tests/pgsql_basics.cc b/src/lib/pgsql/tests/pgsql_basics.cc new file mode 100644 index 0000000..e6d061a --- /dev/null +++ b/src/lib/pgsql/tests/pgsql_basics.cc @@ -0,0 +1,149 @@ +// Copyright (C) 2021-2022 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +#include <config.h> + +#include <pgsql/pgsql_exchange.h> +#include <pgsql/testutils/pgsql_schema.h> +#include <pgsql/tests/pgsql_basics.h> +#include <testutils/gtest_utils.h> + +#include <boost/lexical_cast.hpp> + +#include <gtest/gtest.h> + +#include <sstream> +#include <vector> + +using namespace isc; +using namespace isc::db; +using namespace isc::db::test; + +PgSqlBasicsTest::PgSqlBasicsTest() : expected_col_names_(NUM_BASIC_COLS) { + // Create database connection parameter list + DatabaseConnection::ParameterMap params; + params["name"] = "keatest"; + params["user"] = "keatest"; + params["password"] = "keatest"; + + // Create and open the database connection + conn_.reset(new PgSqlConnection(params)); + conn_->openDatabase(); + + // Create the list of expected column names + expected_col_names_[ID_COL] = "id"; + expected_col_names_[BOOL_COL] = "bool_col"; + expected_col_names_[BYTEA_COL] = "bytea_col"; + expected_col_names_[BIGINT_COL] = "bigint_col"; + expected_col_names_[SMALLINT_COL] = "smallint_col"; + expected_col_names_[INT_COL] = "int_col"; + expected_col_names_[TEXT_COL] = "text_col"; + expected_col_names_[TIMESTAMP_COL] = "timestamp_col"; + expected_col_names_[VARCHAR_COL] = "varchar_col"; + expected_col_names_[INET4_COL] = "inet4_col"; + expected_col_names_[FLOAT_COL] = "float_col"; + expected_col_names_[JSON_COL] = "json_col"; + expected_col_names_[MIN_INT_COL] = "min_int_col"; + expected_col_names_[MAX_INT_COL] = "max_int_col"; + expected_col_names_[INET6_COL] = "inet6_col"; + expected_col_names_[LOCALTIME_COL] = "localtime_col"; + + destroySchema(); + createSchema(); +} + +PgSqlBasicsTest::~PgSqlBasicsTest () { + destroySchema(); +} + +const std::string& +PgSqlBasicsTest::expectedColumnName(int col) { + if (col < 0 || col >= NUM_BASIC_COLS) { + isc_throw(BadValue, + "definedColumnName: invalid column value" << col); + } + + return (expected_col_names_[col]); +} + +void +PgSqlBasicsTest::createSchema() { + // One column for OID type, plus an auto-increment + const char* sql = + "CREATE TABLE basics ( " + " id SERIAL PRIMARY KEY NOT NULL, " + " bool_col BOOLEAN, " + " bytea_col BYTEA, " + " bigint_col BIGINT, " + " smallint_col SMALLINT, " + " int_col INT, " + " text_col TEXT, " + " timestamp_col TIMESTAMP WITH TIME ZONE, " + " varchar_col VARCHAR(255), " + " inet4_col INET, " + " float_col FLOAT, " + " json_col JSON," + " min_int_col INT, " + " max_int_col INT, " + " inet6_col INET, " + " localtime_col TIMESTAMP WITH TIME ZONE " + "); "; + + PgSqlResult r(PQexec(*conn_, sql)); + ASSERT_EQ(PQresultStatus(r), PGRES_COMMAND_OK) + << " create basics table failed: " << PQerrorMessage(*conn_); +} + +void +PgSqlBasicsTest::destroySchema() { + if (conn_) { + PgSqlResult r(PQexec(*conn_, "DROP TABLE IF EXISTS basics;")); + ASSERT_EQ(PQresultStatus(r), PGRES_COMMAND_OK) + << " drop basics table failed: " << PQerrorMessage(*conn_); + } +} + +void +PgSqlBasicsTest::runSql(PgSqlResultPtr& r, const std::string& sql, + int exp_outcome, int lineno) { + r.reset(new PgSqlResult(PQexec(*conn_, sql.c_str()))); + ASSERT_EQ(PQresultStatus(*r), exp_outcome) + << " runSql at line: " << lineno << " failed, sql:[" << sql + << "]\n reason: " << PQerrorMessage(*conn_); +} + +void +PgSqlBasicsTest::runPreparedStatement(PgSqlResultPtr& r, + PgSqlTaggedStatement& statement, + PsqlBindArrayPtr bind_array, + int exp_outcome, int lineno) { + r.reset(new PgSqlResult(PQexecPrepared(*conn_, statement.name, + statement.nbparams, + &bind_array->values_[0], + &bind_array->lengths_[0], + &bind_array->formats_[0], 0))); + ASSERT_EQ(PQresultStatus(*r), exp_outcome) + << " runPreparedStatement at line: " << lineno + << " statement name:[" << statement.name + << "]\n reason: " << PQerrorMessage(*conn_); +} + +void +PgSqlBasicsTest::fetchRows(PgSqlResultPtr& r, int exp_rows, int line) { + std::string sql = + "SELECT" + " id, bool_col, bytea_col, bigint_col, smallint_col, " + " int_col, text_col," + " extract(epoch from timestamp_col)::bigint as timestamp_col," + " varchar_col, inet4_col, float_col, json_col," + " min_int_col, max_int_col, inet6_col," + " (extract(epoch from localtime_col) + extract(timezone from localtime_col))::bigint as localtime_col" + " FROM basics"; + + runSql(r, sql, PGRES_TUPLES_OK, line); + ASSERT_EQ(r->getRows(), exp_rows) << "fetch at line: " << line + << " wrong row count, expected: " << exp_rows + << " , have: " << r->getRows(); +} |