@@ -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 (this ->conn , SQL_ATTR_ASYNC_DBC_EVENT , 0 , 0 ));
@@ -117,31 +124,34 @@ 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 (this ->conn , SQL_ATTR_TRACEFILE , &trace_file0[0 ],
128137 static_cast <SQLINTEGER >(trace_file0.size ())));
129- #ifdef __APPLE__
130- VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHYC00 );
131- #else
132138 VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHY000 );
133- #endif // __APPLE__
139+ #else // Mac & Linux
140+ ASSERT_EQ (SQL_SUCCESS ,
141+ SQLSetConnectAttr (this ->conn , SQL_ATTR_TRACEFILE , &trace_file0[0 ],
142+ static_cast <SQLINTEGER >(trace_file0.size ())));
143+ #endif
134144}
135145
136146TYPED_TEST (ConnectionAttributeTest, TestSQLSetConnectAttrTranslateLabDMOnly) {
137147 // Verify DM-only attribute is handled by Driver Manager
138148 ASSERT_EQ (SQL_ERROR , SQLSetConnectAttr (this ->conn , SQL_ATTR_TRANSLATE_LIB , 0 , 0 ));
139149 // Checks for invalid argument return error
140- #ifdef __APPLE__
141- VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHYC00 );
142- #else
150+ #ifdef _WIN32
143151 VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHY024 );
144- #endif // __APPLE__
152+ #else // Mac & Linux
153+ VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHYC00 );
154+ #endif
145155}
146156
147157TYPED_TEST (ConnectionAttributeTest, TestSQLSetConnectAttrTranslateOptionUnsupported) {
@@ -166,8 +176,8 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrDbcInfoTokenSetOnly) {
166176}
167177#endif
168178
169- // iODBC does not treat SQL_ATTR_ODBC_CURSORS as DM- only
170- #ifndef __APPLE__
179+ // Driver Manager behavior tests for Windows only.
180+ #ifdef _WIN32
171181TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrOdbcCursorsDMOnly) {
172182 // Verify that DM-only attribute is handled by driver manager
173183 SQLULEN cursor_attr;
@@ -176,7 +186,6 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrOdbcCursorsDMOnly) {
176186 EXPECT_EQ (SQL_CUR_USE_DRIVER , cursor_attr);
177187}
178188
179- // iODBC needs to be compiled with tracing enabled to handle SQL_ATTR_TRACE
180189TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrTraceDMOnly) {
181190 // Verify that DM-only attribute is handled by driver manager
182191 SQLUINTEGER trace;
@@ -185,7 +194,6 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTraceDMOnly) {
185194 EXPECT_EQ (SQL_OPT_TRACE_OFF , trace);
186195}
187196
188- // iODBC needs to be compiled with tracing enabled to handle SQL_ATTR_TRACEFILE
189197TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrTraceFileDMOnly) {
190198 // Verify that DM-only attribute is handled by driver manager
191199 SQLWCHAR out_str[kOdbcBufferSize ];
@@ -199,7 +207,7 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTraceFileDMOnly) {
199207 ODBC::SqlWcharToString (out_str, static_cast <SQLSMALLINT >(out_str_len));
200208 EXPECT_FALSE (out_connection_string.empty ());
201209}
202- #endif // __APPLE__
210+ #endif // _WIN32
203211
204212TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrTranslateLibUnsupported) {
205213 SQLWCHAR out_str[kOdbcBufferSize ];
@@ -226,11 +234,17 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTxnIsolationUnsupported
226234#ifdef SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE
227235TYPED_TEST (ConnectionAttributeTest,
228236 TestSQLGetConnectAttrAsyncDbcFunctionsEnableUnsupported) {
229- // Verifies that the Windows driver manager returns HY114 for unsupported functionality
230237 SQLUINTEGER enable;
238+ # ifdef _WIN32
239+ // Verifies that the Windows driver manager returns HY114 for unsupported functionality
231240 ASSERT_EQ (SQL_ERROR , SQLGetConnectAttr (this ->conn , SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE ,
232241 &enable, 0 , 0 ));
233242 VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHY114 );
243+ # else // Mac & Linux
244+ ASSERT_EQ (
245+ SQL_SUCCESS ,
246+ SQLGetConnectAttr (this ->conn , SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE , &enable, 0 , 0 ));
247+ # endif
234248}
235249#endif
236250
@@ -357,14 +371,23 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrLoginTimeoutValid) {
357371 EXPECT_EQ (42 , timeout);
358372}
359373
374+ #ifdef __linux__
375+ // On Linux, SQL_ATTR_PACKET_SIZE can only be set before connection
376+ // which is why use a different test fixture for Linux.
377+ TYPED_TEST (ConnectionAttributePreConnectTest, TestSQLSetConnectAttrPacketSizeValid) {
378+ #else // Windows & Mac
360379TYPED_TEST (ConnectionAttributeTest, TestSQLSetConnectAttrPacketSizeValid) {
361- // The driver always returns 0. PACKET_SIZE value is unused by the driver.
362-
380+ #endif
363381 // Check default value first
364382 SQLUINTEGER size = -1 ;
383+ #ifdef __linux__
384+ ASSERT_EQ (SQL_ERROR , SQLGetConnectAttr (conn, SQL_ATTR_PACKET_SIZE , &size, 0 , nullptr ));
385+ VerifyOdbcErrorState (SQL_HANDLE_DBC , conn, kErrorState08003 );
386+ #else // Windows & Mac
365387 ASSERT_EQ (SQL_SUCCESS ,
366388 SQLGetConnectAttr (this ->conn , SQL_ATTR_PACKET_SIZE , &size, 0 , nullptr ));
367389 EXPECT_EQ (0 , size);
390+ #endif
368391
369392 ASSERT_EQ (SQL_SUCCESS , SQLSetConnectAttr (this ->conn , SQL_ATTR_PACKET_SIZE ,
370393 reinterpret_cast <SQLPOINTER >(0 ), 0 ));
@@ -374,12 +397,18 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrPacketSizeValid) {
374397 SQLGetConnectAttr (this ->conn , SQL_ATTR_PACKET_SIZE , &size, 0 , nullptr ));
375398 EXPECT_EQ (0 , size);
376399
377- // Attempt to set to non-zero value, driver should return warning and not error
400+ // Attempt to set to non-zero value,
401+ #ifdef __linux__
402+ EXPECT_EQ (SQL_SUCCESS , SQLSetConnectAttr (this ->conn , SQL_ATTR_PACKET_SIZE ,
403+ reinterpret_cast <SQLPOINTER >(2 ), 0 ));
404+ #else // Windows & Mac
405+ // driver should return warning and not error
378406 EXPECT_EQ (SQL_SUCCESS_WITH_INFO , SQLSetConnectAttr (this ->conn , SQL_ATTR_PACKET_SIZE ,
379407 reinterpret_cast <SQLPOINTER >(2 ), 0 ));
380408
381409 // Verify warning status
382410 VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorState01S02 );
411+ #endif
383412}
384413
385414} // namespace arrow::flight::sql::odbc
0 commit comments