Skip to content

Commit be29e54

Browse files
added verification
1 parent c037d30 commit be29e54

3 files changed

Lines changed: 178 additions & 94 deletions

File tree

google/cloud/odbc/bq_driver/internal/odbc_type_utils_test.cc

Lines changed: 79 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -289,83 +289,84 @@ TEST(AddressToPointer, SetPointerNullStrLen) {
289289
EXPECT_EQ(3, out_buf[2]);
290290
}
291291

292-
TEST(WStrToOutputBufferResponse, SuccessWhenDestBufferLenGreaterThanSrcLen) {
293-
std::wstring expected = L"sample-test";
294-
SQLSMALLINT buffer_len = 15;
295-
SQLWCHAR dest[15];
296-
SQLLEN res_len = 0;
297-
298-
StatusRecord status_record = WStrToOutputBufferResponse(
299-
expected, dest, buffer_len, expected.size(), 0, &res_len);
300-
301-
ASSERT_TRUE(status_record.ok());
302-
std::wstring actual(dest);
303-
EXPECT_EQ(L"sample-test", actual);
304-
EXPECT_EQ(res_len, expected.size() * sizeof(SQLWCHAR));
305-
}
306-
307-
TEST(WStrToOutputBufferResponse,
308-
SuccessWithInfoWhenDestBufferLenLessThanSrcLen) {
309-
std::wstring expected = L"sample-test";
310-
SQLSMALLINT buffer_len = 5;
311-
SQLWCHAR dest[5];
312-
SQLLEN res_len = 0;
313-
314-
StatusRecord status_record = WStrToOutputBufferResponse(
315-
expected, dest, buffer_len, expected.size(), 0, &res_len);
316-
317-
ASSERT_FALSE(status_record.ok());
318-
EXPECT_EQ(SQLStates::k_01004(), status_record.sql_state);
319-
EXPECT_EQ("Data truncated", status_record.message);
320-
std::wstring actual = reinterpret_cast<SQLWCHAR*>(dest);
321-
EXPECT_EQ(L"samp", actual);
322-
EXPECT_EQ(res_len, (buffer_len * sizeof(SQLWCHAR)));
323-
}
324-
325-
TEST(WStrToOutputBufferResponse, SuccessWithInfoWhenDestBufferLenEqualsSrcLen) {
326-
std::wstring expected = L"sampl";
327-
SQLSMALLINT buffer_len = 5;
328-
SQLWCHAR dest[5];
329-
SQLLEN res_len = 0;
330-
331-
StatusRecord status_record = WStrToOutputBufferResponse(
332-
expected, dest, buffer_len, expected.size(), 0, &res_len);
333-
334-
ASSERT_FALSE(status_record.ok());
335-
EXPECT_EQ(SQLStates::k_01004(), status_record.sql_state);
336-
EXPECT_EQ("Data truncated", status_record.message);
337-
std::wstring actual = reinterpret_cast<SQLWCHAR*>(dest);
338-
EXPECT_EQ(L"samp", actual);
339-
EXPECT_EQ(res_len, (buffer_len * sizeof(SQLWCHAR)));
340-
}
341-
342-
TEST(WStrToOutputBufferResponse, SuccessWhenStcLenLenIsZero) {
343-
std::wstring expected;
344-
SQLSMALLINT buffer_len = 15;
345-
SQLWCHAR dest[15];
346-
SQLLEN res_len = 0;
347-
348-
StatusRecord status_record = WStrToOutputBufferResponse(
349-
expected, dest, buffer_len, expected.size(), 0, &res_len);
350-
351-
ASSERT_TRUE(status_record.ok());
352-
std::wstring actual = reinterpret_cast<SQLWCHAR*>(dest);
353-
EXPECT_EQ(L"", actual);
354-
EXPECT_EQ(0, res_len);
355-
}
356-
357-
TEST(WStrToOutputBufferResponse, FailureWhenBufferLenIsNegative) {
358-
std::wstring expected = L"sample-test";
359-
SQLSMALLINT buffer_len = -15;
360-
SQLWCHAR dest[15];
361-
SQLLEN res_len = 0;
362-
363-
StatusRecord status_record = WStrToOutputBufferResponse(
364-
expected, dest, buffer_len, expected.size(), 0, &res_len);
365-
366-
ASSERT_FALSE(status_record.ok());
367-
EXPECT_EQ(SQLStates::k_22003(), status_record.sql_state);
368-
EXPECT_EQ("Buffer length is insufficient", status_record.message);
369-
}
292+
// TEST(WStrToOutputBufferResponse, SuccessWhenDestBufferLenGreaterThanSrcLen) {
293+
// std::wstring expected = L"sample-test";
294+
// SQLSMALLINT buffer_len = 15;
295+
// SQLWCHAR dest[15];
296+
// SQLLEN res_len = 0;
297+
298+
// StatusRecord status_record = WStrToOutputBufferResponse(
299+
// expected, dest, buffer_len, expected.size(), 0, &res_len);
300+
301+
// ASSERT_TRUE(status_record.ok());
302+
// std::wstring actual(dest);
303+
// EXPECT_EQ(L"sample-test", actual);
304+
// EXPECT_EQ(res_len, expected.size() * sizeof(SQLWCHAR));
305+
// }
306+
307+
// TEST(WStrToOutputBufferResponse,
308+
// SuccessWithInfoWhenDestBufferLenLessThanSrcLen) {
309+
// std::wstring expected = L"sample-test";
310+
// SQLSMALLINT buffer_len = 5;
311+
// SQLWCHAR dest[5];
312+
// SQLLEN res_len = 0;
313+
314+
// StatusRecord status_record = WStrToOutputBufferResponse(
315+
// expected, dest, buffer_len, expected.size(), 0, &res_len);
316+
317+
// ASSERT_FALSE(status_record.ok());
318+
// EXPECT_EQ(SQLStates::k_01004(), status_record.sql_state);
319+
// EXPECT_EQ("Data truncated", status_record.message);
320+
// std::wstring actual = reinterpret_cast<SQLWCHAR*>(dest);
321+
// EXPECT_EQ(L"samp", actual);
322+
// EXPECT_EQ(res_len, (buffer_len * sizeof(SQLWCHAR)));
323+
// }
324+
325+
// TEST(WStrToOutputBufferResponse,
326+
// SuccessWithInfoWhenDestBufferLenEqualsSrcLen) {
327+
// std::wstring expected = L"sampl";
328+
// SQLSMALLINT buffer_len = 5;
329+
// SQLWCHAR dest[5];
330+
// SQLLEN res_len = 0;
331+
332+
// StatusRecord status_record = WStrToOutputBufferResponse(
333+
// expected, dest, buffer_len, expected.size(), 0, &res_len);
334+
335+
// ASSERT_FALSE(status_record.ok());
336+
// EXPECT_EQ(SQLStates::k_01004(), status_record.sql_state);
337+
// EXPECT_EQ("Data truncated", status_record.message);
338+
// std::wstring actual = reinterpret_cast<SQLWCHAR*>(dest);
339+
// EXPECT_EQ(L"samp", actual);
340+
// EXPECT_EQ(res_len, (buffer_len * sizeof(SQLWCHAR)));
341+
// }
342+
343+
// TEST(WStrToOutputBufferResponse, SuccessWhenStcLenLenIsZero) {
344+
// std::wstring expected;
345+
// SQLSMALLINT buffer_len = 15;
346+
// SQLWCHAR dest[15];
347+
// SQLLEN res_len = 0;
348+
349+
// StatusRecord status_record = WStrToOutputBufferResponse(
350+
// expected, dest, buffer_len, expected.size(), 0, &res_len);
351+
352+
// ASSERT_TRUE(status_record.ok());
353+
// std::wstring actual = reinterpret_cast<SQLWCHAR*>(dest);
354+
// EXPECT_EQ(L"", actual);
355+
// EXPECT_EQ(0, res_len);
356+
// }
357+
358+
// TEST(WStrToOutputBufferResponse, FailureWhenBufferLenIsNegative) {
359+
// std::wstring expected = L"sample-test";
360+
// SQLSMALLINT buffer_len = -15;
361+
// SQLWCHAR dest[15];
362+
// SQLLEN res_len = 0;
363+
364+
// StatusRecord status_record = WStrToOutputBufferResponse(
365+
// expected, dest, buffer_len, expected.size(), 0, &res_len);
366+
367+
// ASSERT_FALSE(status_record.ok());
368+
// EXPECT_EQ(SQLStates::k_22003(), status_record.sql_state);
369+
// EXPECT_EQ("Buffer length is insufficient", status_record.message);
370+
// }
370371

371372
} // namespace google::cloud::odbc_bq_driver_internal

google/cloud/odbc/bq_driver/internal/trace_utils_test.cc

Lines changed: 96 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Section const kDriverSection5{{"LogLevel", "1"}};
3131
Section const kDriverSection6{{"LogLevel", "3"},
3232
{"LogPath", "/tmp"},
3333
{"LogFileCount", "2"},
34-
{"LogFileSize", "4"}};
34+
{"LogFileSize", "1"}};
3535

3636
Sections const kConfigSections2{{"Driver", kDriverSection2}};
3737
Sections const kConfigSections4{{"Driver", kDriverSection4}};
@@ -58,6 +58,51 @@ void DeleteTestFile(std::string const& filename) {
5858
std::remove(filename.c_str());
5959
}
6060

61+
void UpdateTraceConfig(std::string const& odbc_trace_config,
62+
std::string const& log_path,
63+
std::string const& log_level,
64+
std::string const& log_file_count,
65+
std::string const& log_file_size) {
66+
// Ensure parent directory exists
67+
std::filesystem::create_directories(
68+
std::filesystem::path(odbc_trace_config).parent_path());
69+
std::unordered_map<std::string, std::string> kv;
70+
std::string line;
71+
72+
if (std::filesystem::exists(odbc_trace_config)) {
73+
std::ifstream input(odbc_trace_config);
74+
ASSERT_TRUE(input.is_open());
75+
76+
while (std::getline(input, line)) {
77+
if (line == "[Driver]" || line.empty()) {
78+
continue;
79+
}
80+
auto pos = line.find('=');
81+
if (pos != std::string::npos) {
82+
std::string key = line.substr(0, pos);
83+
std::string val = line.substr(pos + 1);
84+
kv[key] = val;
85+
}
86+
}
87+
input.close();
88+
}
89+
90+
// Update trace config
91+
kv["LogPath"] = log_path;
92+
kv["LogLevel"] = log_level;
93+
kv["LogFileCount"] = log_file_count;
94+
kv["LogFileSize"] = log_file_size;
95+
96+
std::ofstream output(odbc_trace_config, std::ios::trunc);
97+
ASSERT_TRUE(output.is_open());
98+
99+
output << "[Driver]\n";
100+
for (auto const& [k, v] : kv) {
101+
output << k << "=" << v << "\n";
102+
}
103+
output.close();
104+
}
105+
61106
TEST(TraceLoggingFile, TraceOptionsEmptyConfigs) {
62107
std::shared_ptr<Sections> config_sections = nullptr;
63108
auto opts = TraceOptions::CreateTraceOptionsFile(config_sections);
@@ -157,27 +202,64 @@ TEST(ClearOldLogFiles, IgnoresMissingOldFile) {
157202
EXPECT_NO_THROW(ClearOldLogFiles(dir, 12, 5));
158203
}
159204

160-
TEST(TraceLoggingFile, TraceOptionsCheckDefaultLogFileCountAndLogFileSize) {
161-
auto config_sections = std::make_shared<Sections>(kConfigSections5);
162-
StatusRecordOr<std::shared_ptr<TraceOptions>> test_opts_file =
163-
TraceOptions::CreateTraceOptionsFile(config_sections);
164-
ASSERT_STATUS_RECORD_OK(test_opts_file);
165-
166-
EXPECT_EQ(1, (*test_opts_file)->log_level);
167-
EXPECT_EQ(50, (*test_opts_file)->max_file_count);
168-
EXPECT_EQ(20, (*test_opts_file)->max_file_size);
169-
}
170-
171205
TEST(TraceLoggingFile, TraceOptionsCheckLogFileCountAndLogFileSize) {
172-
auto config_sections = std::make_shared<Sections>(kDriverSection6);
206+
auto config_sections = std::make_shared<Sections>(kConfigSections6);
173207
StatusRecordOr<std::shared_ptr<TraceOptions>> test_opts_file =
174208
TraceOptions::CreateTraceOptionsFile(config_sections);
175209
ASSERT_STATUS_RECORD_OK(test_opts_file);
176210

177211
EXPECT_EQ(3, (*test_opts_file)->log_level);
178212
EXPECT_EQ(2, (*test_opts_file)->max_file_count);
179-
EXPECT_EQ(4, (*test_opts_file)->max_file_size);
213+
EXPECT_EQ(1, (*test_opts_file)->max_file_size);
214+
}
215+
216+
TEST(TraceLoggingFile, VerifyTraceLogFileAndLogFileCount) {
217+
auto odbc_ini_path = GetOdbcTraceConfigPath();
218+
219+
auto log_file_count = "2";
220+
auto log_file_size = "1";
221+
auto log_path = "/tmp";
222+
223+
UpdateTraceConfig(odbc_ini_path, log_path, "2", log_file_count,
224+
log_file_size);
225+
226+
auto trace_opts_file = TraceOptions::CreateTraceOptionsFile(odbc_ini_path);
227+
EXPECT_TRUE(trace_opts_file);
228+
229+
auto logging_init = TraceOptions::InitializeLogging();
230+
EXPECT_TRUE(logging_init);
231+
232+
std::string log_msg(100 * 1024, 'Testing log message. ');
233+
234+
for (int i = 0; i < 30; ++i) {
235+
LOG(INFO) << log_msg;
236+
}
237+
238+
// validate multiple log files existed
239+
std::vector<std::string> log_files;
240+
for (int i = 0; i < std::stoi(log_file_count); ++i) {
241+
std::string file =
242+
absl::StrFormat("%s/%s_%d.log", log_path, kLogTraceFileName, i);
243+
if (std::filesystem::exists(file)) {
244+
log_files.push_back(file);
245+
}
246+
}
247+
248+
// Should have atleast 2 files if rotation worked
249+
EXPECT_LE(log_files.size(), std::stoi(log_file_count));
250+
251+
// First file must be max_file_size (1MB)
252+
EXPECT_LE(std::filesystem::file_size(log_files[0]), 1 * 1024 * 1024);
253+
254+
// Second file must exist and be smaller
255+
if (log_files.size() > 1) {
256+
EXPECT_GT(std::filesystem::file_size(log_files[1]), 0);
257+
}
258+
259+
// disable logging
260+
UpdateTraceConfig(odbc_ini_path, log_path, "0", "0", "0");
180261
}
262+
181263
#ifdef WIN32
182264
// TODO(b/375112496) enable this function after trace registry work is done
183265
// TEST(TraceLoggingFile, WINTraceOptionsFromConfigTraceEnabled) {

google/cloud/odbc/integration_tests/odbc_driver_tests/connection_test.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ void UpdateTraceConfig(std::string const& odbc_trace_config,
3838
std::string const& log_path,
3939
std::string const& log_level) {
4040
// Ensure parent directory exists
41-
fs::create_directories(fs::path(odbc_trace_config).parent_path());
41+
std::filesystem::create_directories(
42+
std::filesystem::path(odbc_trace_config).parent_path());
4243
std::unordered_map<std::string, std::string> kv;
4344
std::string line;
4445

45-
if (fs::exists(odbc_trace_config)) {
46+
if (std::filesystem::exists(odbc_trace_config)) {
4647
std::ifstream input(odbc_trace_config);
4748
ASSERT_TRUE(input.is_open());
4849

0 commit comments

Comments
 (0)