diff --git a/.github/workflows/pr-test-rust.yml b/.github/workflows/pr-test-rust.yml index 0ff03b49c..9b177f24b 100644 --- a/.github/workflows/pr-test-rust.yml +++ b/.github/workflows/pr-test-rust.yml @@ -179,6 +179,35 @@ jobs: run: | sudo --preserve-env=PATH bash scripts/ci/ci_install_dependency.sh + - name: Setup Oracle Instant Client + run: | + sudo apt-get install -y unzip + INSTANT_CLIENT_DIR="/home/ubuntu/instant-client" + INSTANT_CLIENT_ZIP="instantclient-basic-linux.x64-23.9.0.25.07.zip" + + if [ ! -d "$INSTANT_CLIENT_DIR/instantclient_23_9" ]; then + echo "Downloading Oracle Instant Client..." + mkdir -p "$INSTANT_CLIENT_DIR" + cd "$INSTANT_CLIENT_DIR" + wget https://download.oracle.com/otn_software/linux/instantclient/2390000/$INSTANT_CLIENT_ZIP + unzip $INSTANT_CLIENT_ZIP + rm $INSTANT_CLIENT_ZIP + else + echo "Oracle Instant Client already exists, skipping download" + fi + + echo "LD_LIBRARY_PATH=/home/ubuntu/instant-client/instantclient_23_9:\$LD_LIBRARY_PATH" >> $GITHUB_ENV + + - name: Start Oracle Database + run: | + docker run -d -p 1521:1521 -e ORACLE_PASSWORD=oracle --name oracle-db gvenzl/oracle-xe:21-slim + echo "Starting Oracle DB..." + + # Export Oracle connection environment variables + echo "ATP_USER=system" >> $GITHUB_ENV + echo "ATP_PASSWORD=oracle" >> $GITHUB_ENV + echo "ATP_DSN=localhost:1521/XEPDB1" >> $GITHUB_ENV + - name: Build python binding run: | source "$HOME/.cargo/env" @@ -200,6 +229,12 @@ jobs: cd sgl-router SHOW_ROUTER_LOGS=1 ROUTER_LOCAL_MODEL_PATH="/home/ubuntu/models" pytest py_test/e2e_grpc -s -vv -o log_cli=true --log-cli-level=INFO + - name: Cleanup Oracle Database + if: always() + run: | + docker stop oracle-db || true + docker rm oracle-db || true + finish: needs: [unit-test-rust, pytest-rust, pytest-rust-2] diff --git a/sgl-router/py_test/e2e_response_api/test_response_api.py b/sgl-router/py_test/e2e_response_api/test_response_api.py index 5a053be1d..13b0905c2 100644 --- a/sgl-router/py_test/e2e_response_api/test_response_api.py +++ b/sgl-router/py_test/e2e_response_api/test_response_api.py @@ -75,6 +75,29 @@ class TestXaiBackend(StateManagementTests): kill_process_tree(cls.cluster["router"].pid) +class TestOracleStore(ResponseCRUDBaseTest, ConversationCRUDBaseTest): + """End to end tests for Oracle database storage backend.""" + + api_key = os.environ.get("OPENAI_API_KEY") + + @classmethod + def setUpClass(cls): + cls.model = "gpt-5-nano" + cls.base_url_port = "http://127.0.0.1:30040" + + cls.cluster = popen_launch_openai_xai_router( + backend="openai", + base_url=cls.base_url_port, + history_backend="oracle", + ) + + cls.base_url = cls.cluster["base_url"] + + @classmethod + def tearDownClass(cls): + kill_process_tree(cls.cluster["router"].pid) + + class TestGrpcBackend(StateManagementTests, MCPTests): """End to end tests for gRPC backend."""