@@ -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,32 @@ 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
123- // Use placeholder value as we want the call to fail, or else
124- // the driver manager will produce a trace file.
125- std::wstring trace_file = L" invalid/file/path" ;
126- std::vector<SQLWCHAR > trace_file0 (trace_file.begin (), trace_file.end ());
127- ASSERT_EQ (SQL_ERROR , SQLSetConnectAttr (this ->conn , SQL_ATTR_TRACEFILE , &trace_file0[0 ],
128- static_cast <SQLINTEGER >(trace_file0.size ())));
129- #ifdef __APPLE__
130- VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHYC00 );
131- #else
130+ // Use placeholder value to avoid the driver manager producing a trace file.
131+ ASSIGN_SQLWCHAR_ARR_AND_LEN (trace_file, L" invalid/file/path" );
132+
133+ SQLRETURN rc =
134+ SQLSetConnectAttr (this ->conn , SQL_ATTR_TRACEFILE , trace_file, trace_file_len);
135+
136+ #ifdef _WIN32
137+ ASSERT_EQ (SQL_ERROR , rc);
132138 VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHY000 );
133- #endif // __APPLE__
139+ #else // Mac & Linux
140+ ASSERT_EQ (SQL_SUCCESS , rc);
141+ #endif
134142}
135143
136144TYPED_TEST (ConnectionAttributeTest, TestSQLSetConnectAttrTranslateLabDMOnly) {
137145 // Verify DM-only attribute is handled by Driver Manager
138146 ASSERT_EQ (SQL_ERROR , SQLSetConnectAttr (this ->conn , SQL_ATTR_TRANSLATE_LIB , 0 , 0 ));
139147 // Checks for invalid argument return error
140- #ifdef __APPLE__
141- VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHYC00 );
142- #else
148+ #ifdef _WIN32
143149 VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHY024 );
144- #endif // __APPLE__
150+ #else // Mac & Linux
151+ VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHYC00 );
152+ #endif
145153}
146154
147155TYPED_TEST (ConnectionAttributeTest, TestSQLSetConnectAttrTranslateOptionUnsupported) {
@@ -166,8 +174,8 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrDbcInfoTokenSetOnly) {
166174}
167175#endif
168176
169- // iODBC does not treat SQL_ATTR_ODBC_CURSORS as DM- only
170- #ifndef __APPLE__
177+ // Driver Manager behavior tests for Windows only.
178+ #ifdef _WIN32
171179TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrOdbcCursorsDMOnly) {
172180 // Verify that DM-only attribute is handled by driver manager
173181 SQLULEN cursor_attr;
@@ -176,7 +184,6 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrOdbcCursorsDMOnly) {
176184 EXPECT_EQ (SQL_CUR_USE_DRIVER , cursor_attr);
177185}
178186
179- // iODBC needs to be compiled with tracing enabled to handle SQL_ATTR_TRACE
180187TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrTraceDMOnly) {
181188 // Verify that DM-only attribute is handled by driver manager
182189 SQLUINTEGER trace;
@@ -185,7 +192,6 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTraceDMOnly) {
185192 EXPECT_EQ (SQL_OPT_TRACE_OFF , trace);
186193}
187194
188- // iODBC needs to be compiled with tracing enabled to handle SQL_ATTR_TRACEFILE
189195TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrTraceFileDMOnly) {
190196 // Verify that DM-only attribute is handled by driver manager
191197 SQLWCHAR out_str[kOdbcBufferSize ];
@@ -199,7 +205,7 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTraceFileDMOnly) {
199205 ODBC::SqlWcharToString (out_str, static_cast <SQLSMALLINT >(out_str_len));
200206 EXPECT_FALSE (out_connection_string.empty ());
201207}
202- #endif // __APPLE__
208+ #endif // _WIN32
203209
204210TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrTranslateLibUnsupported) {
205211 SQLWCHAR out_str[kOdbcBufferSize ];
@@ -226,11 +232,17 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTxnIsolationUnsupported
226232#ifdef SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE
227233TYPED_TEST (ConnectionAttributeTest,
228234 TestSQLGetConnectAttrAsyncDbcFunctionsEnableUnsupported) {
229- // Verifies that the Windows driver manager returns HY114 for unsupported functionality
230235 SQLUINTEGER enable;
236+ # ifdef _WIN32
237+ // Verifies that the Windows driver manager returns HY114 for unsupported functionality
231238 ASSERT_EQ (SQL_ERROR , SQLGetConnectAttr (this ->conn , SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE ,
232239 &enable, 0 , 0 ));
233240 VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorStateHY114 );
241+ # else // Mac & Linux
242+ ASSERT_EQ (
243+ SQL_SUCCESS ,
244+ SQLGetConnectAttr (this ->conn , SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE , &enable, 0 , 0 ));
245+ # endif
234246}
235247#endif
236248
@@ -357,14 +369,24 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrLoginTimeoutValid) {
357369 EXPECT_EQ (42 , timeout);
358370}
359371
372+ #ifdef __linux__
373+ // On Linux, SQL_ATTR_PACKET_SIZE can only be set before connection
374+ // which is why use a different test fixture for Linux.
375+ TYPED_TEST (ConnectionAttributePreConnectTest, TestSQLSetConnectAttrPacketSizeValid) {
376+ #else // Windows & Mac
360377TYPED_TEST (ConnectionAttributeTest, TestSQLSetConnectAttrPacketSizeValid) {
361- // The driver always returns 0. PACKET_SIZE value is unused by the driver.
362-
378+ #endif
363379 // Check default value first
364380 SQLUINTEGER size = -1 ;
381+ #ifdef __linux__
382+ ASSERT_EQ (SQL_ERROR ,
383+ SQLGetConnectAttr (this ->conn , SQL_ATTR_PACKET_SIZE , &size, 0 , nullptr ));
384+ VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorState08003 );
385+ #else // Windows & Mac
365386 ASSERT_EQ (SQL_SUCCESS ,
366387 SQLGetConnectAttr (this ->conn , SQL_ATTR_PACKET_SIZE , &size, 0 , nullptr ));
367388 EXPECT_EQ (0 , size);
389+ #endif
368390
369391 ASSERT_EQ (SQL_SUCCESS , SQLSetConnectAttr (this ->conn , SQL_ATTR_PACKET_SIZE ,
370392 reinterpret_cast <SQLPOINTER >(0 ), 0 ));
@@ -374,12 +396,18 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLSetConnectAttrPacketSizeValid) {
374396 SQLGetConnectAttr (this ->conn , SQL_ATTR_PACKET_SIZE , &size, 0 , nullptr ));
375397 EXPECT_EQ (0 , size);
376398
377- // Attempt to set to non-zero value, driver should return warning and not error
399+ // Attempt to set to non-zero value,
400+ #ifdef __linux__
401+ EXPECT_EQ (SQL_SUCCESS , SQLSetConnectAttr (this ->conn , SQL_ATTR_PACKET_SIZE ,
402+ reinterpret_cast <SQLPOINTER >(2 ), 0 ));
403+ #else // Windows & Mac
404+ // driver should return warning and not error
378405 EXPECT_EQ (SQL_SUCCESS_WITH_INFO , SQLSetConnectAttr (this ->conn , SQL_ATTR_PACKET_SIZE ,
379406 reinterpret_cast <SQLPOINTER >(2 ), 0 ));
380407
381408 // Verify warning status
382409 VerifyOdbcErrorState (SQL_HANDLE_DBC , this ->conn , kErrorState01S02 );
410+ #endif
383411}
384412
385413} // namespace arrow::flight::sql::odbc
0 commit comments