Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@ BuildKit cache mounts. Only the OLR compilation layer rebuilds on source changes
make test-redo

# Run SQL tests against live Oracle
make -C tests/sql/environments/free-23 up
make -C tests/sql/environments/free-23 test-sql
make -C tests/sql/environments/free-23 down
cd tests && pytest test_e2e.py -v --oracle-env=free-23
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

# Archive generated fixtures for committing
make fixtures
Expand Down
2 changes: 1 addition & 1 deletion tests/LOGMINER-VS-OLR.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ These differences affect any system that compares or consumes output from both
sources — including the test comparison scripts in this repository:

- `tests/sql/scripts/compare.py` — fixture generator (raw JSON comparison)
- `tests/sql/scripts/compare-debezium.py` — Debezium twin-test (Kafka Connect envelope comparison)
- `tests/dbz-twin/compare-debezium.py` — Debezium twin-test (Kafka Connect envelope comparison)

---

Expand Down
2 changes: 1 addition & 1 deletion tests/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ fixture automatically starts/stops containers via `docker compose` (or custom
`up.sh`/`down.sh` scripts for non-Docker environments like RAC).

Environment-specific settings (`DB_CONN`, `PDB_NAME`, `INCLUDE_TAGS`) are
loaded from `sql/environments/<env>/.env` if present.
loaded from `environments/<env>/.env` if present.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

```bash
# Generate all fixtures for Oracle Free 23
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SCRIPTS_DIR="$(cd "$SCRIPT_DIR/../sql/scripts" && pwd)"
SCRIPTS_DIR="$SCRIPT_DIR"

KILL_COUNT="${1:-3}"
RECEIVER_URL="http://localhost:8080"
Expand Down Expand Up @@ -215,13 +215,13 @@ echo ""
echo "--- Stage 1: Verify services ---"

if ! docker ps --format '{{.Names}}' | grep -q "^${ORACLE_CONTAINER}$"; then
echo "ERROR: Oracle container not running. Run: cd tests/debezium && docker compose up -d oracle" >&2
echo "ERROR: Oracle container not running. Run: cd tests/dbz-twin && docker compose up -d oracle" >&2
exit 1
fi
echo " Oracle: OK"

if ! curl -sf "$RECEIVER_URL/health" > /dev/null 2>&1; then
echo "ERROR: Receiver not responding. Run: cd tests/debezium && docker compose up -d receiver" >&2
echo "ERROR: Receiver not responding. Run: cd tests/dbz-twin && docker compose up -d receiver" >&2
exit 1
fi
echo " Receiver: OK"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ services:
environment:
OUTPUT_DIR: /app/output
volumes:
- ../sql/scripts/debezium-receiver.py:/app/debezium-receiver.py:ro
- ./debezium-receiver.py:/app/debezium-receiver.py:ro
- ./output:/app/output

olr:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
RAC_ENV_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
SQL_DIR="$(cd "$RAC_ENV_DIR/../.." && pwd)"
TESTS_DIR="$(cd "$SQL_DIR/.." && pwd)"
DBZ_TWIN_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
TESTS_DIR="$(cd "$DBZ_TWIN_DIR/.." && pwd)"
PROJECT_ROOT="$(cd "$TESTS_DIR/.." && pwd)"
SCRIPTS_DIR="$SQL_DIR/scripts"
SCRIPTS_DIR="$TESTS_DIR/sql/scripts"
RAC_ENV_DIR="$TESTS_DIR/environments/rac"

KILL_COUNT="${1:-3}"

Expand Down Expand Up @@ -95,8 +95,14 @@ _start_olr() {
# Ensure no leftover container
ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" \
"podman rm -f $OLR_CONTAINER 2>/dev/null; true"
# OLR needs RAC public network to reach SCAN VIPs and redo log shares
local SCAN_IP
SCAN_IP=$(ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" \
"podman exec racnodep1 getent hosts racnodepc1-scan 2>/dev/null | head -1 | awk '{print \$1}'" 2>/dev/null)
ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" "podman run -d --name $OLR_CONTAINER \
--user 1000:54335 \
--network rac_pub1_nw \
--add-host racnodepc1-scan:${SCAN_IP} \
-p 5000:5000 \
-v /root/olr-debezium/config:/config:ro,Z \
-v /root/olr-debezium/checkpoint:/olr-data/checkpoint:Z \
Expand Down Expand Up @@ -500,7 +506,7 @@ with open(sys.argv[2], 'w') as f:
f.write(json.dumps(r) + '\n')
" "$OLR_FILE" "$WORK_DIR/olr-sorted.jsonl"

if python3 "$SCRIPTS_DIR/compare-debezium.py" "$WORK_DIR/logminer-sorted.jsonl" "$WORK_DIR/olr-sorted.jsonl"; then
if python3 "$DBZ_TWIN_DIR/compare-debezium.py" "$WORK_DIR/logminer-sorted.jsonl" "$WORK_DIR/olr-sorted.jsonl"; then
echo " Data accuracy: PASS"
else
echo " Data accuracy: FAIL"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ services:
environment:
OUTPUT_DIR: /app/output
volumes:
- ../../../scripts/debezium-receiver.py:/app/debezium-receiver.py:ro
- ../debezium-receiver.py:/app/debezium-receiver.py:ro
- ./output:/app/output

dbz-logminer:
Expand All @@ -19,7 +19,7 @@ services:
condition: service_started
volumes:
- ./config/application-logminer.properties:/debezium/config/application.properties:ro
- ../../../../debezium/lib/ojdbc8.jar:/debezium/lib/ojdbc8.jar:ro
- ../lib/ojdbc8.jar:/debezium/lib/ojdbc8.jar:ro
- dbz-logminer-data:/debezium/data

dbz-olr:
Expand All @@ -32,8 +32,8 @@ services:
condition: service_started
volumes:
- ./config/application-olr.properties:/debezium/config/application.properties:ro
- ../../../../debezium/lib/ojdbc8.jar:/debezium/lib/ojdbc8.jar:ro
- ../../../../debezium/lib/debezium-connector-oracle-3.5.0.Beta1.jar:/debezium/lib/debezium-connector-oracle-3.5.0.Beta1.jar:ro
- ../lib/ojdbc8.jar:/debezium/lib/ojdbc8.jar:ro
- ../lib/debezium-connector-oracle-3.5.0.Beta1.jar:/debezium/lib/debezium-connector-oracle-3.5.0.Beta1.jar:ro
- dbz-olr-data:/debezium/data

volumes:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ services:
environment:
OUTPUT_DIR: /app/output
volumes:
- ../../../../scripts/debezium-receiver.py:/app/debezium-receiver.py:ro
- ../../debezium-receiver.py:/app/debezium-receiver.py:ro
- ./output:/app/output

dbz-logminer:
Expand All @@ -19,7 +19,7 @@ services:
condition: service_started
volumes:
- ./config/application-logminer.properties:/debezium/config/application.properties:ro
- ../../../../../debezium/lib/ojdbc8.jar:/debezium/lib/ojdbc8.jar:ro
- ../../lib/ojdbc8.jar:/debezium/lib/ojdbc8.jar:ro
- dbz-logminer-data:/debezium/data

dbz-olr:
Expand All @@ -32,8 +32,8 @@ services:
condition: service_started
volumes:
- ./config/application-olr.properties:/debezium/config/application.properties:ro
- ../../../../../debezium/lib/ojdbc8.jar:/debezium/lib/ojdbc8.jar:ro
- ../../../../../debezium/lib/debezium-connector-oracle-3.5.0.Beta1.jar:/debezium/lib/debezium-connector-oracle-3.5.0.Beta1.jar:ro
- ../../lib/ojdbc8.jar:/debezium/lib/ojdbc8.jar:ro
- ../../lib/debezium-connector-oracle-3.5.0.Beta1.jar:/debezium/lib/debezium-connector-oracle-3.5.0.Beta1.jar:ro
- dbz-olr-data:/debezium/data

swingbench:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DEBEZIUM_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
RAC_ENV_DIR="$(cd "$DEBEZIUM_DIR/.." && pwd)"
DBZ_RAC_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
DBZ_TWIN_DIR="$(cd "$DBZ_RAC_DIR/.." && pwd)"
TESTS_DIR="$(cd "$DBZ_TWIN_DIR/.." && pwd)"
RAC_ENV_DIR="$TESTS_DIR/environments/rac"

source "$RAC_ENV_DIR/vm-env.sh"

Expand Down Expand Up @@ -101,8 +103,13 @@ for i in $(seq 1 90); do
done

# Start OLR on VM, then adapter (adapter must connect before OLR processes)
# OLR needs RAC public network to reach SCAN VIPs and redo log shares
SCAN_IP=$(ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" \
"podman exec racnodep1 getent hosts racnodepc1-scan 2>/dev/null | head -1 | awk '{print \$1}'" 2>/dev/null)
ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" "podman run -d --name $OLR_CONTAINER \
--user 1000:54335 \
--network rac_pub1_nw \
--add-host racnodepc1-scan:${SCAN_IP} \
-p 5000:5000 \
-v /root/olr-debezium/config:/config:ro,Z \
-v /root/olr-debezium/checkpoint:/olr-data/checkpoint:Z \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,16 @@
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
RAC_ENV_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
SQL_DIR="$(cd "$RAC_ENV_DIR/../.." && pwd)"
TESTS_DIR="$(cd "$SQL_DIR/.." && pwd)"
DBZ_TWIN_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
TESTS_DIR="$(cd "$DBZ_TWIN_DIR/.." && pwd)"
PROJECT_ROOT="$(cd "$TESTS_DIR/.." && pwd)"
SCRIPTS_DIR="$SQL_DIR/scripts"
SCRIPTS_DIR="$TESTS_DIR/sql/scripts"
RAC_ENV_DIR="$TESTS_DIR/environments/rac"

SCENARIO="${1:?Usage: $0 <scenario-name>}"

# ---- RAC configuration ----
VM_HOST="${VM_HOST:-192.168.122.248}"
VM_KEY="${VM_KEY:-$PROJECT_ROOT/oracle-rac/assets/vm-key}"
VM_USER="${VM_USER:-root}"
# ---- RAC configuration (auto-detect VM IP) ----
source "$RAC_ENV_DIR/vm-env.sh"
OLR_IMAGE="${OLR_IMAGE:-docker.io/library/olr-dev:latest}"
RAC_NODE1="${RAC_NODE1:-racnodep1}"
RAC_NODE2="${RAC_NODE2:-racnodep2}"
Expand All @@ -41,8 +39,6 @@ OLR_CONTAINER="olr-debezium"
RECEIVER_URL="${RECEIVER_URL:-http://localhost:8080}"
POLL_TIMEOUT="${POLL_TIMEOUT:-120}"

_SSH_OPTS="-i $VM_KEY -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR"

# ---- SSH helpers (same pattern as rac.sh driver) ----
_vm_sqlplus() {
local node="$1" sid="$2" conn="$3" sql_file="$4"
Expand Down Expand Up @@ -149,9 +145,9 @@ _run_rac_blocks() {
}

# ---- Find scenario SQL ----
SCENARIO_SQL="$SQL_DIR/inputs/${SCENARIO}.sql"
SCENARIO_SQL="$TESTS_DIR/sql/inputs/${SCENARIO}.sql"
if [[ ! -f "$SCENARIO_SQL" ]]; then
SCENARIO_SQL="$SQL_DIR/inputs/${SCENARIO}.rac.sql"
SCENARIO_SQL="$TESTS_DIR/sql/inputs/${SCENARIO}.rac.sql"
fi
if [[ ! -f "$SCENARIO_SQL" ]]; then
echo "ERROR: Scenario file not found: $SCENARIO" >&2
Expand Down Expand Up @@ -184,7 +180,7 @@ echo "--- Stage 1: Verify services ---"
# Check receiver
if ! curl -sf "$RECEIVER_URL/health" > /dev/null 2>&1; then
echo "ERROR: Receiver not responding at $RECEIVER_URL" >&2
echo "Run: make -C tests/sql/environments/rac/debezium up" >&2
echo "Run: make -C tests/environments/rac/debezium up" >&2
exit 1
fi
echo " Receiver: OK"
Expand Down Expand Up @@ -278,8 +274,13 @@ ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" "rm -rf /root/olr-debezium/checkpoint/* &

# Start OLR on VM with network writer
echo " Starting OLR on RAC VM..."
# OLR needs RAC public network to reach SCAN VIPs and redo log shares
SCAN_IP=$(ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" \
"podman exec racnodep1 getent hosts racnodepc1-scan 2>/dev/null | head -1 | awk '{print \$1}'" 2>/dev/null)
ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" "podman run -d --name $OLR_CONTAINER \
--user 1000:54335 \
--network rac_pub1_nw \
--add-host racnodepc1-scan:${SCAN_IP} \
Comment thread
coderabbitai[bot] marked this conversation as resolved.
-p 5000:5000 \
-v /root/olr-debezium/config:/config:ro,Z \
-v /root/olr-debezium/checkpoint:/olr-data/checkpoint:Z \
Expand Down Expand Up @@ -439,7 +440,7 @@ if [[ ! -s "$OLR_FILE" ]]; then
exit 1
fi

if python3 "$SCRIPTS_DIR/compare-debezium.py" "$LM_FILE" "$OLR_FILE"; then
if python3 "$DBZ_TWIN_DIR/compare-debezium.py" "$LM_FILE" "$OLR_FILE"; then
echo ""
echo "=== PASS: Debezium RAC twin-test '$SCENARIO' ==="
else
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
#!/usr/bin/env bash
# One-time setup: create c##dbzuser + grants + sentinel table on RAC.
# Run from the project root:
# tests/sql/environments/rac/debezium/setup.sh
# tests/environments/rac/debezium/setup.sh
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
#
# Prerequisites: RAC VM running with containers started.

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../../../.." && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"

VM_HOST="${VM_HOST:-192.168.122.248}"
VM_KEY="${VM_KEY:-$PROJECT_ROOT/oracle-rac/assets/vm-key}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,17 @@
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
RAC_ENV_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
SQL_DIR="$(cd "$RAC_ENV_DIR/../.." && pwd)"
TESTS_DIR="$(cd "$SQL_DIR/.." && pwd)"
DBZ_TWIN_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
TESTS_DIR="$(cd "$DBZ_TWIN_DIR/.." && pwd)"
PROJECT_ROOT="$(cd "$TESTS_DIR/.." && pwd)"
SCRIPTS_DIR="$SQL_DIR/scripts"
SCRIPTS_DIR="$TESTS_DIR/sql/scripts"
RAC_ENV_DIR="$TESTS_DIR/environments/rac"

DURATION_MINUTES="${1:-30}"
DURATION_SECONDS=$(( DURATION_MINUTES * 60 ))

# ---- RAC configuration ----
VM_HOST="${VM_HOST:-192.168.122.248}"
VM_KEY="${VM_KEY:-$PROJECT_ROOT/oracle-rac/assets/vm-key}"
VM_USER="${VM_USER:-root}"
# ---- RAC configuration (auto-detect VM IP) ----
source "$RAC_ENV_DIR/vm-env.sh"
OLR_IMAGE="${OLR_IMAGE:-docker.io/library/olr-dev:latest}"
RAC_NODE1="${RAC_NODE1:-racnodep1}"
RAC_NODE2="${RAC_NODE2:-racnodep2}"
Expand All @@ -44,8 +42,6 @@ OLR_CONTAINER="olr-debezium"
RECEIVER_URL="${RECEIVER_URL:-http://localhost:8080}"
POLL_TIMEOUT="${POLL_TIMEOUT:-180}"

_SSH_OPTS="-i $VM_KEY -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR"

# ---- SSH helpers ----
_vm_sqlplus() {
local node="$1" sid="$2" conn="$3" sql_file="$4"
Expand Down Expand Up @@ -96,7 +92,7 @@ echo "--- Stage 1: Verify services ---"

if ! curl -sf "$RECEIVER_URL/health" > /dev/null 2>&1; then
echo "ERROR: Receiver not responding at $RECEIVER_URL" >&2
echo "Run: make -C tests/sql/environments/rac/debezium up" >&2
echo "Run: make -C tests/environments/rac/debezium up" >&2
exit 1
fi
echo " Receiver: OK"
Expand Down Expand Up @@ -192,10 +188,14 @@ ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" "mkdir -p /root/olr-debezium/config /root
scp $_SSH_OPTS "$SCRIPT_DIR/config/olr-config.json" "${VM_USER}@${VM_HOST}:/root/olr-debezium/config/"
ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" "rm -rf /root/olr-debezium/checkpoint/* && chown -R 1000:54335 /root/olr-debezium/checkpoint"

# Start OLR
# Start OLR — needs RAC public network to reach SCAN VIPs
echo " Starting OLR on RAC VM..."
SCAN_IP=$(ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" \
"podman exec racnodep1 getent hosts racnodepc1-scan 2>/dev/null | head -1 | awk '{print \$1}'" 2>/dev/null)
ssh $_SSH_OPTS "${VM_USER}@${VM_HOST}" "podman run -d --name $OLR_CONTAINER \
--user 1000:54335 \
--network rac_pub1_nw \
--add-host racnodepc1-scan:${SCAN_IP} \
Comment thread
coderabbitai[bot] marked this conversation as resolved.
-p 5000:5000 \
-v /root/olr-debezium/config:/config:ro,Z \
-v /root/olr-debezium/checkpoint:/olr-data/checkpoint:Z \
Expand Down Expand Up @@ -557,7 +557,7 @@ if [[ ! -s "$LM_FILE" ]]; then
elif [[ ! -s "$OLR_FILE" ]]; then
echo "ERROR: OLR output is empty: $OLR_FILE" >&2
COMPARE_RESULT=1
elif python3 "$SCRIPTS_DIR/compare-debezium.py" "$LM_FILE" "$OLR_FILE"; then
elif python3 "$DBZ_TWIN_DIR/compare-debezium.py" "$LM_FILE" "$OLR_FILE"; then
echo " Data accuracy: PASS"
else
echo " Data accuracy: FAIL"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
# Example: ./run-debezium.sh basic-crud
#
# Prerequisites:
# - Services running: make -C tests/debezium up
# - Services running: make -C tests/dbz-twin up
# - OLR image built: make build

set -euo pipefail
Expand Down Expand Up @@ -58,7 +58,7 @@ echo "--- Stage 1: Verify services ---"
# Check receiver
if ! curl -sf "$RECEIVER_URL/health" > /dev/null 2>&1; then
echo "ERROR: Receiver not responding at $RECEIVER_URL" >&2
echo "Run: make -C tests/debezium up" >&2
echo "Run: make -C tests/dbz-twin up" >&2
exit 1
fi
echo " Receiver: OK"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ services:
entrypoint: []
command: ["sleep", "infinity"]
volumes:
- ../../../..:/opt/OpenLogReplicator-local
- ../../..:/opt/OpenLogReplicator-local

oracle:
image: container-registry.oracle.com/database/enterprise:19.3.0.0
Expand All @@ -20,11 +20,11 @@ services:
- ./oracle-init:/opt/oracle/scripts/startup
- oradata:/opt/oracle/oradata
healthcheck:
test: ["CMD-SHELL", "echo 'SELECT 1 FROM dual;' | sqlplus -S \"${DB_CONN}\" | grep -q 1"]
test: ["CMD-SHELL", "echo 'SELECT 42 FROM dual;' | sqlplus -S olr_test/olr_test@//localhost:1521/ORCLPDB1 | grep -q 42"]
interval: 30s
timeout: 10s
timeout: 30s
retries: 60
start_period: 600s
start_period: 900s

volumes:
oradata:
Loading
Loading