9675823cd6
Two disposable docker fixtures (postgres:17-alpine on 15432, gvenzl/oracle-free: 23-slim on 11521) shaped like the existing mssql one — project label, distinct container name, healthcheck, one-shot seed service — plus a live suite per provider, gated on SQL_PG_* / SQL_ORACLE_* and skipping clean offline. Each suite covers what a DIALECT can get wrong, rather than re-running the provider-agnostic read semantics already pinned against SQL Server and SQLite: liveness + catalog load, a KeyValue read, the provider's own row-limit syntax via topByTimestamp (LIMIT 1 / FETCH FIRST 1 ROWS ONLY, where T-SQL emits TOP 1), identifier case-folding through the design §8.1 catalog gate, and the AdminUI browse walk driven through SqlDriverBrowser. Two seed decisions are load-bearing rather than scaffolding: - The Postgres schema is owned by a role the suite is NOT; the connecting login holds USAGE + SELECT only. That is the exact provisioning PostgresDialect's ListSchemasSql exists for (information_schema.schemata lists only schemas the role OWNS, so a granted-not-owning poller would see none and every tag would be rejected). A fixture that owned its own schema would pass either way. - Every identifier in both seeds is created UNQUOTED, so the catalogs hold lower-case (Postgres) and UPPER-case (Oracle) spellings. The case-folding legs author the opposite case and pin SqlCatalog.TryMatch's REAL contract — exact ordinal first, then a UNIQUE case-insensitive match whose catalog spelling is substituted — which on both providers is what makes mixed-case authoring work at all, since both dialects emit case-sensitive double-quoted identifiers. Connection strings are composed through dialect.Factory.CreateConnectionString- Builder() and the abstract DbConnectionStringBuilder indexer, so the csproj keeps its no-direct-provider-reference discipline; every key used was verified accepted through that indexer. The csproj gains only Driver.Sql.Browser, for the browse leg. Live-run evidence (local OrbStack, both images arm64): Postgres 5/5 green; Oracle 6/6 green after the ORA-01745 dialect fix this suite found. Offline the whole project is 33 skipped / 0 failed.
82 lines
4.1 KiB
YAML
82 lines
4.1 KiB
YAML
# Dedicated, DISPOSABLE Oracle Database Free for the Sql driver's Oracle live gate
|
|
# (OracleReadTests).
|
|
#
|
|
# ── SAFETY ─────────────────────────────────────────────────────────────────────
|
|
# This stack owns its OWN container, `otopcua-sql-oracle`, on host port 11521 — deliberately not
|
|
# the default 1521, so it can never be confused with a real Oracle listener on the rig. `restart:
|
|
# "no"` so a killed container stays down rather than respawning.
|
|
#
|
|
# ── DEPLOY (docker runs on the shared Linux host, 10.100.0.35) ──────────────────
|
|
# # from a Windows VM:
|
|
# lmxopcua-fix sync sql-oracle # rsync this dir → /opt/otopcua-sql-oracle/
|
|
# lmxopcua-fix up sql-oracle # single-service stack (+ one-shot seed), no profile arg
|
|
#
|
|
# # from macOS (there is no lmxopcua-fix there — drive the host over SSH):
|
|
# rsync -av tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Sql.IntegrationTests/Docker/oracle/ \
|
|
# dohertj2@10.100.0.35:/opt/otopcua-sql-oracle/
|
|
# ssh dohertj2@10.100.0.35 'cd /opt/otopcua-sql-oracle && SQL_ORACLE_PASSWORD=... docker compose up -d'
|
|
#
|
|
# ⚠️ FIRST START TAKES MINUTES, not seconds — the image creates the database on first boot. The
|
|
# healthcheck's start_period reflects that; the seed one-shot simply waits for it.
|
|
#
|
|
# ── RUN THE GATE ───────────────────────────────────────────────────────────────
|
|
# export SQL_ORACLE_ENDPOINT=10.100.0.35:11521
|
|
# export SQL_ORACLE_USER=otopcua # optional; this is the default
|
|
# export SQL_ORACLE_PASSWORD=... # the same value this compose was brought up with
|
|
# export SQL_ORACLE_SERVICE=FREEPDB1 # optional; this is the default (the image's PDB)
|
|
# dotnet test tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Sql.IntegrationTests \
|
|
# --filter "FullyQualifiedName~OracleReadTests"
|
|
#
|
|
# The one-shot `oracle-seed` service applies seed-oracle.sql once the server is healthy. The
|
|
# gvenzl images also auto-run scripts mounted at /container-entrypoint-initdb.d, but that path
|
|
# runs ONLY on the very first boot of an empty data volume — a re-seed after editing the script
|
|
# would silently not happen. The one-shot service matches the mssql fixture and re-runs every
|
|
# `docker compose up`, which is why it is used here.
|
|
|
|
name: otopcua-sql-oracle
|
|
|
|
services:
|
|
oracle:
|
|
image: gvenzl/oracle-free:23-slim
|
|
container_name: otopcua-sql-oracle
|
|
labels:
|
|
project: lmxopcua
|
|
restart: "no"
|
|
environment:
|
|
# SYS/SYSTEM password. Dev-only sandbox value for a throwaway container.
|
|
ORACLE_PASSWORD: "${SQL_ORACLE_PASSWORD:-Oracle_dev_pw1}"
|
|
# The image creates this non-SYS user (and its schema) inside the FREEPDB1 pluggable
|
|
# database. It is the principal the suite connects as — nothing here ever uses SYS.
|
|
APP_USER: otopcua
|
|
APP_USER_PASSWORD: "${SQL_ORACLE_PASSWORD:-Oracle_dev_pw1}"
|
|
ports:
|
|
- "11521:1521"
|
|
healthcheck:
|
|
# healthcheck.sh ships in the image and reports the database OPEN, not merely the listener up.
|
|
test: ["CMD", "healthcheck.sh"]
|
|
interval: 15s
|
|
timeout: 10s
|
|
retries: 40
|
|
start_period: 180s
|
|
|
|
# One-shot seed: waits for the database to pass its healthcheck, applies seed-oracle.sql, exits.
|
|
# Reuses the server image purely because it already carries sqlplus.
|
|
oracle-seed:
|
|
image: gvenzl/oracle-free:23-slim
|
|
labels:
|
|
project: lmxopcua
|
|
restart: "no"
|
|
depends_on:
|
|
oracle:
|
|
condition: service_healthy
|
|
environment:
|
|
APP_USER_PASSWORD: "${SQL_ORACLE_PASSWORD:-Oracle_dev_pw1}"
|
|
volumes:
|
|
- ./seed-oracle.sql:/seed.sql:ro
|
|
entrypoint:
|
|
- "/bin/bash"
|
|
- "-c"
|
|
# -S silent, -L single login attempt (never prompt). The script's WHENEVER SQLERROR EXIT
|
|
# makes a broken seed fail this service rather than leave a half-seeded schema behind.
|
|
- "sqlplus -S -L otopcua/\"$${APP_USER_PASSWORD}\"@//oracle:1521/FREEPDB1 @/seed.sql"
|