Skip to content

Add License, Readme, release notes and update version to 1.0.1 #20

Add License, Readme, release notes and update version to 1.0.1

Add License, Readme, release notes and update version to 1.0.1 #20

name: Functional Tests
permissions:
contents: read
packages: read
on:
pull_request:
workflow_dispatch:
inputs:
version_tag:
description: "Optional release tag (e.g. 1.0.0 or 1.0.0-rc1)"
required: false
type: string
cbdc_version:
description: "Optional cbdinocluster version (e.g. v0.0.88)"
required: false
type: string
env:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
DOTNET_NOLOGO: 1
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
jobs:
functional-tests:
name: Functional Tests (ubuntu-22.04)
runs-on: ubuntu-22.04
timeout-minutes: 45
steps:
- name: Checkout (tag)
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.version_tag != '' }}
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: refs/tags/${{ github.event.inputs.version_tag }}
- name: Checkout (PR head)
if: ${{ github.event_name == 'pull_request' }}
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Checkout (default)
if: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.version_tag == '' || github.event.inputs.version_tag == null) }}
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup .NET SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
cache: false
- name: Install cbdinocluster
id: install-cbdc
run: |
mkdir -p "$HOME/bin"
CBDC_VER=${{ github.event.inputs.cbdc_version }}
if [ -z "$CBDC_VER" ]; then
CBDC_VER=v0.0.88
fi
echo "Installing cbdinocluster $CBDC_VER"
wget -nv -O $HOME/bin/cbdinocluster https://github.com/couchbaselabs/cbdinocluster/releases/download/${CBDC_VER}/cbdinocluster-linux-amd64
chmod +x $HOME/bin/cbdinocluster
echo "$HOME/bin" >> $GITHUB_PATH
- name: Initialize cbdinocluster
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cbdinocluster -v init --auto
- name: Start Couchbase Analytics cluster
id: start-cluster
env:
INPUT_TAG: ${{ github.event.inputs.version_tag }}
run: |
TAG=${INPUT_TAG}
EA_VERSION=2.0.1-1231
cat > cluster.yml <<'YAML'
columnar: true
nodes:
- count: 2
version: ${EA_VERSION}
docker:
load-balancer: true
use-dino-certs: true
YAML
# Substitute shell vars into YAML
eval "echo \"$(cat cluster.yml)\"" > cluster.resolved.yml
CBDINO_CLUSTER_ID=$(cbdinocluster -v alloc --def="$(cat cluster.resolved.yml)")
CBDINO_CONNSTR=$(cbdinocluster -v connstr --tls --analytics "$CBDINO_CLUSTER_ID")
echo "CBDINO_CLUSTER_ID=$CBDINO_CLUSTER_ID" >> "$GITHUB_ENV"
echo "CBDINO_CONNSTR=$CBDINO_CONNSTR" >> "$GITHUB_ENV"
echo "CBDINO_USER=Administrator" >> "$GITHUB_ENV"
echo "CBDINO_PASS=password" >> "$GITHUB_ENV"
- name: Prepare Functional Test settings.json
run: |
echo "Writing functional test settings.json with cluster connection string"
cat > tests/Couchbase.Analytics.FunctionalTests/settings.json <<EOF
{
"TestSettings": {
"ConnectionString": "${CBDINO_CONNSTR}",
"Username": "${CBDINO_USER}",
"Password": "${CBDINO_PASS}"
}
}
EOF
echo "settings.json written:" && cat tests/Couchbase.Analytics.FunctionalTests/settings.json
- name: Build and Run Functional Tests
run: |
dotnet test tests/Couchbase.Analytics.FunctionalTests/Couchbase.Analytics.FunctionalTests.csproj \
--configuration Release \
--logger "trx;LogFileName=functional-tests.trx" \
--results-directory "TestResults"
- name: Verify Functional Test Results
run: |
python3 - TestResults/functional-tests.trx <<'PY'
import sys
import xml.etree.ElementTree as ET
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} <results.trx>")
sys.exit(1)
path = sys.argv[1]
print(f"Parsing TRX: {path}")
try:
tree = ET.parse(path)
except Exception as e:
print(f"ERROR: Failed to parse TRX file: {e}")
sys.exit(1)
root = tree.getroot()
ns = {'ns': root.tag.split('}')[0].strip('{')} if root.tag.startswith('{') else {}
rs = root.find('.//ns:ResultSummary', ns)
if rs is None:
rs = root.find('.//ResultSummary')
if rs is None:
print('ERROR: ResultSummary not found in TRX')
sys.exit(1)
counters = rs.find('.//ns:Counters', ns)
if counters is None:
counters = rs.find('.//Counters')
if counters is None:
print('ERROR: Counters not found in TRX')
sys.exit(1)
def get_int(name: str) -> int:
v = counters.attrib.get(name)
try:
return int(v) if v is not None else 0
except ValueError:
return 0
total = get_int('total')
executed = get_int('executed')
passed = get_int('passed')
failed = (
get_int('failed') +
get_int('error') +
get_int('timeout') +
get_int('aborted')
)
print(f"Summary: total={total}, executed={executed}, passed={passed}, failed={failed}")
if total == 0 or executed == 0:
print('ERROR: No tests were run.')
sys.exit(1)
if failed > 0:
print(f'ERROR: {failed} tests failed.')
sys.exit(1)
if passed < executed:
print(f'ERROR: Not all executed tests passed (passed={passed}, executed={executed}).')
sys.exit(1)
print('All functional tests passed.')
PY
- name: Upload Functional Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: functional-test-results
path: TestResults
- name: Teardown cbdinocluster
if: always()
run: |
if [ -n "${CBDINO_CLUSTER_ID}" ]; then
cbdinocluster rm "$CBDINO_CLUSTER_ID" || true
fi