Skip to content

Commit 92cf65f

Browse files
justing-bqalinaliBQ
authored andcommitted
Fix tests on Linux
1 parent 5e5eac6 commit 92cf65f

12 files changed

Lines changed: 185 additions & 103 deletions

ci/scripts/cpp_test.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ if ! type minio >/dev/null 2>&1; then
5555
fi
5656
case "$(uname)" in
5757
Linux)
58-
exclude_tests+=("arrow-flight-sql-odbc-test")
5958
n_jobs=$(nproc)
6059
;;
6160
Darwin)

cpp/src/arrow/flight/sql/odbc/tests/columns_test.cc

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ TYPED_TEST_SUITE(ColumnsOdbcV2Test, TestTypesOdbcV2);
4646

4747
namespace {
4848
// Helper functions
49+
50+
// GH-49702: TODO Disabled on Linux due to BlockingQueue issue
51+
#ifndef __linux__
4952
void CheckSQLColumns(
5053
SQLHSTMT stmt, const std::wstring& expected_table,
5154
const std::wstring& expected_column, const SQLINTEGER& expected_data_type,
@@ -125,6 +128,7 @@ void CheckRemoteSQLColumns(
125128
expected_octet_char_length, expected_ordinal_position,
126129
expected_is_nullable);
127130
}
131+
#endif // __linux__
128132

129133
void CheckSQLColAttribute(SQLHSTMT stmt, SQLUSMALLINT idx,
130134
const std::string& expected_column_name,
@@ -415,6 +419,8 @@ TYPED_TEST(ColumnsTest, SQLColumnsTestInputData) {
415419
ValidateFetch(stmt, SQL_SUCCESS);
416420
}
417421

422+
// GH-49702: TODO Disabled on Linux due to BlockingQueue issue
423+
#ifndef __linux__
418424
TEST_F(ColumnsMockTest, TestSQLColumnsAllColumns) {
419425
// Check table pattern and column pattern returns all columns
420426

@@ -1209,6 +1215,7 @@ TEST_F(ColumnsMockTest, TestSQLColumnsTableColumnPattern) {
12091215
// There is no more column
12101216
EXPECT_EQ(SQL_NO_DATA, SQLFetch(stmt));
12111217
}
1218+
#endif // __linux__
12121219

12131220
TEST_F(ColumnsMockTest, TestSQLColumnsInvalidTablePattern) {
12141221
ASSIGN_SQLWCHAR_ARR(table_pattern, L"non-existent-table");
@@ -1224,8 +1231,7 @@ TEST_F(ColumnsMockTest, TestSQLColumnsInvalidTablePattern) {
12241231
TYPED_TEST(ColumnsTest, SQLColAttributeTestInputData) {
12251232
ASSIGN_SQLWCHAR_ARR_AND_LEN(wsql, L"SELECT 1 as col1;");
12261233

1227-
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len))
1228-
<< GetOdbcErrorMessage(SQL_HANDLE_DBC, conn);
1234+
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, wsql, wsql_len));
12291235

12301236
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
12311237

@@ -2560,10 +2566,6 @@ TEST_F(ColumnsMockTest, SQLDescribeColUnicodeTableMetadata) {
25602566

25612567
ASSIGN_SQLWCHAR_ARR_AND_LEN(sql_query, L"SELECT * from 数据 LIMIT 1;");
25622568

2563-
ASSIGN_SQLWCHAR_ARR_AND_LEN(expected_column_name, L"资料");
2564-
SQLSMALLINT expected_column_data_type = SQL_WVARCHAR;
2565-
SQLULEN expected_column_size = 0;
2566-
25672569
ASSERT_EQ(SQL_SUCCESS, SQLExecDirect(stmt, sql_query, sql_query_len));
25682570

25692571
ASSERT_EQ(SQL_SUCCESS, SQLFetch(stmt));
@@ -2572,13 +2574,14 @@ TEST_F(ColumnsMockTest, SQLDescribeColUnicodeTableMetadata) {
25722574
SQLDescribeCol(stmt, column_index, column_name, buf_char_len, &name_length,
25732575
&column_data_type, &column_size, &decimal_digits, &nullable));
25742576

2575-
EXPECT_EQ(name_length, expected_column_name_len);
2577+
std::wstring expected_column_name_wstr = std::wstring(L"资料");
2578+
size_t expected_column_name_len = expected_column_name_wstr.length();
25762579

25772580
std::wstring returned(column_name, column_name + name_length);
2578-
std::wstring expected_col_name_str = ConvertToWString(expected_column_name);
2579-
EXPECT_EQ(expected_col_name_str, returned);
2580-
EXPECT_EQ(expected_column_data_type, column_data_type);
2581-
EXPECT_EQ(expected_column_size, column_size);
2581+
EXPECT_EQ(expected_column_name_wstr, returned);
2582+
EXPECT_EQ(expected_column_name_len, name_length);
2583+
EXPECT_EQ(SQL_WVARCHAR, column_data_type);
2584+
EXPECT_EQ(0, column_size);
25822585
EXPECT_EQ(0, decimal_digits);
25832586
EXPECT_EQ(SQL_NULLABLE, nullable);
25842587

cpp/src/arrow/flight/sql/odbc/tests/connection_attr_test.cc

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ using TestTypes =
3333
::testing::Types<FlightSQLODBCMockTestBase, FlightSQLODBCRemoteTestBase>;
3434
TYPED_TEST_SUITE(ConnectionAttributeTest, TestTypes);
3535

36+
template <typename T>
37+
class ConnectionAttributePreConnectTest : public T {};
38+
39+
using TestTypesHandle = ::testing::Types<FlightSQLOdbcEnvConnHandleMockTestBase,
40+
FlightSQLOdbcEnvConnHandleRemoteTestBase>;
41+
TYPED_TEST_SUITE(ConnectionAttributePreConnectTest, TestTypesHandle);
42+
3643
#ifdef SQL_ATTR_ASYNC_DBC_EVENT
3744
TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrAsyncDbcEventUnsupported) {
3845
ASSERT_EQ(SQL_ERROR, SQLSetConnectAttr(conn, SQL_ATTR_ASYNC_DBC_EVENT, 0, 0));
@@ -117,31 +124,33 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrTraceDMOnly) {
117124
}
118125
#endif // __APPLE__
119126

120-
TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrTracefileDMOnly) {
127+
TYPED_TEST(ConnectionAttributePreConnectTest, TestSQLSetConnectAttrTracefileDMOnly) {
121128
// Verify DM-only attribute is handled by Driver Manager
122129

123130
// Use placeholder value as we want the call to fail, or else
124131
// the driver manager will produce a trace file.
125132
std::wstring trace_file = L"invalid/file/path";
126133
std::vector<SQLWCHAR> trace_file0(trace_file.begin(), trace_file.end());
134+
135+
#ifdef _WIN32
127136
ASSERT_EQ(SQL_ERROR, SQLSetConnectAttr(conn, SQL_ATTR_TRACEFILE, &trace_file0[0],
128137
static_cast<SQLINTEGER>(trace_file0.size())));
129-
#ifdef __APPLE__
130-
VerifyOdbcErrorState(SQL_HANDLE_DBC, conn, kErrorStateHYC00);
131-
#else
132138
VerifyOdbcErrorState(SQL_HANDLE_DBC, conn, kErrorStateHY000);
133-
#endif // __APPLE__
139+
#else // Mac & Linux
140+
ASSERT_EQ(SQL_SUCCESS, SQLSetConnectAttr(conn, SQL_ATTR_TRACEFILE, &trace_file0[0],
141+
static_cast<SQLINTEGER>(trace_file0.size())));
142+
#endif
134143
}
135144

136145
TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrTranslateLabDMOnly) {
137146
// Verify DM-only attribute is handled by Driver Manager
138147
ASSERT_EQ(SQL_ERROR, SQLSetConnectAttr(conn, SQL_ATTR_TRANSLATE_LIB, 0, 0));
139148
// Checks for invalid argument return error
140-
#ifdef __APPLE__
141-
VerifyOdbcErrorState(SQL_HANDLE_DBC, conn, kErrorStateHYC00);
142-
#else
149+
#ifdef _WIN32
143150
VerifyOdbcErrorState(SQL_HANDLE_DBC, conn, kErrorStateHY024);
144-
#endif // __APPLE__
151+
#else // Mac & Linux
152+
VerifyOdbcErrorState(SQL_HANDLE_DBC, conn, kErrorStateHYC00);
153+
#endif
145154
}
146155

147156
TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrTranslateOptionUnsupported) {
@@ -165,8 +174,8 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrDbcInfoTokenSetOnly) {
165174
}
166175
#endif
167176

168-
// iODBC does not treat SQL_ATTR_ODBC_CURSORS as DM-only
169-
#ifndef __APPLE__
177+
// Driver Manager behavior tests for Windows only.
178+
#ifdef _WIN32
170179
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrOdbcCursorsDMOnly) {
171180
// Verify that DM-only attribute is handled by driver manager
172181
SQLULEN cursor_attr;
@@ -175,15 +184,13 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrOdbcCursorsDMOnly) {
175184
EXPECT_EQ(SQL_CUR_USE_DRIVER, cursor_attr);
176185
}
177186

178-
// iODBC needs to be compiled with tracing enabled to handle SQL_ATTR_TRACE
179187
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTraceDMOnly) {
180188
// Verify that DM-only attribute is handled by driver manager
181189
SQLUINTEGER trace;
182190
ASSERT_EQ(SQL_SUCCESS, SQLGetConnectAttr(conn, SQL_ATTR_TRACE, &trace, 0, nullptr));
183191
EXPECT_EQ(SQL_OPT_TRACE_OFF, trace);
184192
}
185193

186-
// iODBC needs to be compiled with tracing enabled to handle SQL_ATTR_TRACEFILE
187194
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTraceFileDMOnly) {
188195
// Verify that DM-only attribute is handled by driver manager
189196
SQLWCHAR out_str[kOdbcBufferSize];
@@ -197,7 +204,7 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTraceFileDMOnly) {
197204
ODBC::SqlWcharToString(out_str, static_cast<SQLSMALLINT>(out_str_len));
198205
EXPECT_FALSE(out_connection_string.empty());
199206
}
200-
#endif // __APPLE__
207+
#endif // _WIN32
201208

202209
TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTranslateLibUnsupported) {
203210
SQLWCHAR out_str[kOdbcBufferSize];
@@ -224,11 +231,16 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTxnIsolationUnsupported
224231
#ifdef SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE
225232
TYPED_TEST(ConnectionAttributeTest,
226233
TestSQLGetConnectAttrAsyncDbcFunctionsEnableUnsupported) {
227-
// Verifies that the Windows driver manager returns HY114 for unsupported functionality
228234
SQLUINTEGER enable;
235+
# ifdef _WIN32
236+
// Verifies that the Windows driver manager returns HY114 for unsupported functionality
229237
ASSERT_EQ(SQL_ERROR,
230238
SQLGetConnectAttr(conn, SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE, &enable, 0, 0));
231239
VerifyOdbcErrorState(SQL_HANDLE_DBC, conn, kErrorStateHY114);
240+
# else // Mac & Linux
241+
ASSERT_EQ(SQL_SUCCESS,
242+
SQLGetConnectAttr(conn, SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE, &enable, 0, 0));
243+
# endif
232244
}
233245
#endif
234246

@@ -353,14 +365,23 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrLoginTimeoutValid) {
353365
EXPECT_EQ(42, timeout);
354366
}
355367

368+
#ifdef __linux__
369+
// On Linux, SQL_ATTR_PACKET_SIZE can only be set before connection
370+
// which is why use a different test fixture for Linux.
371+
TYPED_TEST(ConnectionAttributePreConnectTest, TestSQLSetConnectAttrPacketSizeValid) {
372+
#else // Windows & Mac
356373
TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrPacketSizeValid) {
357-
// The driver always returns 0. PACKET_SIZE value is unused by the driver.
358-
374+
#endif
359375
// Check default value first
360376
SQLUINTEGER size = -1;
377+
#ifdef __linux__
378+
ASSERT_EQ(SQL_ERROR, SQLGetConnectAttr(conn, SQL_ATTR_PACKET_SIZE, &size, 0, nullptr));
379+
VerifyOdbcErrorState(SQL_HANDLE_DBC, conn, kErrorState08003);
380+
#else // Windows & Mac
361381
ASSERT_EQ(SQL_SUCCESS,
362382
SQLGetConnectAttr(conn, SQL_ATTR_PACKET_SIZE, &size, 0, nullptr));
363383
EXPECT_EQ(0, size);
384+
#endif
364385

365386
ASSERT_EQ(SQL_SUCCESS, SQLSetConnectAttr(conn, SQL_ATTR_PACKET_SIZE,
366387
reinterpret_cast<SQLPOINTER>(0), 0));
@@ -370,12 +391,18 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrPacketSizeValid) {
370391
SQLGetConnectAttr(conn, SQL_ATTR_PACKET_SIZE, &size, 0, nullptr));
371392
EXPECT_EQ(0, size);
372393

373-
// Attempt to set to non-zero value, driver should return warning and not error
394+
// Attempt to set to non-zero value,
395+
#ifdef __linux__
396+
EXPECT_EQ(SQL_SUCCESS, SQLSetConnectAttr(conn, SQL_ATTR_PACKET_SIZE,
397+
reinterpret_cast<SQLPOINTER>(2), 0));
398+
#else // Windows & Mac
399+
// driver should return warning and not error
374400
EXPECT_EQ(SQL_SUCCESS_WITH_INFO, SQLSetConnectAttr(conn, SQL_ATTR_PACKET_SIZE,
375401
reinterpret_cast<SQLPOINTER>(2), 0));
376402

377403
// Verify warning status
378404
VerifyOdbcErrorState(SQL_HANDLE_DBC, conn, kErrorState01S02);
405+
#endif
379406
}
380407

381408
} // namespace arrow::flight::sql::odbc

cpp/src/arrow/flight/sql/odbc/tests/connection_info_test.cc

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDataSourceName) {
143143
}
144144

145145
#ifdef SQL_DRIVER_AWARE_POOLING_SUPPORTED
146+
// GH-49782: TODO Disabled on Linux until SQL_DRIVER_AWARE_POOLING_SUPPORTED is
147+
// implemented in the driver.
148+
# ifndef __linux__
146149
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDriverAwarePoolingSupported) {
147150
// According to Microsoft documentation, ODBC driver does not need to implement
148151
// SQL_DRIVER_AWARE_POOLING_SUPPORTED and the Driver Manager will ignore the
@@ -153,7 +156,8 @@ TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDriverAwarePoolingSupported) {
153156

154157
EXPECT_EQ(static_cast<SQLUINTEGER>(SQL_DRIVER_AWARE_POOLING_NOT_CAPABLE), value);
155158
}
156-
#endif
159+
# endif // __linux__
160+
#endif // SQL_DRIVER_AWARE_POOLING_SUPPORTED
157161

158162
// These information types are implemented by the Driver Manager alone.
159163
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDriverHdbc) {
@@ -329,9 +333,11 @@ TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoOdbcVer) {
329333

330334
std::wstring result = ConvertToWString(value);
331335

332-
#ifdef __APPLE__
336+
#if defined(__APPLE__)
333337
EXPECT_EQ(std::wstring(L"03.52.0000"), result);
334-
#else
338+
#elif defined(__linux__)
339+
EXPECT_EQ(std::wstring(L"03.52"), result);
340+
#else // WINDOWS
335341
EXPECT_EQ(std::wstring(L"03.80.0000"), result);
336342
#endif // __APPLE__
337343
}
@@ -370,7 +376,8 @@ TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoServerName) {
370376
SQLWCHAR value[kOdbcBufferSize] = {};
371377
GetInfoSQLWCHAR(conn, SQL_SERVER_NAME, value);
372378

373-
EXPECT_GT(wcslen(reinterpret_cast<wchar_t*>(value)), 0);
379+
std::wstring result = ConvertToWString(value);
380+
EXPECT_GT(result.length(), 0);
374381
}
375382

376383
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoStaticCursorAttributes1) {
@@ -401,14 +408,16 @@ TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDbmsName) {
401408
SQLWCHAR value[kOdbcBufferSize] = {};
402409
GetInfoSQLWCHAR(conn, SQL_DBMS_NAME, value);
403410

404-
EXPECT_GT(wcslen(reinterpret_cast<wchar_t*>(value)), 0);
411+
std::wstring result = ConvertToWString(value);
412+
EXPECT_GT(result.length(), 0);
405413
}
406414

407415
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoDbmsVer) {
408416
SQLWCHAR value[kOdbcBufferSize] = {};
409417
GetInfoSQLWCHAR(conn, SQL_DBMS_VER, value);
410418

411-
EXPECT_GT(wcslen(reinterpret_cast<wchar_t*>(value)), 0);
419+
std::wstring result = ConvertToWString(value);
420+
EXPECT_GT(result.length(), 0);
412421
}
413422

414423
// Data Source Information
@@ -848,7 +857,8 @@ TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoKeywords) {
848857
SQLWCHAR value[info_len] = {};
849858
GetInfoSQLWCHAR(conn, SQL_KEYWORDS, value, info_len);
850859

851-
EXPECT_GT(wcslen(reinterpret_cast<wchar_t*>(value)), 0);
860+
std::wstring result = ConvertToWString(value, -1, info_len);
861+
EXPECT_GT(result.length(), 0);
852862
}
853863

854864
TYPED_TEST(ConnectionInfoTest, TestSQLGetInfoLikeEscapeClause) {

cpp/src/arrow/flight/sql/odbc/tests/errors_test.cc

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -309,15 +309,20 @@ TYPED_TEST(ErrorsTest, TestSQLGetDiagRecInputData) {
309309
EXPECT_EQ(SQL_NO_DATA, SQLGetDiagRec(SQL_HANDLE_DBC, conn, 1, nullptr, nullptr, nullptr,
310310
0, nullptr));
311311

312-
// Invalid handle
313312
#ifdef __APPLE__
314313
// MacOS ODBC driver manager requires connection handle
315314
EXPECT_EQ(SQL_INVALID_HANDLE,
316315
SQLGetDiagRec(0, conn, 1, nullptr, nullptr, nullptr, 0, nullptr));
317316
#else
318-
EXPECT_EQ(SQL_INVALID_HANDLE,
317+
// Linux & Windows driver managers have different expected return values
318+
# ifdef __linux__
319+
SQLRETURN expected_rc = SQL_ERROR;
320+
# else // Windows
321+
SQLRETURN expected_rc = SQL_INVALID_HANDLE;
322+
# endif
323+
EXPECT_EQ(expected_rc,
319324
SQLGetDiagRec(0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr));
320-
#endif // __APPLE__
325+
#endif
321326
}
322327

323328
TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorInputData) {
@@ -485,13 +490,13 @@ TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorEnvErrorFromDriverManager) {
485490
EXPECT_EQ(0, native_error);
486491

487492
// Function sequence error state from driver manager
488-
#ifdef _WIN32
489-
// Windows Driver Manager returns S1010
490-
EXPECT_EQ(kErrorStateS1010, SqlWcharToString(sql_state));
491-
#else
492-
// unix Driver Manager returns HY010
493+
#ifdef __APPLE__
494+
// MacOS Driver Manager returns HY010
493495
EXPECT_EQ(kErrorStateHY010, SqlWcharToString(sql_state));
494-
#endif // _WIN32
496+
#else // Linux & Windows
497+
// Linux & Windows Driver Managers returns S1010
498+
EXPECT_EQ(kErrorStateS1010, SqlWcharToString(sql_state));
499+
#endif
495500

496501
std::string msg = SqlWcharToString(message);
497502
EXPECT_FALSE(msg.empty());

cpp/src/arrow/flight/sql/odbc/tests/get_functions_test.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ using TestTypesOdbcV2 =
4040
::testing::Types<FlightSQLOdbcV2MockTestBase, FlightSQLOdbcV2RemoteTestBase>;
4141
TYPED_TEST_SUITE(GetFunctionsOdbcV2Test, TestTypesOdbcV2);
4242

43-
// MacOS driver manager iODBC does not support SQLGetFunctions for ODBC 3.x or 2.x driver
44-
#ifndef __APPLE__
43+
// Unix driver managers iODBC and Unix-ODBC do not support SQLGetFunctions
44+
// for ODBC 3.x or 2.x driver
45+
#ifdef _WIN32
4546
TYPED_TEST(GetFunctionsTest, TestSQLGetFunctionsAllFunctions) {
4647
// Verify driver manager return values for SQLGetFunctions
4748

@@ -217,6 +218,6 @@ TYPED_TEST(GetFunctionsOdbcV2Test, TestSQLGetFunctionsUnsupportedSingleAPI) {
217218
api_exists = -1;
218219
}
219220
}
220-
#endif // __APPLE__
221+
#endif // _WIN32
221222

222223
} // namespace arrow::flight::sql::odbc

0 commit comments

Comments
 (0)