Files
google__adk-docs/tools/go-snippets/runner_test.sh
Ivan Cheung 4f74c1c091 PR and Regression testing for Go snippets (#973)
* Added pr checks and regression test code

* Added github workflows and go.mod/go.sum

* Added comments to files_to_test.txt

* Moved check_go_snippets.sh

* Fixed issues with workflows

* Removed unneeded workflow

* Revert bad change

* Added runner tests

* Added README

* refactor(go-snippets): Unify Go module structure and dynamically update ADK dependency

Consolidate all Go snippet module dependencies to a single  file located at . This simplifies dependency management and ensures consistent versions across all Go examples.

Update Usage: tools/go-snippets/runner.sh <build|run> [file1 file2 ...] to dynamically fetch the latest  module () before running any builds or tests. This ensures that PR and regression checks always validate against the most recent ADK release, preventing outdated dependency issues.

Address breaking changes in  by removing the  initialization from , which is no longer available.

Cleaned up extraneous  and  files from subdirectories within , as well as the unused  file.

* feat(go-snippets): Reinforce strict `files_to_test.txt` adherence

Reverts previous attempts to infer Go snippet dependencies and clarifies the strict testing model.

- **`runner.sh`**: Restores `find_snippet_line` to rely on exact substring matching of changed files within `files_to_test.txt` lines. Adds `go get` exit code check.
- **`tools/go-snippets/README.md`**: Adds "Understanding the Test Runner" section detailing `files_to_test.txt` adherence, multi-file `package main` requirements, and `_test.go` file handling.
- **`runner_test.sh`**: Adds `test_find_snippet_line_multi_file_match` to verify correct behavior for multi-file snippets listed on a single line.

---------

Co-authored-by: ivanmkc <ivanmkc@google.com>
2025-12-03 14:32:21 -05:00

165 lines
6.5 KiB
Bash
Executable File

#!/bin/bash
# Copyright 2025 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.
# Unit tests for runner.sh.
# This script can be run directly to validate the logic of the functions in runner.sh.
# --- Test Setup ---
# Source the script to make its functions available for testing.
source "$(dirname "$0")/runner.sh"
# --- Test Harness ---
# Simple assertion function to check for equality.
assert_equals() {
local expected=$1
local actual=$2
local test_name=$3
if [ "${expected}" == "${actual}" ]; then
echo -e "[${GREEN}PASS${NC}] ${test_name}"
else
echo -e "[${RED}FAIL${NC}] ${test_name}"
echo " Expected: '${expected}'"
echo " Actual: '${actual}'"
exit 1
fi
}
# --- Test Cases ---
# Tests that the 'run' action correctly forms a 'go run' command,
# preserving any arguments that might be on the line.
test_get_command_for_run_action() {
local line="snippets/quickstart/main.go"
local expected="go run snippets/quickstart/main.go"
local actual=$(get_command_for_action "run" "${line}")
assert_equals "${expected}" "${actual}" "Should create correct 'run' command without arguments"
}
# Tests that the 'build' action correctly forms a 'go build' command
# and, most importantly, strips any non-.go file arguments from the line.
# This is critical because 'go build' does not accept application arguments.
test_get_command_for_build_action_strips_args() {
local line="snippets/quickstart/main.go"
local expected="go build snippets/quickstart/main.go "
local actual=$(get_command_for_action "build" "${line}")
assert_equals "${expected}" "${actual}" "Should create correct 'build' command and strip arguments"
}
# Tests that a line with multiple .go files is correctly handled for a build.
# This is important for packages that are split across multiple files.
test_get_command_for_multi_file_build() {
local line="file1.go file2.go"
local expected="go build file1.go file2.go "
local actual=$(get_command_for_action "build" "${line}")
assert_equals "${expected}" "${actual}" "Should handle multiple files correctly for build"
}
# Tests that a line with multiple .go files is correctly handled for a run.
test_get_command_for_multi_file_run() {
local line="file1.go file2.go"
local expected="go run file1.go file2.go"
local actual=$(get_command_for_action "run" "${line}")
assert_equals "${expected}" "${actual}" "Should handle multiple files correctly for run"
}
# Tests the core logic for finding a snippet in the configuration file.
# It ensures that:
# 1. The 'examples/go/' prefix is correctly stripped from the input path.
# 2. The correct line is found in the test file.
# 3. Commented-out lines are ignored.
test_find_snippet_line() {
# Create a temporary SNIPPETS_FILE for this test to isolate it.
local original_snippets_file="${SNIPPETS_FILE}"
SNIPPETS_FILE=$(mktemp)
# Populate the temporary file with test data.
# This first line acts as a negative test case. The test specifically searches for 'snippets/quickstart/main.go',
# so this line should be correctly ignored by the grep logic, ensuring the function doesn't just return the first line it finds.
echo "file1.go" > "${SNIPPETS_FILE}"
# This line is a commented-out version of our target and should also be ignored.
echo "# snippets/quickstart/main.go" >> "${SNIPPETS_FILE}" # This line should be ignored by grep.
# This is the actual line we expect the function to find and return.
echo "snippets/quickstart/main.go" >> "${SNIPPETS_FILE}" # This is the line we expect to find.
# This simulates the file path that would be passed to the script (e.g., from 'git diff').
local input_file_path="examples/go/snippets/quickstart/main.go"
local expected_line="snippets/quickstart/main.go"
# Call the function under test.
local actual_line=$(find_snippet_line "${input_file_path}")
assert_equals "${expected_line}" "${actual_line}" "Should find the correct snippet line, ignoring comments"
# Cleanup
rm "${SNIPPETS_FILE}"
SNIPPETS_FILE="${original_snippets_file}" # Restore original path
}
# Tests that find_snippet_line correctly matches a line when the changed file
# is part of a multi-file snippet listed on a single line in files_to_test.txt.
test_find_snippet_line_multi_file_match() {
local original_snippets_file="${SNIPPETS_FILE}"
SNIPPETS_FILE=$(mktemp)
# A snippet line with multiple files.
echo "snippets/my-multi-file/main.go snippets/my-multi-file/helper.go" > "${SNIPPETS_FILE}"
# Simulate changing the helper file.
local input_file_path="examples/go/snippets/my-multi-file/helper.go"
local expected_line="snippets/my-multi-file/main.go snippets/my-multi-file/helper.go"
local actual_line=$(find_snippet_line "${input_file_path}")
assert_equals "${expected_line}" "${actual_line}" "Should find the entire multi-file snippet line"
# Cleanup
rm "${SNIPPETS_FILE}"
SNIPPETS_FILE="${original_snippets_file}"
}
# Tests the logic for determining if a line should be processed.
test_should_process_line() {
# A valid line should return 0 (success).
should_process_line "file1.go"
assert_equals "0" "$?" "Should return success for a valid line"
# An empty line should return 1 (failure).
should_process_line ""
assert_equals "1" "$?" "Should return failure for an empty line"
# A line with only whitespace should return 1 (failure).
should_process_line " "
assert_equals "1" "$?" "Should return failure for a whitespace-only line"
# A commented line should return 1 (failure).
should_process_line "# file1.go"
assert_equals "1" "$?" "Should return failure for a commented line"
# A commented line with leading spaces should return 1 (failure).
should_process_line " # file1.go"
assert_equals "1" "$?" "Should return failure for a commented line with leading spaces"
}
# --- Run Tests ---
echo "Running tests for runner.sh..."
test_get_command_for_run_action
test_get_command_for_build_action_strips_args
test_get_command_for_multi_file_build
test_get_command_for_multi_file_run
test_find_snippet_line
test_find_snippet_line_multi_file_match
test_should_process_line
echo "All tests passed."