This is an automated email from the ASF dual-hosted git repository.

isapego pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 47f51d5baf8 IGNITE-27304 C++ Client: Add Windows TC suite (#7875)
47f51d5baf8 is described below

commit 47f51d5baf8868112b7fafd73054800adf8df4f2
Author: Igor Sapego <[email protected]>
AuthorDate: Thu Mar 26 10:37:29 2026 +0100

    IGNITE-27304 C++ Client: Add Windows TC suite (#7875)
---
 .../files/scripts/powershell/AnalyzeCrashDumps.ps1 |  31 ++++++
 .../CollectDebugArtifactsForCrashDumps.ps1         |  43 +++++++
 .teamcity/test/build_types/RunPlatformTests.kt     |   2 +-
 .../test/platform_tests/PlatformCppTestsWindows.kt | 124 +++++++++++++--------
 .../cpp/ignite/odbc/install/install_win.cmd        |  26 -----
 .../cpp/ignite/odbc/install/install_win.ps1        | 102 +++++++++++++++++
 modules/platforms/cpp/tests/client-test/main.cpp   |  12 +-
 modules/platforms/cpp/tests/odbc-test/main.cpp     |   6 +-
 .../cpp/tests/odbc-test/transaction_test.cpp       |   4 +-
 9 files changed, 273 insertions(+), 77 deletions(-)

diff --git a/.teamcity/files/scripts/powershell/AnalyzeCrashDumps.ps1 
b/.teamcity/files/scripts/powershell/AnalyzeCrashDumps.ps1
new file mode 100644
index 00000000000..673839605e7
--- /dev/null
+++ b/.teamcity/files/scripts/powershell/AnalyzeCrashDumps.ps1
@@ -0,0 +1,31 @@
+$dumpsDir = "%PATH__CRASH_DUMPS%"
+$binDir = "%PATH__CMAKE_BUILD_DIRECTORY%\Debug\bin"
+$cdb = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe"
+$symPath = "$dumpsDir;$binDir"
+$srcPath = "%PATH__WORKING_DIR%"
+
+if (-not (Test-Path $dumpsDir)) {
+    Write-Host "Dumps directory '$dumpsDir' does not exist, skipping."
+    exit 0
+}
+
+$dumps = @(Get-ChildItem -Path $dumpsDir -File -Filter "*.dmp")
+if ($dumps.Count -eq 0) {
+    Write-Host "No dump files found in '$dumpsDir', skipping."
+    exit 0
+}
+
+if (-not (Test-Path $cdb)) {
+    Write-Error "Crash dump analyzer requires cdb.exe, but it was not found at 
the expected path: '$cdb'. " +
+                "Ensure the Windows SDK Debuggers are installed and the path 
is correct."
+    exit 1
+}
+
+foreach ($dump in $dumps) {
+    Write-Host "##teamcity[buildProblem description='Crash dump detected: 
$($dump.Name)']"
+    Write-Host "##teamcity[blockOpened name='Crash analysis: $($dump.Name)']"
+
+    & $cdb -z $dump.FullName -y $symPath -srcpath $srcPath -t 0 -c ".symopt+ 
0x80000; .reload /f; .lines; .ecxr; ~*kp; q"
+
+    Write-Host "##teamcity[blockClosed name='Crash analysis: $($dump.Name)']"
+}
\ No newline at end of file
diff --git 
a/.teamcity/files/scripts/powershell/CollectDebugArtifactsForCrashDumps.ps1 
b/.teamcity/files/scripts/powershell/CollectDebugArtifactsForCrashDumps.ps1
new file mode 100644
index 00000000000..c3618243418
--- /dev/null
+++ b/.teamcity/files/scripts/powershell/CollectDebugArtifactsForCrashDumps.ps1
@@ -0,0 +1,43 @@
+$dumpsDir = "%PATH__CRASH_DUMPS%"
+$binDir = "%PATH__CMAKE_BUILD_DIRECTORY%\Debug\bin"
+
+if (-not (Test-Path $dumpsDir)) {
+    Write-Host "Dumps directory '$dumpsDir' does not exist, skipping."
+    exit 0
+}
+
+$dumps = Get-ChildItem -Path $dumpsDir -File -Filter "*.dmp"
+if ($dumps.Count -eq 0) {
+    Write-Host "Dumps directory '$dumpsDir' is empty, skipping."
+    exit 0
+}
+
+Write-Host "Found $($dumps.Count) dump file(s), collecting binaries from CMake 
build directory."
+
+if (-not (Test-Path $binDir)) {
+    Write-Error "Bin directory '$binDir' does not exist."
+    exit 1
+}
+
+$dumpNames = $dumps | ForEach-Object { ($_.BaseName -split "\.exe")[0] }
+
+$exes = @(Get-ChildItem -Path "$binDir\*" -File -Include "*.exe" |
+    Where-Object { $dumpNames -contains $_.BaseName })
+
+$dlls = @(Get-ChildItem -Path "$binDir\*" -File -Include "*.dll")
+
+$binaryNames = @(($exes + $dlls) | ForEach-Object { $_.BaseName })
+
+$pdbs = @(Get-ChildItem -Path "$binDir\*" -File -Include "*.pdb" |
+    Where-Object { $binaryNames -contains $_.BaseName })
+
+$filesToCopy = @($exes + $dlls + $pdbs)
+if ($filesToCopy.Count -eq 0) {
+    Write-Host "Warning: no matching binaries found in '$binDir'."
+    exit 0
+}
+
+$filesToCopy | ForEach-Object {
+    Copy-Item -Path $_.FullName -Destination $dumpsDir -Force
+    Write-Host "Copied: $($_.Name)"
+}
diff --git a/.teamcity/test/build_types/RunPlatformTests.kt 
b/.teamcity/test/build_types/RunPlatformTests.kt
index ee2d2aece0f..a0ef75a4c01 100644
--- a/.teamcity/test/build_types/RunPlatformTests.kt
+++ b/.teamcity/test/build_types/RunPlatformTests.kt
@@ -15,7 +15,7 @@ object RunPlatformTests : BuildType({
         snapshot(PlatformCppOdbcTestsDebLinux) {}
         snapshot(PlatformCppOdbcTestsRpmLinux) {}
         snapshot(PlatformCppOdbcTestsTgzLinux) {}
-//        snapshot(PlatformCppTestsWindows) {}  // Always falling, under 
investigation
+        snapshot(PlatformCppTestsWindows) {}
         snapshot(PlatformDotnetTestsWindows) {}
         snapshot(PlatformDotnetTestsLinux) {}
         snapshot(RunPythonTests) {}
diff --git a/.teamcity/test/platform_tests/PlatformCppTestsWindows.kt 
b/.teamcity/test/platform_tests/PlatformCppTestsWindows.kt
index 9a538e942a5..a4d9716cd7d 100644
--- a/.teamcity/test/platform_tests/PlatformCppTestsWindows.kt
+++ b/.teamcity/test/platform_tests/PlatformCppTestsWindows.kt
@@ -1,7 +1,7 @@
 package test.platform_tests
 
 import jetbrains.buildServer.configs.kotlin.BuildType
-import jetbrains.buildServer.configs.kotlin.ParameterDisplay
+import jetbrains.buildServer.configs.kotlin.BuildStep
 import jetbrains.buildServer.configs.kotlin.buildFeatures.XmlReport
 import jetbrains.buildServer.configs.kotlin.buildFeatures.xmlReport
 import jetbrains.buildServer.configs.kotlin.buildSteps.*
@@ -9,9 +9,8 @@ import 
jetbrains.buildServer.configs.kotlin.failureConditions.BuildFailureOnMetr
 import 
jetbrains.buildServer.configs.kotlin.failureConditions.BuildFailureOnText
 import 
jetbrains.buildServer.configs.kotlin.failureConditions.failOnMetricChange
 import jetbrains.buildServer.configs.kotlin.failureConditions.failOnText
-import jetbrains.buildServer.configs.kotlin.triggers.vcs
 import org.apache.ignite.teamcity.CustomBuildSteps.Companion.customGradle
-import org.apache.ignite.teamcity.CustomBuildSteps.Companion.customScript
+import org.apache.ignite.teamcity.CustomBuildSteps.Companion.customPowerShell
 import org.apache.ignite.teamcity.Teamcity
 import org.apache.ignite.teamcity.Teamcity.Companion.hiddenText
 
@@ -23,6 +22,7 @@ object PlatformCppTestsWindows : BuildType({
     artifactRules = """
         %PATH__UNIT_TESTS_RESULT% => test_logs
         %PATH__CLIENT_TEST_RESULTS% => test_logs
+        %PATH__CRASH_DUMPS% => crash_dumps
     """.trimIndent()
 
     params {
@@ -30,48 +30,44 @@ object PlatformCppTestsWindows : BuildType({
         hiddenText("PATH__CMAKE_BUILD_DIRECTORY", 
"""%PATH__WORKING_DIR%\cmake-build-debug""")
         hiddenText("PATH__CLIENT_TEST_RESULTS", 
"""%PATH__CMAKE_BUILD_DIRECTORY%\cpp_client_tests_results.xml""")
         hiddenText("PATH__ODBC_TEST_RESULTS", 
"""%PATH__CMAKE_BUILD_DIRECTORY%\odbc_tests_results.xml""")
+        hiddenText("PATH__CRASH_DUMPS", 
"""%PATH__CMAKE_BUILD_DIRECTORY%\dumps""")
         hiddenText("PATH__UNIT_TESTS_RESULT", 
"""%PATH__CMAKE_BUILD_DIRECTORY%\cpp_unit_test_results.xml""")
-        hiddenText("PATH__WORKING_DIR", 
"""%VCSROOT__IGNITE3%\modules\platforms\cpp""")
+        hiddenText("PATH__WORKING_DIR", 
"""%teamcity.build.checkoutDir%\%VCSROOT__IGNITE3%\modules\platforms\cpp""")
         hiddenText("env.CPP_STAGING", """%PATH__WORKING_DIR%\cpp_staging""")
     }
 
     steps {
-        script {
+
+        powerShell {
             name = "Build C++"
-            scriptContent = """
-                @echo on
-                
-                mkdir %PATH__CMAKE_BUILD_DIRECTORY%
-                cd %PATH__CMAKE_BUILD_DIRECTORY%
-                
-                cmake .. -DENABLE_TESTS=ON -DENABLE_ODBC=ON 
-DWARNINGS_AS_ERRORS=ON -DCMAKE_BUILD_TYPE=Debug 
-DCMAKE_INSTALL_PREFIX=%env.CPP_STAGING% -DCMAKE_CONFIGURATION_TYPES="Debug" -G 
"Visual Studio 15 2017" -A x64
-                
-                @echo off
-                if %%ERRORLEVEL%% NEQ 0 (
-                  echo 'CMake configuration failed'
-                  exit 5
-                )
-                @echo on
-                
-                cmake --build . -j8
-                
-                @echo off
-                if %%ERRORLEVEL%% NEQ 0 (
-                  echo 'CMake build failed'
-                  exit 6
-                )
-                @echo on
-                
-                cmake --install .
-                
-                @echo off
-                if %%ERRORLEVEL%% NEQ 0 (
-                  echo 'CMake install failed'
-                  exit 7
-                )
-                @echo on
-            """.trimIndent()
-        }
+            platform = PowerShellStep.Platform.x64
+            scriptMode = script {
+                content = """
+                    ${'$'}ErrorActionPreference = "Stop"
+    
+                    New-Item -ItemType Directory -Force -Path 
"%PATH__CMAKE_BUILD_DIRECTORY%" | Out-Null
+                    Set-Location "%PATH__CMAKE_BUILD_DIRECTORY%"
+    
+                    cmake .. -DENABLE_TESTS=ON -DENABLE_ODBC=ON 
-DWARNINGS_AS_ERRORS=ON -DCMAKE_BUILD_TYPE=Debug 
-DCMAKE_INSTALL_PREFIX="%env.CPP_STAGING%" -DCMAKE_CONFIGURATION_TYPES="Debug" 
-G "Visual Studio 15 2017" -A x64
+                    if (${'$'}LASTEXITCODE -ne 0) {
+                        Write-Error "CMake configuration failed"
+                        exit 1
+                    }
+    
+                    cmake --build . -j8
+                    if (${'$'}LASTEXITCODE -ne 0) {
+                        Write-Error "CMake build failed"
+                        exit 2
+                    }
+    
+                    cmake --install .
+                    if (${'$'}LASTEXITCODE -ne 0) {
+                        Write-Error "CMake install failed"
+                        exit 3
+                    }
+                """.trimIndent()
+                }
+            }
         script {
             name = "Unit tests"
             workingDir = "%PATH__CMAKE_BUILD_DIRECTORY%"
@@ -83,26 +79,66 @@ object PlatformCppTestsWindows : BuildType({
             formatStderrAsError = true
         }
         customGradle {
-            name = "Verify runner is builded"
+            name = "Verify runner is built"
             tasks = ":ignite-runner:integrationTestClasses"
         }
         script {
             name = "C++ Client integration tests"
             workingDir = "%PATH__CMAKE_BUILD_DIRECTORY%"
-            scriptContent = """Debug\bin\ignite-client-test 
--gtest_output=xml:%PATH__CLIENT_TEST_RESULTS%"""
+            scriptContent = """
+                mkdir %PATH__CRASH_DUMPS% 2>nul
+                procdump -accepteula -ma -e -n 1 -x %PATH__CRASH_DUMPS% 
Debug\bin\ignite-client-test --gtest_output=xml:%PATH__CLIENT_TEST_RESULTS%
+                if %%ERRORLEVEL%% NEQ 0 if %%ERRORLEVEL%% NEQ -2 (
+                    echo procdump failed unexpectedly with code %%ERRORLEVEL%%
+                    exit /b 1
+                )
+            """.trimIndent()
             formatStderrAsError = true
         }
+        powerShell {
+            name = "Install ODBC"
+            platform = PowerShellStep.Platform.x64
+            scriptMode = file {
+                path = 
"%PATH__WORKING_DIR%\\ignite\\odbc\\install\\install_win.ps1"
+            }
+            scriptArgs = "install 
\"%PATH__CMAKE_BUILD_DIRECTORY%\\Debug\\bin\\ignite3-odbc.dll\""
+        }
         script {
             name = "ODBC integration tests"
-            enabled = false
             workingDir = "%PATH__CMAKE_BUILD_DIRECTORY%"
-            scriptContent = """Debug\bin\ignite-odbc-test 
--gtest_output=xml:%PATH__ODBC_TEST_RESULTS%"""
+            scriptContent = """
+                mkdir %PATH__CRASH_DUMPS% 2>nul
+                procdump -accepteula -ma -e -n 1 -x %PATH__CRASH_DUMPS% 
Debug\bin\ignite-odbc-test --gtest_output=xml:%PATH__ODBC_TEST_RESULTS%
+                if %%ERRORLEVEL%% NEQ 0 if %%ERRORLEVEL%% NEQ -2 (
+                    echo procdump failed unexpectedly with code %%ERRORLEVEL%%
+                    exit /b 1
+                )
+            """.trimIndent()
             formatStderrAsError = true
         }
+        powerShell {
+            name = "Remove ODBC"
+            platform = PowerShellStep.Platform.x64
+            scriptMode = file {
+                path = 
"%PATH__WORKING_DIR%\\ignite\\odbc\\install\\install_win.ps1"
+            }
+            scriptArgs = "remove"
+            executionMode = BuildStep.ExecutionMode.ALWAYS
+        }
+        customPowerShell {
+            name = "Collect debug artifacts for crash dumps"
+            workingDir = "%PATH__CMAKE_BUILD_DIRECTORY%"
+            executionMode = BuildStep.ExecutionMode.RUN_ON_FAILURE
+        }
+        customPowerShell {
+            name = "Analyze crash dumps"
+            workingDir = "%PATH__CMAKE_BUILD_DIRECTORY%"
+            executionMode = BuildStep.ExecutionMode.RUN_ON_FAILURE
+        }
     }
 
     failureConditions {
-        executionTimeoutMin = 20
+        executionTimeoutMin = 40
         failOnMetricChange {
             metric = BuildFailureOnMetric.MetricType.TEST_COUNT
             threshold = 5
diff --git a/modules/platforms/cpp/ignite/odbc/install/install_win.cmd 
b/modules/platforms/cpp/ignite/odbc/install/install_win.cmd
deleted file mode 100644
index 03a2be40ee8..00000000000
--- a/modules/platforms/cpp/ignite/odbc/install/install_win.cmd
+++ /dev/null
@@ -1,26 +0,0 @@
-@echo off
-
-set ODBC_AMD64=%1
-
-if [%ODBC_AMD64%] == [] (
-       echo error: driver path is not specified. Call format: install_win 
abs_path_to_64_bit_driver
-       pause
-       exit /b 1
-)
-
-if exist %ODBC_AMD64% (
-       for %%i IN (%ODBC_AMD64%) DO IF EXIST %%~si\NUL (
-               echo warning: The path you have specified seems to be a 
directory. Note that you have to specify path to driver file itself instead.
-       )
-       echo Installing 64-bit driver: %ODBC_AMD64%
-       reg add "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Apache Ignite" 
/v DriverODBCVer /t REG_SZ /d "03.80" /f
-       reg add "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Apache Ignite" 
/v UsageCount /t REG_DWORD /d 00000001 /f
-       reg add "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Apache Ignite" 
/v Driver /t REG_SZ /d %ODBC_AMD64% /f
-       reg add "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Apache Ignite" 
/v Setup /t REG_SZ /d %ODBC_AMD64% /f
-       reg add "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers" /v 
"Apache Ignite 3" /t REG_SZ /d "Installed" /f
-) else (
-       echo 64-bit driver can not be found: %ODBC_AMD64%
-       echo Call format: install_win abs_path_to_64_bit_driver
-       pause
-       exit /b 1
-)
diff --git a/modules/platforms/cpp/ignite/odbc/install/install_win.ps1 
b/modules/platforms/cpp/ignite/odbc/install/install_win.ps1
new file mode 100644
index 00000000000..eb3f9c8e9c8
--- /dev/null
+++ b/modules/platforms/cpp/ignite/odbc/install/install_win.ps1
@@ -0,0 +1,102 @@
+param (
+    [Parameter(Mandatory = $true, Position = 0, HelpMessage = "Mode of 
operation: 'install' or 'remove'.")]
+    [ValidateSet("install", "remove")]
+    [string]$Mode,
+
+    [Parameter(Position = 1, HelpMessage = "Absolute path to the ODBC driver 
file. Required for 'install' mode.")]
+    [string]$DriverPath
+)
+
+# Treat all errors as terminating so unhandled failures always produce a 
non-zero exit code.
+$ErrorActionPreference = 'Stop'
+
+# Check for administrator privileges explicitly so the error is clear in the 
build log.
+$isAdmin = ([Security.Principal.WindowsPrincipal] 
[Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
+    [Security.Principal.WindowsBuiltInRole]::Administrator
+)
+if (-not $isAdmin) {
+    Write-Error "This script must be run as Administrator. Ensure the TeamCity 
build agent service account has the required privileges."
+    exit 1
+}
+
+$DriverName  = "Apache Ignite 3"
+$OdbcInstKey = "HKLM:\SOFTWARE\ODBC\ODBCINST.INI\$DriverName"
+$OdbcDrvKey  = "HKLM:\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"
+
+# ============================================================
+# INSTALL
+# ============================================================
+if ($Mode -eq "install") {
+
+    # --- Validate DriverPath was supplied ---
+    if (-not $DriverPath) {
+        Write-Error "DriverPath is required in 'install' mode. Call format: 
.\install_win.ps1 install <abs_path_to_driver>"
+        exit 1
+    }
+
+    # --- Validate the path points to an existing file (not a directory) ---
+    if (-not (Test-Path -LiteralPath $DriverPath)) {
+        Write-Error "Driver cannot be found: $DriverPath"
+        exit 1
+    }
+
+    if (Test-Path -LiteralPath $DriverPath -PathType Container) {
+        Write-Error "The path '$DriverPath' is a directory. You must specify 
the path to the driver file itself, not its folder."
+        exit 1
+    }
+
+    # --- Install the driver ---
+    Write-Host "Installing ODBC driver: $DriverPath"
+
+    # Create the driver sub-key if it doesn't exist
+    if (-not (Test-Path -LiteralPath $OdbcInstKey)) {
+        New-Item -Path $OdbcInstKey -Force | Out-Null
+    }
+
+    # Write driver properties
+    New-ItemProperty -LiteralPath $OdbcInstKey -Name "DriverODBCVer" -Value 
"03.80"     -PropertyType String -Force | Out-Null
+    New-ItemProperty -LiteralPath $OdbcInstKey -Name "UsageCount"    -Value 1  
         -PropertyType DWord  -Force | Out-Null
+    New-ItemProperty -LiteralPath $OdbcInstKey -Name "Driver"        -Value 
$DriverPath -PropertyType String -Force | Out-Null
+    New-ItemProperty -LiteralPath $OdbcInstKey -Name "Setup"         -Value 
$DriverPath -PropertyType String -Force | Out-Null
+
+    # Register the driver name in the ODBC Drivers list
+    if (-not (Test-Path -LiteralPath $OdbcDrvKey)) {
+        New-Item -Path $OdbcDrvKey -Force | Out-Null
+    }
+    New-ItemProperty -LiteralPath $OdbcDrvKey -Name $DriverName -Value 
"Installed" -PropertyType String -Force | Out-Null
+
+    Write-Host "Driver '$DriverName' installed successfully."
+}
+
+# ============================================================
+# REMOVE
+# ============================================================
+elseif ($Mode -eq "remove") {
+
+    $removedSomething = $false
+
+    # Remove the driver properties key
+    if (Test-Path -LiteralPath $OdbcInstKey) {
+        Remove-Item -LiteralPath $OdbcInstKey -Recurse -Force
+        Write-Host "Removed registry key: $OdbcInstKey"
+        $removedSomething = $true
+    } else {
+        Write-Warning "Driver key not found (already removed?): $OdbcInstKey"
+    }
+
+    # Remove the entry from the ODBC Drivers list
+    $drvProperty = Get-ItemProperty -LiteralPath $OdbcDrvKey -Name $DriverName 
-ErrorAction SilentlyContinue
+    if ($null -ne $drvProperty) {
+        Remove-ItemProperty -LiteralPath $OdbcDrvKey -Name $DriverName -Force
+        Write-Host "Removed '$DriverName' from ODBC Drivers list."
+        $removedSomething = $true
+    } else {
+        Write-Warning "Driver entry not found in ODBC Drivers list (already 
removed?): $DriverName"
+    }
+
+    if ($removedSomething) {
+        Write-Host "Driver '$DriverName' removed successfully."
+    } else {
+        Write-Host "Nothing to remove - driver '$DriverName' was not 
registered."
+    }
+}
diff --git a/modules/platforms/cpp/tests/client-test/main.cpp 
b/modules/platforms/cpp/tests/client-test/main.cpp
index 9139c2e6119..2b1e3749e8e 100644
--- a/modules/platforms/cpp/tests/client-test/main.cpp
+++ b/modules/platforms/cpp/tests/client-test/main.cpp
@@ -71,24 +71,28 @@ int main(int argc, char **argv) {
 
     ignite_runner runner;
     set_process_abort_handler([&](int signal) {
-        std::cout << "Caught signal " << signal << " during tests" << 
std::endl;
+        std::cerr << "Caught signal " << signal << " during tests" << 
std::endl;
 
         runner.stop();
     });
 
     if (!check_test_node_connectable(std::chrono::seconds(5))) {
         runner.start();
-        ensure_node_connectable(std::chrono::seconds(60));
+        auto timeout = std::chrono::minutes(5);
+        if (!check_test_node_connectable(timeout)) {
+            std::cerr << "Failed to start node within timeout: " << 
timeout.count() << "min"  << std::endl;
+            return 3;
+        }
     }
 
     try {
         ::testing::InitGoogleTest(&argc, argv);
         [[maybe_unused]] int run_res = RUN_ALL_TESTS();
     } catch (const std::exception &err) {
-        std::cout << "Uncaught error: " << err.what() << std::endl;
+        std::cerr << "Uncaught error: " << err.what() << std::endl;
         return 1;
     } catch (...) {
-        std::cout << "Unknown uncaught error" << std::endl;
+        std::cerr << "Unknown uncaught error" << std::endl;
         return 2;
     }
 
diff --git a/modules/platforms/cpp/tests/odbc-test/main.cpp 
b/modules/platforms/cpp/tests/odbc-test/main.cpp
index 9139c2e6119..d022a8932e1 100644
--- a/modules/platforms/cpp/tests/odbc-test/main.cpp
+++ b/modules/platforms/cpp/tests/odbc-test/main.cpp
@@ -78,7 +78,11 @@ int main(int argc, char **argv) {
 
     if (!check_test_node_connectable(std::chrono::seconds(5))) {
         runner.start();
-        ensure_node_connectable(std::chrono::seconds(60));
+        auto timeout = std::chrono::minutes(5);
+        if (!check_test_node_connectable(timeout)) {
+            std::cerr << "Failed to start node within timeout: " << 
timeout.count() << "min"  << std::endl;
+            return 3;
+        }
     }
 
     try {
diff --git a/modules/platforms/cpp/tests/odbc-test/transaction_test.cpp 
b/modules/platforms/cpp/tests/odbc-test/transaction_test.cpp
index 1c1c1558785..d5aa3649939 100644
--- a/modules/platforms/cpp/tests/odbc-test/transaction_test.cpp
+++ b/modules/platforms/cpp/tests/odbc-test/transaction_test.cpp
@@ -657,5 +657,7 @@ TEST_F(transaction_test, 
heartbeat_disable_connection_is_closed) {
 
     ret = SQLEndTran(SQL_HANDLE_ENV, m_env, SQL_ROLLBACK);
 
-    EXPECT_EQ(ret, SQL_ERROR);
+    std::cout << "Error message: " << get_odbc_error_message(SQL_HANDLE_ENV, 
m_env) << std::endl;
+
+    EXPECT_TRUE(ret == SQL_ERROR || ret == SQL_SUCCESS_WITH_INFO);
 }

Reply via email to