feat(ODBC): nix shells for mssql and oracle #5144 (#5145)

* feat(ODBC): nix shells for mssql and oracle #5144

* fix(cmake): not using cppignore #5146

* fix(Data/ODBC): Improve Nix CI container startup and debugging

Oracle (oracle.nix):
- Add --shm-size=1g for Oracle container (requires 1GB shared memory)
- Add container state verification before exec commands
- Add proper error handling with container log output on failure
- Add pre-flight checks in build_and_test to verify container running
- Add Podman environment info for CI debugging
- Add progress indicators during Oracle startup wait
- Exit with error in CI mode if container fails to start

MSSQL (mssql.nix):
- Add ODBCINSTINI environment variable
- Add sync command to flush ODBC configs to disk
- Add odbcinst verification commands

Temporarily disable all ci except nix #5144

* try newer oracle version

* use ubuntu 24.04 for nix ci (podman related)

* chore(c): restore ci.yml

* Update Data/ODBC/oracle.nix

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Data/ODBC/oracle.nix

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Data/ODBC/mssql.nix

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Data/ODBC/oracle.nix

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(odbc): verify oracle downloads #5144

* chore(doc): update nix documentation #5144

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Aleksandar Fabijanic
2026-01-04 22:13:58 -06:00
committed by GitHub
parent 539de0d0ca
commit bd09152aff
28 changed files with 1032 additions and 24 deletions

View File

@@ -1029,6 +1029,54 @@ jobs:
PWD=`pwd`
ctest --output-on-failure
nix-gcc-make-odbc-sqlserver:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Install Nix
uses: cachix/install-nix-action@v27
with:
nix_path: nixpkgs=channel:nixos-unstable
- name: Install uidmap for rootless podman
run: sudo apt-get update && sudo apt-get install -y uidmap
- name: Configure subuid/subgid for rootless podman
run: |
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER
- uses: ./.github/actions/retry-action
with:
timeout_minutes: 90
max_attempts: 3
retry_on: any
command: nix-shell Data/ODBC/mssql.nix --pure --run "build_and_test"
nix-gcc-make-odbc-oracle:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Install Nix
uses: cachix/install-nix-action@v27
with:
nix_path: nixpkgs=channel:nixos-unstable
- name: Install uidmap for rootless podman
run: sudo apt-get update && sudo apt-get install -y uidmap
- name: Configure subuid/subgid for rootless podman
run: |
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER
- uses: ./.github/actions/retry-action
with:
timeout_minutes: 90
max_attempts: 3
retry_on: any
command: nix-shell Data/ODBC/oracle.nix --pure --run "build_and_test"
linux-gcc-cmake-sqlite-no-sqlparser:
runs-on: ubuntu-24.04
steps:

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/ActiveRecord-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME ActiveRecord
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ActiveRecord-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND ActiveRecord-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(ActiveRecord PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/CppParser-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME CppParser
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND CppParser-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND CppParser-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(CppParser PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/Crypto-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME Crypto
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND Crypto-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND Crypto-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(Crypto PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/DataMySQL-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME DataMySQL
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND DataMySQL-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND DataMySQL-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(DataMySQL PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

2
Data/ODBC/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.nix-mssql-data/
.nix-oracle-data/

268
Data/ODBC/mssql.nix Normal file
View File

@@ -0,0 +1,268 @@
# Nix shell environment for running Poco::Data::ODBC tests with SQL Server.
#
# Install Nix (if not already installed):
# sh <(curl -L https://nixos.org/nix/install) --daemon
#
# Prerequisites (Debian/Ubuntu):
# sudo apt-get install uidmap
#
# Usage:
# nix-shell mssql.nix [--pure]
#
# (--pure is recommended to avoid interference from host environment)
#
# This sets up SQL Server via Podman with the Microsoft ODBC driver,
# and configures the Poco build environment. The database starts
# automatically and stops when the shell exits.
#
# Test database: model (user: sa, password: Pocopoco1)
#
# Notes:
# - On first run, you may be prompted for sudo password to configure
# subuid/subgid for rootless podman (one-time setup).
# - The Microsoft ODBC driver (msodbcsql18) is unfree software;
# this shell.nix automatically allows it.
#
# Cleanup/Reset:
# To completely reset the environment (e.g., for a fresh start):
# podman stop poco-mssql-test && podman rm poco-mssql-test
# rm -rf Data/ODBC/.nix-mssql-data
# This removes the container and all cached data (ODBC config).
{
pkgs ? import <nixpkgs> {
config = {
allowUnfreePredicate = pkg:
let name = pkg.pname or (builtins.parseDrvName pkg.name).name;
in builtins.elem name [ "msodbcsql18" ];
};
}
}:
let
dataDir = builtins.toString ./.nix-mssql-data;
containerName = "poco-mssql-test";
mssqlPassword = "Pocopoco1";
mssqlPort = "1433";
in
pkgs.mkShell {
buildInputs = with pkgs; [
# Container runtime
podman
# Database tools
unixODBC
unixODBCDrivers.msodbcsql18
libtool # for libltdl
# Build tools
cmake
pkg-config
gnumake
gcc
clang
openssl
zlib
pcre2
# Standard utilities needed by Poco build
coreutils
findutils
gnugrep
gnused
gawk
hostname
which
procps # ps, pgrep, etc.
inetutils # netstat, etc.
];
# ODBC configuration for Poco build
POCO_ODBC_INCLUDE = "${pkgs.unixODBC}/include";
POCO_ODBC_LIB = "${pkgs.unixODBC}/lib";
ODBCSYSINI = "${dataDir}/odbc";
ODBCINSTINI = "odbcinst.ini";
ODBCINI = "${dataDir}/odbc/odbc.ini";
# SQL Server connection info for tests
POCO_ODBC_TEST_DATABASE_SERVER = "127.0.0.1";
shellHook = ''
export DATA_DIR="${dataDir}"
export CONTAINER_NAME="${containerName}"
export MSSQL_PASSWORD="${mssqlPassword}"
export MSSQL_PORT="${mssqlPort}"
mkdir -p "$DATA_DIR" "$ODBCSYSINI" "$HOME/.config/containers"
# Add system paths for setuid binaries needed by rootless podman
export PATH="$PATH:/usr/bin:/usr/sbin"
# Check for newuidmap (required for rootless podman)
if ! command -v newuidmap >/dev/null 2>&1; then
echo "ERROR: newuidmap not found. On Debian/Ubuntu, install with:"
echo " sudo apt-get install uidmap"
echo "Then re-enter this nix-shell."
fi
# Check and configure subuid/subgid for rootless podman
if ! grep -q "^$USER:" /etc/subuid 2>/dev/null; then
echo "Rootless podman requires subuid/subgid configuration."
SUDO_CMD=""
for s in /usr/bin/sudo /run/wrappers/bin/sudo /usr/local/bin/sudo; do
[ -x "$s" ] && SUDO_CMD="$s" && break
done
if [ -n "$SUDO_CMD" ]; then
echo "Running: $SUDO_CMD usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER"
"$SUDO_CMD" usermod --add-subuids 100000-165535 --add-subgids 100000-165535 "$USER"
else
echo "ERROR: sudo not found. Please run outside the nix-shell:"
echo " sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER"
fi
fi
# Always run podman system migrate to pick up PATH and subuid changes
podman system migrate 2>/dev/null || true
# Configure Podman policy for rootless mode if not present
if [ ! -f "$HOME/.config/containers/policy.json" ]; then
cat > "$HOME/.config/containers/policy.json" << 'POLICYJSON'
{
"default": [
{
"type": "insecureAcceptAnything"
}
]
}
POLICYJSON
fi
# Configure Poco and source environment
POCO_BASE="$(cd "$DATA_DIR/../../.." && pwd)"
(cd "$POCO_BASE" && ./configure)
source "$POCO_BASE/poco_env.bash"
# Add ODBC driver and its dependencies to library path (after poco_env.bash which sets LD_LIBRARY_PATH)
export LD_LIBRARY_PATH="${pkgs.unixODBCDrivers.msodbcsql18}/lib:${pkgs.openssl.out}/lib:${pkgs.stdenv.cc.cc.lib}/lib:${pkgs.unixODBC}/lib''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
cat > "$ODBCSYSINI/odbcinst.ini" << EOF
[ODBC Driver 18 for SQL Server]
Description = Microsoft ODBC Driver 18 for SQL Server
Driver = ${pkgs.unixODBCDrivers.msodbcsql18}/lib/libmsodbcsql-18.1.so.1.1
UsageCount = 1
EOF
cat > "$ODBCINI" << EOF
[PocoDataSQLServerTest]
Description = Poco SQL Server Test Database
Driver = ODBC Driver 18 for SQL Server
Server = 127.0.0.1
Port = 1433
Database = model
TrustServerCertificate = yes
Encrypt = no
EOF
# Flush files to disk to avoid potential race conditions
sync
# Verify ODBC configuration
echo "Verifying ODBC configuration..."
odbcinst -j
echo "Registered drivers:"
odbcinst -q -d
echo "Registered DSNs:"
odbcinst -q -s
start_mssql() {
if ! podman ps --format '{{.Names}}' | grep -q "^${containerName}$"; then
# Check if container exists but is stopped
if podman ps -a --format '{{.Names}}' | grep -q "^${containerName}$"; then
echo "Starting existing SQL Server container..."
podman start "$CONTAINER_NAME"
else
echo "Creating and starting SQL Server container..."
podman run -d --replace \
--name "$CONTAINER_NAME" \
-e "ACCEPT_EULA=Y" \
-e "MSSQL_SA_PASSWORD=$MSSQL_PASSWORD" \
-e "MSSQL_PID=Express" \
-p "$MSSQL_PORT:1433" \
mcr.microsoft.com/mssql/server:2022-latest
fi
echo "Waiting for SQL Server to be ready..."
for i in $(seq 1 30); do
if podman exec "$CONTAINER_NAME" /opt/mssql-tools18/bin/sqlcmd \
-S localhost -U sa -P "$MSSQL_PASSWORD" \
-C -Q "SELECT 1" > /dev/null 2>&1; then
echo "SQL Server is ready!"
break
fi
if [ "$i" -eq 30 ]; then
echo "Warning: SQL Server may not be fully ready yet"
fi
sleep 2
done
else
echo "SQL Server container already running"
fi
}
stop_mssql() {
if podman ps --format '{{.Names}}' | grep -q "^${containerName}$"; then
echo "Stopping SQL Server container..."
podman stop "$CONTAINER_NAME" > /dev/null 2>&1 || true
fi
}
remove_mssql() {
stop_mssql
if podman ps -a --format '{{.Names}}' | grep -q "^${containerName}$"; then
echo "Removing SQL Server container..."
podman rm "$CONTAINER_NAME" > /dev/null 2>&1 || true
fi
}
mssql_shell() {
podman exec -it "$CONTAINER_NAME" /opt/mssql-tools18/bin/sqlcmd \
-S localhost -U sa -P "$MSSQL_PASSWORD" -C
}
build_and_test() {
echo "Building Poco ODBC components..."
make -s -j$(nproc) -C "$POCO_BASE/CppUnit"
make -s -j$(nproc) -C "$POCO_BASE/Foundation"
make -s -j$(nproc) -C "$POCO_BASE/Data"
make -s -j$(nproc) -C "$POCO_BASE/Data/DataTest"
make -s -j$(nproc) -C "$POCO_BASE/Data/ODBC"
make -s -j$(nproc) -C "$POCO_BASE/Data/ODBC/testsuite"
echo "Running ODBC tests..."
"$POCO_BASE/Data/ODBC/testsuite/bin/$OSNAME/$OSARCH/testrunner" -all
}
trap stop_mssql EXIT
export -f start_mssql stop_mssql remove_mssql mssql_shell build_and_test
# Auto-start database
start_mssql
# For CI, use: nix-shell mssql.nix --pure --run "build_and_test"
if [ -t 0 ]; then
echo ""
echo "=== Poco SQL Server ODBC Test Environment ==="
echo "Container: $CONTAINER_NAME"
echo ""
echo "Commands:"
echo " build_and_test - Build and run tests"
echo " start_mssql - Start the SQL Server container"
echo " stop_mssql - Stop the SQL Server container"
echo " remove_mssql - Stop and remove the SQL Server container"
echo " mssql_shell - Open SQL Server command line"
echo ""
fi
'';
}

571
Data/ODBC/oracle.nix Normal file
View File

@@ -0,0 +1,571 @@
# Nix shell environment for running Poco::Data::ODBC tests with Oracle.
#
# Install Nix (if not already installed):
# sh <(curl -L https://nixos.org/nix/install) --daemon
#
# Usage:
# nix-shell oracle.nix [--pure]
#
# (--pure is recommended to avoid interference from host environment)
#
# This sets up Oracle Free via Podman with the Oracle Instant Client ODBC driver,
# and configures the Poco build environment. The database starts
# automatically and stops when the shell exits.
#
# Test database: FREEPDB1 (user: poco, password: poco)
#
# Notes:
# - On first run, you may be prompted for sudo password to configure
# subuid/subgid for rootless podman (one-time setup).
# - Oracle Instant Client is downloaded automatically on first run.
# - The Oracle Free container image is publicly available (no login required).
# - The Oracle container image is large (~1.5GB) and may take time to download.
# - Oracle startup takes several minutes; be patient on first run.
#
# Cleanup/Reset:
# To completely reset the environment (e.g., after failed download or for a fresh start):
# podman stop poco-oracle-test && podman rm poco-oracle-test
# rm -rf Data/ODBC/.nix-oracle-data
# This removes the container and all cached data (ODBC config, Oracle Instant Client).
{ pkgs ? import <nixpkgs> {} }:
let
dataDir = builtins.toString ./.nix-oracle-data;
containerName = "poco-oracle-test";
oraclePassword = "poco";
oraclePort = "1521";
instantClientVersion = "23_26";
instantClientFullVersion = "23.26.0.0.0";
instantClientPathVersion = "2326000";
# SHA256 checksums for Oracle Instant Client packages
# To update: download the files manually and run `sha256sum <filename>`
# Or run with placeholders first - the script will compute and print the actual hashes.
#
# x64 checksums for version 23.26.0.0.0:
# (Set to "placeholder-update-after-first-download" to compute on first run)
instantClientBasicSha256_x64 = "placeholder-update-after-first-download";
instantClientOdbcSha256_x64 = "placeholder-update-after-first-download";
# ARM64 uses "latest" URLs without version numbers - hashes may change when Oracle updates
instantClientBasicSha256_arm64 = "9c9a32051e97f087016fb334b7ad5c0aea8511ca8363afd8e0dc6ec4fc515c32";
instantClientOdbcSha256_arm64 = "11b2d0d53b15145a79b00837bbd6556314486f28e734ba909695c6f051c5d279";
in
pkgs.mkShell {
buildInputs = with pkgs; [
# Container runtime
podman
# Database tools
unixODBC
libtool # for libltdl
libaio # required by Oracle Instant Client
# Download tools
curl
unzip
cacert # SSL certificates for curl
# Build tools
cmake
pkg-config
gnumake
gcc
clang
openssl
zlib
pcre2
# Standard utilities needed by Poco build
coreutils
findutils
gnugrep
gnused
gawk
hostname
which
procps # ps, pgrep, etc.
inetutils # netstat, etc.
];
# ODBC configuration for Poco build
POCO_ODBC_INCLUDE = "${pkgs.unixODBC}/include";
POCO_ODBC_LIB = "${pkgs.unixODBC}/lib";
ODBCSYSINI = "${dataDir}/odbc";
ODBCINSTINI = "odbcinst.ini";
ODBCINI = "${dataDir}/odbc/odbc.ini";
# Oracle connection info for tests
POCO_ODBC_TEST_DATABASE_SERVER = "127.0.0.1";
shellHook = ''
export DATA_DIR="${dataDir}"
export CONTAINER_NAME="${containerName}"
export ORACLE_PASSWORD="${oraclePassword}"
export ORACLE_PORT="${oraclePort}"
export INSTANT_CLIENT_VERSION="${instantClientVersion}"
export INSTANT_CLIENT_DIR="$DATA_DIR/instantclient_${instantClientVersion}"
mkdir -p "$DATA_DIR" "$ODBCSYSINI" "$HOME/.config/containers"
# Set SSL certificate path for curl
export SSL_CERT_FILE="${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
# Add system paths for setuid binaries needed by rootless podman
export PATH="$PATH:/usr/bin:/usr/sbin"
# Check for newuidmap (required for rootless podman)
if ! command -v newuidmap >/dev/null 2>&1; then
echo "ERROR: newuidmap not found. On Debian/Ubuntu, install with:"
echo " sudo apt-get install uidmap"
echo "Then re-enter this nix-shell."
fi
# Check and configure subuid/subgid for rootless podman
if ! grep -q "^$USER:" /etc/subuid 2>/dev/null; then
echo "Rootless podman requires subuid/subgid configuration."
SUDO_CMD=""
for s in /usr/bin/sudo /run/wrappers/bin/sudo /usr/local/bin/sudo; do
[ -x "$s" ] && SUDO_CMD="$s" && break
done
if [ -n "$SUDO_CMD" ]; then
echo "Running: $SUDO_CMD usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER"
"$SUDO_CMD" usermod --add-subuids 100000-165535 --add-subgids 100000-165535 "$USER"
else
echo "ERROR: sudo not found. Please run outside the nix-shell:"
echo " sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER"
fi
fi
# Always run podman system migrate to pick up PATH and subuid changes
podman system migrate 2>/dev/null || true
# Show Podman info for debugging CI issues
echo "=== Podman Environment ==="
podman --version
echo "Podman info:"
podman info --format '{{.Host.OS}} {{.Host.Arch}} {{.Host.MemTotal}} {{.Host.SwapTotal}}' 2>/dev/null || true
echo "Storage driver: $(podman info --format '{{.Store.GraphDriverName}}' 2>/dev/null || echo 'unknown')"
echo "==========================="
# Configure Podman policy for rootless mode if not present
if [ ! -f "$HOME/.config/containers/policy.json" ]; then
cat > "$HOME/.config/containers/policy.json" << 'POLICYJSON'
{
"default": [
{
"type": "insecureAcceptAnything"
}
]
}
POLICYJSON
fi
# Download Oracle Instant Client if not present
if [ ! -d "$INSTANT_CLIENT_DIR" ]; then
(
set -e # Exit subshell on any error
echo "Downloading Oracle Instant Client..."
mkdir -p "$DATA_DIR/downloads"
cd "$DATA_DIR/downloads"
# Detect architecture and set download URLs and expected checksums
# Note: ARM64 uses different URL format than x64
ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ]; then
BASIC_URL="https://download.oracle.com/otn_software/linux/instantclient/${instantClientPathVersion}/instantclient-basic-linux.x64-${instantClientFullVersion}.zip"
ODBC_URL="https://download.oracle.com/otn_software/linux/instantclient/${instantClientPathVersion}/instantclient-odbc-linux.x64-${instantClientFullVersion}.zip"
BASIC_ZIP="instantclient-basic-linux.x64-${instantClientFullVersion}.zip"
ODBC_ZIP="instantclient-odbc-linux.x64-${instantClientFullVersion}.zip"
EXPECTED_BASIC_SHA256="${instantClientBasicSha256_x64}"
EXPECTED_ODBC_SHA256="${instantClientOdbcSha256_x64}"
elif [ "$ARCH" = "aarch64" ]; then
# ARM64 uses simplified URLs without version numbers
BASIC_URL="https://download.oracle.com/otn_software/linux/instantclient/instantclient-basic-linux-arm64.zip"
ODBC_URL="https://download.oracle.com/otn_software/linux/instantclient/instantclient-odbc-linux-arm64.zip"
BASIC_ZIP="instantclient-basic-linux-arm64.zip"
ODBC_ZIP="instantclient-odbc-linux-arm64.zip"
EXPECTED_BASIC_SHA256="${instantClientBasicSha256_arm64}"
EXPECTED_ODBC_SHA256="${instantClientOdbcSha256_arm64}"
else
echo "ERROR: Unsupported architecture: $ARCH"
exit 1
fi
echo "Downloading: $BASIC_URL"
curl -L -f -o "$BASIC_ZIP" "$BASIC_URL" || { echo "ERROR: Failed to download basic package"; exit 1; }
echo "Downloading: $ODBC_URL"
curl -L -f -o "$ODBC_ZIP" "$ODBC_URL" || { echo "ERROR: Failed to download ODBC package"; exit 1; }
# Validate downloaded files are actual ZIP files (not HTML error pages)
echo "Validating downloaded files..."
for zipfile in "$BASIC_ZIP" "$ODBC_ZIP"; do
filesize=$({ stat -c%s "$zipfile" 2>/dev/null || stat -f%z "$zipfile" 2>/dev/null || wc -c <"$zipfile"; })
if [ -z "$filesize" ]; then
echo "ERROR: Failed to determine size of $zipfile"
exit 1
fi
echo " $zipfile: $filesize bytes"
if [ "$filesize" -lt 100000 ]; then
echo "ERROR: $zipfile is too small ($filesize bytes) - likely an error page"
echo "Contents:"
head -20 "$zipfile"
exit 1
fi
# Check ZIP magic number (PK)
if ! head -c2 "$zipfile" | grep -q "PK"; then
echo "ERROR: $zipfile is not a valid ZIP file"
echo "First 100 bytes:"
head -c100 "$zipfile"
exit 1
fi
done
# Verify SHA256 checksums for integrity/security
echo "Verifying SHA256 checksums..."
CHECKSUM_FILE="$DATA_DIR/checksums-$ARCH.txt"
verify_sha256() {
local file="$1"
local expected="$2"
local varname="$3"
local actual
actual=$(sha256sum "$file" | cut -d' ' -f1)
# Save computed checksum to file for easy updating of oracle.nix
echo "$varname = \"$actual\";" >> "$CHECKSUM_FILE"
if [ "$expected" = "placeholder-update-after-first-download" ]; then
echo "WARNING: No checksum configured for $file"
echo " Computed SHA256: $actual"
echo " Please update oracle.nix with this checksum for security."
return 0
fi
if [ "$actual" != "$expected" ]; then
echo "ERROR: SHA256 checksum mismatch for $file"
echo " Expected: $expected"
echo " Actual: $actual"
echo ""
echo "This could indicate a corrupted download or a security compromise."
echo "If Oracle has released a new version, update the checksums in oracle.nix."
return 1
fi
echo " $file: OK"
return 0
}
rm -f "$CHECKSUM_FILE"
NEEDS_CHECKSUM_UPDATE=0
if [ "$ARCH" = "x86_64" ]; then
verify_sha256 "$BASIC_ZIP" "$EXPECTED_BASIC_SHA256" "instantClientBasicSha256_x64" || exit 1
verify_sha256 "$ODBC_ZIP" "$EXPECTED_ODBC_SHA256" "instantClientOdbcSha256_x64" || exit 1
[[ "$EXPECTED_BASIC_SHA256" == "placeholder"* ]] && NEEDS_CHECKSUM_UPDATE=1
[[ "$EXPECTED_ODBC_SHA256" == "placeholder"* ]] && NEEDS_CHECKSUM_UPDATE=1
else
verify_sha256 "$BASIC_ZIP" "$EXPECTED_BASIC_SHA256" "instantClientBasicSha256_arm64" || exit 1
verify_sha256 "$ODBC_ZIP" "$EXPECTED_ODBC_SHA256" "instantClientOdbcSha256_arm64" || exit 1
[[ "$EXPECTED_BASIC_SHA256" == "placeholder"* ]] && NEEDS_CHECKSUM_UPDATE=1
[[ "$EXPECTED_ODBC_SHA256" == "placeholder"* ]] && NEEDS_CHECKSUM_UPDATE=1
fi
if [ "$NEEDS_CHECKSUM_UPDATE" -eq 1 ] && [ -f "$CHECKSUM_FILE" ]; then
echo ""
echo "=== Copy these checksums to oracle.nix ==="
cat "$CHECKSUM_FILE"
echo "==========================================="
fi
echo "Extracting Oracle Instant Client..."
unzip -o "$BASIC_ZIP" -d "$DATA_DIR"
unzip -o "$ODBC_ZIP" -d "$DATA_DIR"
)
download_status=$?
# Check if download subshell succeeded
if [ "$download_status" -ne 0 ]; then
echo ""
echo "=== ORACLE INSTANT CLIENT DOWNLOAD FAILED ==="
echo "Could not download or extract Oracle Instant Client."
echo "Please check network connectivity and try again."
echo ""
if [ ! -t 0 ]; then
exit 1
fi
fi
# Find the actual extracted directory (version may differ)
EXTRACTED_DIR=$(ls -d "$DATA_DIR"/instantclient_* 2>/dev/null | head -1)
if [ -n "$EXTRACTED_DIR" ] && [ "$EXTRACTED_DIR" != "$INSTANT_CLIENT_DIR" ]; then
echo "Linking $EXTRACTED_DIR to $INSTANT_CLIENT_DIR"
ln -sfn "$(basename "$EXTRACTED_DIR")" "$INSTANT_CLIENT_DIR"
fi
fi
# Configure Poco and source environment
POCO_BASE="$(cd "$DATA_DIR/../../.." && pwd)"
(cd "$POCO_BASE" && ./configure)
source "$POCO_BASE/poco_env.bash"
# Add Oracle Instant Client and ODBC dependencies to library path
export LD_LIBRARY_PATH="$INSTANT_CLIENT_DIR:${pkgs.libaio}/lib:${pkgs.openssl.out}/lib:${pkgs.stdenv.cc.cc.lib}/lib:${pkgs.unixODBC}/lib''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
# Find the ODBC driver library
echo "Looking for Oracle ODBC driver in: $INSTANT_CLIENT_DIR"
ls -la "$INSTANT_CLIENT_DIR"/libsqora* 2>/dev/null || echo "No libsqora files found"
ODBC_DRIVER_LIB=$(ls "$INSTANT_CLIENT_DIR"/libsqora.so* 2>/dev/null | head -1)
if [ -z "$ODBC_DRIVER_LIB" ]; then
echo "WARNING: Oracle ODBC driver library not found in $INSTANT_CLIENT_DIR"
echo "Contents of $INSTANT_CLIENT_DIR:"
ls -la "$INSTANT_CLIENT_DIR/" 2>/dev/null || echo "(failed to list directory)"
echo "No Oracle ODBC driver will be configured; odbcinst.ini may be invalid."
else
echo "Using ODBC driver library: $ODBC_DRIVER_LIB"
fi
cat > "$ODBCSYSINI/odbcinst.ini" << EOF
[Oracle 23 ODBC driver]
Description = Oracle ODBC driver for Oracle 23
Driver = $ODBC_DRIVER_LIB
UsageCount = 1
EOF
echo "Wrote odbcinst.ini:"
cat "$ODBCSYSINI/odbcinst.ini"
cat > "$ODBCINI" << EOF
[PocoDataOracleTest]
Description = Poco Oracle Test Database
Driver = Oracle 23 ODBC driver
ServerName = //127.0.0.1:${oraclePort}/FREEPDB1
UserID = poco
Password = poco
EOF
# Flush files to disk to avoid potential race conditions
sync
# Verify ODBC configuration is correct
echo "Verifying ODBC configuration..."
odbcinst -j
echo "Registered drivers:"
odbcinst -q -d
echo "Registered DSNs:"
odbcinst -q -s
start_oracle() {
if ! podman ps --format '{{.Names}}' | grep -q "^${containerName}$"; then
# Check if container exists but is stopped
if podman ps -a --format '{{.Names}}' | grep -q "^${containerName}$"; then
echo "Starting existing Oracle container..."
if ! podman start "$CONTAINER_NAME"; then
echo "ERROR: Failed to start existing container. Removing and recreating..."
podman rm -f "$CONTAINER_NAME" 2>/dev/null || true
fi
fi
# Check if we need to create a new container
if ! podman ps --format '{{.Names}}' | grep -q "^${containerName}$"; then
echo "Creating and starting Oracle container (this may take a while on first run)..."
# Oracle requires at least 1GB of shared memory
if ! podman run -d --replace \
--name "$CONTAINER_NAME" \
--shm-size=1g \
-e "ORACLE_PWD=$ORACLE_PASSWORD" \
-p "$ORACLE_PORT:1521" \
container-registry.oracle.com/database/free:23.5.0.0-lite; then
echo "ERROR: Failed to create Oracle container"
echo "Container logs:"
podman logs "$CONTAINER_NAME" 2>&1 || echo "(no logs available)"
return 1
fi
fi
# Wait for container to be in running state
echo "Waiting for container to reach running state..."
for i in $(seq 1 30); do
CONTAINER_STATE=$(podman inspect --format '{{.State.Status}}' "$CONTAINER_NAME" 2>/dev/null || echo "unknown")
echo "Container state: $CONTAINER_STATE"
if [ "$CONTAINER_STATE" = "running" ]; then
echo "Container is running"
break
elif [ "$CONTAINER_STATE" = "exited" ] || [ "$CONTAINER_STATE" = "dead" ]; then
echo "ERROR: Container exited unexpectedly"
echo "Container logs:"
podman logs "$CONTAINER_NAME" 2>&1 || echo "(no logs available)"
return 1
fi
if [ "$i" -eq 30 ]; then
echo "ERROR: Container failed to reach running state within 60 seconds"
echo "Container logs:"
podman logs "$CONTAINER_NAME" 2>&1 || echo "(no logs available)"
return 1
fi
sleep 2
done
echo "Waiting for Oracle to be ready (this may take several minutes)..."
for i in $(seq 1 180); do
# First verify container is still running
CONTAINER_STATE=$(podman inspect --format '{{.State.Status}}' "$CONTAINER_NAME" 2>/dev/null || echo "unknown")
if [ "$CONTAINER_STATE" != "running" ]; then
echo "ERROR: Container stopped unexpectedly (state: $CONTAINER_STATE)"
echo "Container logs:"
podman logs "$CONTAINER_NAME" 2>&1 || echo "(no logs available)"
return 1
fi
# Check if FREEPDB1 is accessible
if podman exec "$CONTAINER_NAME" bash -c 'echo "SELECT 1 FROM DUAL;" | sqlplus -s sys/poco@localhost:1521/FREEPDB1 as sysdba 2>&1' | grep -q "^[[:space:]]*1"; then
echo "Oracle FREEPDB1 is ready!"
# Wait a bit more to ensure listener is fully stable
sleep 5
# Create test user if it doesn't exist
echo "Creating test user 'poco'..."
podman exec "$CONTAINER_NAME" bash -c 'sqlplus -s sys/poco@localhost:1521/FREEPDB1 as sysdba <<EOSQL
WHENEVER SQLERROR CONTINUE
CREATE USER poco IDENTIFIED BY poco;
GRANT CONNECT, RESOURCE, DBA TO poco;
GRANT UNLIMITED TABLESPACE TO poco;
EXIT;
EOSQL'
return 0
fi
if [ "$i" -eq 180 ]; then
echo "ERROR: Oracle did not become ready within 6 minutes"
echo "Container logs (last 100 lines):"
podman logs --tail 100 "$CONTAINER_NAME" 2>&1 || echo "(no logs available)"
return 1
fi
# Progress indicator every 30 seconds
if [ $((i % 15)) -eq 0 ]; then
echo "Still waiting for Oracle... ($((i * 2)) seconds elapsed)"
fi
sleep 2
done
else
echo "Oracle container already running"
fi
}
stop_oracle() {
if podman ps --format '{{.Names}}' | grep -q "^${containerName}$"; then
echo "Stopping Oracle container..."
podman stop "$CONTAINER_NAME" > /dev/null 2>&1 || true
fi
}
remove_oracle() {
stop_oracle
if podman ps -a --format '{{.Names}}' | grep -q "^${containerName}$"; then
echo "Removing Oracle container..."
podman rm "$CONTAINER_NAME" > /dev/null 2>&1 || true
fi
}
oracle_shell() {
podman exec -it "$CONTAINER_NAME" sqlplus poco/poco@localhost:1521/FREEPDB1
}
build_and_test() {
# Pre-flight check: Verify Oracle container is running
echo "=== Pre-flight checks ==="
CONTAINER_STATE=$(podman inspect --format '{{.State.Status}}' "$CONTAINER_NAME" 2>/dev/null || echo "not_found")
echo "Oracle container state: $CONTAINER_STATE"
if [ "$CONTAINER_STATE" != "running" ]; then
echo "ERROR: Oracle container is not running (state: $CONTAINER_STATE)"
echo "Attempting to restart Oracle..."
if ! start_oracle; then
echo "ERROR: Failed to start Oracle container"
return 1
fi
fi
echo "Building Poco ODBC components..."
make -s -j$(nproc) -C "$POCO_BASE/CppUnit"
make -s -j$(nproc) -C "$POCO_BASE/Foundation"
make -s -j$(nproc) -C "$POCO_BASE/Data"
make -s -j$(nproc) -C "$POCO_BASE/Data/DataTest"
make -s -j$(nproc) -C "$POCO_BASE/Data/ODBC"
make -s -j$(nproc) -C "$POCO_BASE/Data/ODBC/testsuite"
echo ""
echo "=== ODBC Configuration Debug ==="
echo "ODBCSYSINI=$ODBCSYSINI"
echo "ODBCINSTINI=$ODBCINSTINI"
echo "ODBCINI=$ODBCINI"
echo ""
echo "--- odbcinst.ini contents ---"
cat "$ODBCSYSINI/odbcinst.ini"
echo ""
echo "--- odbc.ini contents ---"
cat "$ODBCINI"
echo ""
echo "--- odbcinst verification ---"
odbcinst -j
echo ""
echo "--- Registered drivers (odbcinst -q -d) ---"
odbcinst -q -d
echo ""
echo "--- Registered DSNs (odbcinst -q -s) ---"
odbcinst -q -s
echo ""
echo "--- Driver details ---"
odbcinst -q -d -n "Oracle 23 ODBC driver" 2>&1 || echo "(failed to query driver details)"
echo ""
echo "--- DSN details ---"
odbcinst -q -s -n "PocoDataOracleTest" 2>&1 || echo "(failed to query DSN details)"
echo ""
echo "--- Checking for system ODBC configs ---"
ls -la /etc/odbcinst.ini 2>/dev/null || echo "/etc/odbcinst.ini not found"
ls -la /etc/odbc.ini 2>/dev/null || echo "/etc/odbc.ini not found"
echo ""
echo "--- Verifying driver library exists ---"
ls -la "$INSTANT_CLIENT_DIR"/libsqora* 2>/dev/null || echo "No libsqora files found"
ldd "$INSTANT_CLIENT_DIR"/libsqora.so* 2>&1 | head -20 || echo "(ldd failed)"
echo "================================"
echo ""
# Final container state check before running tests
CONTAINER_STATE=$(podman inspect --format '{{.State.Status}}' "$CONTAINER_NAME" 2>/dev/null || echo "not_found")
echo "Oracle container state before tests: $CONTAINER_STATE"
if [ "$CONTAINER_STATE" != "running" ]; then
echo "ERROR: Oracle container stopped during build!"
return 1
fi
echo "Running ODBC tests..."
"$POCO_BASE/Data/ODBC/testsuite/bin/$OSNAME/$OSARCH/testrunner" -all
}
trap stop_oracle EXIT
export -f start_oracle stop_oracle remove_oracle oracle_shell build_and_test
# Auto-start database
if ! start_oracle; then
echo ""
echo "=== ORACLE CONTAINER FAILED TO START ==="
echo "The Oracle container could not be started. See errors above."
echo ""
# In non-interactive mode (CI), exit with error
if [ ! -t 0 ]; then
exit 1
fi
fi
# For CI, use: nix-shell oracle.nix --pure --run "build_and_test"
if [ -t 0 ]; then
echo ""
echo "=== Poco Oracle ODBC Test Environment ==="
echo "Container: $CONTAINER_NAME"
echo ""
echo "Commands:"
echo " build_and_test - Build and run tests"
echo " start_oracle - Start the Oracle container"
echo " stop_oracle - Stop the Oracle container"
echo " remove_oracle - Stop and remove the Oracle container"
echo " oracle_shell - Open SQL*Plus command line"
echo ""
fi
'';
}

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/DataODBC-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME DataODBC
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND DataODBC-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND DataODBC-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(DataODBC PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -12,10 +12,15 @@ POCO_SOURCES_AUTO_PLAT(TEST_SRCS OFF
add_executable(DataPostgreSQL-testrunner ${TEST_SRCS})
set_target_properties(DataPostgreSQL-testrunner PROPERTIES DEBUG_POSTFIX "d")
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME DataPostgreSQL
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND DataPostgreSQL-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND DataPostgreSQL-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(DataPostgreSQL PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
target_link_libraries(DataPostgreSQL-testrunner PUBLIC Poco::DataPostgreSQL Poco::DataTest CppUnit)

View File

@@ -20,10 +20,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/DataSQLite-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME DataSQLite
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND DataSQLite-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND DataSQLite-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(DataSQLite PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -20,10 +20,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/Data-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME Data
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND Data-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND Data-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(Data PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/Data-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME Data
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND Data-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND Data-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(Data PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/Encodings-testrunner -DTEST_PARAMETER=-all -P ${CMAKE_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${CMAKE_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${CMAKE_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME Encodings
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND Encodings-testrunner -ignore ${CMAKE_SOURCE_DIR}/cppignore.lnx -all
COMMAND Encodings-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(Encodings PROPERTIES ENVIRONMENT POCO_BASE=${CMAKE_SOURCE_DIR})
endif()

View File

@@ -36,10 +36,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} "-DTEST_FILES=${CMAKE_CURRENT_SOURCE_DIR}/data;${CMAKE_BINARY_DIR}/bin/TestApp;${CMAKE_BINARY_DIR}/bin/TestLibrary.so" -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/Foundation-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME Foundation
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
COMMAND Foundation-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND Foundation-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(Foundation PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") # The SharedLibaryTest has to look for shared libraries in the working directory
set_property(TEST Foundation APPEND PROPERTY ENVIRONMENT "PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}:$ENV{PATH}") # The ProcessTest has to look for the TestApp in the working directory

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} "-DTEST_FILES=${CMAKE_CURRENT_SOURCE_DIR}/data;" -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/JSON-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME JSON
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND JSON-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND JSON-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(JSON PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
# The test is run in the build directory. So the test data is copied there too

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/JWT-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME JWT
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND JWT-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND JWT-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(JWT PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -19,9 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/MongoDB-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME MongoDB
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND MongoDB-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND MongoDB-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(MongoDB PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/Net-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME Net
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND Net-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND Net-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(Net PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -20,10 +20,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} "-DTEST_FILES=${CMAKE_CURRENT_SOURCE_DIR}/any.pem;${CMAKE_CURRENT_SOURCE_DIR}/rootcert.pem;${CMAKE_CURRENT_SOURCE_DIR}/testrunner.xml" -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/NetSSL-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME NetSSL
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
COMMAND NetSSL-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND NetSSL-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(NetSSL PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
# The test is run in the build directory. So the test data is copied there too

View File

@@ -12,10 +12,11 @@ POCO_SOURCES_AUTO_PLAT(TEST_SRCS OFF
add_executable(NetSSLWin-testrunner ${TEST_SRCS})
set_target_properties(NetSSLWin-testrunner PROPERTIES DEBUG_POSTFIX "d")
# NetSSL_Win is Windows-only, so always use cppignore.win
add_test(
NAME NetSSLWin
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
COMMAND NetSSLWin-testrunner -ignore ${CMAKE_SOURCE_DIR}/cppignore.lnx -all
COMMAND NetSSLWin-testrunner -ignore ${CMAKE_SOURCE_DIR}/cppignore.win -all
)
set_tests_properties(NetSSLWin PROPERTIES ENVIRONMENT POCO_BASE=${CMAKE_SOURCE_DIR})
target_link_libraries(NetSSLWin-testrunner PUBLIC Poco::NetSSL Poco::Util Poco::XML CppUnit)

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/PDF-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME PDF
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND PDF-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND PDF-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(PDF PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -19,9 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/Prometheus-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME Prometheus
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND Prometheus-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND Prometheus-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(Prometheus PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/Redis-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME Redis
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND Redis-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND Redis-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(Redis PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -26,10 +26,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/Util-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME Util
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND Util-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND Util-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(Util PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()

View File

@@ -19,10 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/XML-testrunner -DTEST_PARAMETER=-all -P ${CMAKE_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${CMAKE_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${CMAKE_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME XML
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND XML-testrunner -ignore ${CMAKE_SOURCE_DIR}/cppignore.lnx -all
COMMAND XML-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(XML PROPERTIES ENVIRONMENT POCO_BASE=${CMAKE_SOURCE_DIR})
endif()

View File

@@ -19,9 +19,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} "-DTEST_FILES=${CMAKE_CURRENT_SOURCE_DIR}/data;" -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/Zip-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME Zip
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND Zip-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND Zip-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(Zip PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
# The test is run in the build directory. So the test data is copied there too

View File

@@ -22,10 +22,15 @@ if(ANDROID)
COMMAND ${CMAKE_COMMAND} -DANDROID_NDK=${ANDROID_NDK} -DLIBRARY_DIR=${CMAKE_BINARY_DIR}/lib -DUNITTEST=${CMAKE_BINARY_DIR}/bin/Modules-testrunner -DTEST_PARAMETER=-all -P ${PROJECT_SOURCE_DIR}/cmake/ExecuteOnAndroid.cmake
)
else()
if(WIN32)
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.win")
else()
set(CPPIGNORE_FILE "${PROJECT_SOURCE_DIR}/cppignore.lnx")
endif()
add_test(
NAME Modules
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND Modules-testrunner -ignore ${PROJECT_SOURCE_DIR}/cppignore.lnx -all
COMMAND Modules-testrunner -ignore ${CPPIGNORE_FILE} -all
)
set_tests_properties(Modules PROPERTIES ENVIRONMENT POCO_BASE=${PROJECT_SOURCE_DIR})
endif()