@@ -47,6 +47,8 @@ using TestTypesHandle = ::testing::Types<FlightSQLOdbcEnvConnHandleMockTestBase,
4747 FlightSQLOdbcEnvConnHandleRemoteTestBase>;
4848TYPED_TEST_SUITE (ErrorsHandleTest, TestTypesHandle);
4949
50+ using ODBC::SqlWcharToString;
51+
5052TYPED_TEST (ErrorsHandleTest, TestSQLGetDiagFieldWForConnectFailure) {
5153 // Invalid connect string
5254 std::string connect_str = this ->GetInvalidConnectionString ();
@@ -119,7 +121,7 @@ TYPED_TEST(ErrorsHandleTest, TestSQLGetDiagFieldWForConnectFailure) {
119121 SQLGetDiagField (SQL_HANDLE_DBC, this ->conn , RECORD_1, SQL_DIAG_SQLSTATE, sql_state,
120122 sql_state_size * GetSqlWCharSize (), &sql_state_length));
121123
122- EXPECT_EQ (std::wstring ( L" 28000 " ), std::wstring (sql_state));
124+ EXPECT_EQ (kErrorState28000 , SqlWcharToString (sql_state));
123125}
124126
125127TYPED_TEST (ErrorsHandleTest, DISABLED_TestSQLGetDiagFieldWForConnectFailureNTS) {
@@ -218,7 +220,7 @@ TYPED_TEST(ErrorsTest, TestSQLGetDiagFieldWForDescriptorFailureFromDriverManager
218220 SQLGetDiagField (SQL_HANDLE_DESC, descriptor, RECORD_1, SQL_DIAG_SQLSTATE, sql_state,
219221 sql_state_size * GetSqlWCharSize (), &sql_state_length));
220222
221- EXPECT_EQ (std::wstring ( L" IM001 " ), std::wstring (sql_state));
223+ EXPECT_EQ (kErrorStateIM001 , SqlWcharToString (sql_state));
222224
223225 // Free descriptor handle
224226 EXPECT_EQ (SQL_SUCCESS, SQLFreeHandle (SQL_HANDLE_DESC, descriptor));
@@ -247,7 +249,7 @@ TYPED_TEST(ErrorsTest, TestSQLGetDiagRecForDescriptorFailureFromDriverManager) {
247249 EXPECT_EQ (0 , native_error);
248250
249251 // API not implemented error from driver manager
250- EXPECT_EQ (std::wstring ( L" IM001 " ), std::wstring (sql_state));
252+ EXPECT_EQ (kErrorStateIM001 , SqlWcharToString (sql_state));
251253
252254 EXPECT_FALSE (std::wstring (message).empty ());
253255
@@ -284,7 +286,7 @@ TYPED_TEST(ErrorsHandleTest, TestSQLGetDiagRecForConnectFailure) {
284286
285287 EXPECT_EQ (200 , native_error);
286288
287- EXPECT_EQ (std::wstring ( L" 28000 " ), std::wstring (sql_state));
289+ EXPECT_EQ (kErrorState28000 , SqlWcharToString (sql_state));
288290
289291 EXPECT_FALSE (std::wstring (message).empty ());
290292}
@@ -358,12 +360,12 @@ TYPED_TEST(ErrorsTest, TestSQLErrorEnvErrorFromDriverManager) {
358360 ASSERT_EQ (SQL_SUCCESS, SQLError (this ->env , nullptr , nullptr , sql_state, &native_error,
359361 message, SQL_MAX_MESSAGE_LENGTH, &message_length));
360362
361- EXPECT_GT (message_length, 50 );
363+ EXPECT_GT (message_length, 40 );
362364
363365 EXPECT_EQ (0 , native_error);
364366
365367 // Function sequence error state from driver manager
366- EXPECT_EQ (std::wstring ( L" HY010 " ), std::wstring (sql_state));
368+ EXPECT_EQ (kErrorStateHY010 , SqlWcharToString (sql_state));
367369
368370 EXPECT_FALSE (std::wstring (message).empty ());
369371}
@@ -390,7 +392,7 @@ TYPED_TEST(ErrorsTest, TestSQLErrorConnError) {
390392 EXPECT_EQ (100 , native_error);
391393
392394 // optional feature not supported error state
393- EXPECT_EQ (std::wstring ( L" HYC00 " ), std::wstring (sql_state));
395+ EXPECT_EQ (kErrorStateHYC00 , SqlWcharToString (sql_state));
394396
395397 EXPECT_FALSE (std::wstring (message).empty ());
396398}
@@ -420,7 +422,7 @@ TYPED_TEST(ErrorsTest, TestSQLErrorStmtError) {
420422
421423 EXPECT_EQ (100 , native_error);
422424
423- EXPECT_EQ (std::wstring ( L" HY000 " ), std::wstring (sql_state));
425+ EXPECT_EQ (kErrorStateHY000 , SqlWcharToString (sql_state));
424426
425427 EXPECT_FALSE (std::wstring (message).empty ());
426428}
@@ -457,7 +459,7 @@ TYPED_TEST(ErrorsTest, TestSQLErrorStmtWarning) {
457459 EXPECT_EQ (1000100 , native_error);
458460
459461 // Verify string truncation warning is reported
460- EXPECT_EQ (std::wstring ( L" 01004 " ), std::wstring (sql_state));
462+ EXPECT_EQ (kErrorState01004 , SqlWcharToString (sql_state));
461463
462464 EXPECT_FALSE (std::wstring (message).empty ());
463465}
@@ -479,22 +481,35 @@ TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorEnvErrorFromDriverManager) {
479481 ASSERT_EQ (SQL_SUCCESS, SQLError (this ->env , nullptr , nullptr , sql_state, &native_error,
480482 message, SQL_MAX_MESSAGE_LENGTH, &message_length));
481483
482- EXPECT_GT (message_length, 50 );
484+ EXPECT_GT (message_length, 40 );
483485
484486 EXPECT_EQ (0 , native_error);
485487
486488 // Function sequence error state from driver manager
487- EXPECT_EQ (std::wstring (L" S1010" ), std::wstring (sql_state));
489+ #ifdef _WIN32
490+ // Windows Driver Manager returns S1010
491+ EXPECT_EQ (kErrorStateS1010 , SqlWcharToString (sql_state));
492+ #else
493+ // unix Driver Manager returns HY010
494+ EXPECT_EQ (kErrorStateHY010 , SqlWcharToString (sql_state));
495+ #endif // _WIN32
488496
489497 EXPECT_FALSE (std::wstring (message).empty ());
490498}
491499
500+ // TODO: verify that `SQLGetConnectOption` is not required by Excel.
501+ #ifndef __APPLE__
492502TYPED_TEST (ErrorsOdbcV2Test, TestSQLErrorConnError) {
493503 // Test ODBC 2.0 API SQLError with ODBC ver 2.
494504 // Known Windows Driver Manager (DM) behavior:
495505 // When application passes buffer length greater than SQL_MAX_MESSAGE_LENGTH (512),
496506 // DM passes 512 as buffer length to SQLError.
497507
508+ // Known macOS Driver Manager (DM) behavior:
509+ // Attempts to call SQLGetConnectOption without redirecting the API call to
510+ // SQLGetConnectAttr. SQLGetConnectOption is not implemented as it is not required by
511+ // macOS Excel.
512+
498513 // Attempt to set unsupported attribute
499514 ASSERT_EQ (SQL_ERROR,
500515 SQLGetConnectAttr (this ->conn , SQL_ATTR_TXN_ISOLATION, 0 , 0 , nullptr ));
@@ -511,10 +526,11 @@ TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorConnError) {
511526 EXPECT_EQ (100 , native_error);
512527
513528 // optional feature not supported error state. Driver Manager maps state to S1C00
514- EXPECT_EQ (std::wstring ( L" S1C00 " ), std::wstring (sql_state));
529+ EXPECT_EQ (kErrorStateS1C00 , SqlWcharToString (sql_state));
515530
516531 EXPECT_FALSE (std::wstring (message).empty ());
517532}
533+ #endif // __APPLE__
518534
519535TYPED_TEST (ErrorsOdbcV2Test, TestSQLErrorStmtError) {
520536 // Test ODBC 2.0 API SQLError with ODBC ver 2.
@@ -540,7 +556,7 @@ TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorStmtError) {
540556 EXPECT_EQ (100 , native_error);
541557
542558 // Driver Manager maps error state to S1000
543- EXPECT_EQ (std::wstring ( L" S1000 " ), std::wstring (sql_state));
559+ EXPECT_EQ (kErrorStateS1000 , SqlWcharToString (sql_state));
544560
545561 EXPECT_FALSE (std::wstring (message).empty ());
546562}
@@ -577,7 +593,7 @@ TYPED_TEST(ErrorsOdbcV2Test, TestSQLErrorStmtWarning) {
577593 EXPECT_EQ (1000100 , native_error);
578594
579595 // Verify string truncation warning is reported
580- EXPECT_EQ (std::wstring ( L" 01004 " ), std::wstring (sql_state));
596+ EXPECT_EQ (kErrorState01004 , SqlWcharToString (sql_state));
581597
582598 EXPECT_FALSE (std::wstring (message).empty ());
583599}
0 commit comments