@@ -33,6 +33,13 @@ using TestTypes =
3333 ::testing::Types<FlightSQLODBCMockTestBase, FlightSQLODBCRemoteTestBase>;
3434TYPED_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
3744TYPED_TEST (ConnectionAttributeTest, TestSQLSetConnectAttrAsyncDbcEventUnsupported) {
3845 ASSERT_EQ (SQL_ERROR, SQLSetConnectAttr (conn, SQL_ATTR_ASYNC_DBC_EVENT, 0 , 0 ));
@@ -114,31 +121,33 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrTraceDMOnly) {
114121}
115122#endif // __APPLE__
116123
117- TYPED_TEST (ConnectionAttributeTest , TestSQLSetConnectAttrTracefileDMOnly) {
124+ TYPED_TEST (ConnectionAttributePreConnectTest , TestSQLSetConnectAttrTracefileDMOnly) {
118125 // Verify DM-only attribute is handled by Driver Manager
119126
120127 // Use placeholder value as we want the call to fail, or else
121128 // the driver manager will produce a trace file.
122129 std::wstring trace_file = L" invalid/file/path" ;
123130 std::vector<SQLWCHAR> trace_file0 (trace_file.begin (), trace_file.end ());
131+
132+ #ifdef _WIN32
124133 ASSERT_EQ (SQL_ERROR, SQLSetConnectAttr (conn, SQL_ATTR_TRACEFILE, &trace_file0[0 ],
125134 static_cast <SQLINTEGER>(trace_file0.size ())));
126- #ifdef __APPLE__
127- VerifyOdbcErrorState (SQL_HANDLE_DBC, conn, kErrorStateHYC00 );
128- #else
129135 VerifyOdbcErrorState (SQL_HANDLE_DBC, conn, kErrorStateHY000 );
130- #endif // __APPLE__
136+ #else // Mac & Linux
137+ ASSERT_EQ (SQL_SUCCESS, SQLSetConnectAttr (conn, SQL_ATTR_TRACEFILE, &trace_file0[0 ],
138+ static_cast <SQLINTEGER>(trace_file0.size ())));
139+ #endif
131140}
132141
133142TYPED_TEST (ConnectionAttributeTest, TestSQLSetConnectAttrTranslateLabDMOnly) {
134143 // Verify DM-only attribute is handled by Driver Manager
135144 ASSERT_EQ (SQL_ERROR, SQLSetConnectAttr (conn, SQL_ATTR_TRANSLATE_LIB, 0 , 0 ));
136145 // Checks for invalid argument return error
137- #ifdef __APPLE__
138- VerifyOdbcErrorState (SQL_HANDLE_DBC, conn, kErrorStateHYC00 );
139- #else
146+ #ifdef _WIN32
140147 VerifyOdbcErrorState (SQL_HANDLE_DBC, conn, kErrorStateHY024 );
141- #endif // __APPLE__
148+ #else // Mac & Linux
149+ VerifyOdbcErrorState (SQL_HANDLE_DBC, conn, kErrorStateHYC00 );
150+ #endif
142151}
143152
144153TYPED_TEST (ConnectionAttributeTest, TestSQLSetConnectAttrTranslateOptionUnsupported) {
@@ -162,8 +171,8 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrDbcInfoTokenSetOnly) {
162171}
163172#endif
164173
165- // iODBC does not treat SQL_ATTR_ODBC_CURSORS as DM- only
166- #ifndef __APPLE__
174+ // Driver Manager behavior tests for Windows only.
175+ #ifdef _WIN32
167176TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrOdbcCursorsDMOnly) {
168177 // Verify that DM-only attribute is handled by driver manager
169178 SQLULEN cursor_attr;
@@ -172,15 +181,13 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrOdbcCursorsDMOnly) {
172181 EXPECT_EQ (SQL_CUR_USE_DRIVER, cursor_attr);
173182}
174183
175- // iODBC needs to be compiled with tracing enabled to handle SQL_ATTR_TRACE
176184TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrTraceDMOnly) {
177185 // Verify that DM-only attribute is handled by driver manager
178186 SQLUINTEGER trace;
179187 ASSERT_EQ (SQL_SUCCESS, SQLGetConnectAttr (conn, SQL_ATTR_TRACE, &trace, 0 , nullptr ));
180188 EXPECT_EQ (SQL_OPT_TRACE_OFF, trace);
181189}
182190
183- // iODBC needs to be compiled with tracing enabled to handle SQL_ATTR_TRACEFILE
184191TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrTraceFileDMOnly) {
185192 // Verify that DM-only attribute is handled by driver manager
186193 SQLWCHAR out_str[kOdbcBufferSize ];
@@ -194,7 +201,7 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTraceFileDMOnly) {
194201 ODBC::SqlWcharToString (out_str, static_cast <SQLSMALLINT>(out_str_len));
195202 EXPECT_FALSE (out_connection_string.empty ());
196203}
197- #endif // __APPLE__
204+ #endif // _WIN32
198205
199206TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrTranslateLibUnsupported) {
200207 SQLWCHAR out_str[kOdbcBufferSize ];
@@ -221,11 +228,16 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTxnIsolationUnsupported
221228#ifdef SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE
222229TYPED_TEST (ConnectionAttributeTest,
223230 TestSQLGetConnectAttrAsyncDbcFunctionsEnableUnsupported) {
224- // Verifies that the Windows driver manager returns HY114 for unsupported functionality
225231 SQLUINTEGER enable;
232+ # ifdef _WIN32
233+ // Verifies that the Windows driver manager returns HY114 for unsupported functionality
226234 ASSERT_EQ (SQL_ERROR,
227235 SQLGetConnectAttr (conn, SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE, &enable, 0 , 0 ));
228236 VerifyOdbcErrorState (SQL_HANDLE_DBC, conn, kErrorStateHY114 );
237+ # else // Mac & Linux
238+ ASSERT_EQ (SQL_SUCCESS,
239+ SQLGetConnectAttr (conn, SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE, &enable, 0 , 0 ));
240+ # endif
229241}
230242#endif
231243
@@ -350,14 +362,23 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrLoginTimeoutValid) {
350362 EXPECT_EQ (42 , timeout);
351363}
352364
365+ #ifdef __linux__
366+ // On Linux, SQL_ATTR_PACKET_SIZE can only be set before connection
367+ // which is why use a different test fixture for Linux.
368+ TYPED_TEST (ConnectionAttributePreConnectTest, TestSQLSetConnectAttrPacketSizeValid) {
369+ #else // Windows & Mac
353370TYPED_TEST (ConnectionAttributeTest, TestSQLSetConnectAttrPacketSizeValid) {
354- // The driver always returns 0. PACKET_SIZE value is unused by the driver.
355-
371+ #endif
356372 // Check default value first
357373 SQLUINTEGER size = -1 ;
374+ #ifdef __linux__
375+ ASSERT_EQ (SQL_ERROR, SQLGetConnectAttr (conn, SQL_ATTR_PACKET_SIZE, &size, 0 , nullptr ));
376+ VerifyOdbcErrorState (SQL_HANDLE_DBC, conn, kErrorState08003 );
377+ #else // Windows & Mac
358378 ASSERT_EQ (SQL_SUCCESS,
359379 SQLGetConnectAttr (conn, SQL_ATTR_PACKET_SIZE, &size, 0 , nullptr ));
360380 EXPECT_EQ (0 , size);
381+ #endif
361382
362383 ASSERT_EQ (SQL_SUCCESS, SQLSetConnectAttr (conn, SQL_ATTR_PACKET_SIZE,
363384 reinterpret_cast <SQLPOINTER>(0 ), 0 ));
@@ -367,12 +388,18 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrPacketSizeValid) {
367388 SQLGetConnectAttr (conn, SQL_ATTR_PACKET_SIZE, &size, 0 , nullptr ));
368389 EXPECT_EQ (0 , size);
369390
370- // Attempt to set to non-zero value, driver should return warning and not error
391+ // Attempt to set to non-zero value,
392+ #ifdef __linux__
393+ EXPECT_EQ (SQL_SUCCESS, SQLSetConnectAttr (conn, SQL_ATTR_PACKET_SIZE,
394+ reinterpret_cast <SQLPOINTER>(2 ), 0 ));
395+ #else // Windows & Mac
396+ // driver should return warning and not error
371397 EXPECT_EQ (SQL_SUCCESS_WITH_INFO, SQLSetConnectAttr (conn, SQL_ATTR_PACKET_SIZE,
372398 reinterpret_cast <SQLPOINTER>(2 ), 0 ));
373399
374400 // Verify warning status
375401 VerifyOdbcErrorState (SQL_HANDLE_DBC, conn, kErrorState01S02 );
402+ #endif
376403}
377404
378405} // namespace arrow::flight::sql::odbc
0 commit comments