# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. name: tests on: push: branches: - "main" paths: - "**" - "!docs/**" - "!**.md" - "!.github/**" - ".github/workflows/tests.yaml" pull_request: paths: - "**" - "!docs/**" - "!**.md" - "!.github/**" - ".github/workflows/tests.yaml" # Declare default permissions as read only. permissions: read-all jobs: integration: name: unit tests runs-on: ${{ matrix.os }} strategy: matrix: os: [macos-latest, windows-latest, ubuntu-latest] fail-fast: false permissions: contents: "read" steps: - name: Checkout code uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Setup Go uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 with: go-version-file: 'go.mod' - name: Install dependencies run: go get . - name: Build run: go build -v ./... - name: Run tests with coverage if: ${{ runner.os == 'Linux' }} env: GOTOOLCHAIN: go1.25.0+auto run: | source_dir="./internal/sources/*" tool_dir="./internal/tools/*" prompt_dir="./internal/prompts/*" auth_dir="./internal/auth/*" int_test_dir="./tests/*" included_packages=$(go list ./... | grep -v -e "$source_dir" -e "$tool_dir" -e "$prompt_dir" -e "$auth_dir" -e "$int_test_dir") go test -race -cover -coverprofile=coverage.out -v $included_packages go test -race -v ./internal/sources/... ./internal/tools/... ./internal/prompts/... ./internal/auth/... - name: Run tests without coverage if: ${{ runner.os != 'Linux' }} run: | go test -race -v ./internal/... ./cmd/... - name: Check coverage if: ${{ runner.os == 'Linux' }} run: | FILE_TO_EXCLUDE="github.com/googleapis/mcp-toolbox/internal/server/config.go" ESCAPED_PATH=$(echo "$FILE_TO_EXCLUDE" | sed 's/\//\\\//g; s/\./\\\./g') sed -i "/^${ESCAPED_PATH}:/d" coverage.out total_coverage=$(go tool cover -func=coverage.out | grep "total:" | awk '{print $3}') echo "Total coverage: $total_coverage" coverage_numeric=$(echo "$total_coverage" | sed 's/%//') if (( $(echo "$coverage_numeric < 40" | bc -l) )); then echo "Coverage failure: total coverage($total_coverage) is below 40%." exit 1 fi