@@ -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 ));
@@ -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
136145TYPED_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
147156TYPED_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
170179TYPED_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
179187TYPED_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
187194TYPED_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
202209TYPED_TEST (ConnectionAttributeTest, TestSQLGetConnectAttrTranslateLibUnsupported) {
203210 SQLWCHAR out_str[kOdbcBufferSize ];
@@ -224,11 +231,16 @@ TYPED_TEST(ConnectionAttributeTest, TestSQLGetConnectAttrTxnIsolationUnsupported
224231#ifdef SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE
225232TYPED_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
356373TYPED_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
0 commit comments