@@ -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