diff --git a/.github/workflows/integration-bun-deno.yml b/.github/workflows/integration-bun-deno.yml new file mode 100644 index 00000000..b5be8cc1 --- /dev/null +++ b/.github/workflows/integration-bun-deno.yml @@ -0,0 +1,168 @@ +name: Bun and Deno Integration Tests + +on: + push: + branches: [trunk] + workflow_dispatch: + +permissions: + contents: read + actions: read + checks: write + +jobs: + integration-tests: + name: Integration (${{ matrix.RUNTIME }}, Cassandra ${{ matrix.SERVER_VERSION }}) + runs-on: ubuntu-latest + strategy: + matrix: + RUNTIME: ["bun", "deno"] + SERVER_VERSION: ["3.11", "4.0", "4.1", "5.0"] # Cassandra minor versions + fail-fast: false + + steps: + - name: Checkout + uses: actions/checkout@v4 + + # ---- Python for ccm ---- + - name: Set up Python 3.9.16 + uses: actions/setup-python@v5 + with: + python-version: "3.9.16" + + - name: Install ccm + run: | + python -m pip install --upgrade pip + git clone --depth 1 --single-branch -b cassandra-test https://github.com/apache/cassandra-ccm.git + cd cassandra-ccm + pip install -r requirements.txt + ./setup.py install + + # ---- Install required Zulu JDKs (8/11/17) and capture their homes ---- + - name: Install Zulu 11 + id: z11 + uses: actions/setup-java@v5 + with: + distribution: zulu + java-version: "11" + + - name: Install Zulu 17 + id: z17 + uses: actions/setup-java@v5 + with: + distribution: zulu + java-version: "17" + + - name: Install Zulu 8 + id: z8 + uses: actions/setup-java@v5 + with: + distribution: zulu + java-version: "8" + + - name: Export JAVA*_HOME variables + run: | + echo "JAVA8_HOME=${{ steps.z8.outputs.path }}" >> "$GITHUB_ENV" + echo "JAVA11_HOME=${{ steps.z11.outputs.path }}" >> "$GITHUB_ENV" + echo "JAVA17_HOME=${{ steps.z17.outputs.path }}" >> "$GITHUB_ENV" + echo "JAVA_HOME=${{ steps.z8.outputs.path }}" >> "$GITHUB_ENV" + echo "CCM_UPDATE_PID_DEFAULT_TIMEOUT=120" >> "$GITHUB_ENV" + + - name: Generate SSL certificates + run: | + mkdir -p /home/runner/workspace/tools/ccm/ssl/ + cd /home/runner/workspace/tools/ccm/ssl/ + keytool -genkey \ + -keyalg RSA \ + -alias cassandra \ + -keystore keystore.jks \ + -storepass cassandra \ + -keypass cassandra \ + -validity 364635 \ + -dname "CN=Jane He, OU=TE, O=ASF, L=Santa Clara, ST=CA, C=TE" + keytool -export \ + -alias cassandra \ + -file cassandra.crt \ + -keystore keystore.jks \ + -storepass cassandra + openssl x509 \ + -inform der \ + -in cassandra.crt \ + -out cassandra.pem + keytool -genkeypair \ + -keyalg RSA \ + -alias client \ + -keystore truststore.jks \ + -storepass cassandra \ + -keypass cassandra \ + -validity 364635 \ + -dname "CN=Philip Thompson, OU=TE, O=DataStax, L=Santa Clara, ST=CA, C=TE" + keytool -importkeystore \ + -srckeystore truststore.jks \ + -destkeystore client.p12 \ + -srcstorepass cassandra \ + -deststorepass cassandra \ + -deststoretype PKCS12 + openssl pkcs12 \ + -in client.p12 \ + -passin pass:cassandra \ + -nokeys \ + -out client_cert.pem -legacy + openssl pkcs12 \ + -in client.p12 \ + -passin pass:cassandra \ + -nodes \ + -nocerts \ + -out client_key.pem -legacy + + - name: Install Simulacron + run: | + wget https://github.com/datastax/simulacron/releases/download/0.12.0/simulacron-standalone-0.12.0.jar -O /home/runner/simulacron.jar + + # ---- Set up the runtime under test ---- + - name: Set up Bun + if: matrix.RUNTIME == 'bun' + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Set up Deno + if: matrix.RUNTIME == 'deno' + uses: denoland/setup-deno@v2 + with: + deno-version: latest + + - name: Resolve Cassandra latest patch version + env: + SERVER_VERSION: ${{ matrix.SERVER_VERSION }} + run: | + PATCH_SERVER_VERSION=$( + curl -s https://downloads.apache.org/cassandra/ \ + | grep -oP '(?<=href=")[0-9]+\.[0-9]+\.[0-9]+(?=)' \ + | sort -rV \ + | uniq -w 3 \ + | grep "^${SERVER_VERSION}\." + ) + echo "Resolved Cassandra ${SERVER_VERSION}.x -> ${PATCH_SERVER_VERSION}" + echo "CCM_VERSION=$PATCH_SERVER_VERSION" >> "$GITHUB_ENV" + + - name: Print environment + run: printenv | sort + + - name: Pre-download Cassandra distribution + run: | + ccm create predownload -v $CCM_VERSION + ccm remove + + - name: Run integration tests (${{ matrix.RUNTIME }}) + run: | + if [ "${{ matrix.RUNTIME }}" = "bun" ]; then + # Bun has full CommonJS support, so mocha runs unchanged. + bun install + bunx mocha test/integration/short --recursive --exit -R spec -t 5000 + else + # --allow-scripts builds the kerberos native addon; --unstable-detect-cjs + # makes Deno load the CommonJS driver and tests correctly. + deno install --allow-scripts=npm:kerberos + deno run -A --unstable-detect-cjs npm:mocha test/integration/short --recursive --exit -R spec -t 5000 + fi diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 19d0c023..1decd2c4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,6 +46,29 @@ jobs: node -e "require('./api-generation-test').generate()" > generated.ts npx tsc --noEmit + bun-unit-tests: + name: Unit tests on Bun + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + - run: bun install + - run: bunx mocha test/unit --recursive -R spec -t 5000 + + deno-unit-tests: + name: Unit tests on Deno + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: denoland/setup-deno@v2 + with: + deno-version: latest + # --allow-scripts runs lifecycle scripts so the kerberos prebuild is fetched. + - run: deno install --allow-scripts=npm:kerberos + - run: deno run -A --unstable-detect-cjs npm:mocha@10.8.2 test/unit --recursive -R spec -t 5000 + unit-integration-tests: runs-on: ubuntu-latest strategy: