-
Notifications
You must be signed in to change notification settings - Fork 310
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: setup showcase testing for codegen modules (#1957)
An initial setup for testing spring-cloud-generator using showcase: * setup-showcase.sh: script to generate starter module for gapic-showcase: showcase-spring-starter - Two options: verify (default, used by the gh actions workflow) and update (-u flag, for updating “golden” showcase module in development of spring generator) * EchoAutoConfigurationTests: handwritten unit tests to migrate/replace existing coverage in LanguageAutoConfigurationTests (currently living alongside spring-cloud-previews/google-cloud-language-starter) * showcaseTests.yaml: new CI workflow to run showcase verification (generation diff from goldens, compile with handwritten unit tests) for spring-cloud-generator
- Loading branch information
Showing
24 changed files
with
4,046 additions
and
55 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
name: Generator - Showcase Tests | ||
|
||
on: | ||
push: | ||
branches: | ||
- main | ||
pull_request: | ||
paths: | ||
- 'spring-cloud-generator/**' | ||
workflow_dispatch: | ||
|
||
jobs: | ||
showcaseTests: | ||
runs-on: ubuntu-20.04 | ||
steps: | ||
- uses: actions/checkout@v2 | ||
- name: Setup Java 17 | ||
uses: actions/setup-java@v1 | ||
with: | ||
java-version: 17 | ||
- name: Install buildozer | ||
run: | | ||
go install github.com/bazelbuild/buildtools/buildozer@latest | ||
export PATH=$PATH:$(go env GOPATH)/bin | ||
buildozer --version | ||
- name: Install spring-cloud-gcp | ||
# Installs spring-cloud-gcp from root, | ||
# including spring-cloud-generator module | ||
run: | | ||
./mvnw \ | ||
--batch-mode \ | ||
--show-version \ | ||
--threads 1.5C \ | ||
--define maven.test.skip=true \ | ||
--define maven.javadoc.skip=true \ | ||
install | ||
- name: Verify generation of showcase-spring-starter | ||
# Runs showcase-spring-starter golden tests | ||
working-directory: spring-cloud-generator | ||
id: verify-showcase-spring-starter | ||
run: | | ||
set -x | ||
set -e | ||
export PATH=$PATH:$(go env GOPATH)/bin | ||
buildozer --version | ||
bash scripts/generate-showcase.sh | ||
- name: Unit tests for showcase-spring-starter | ||
# Runs showcase-spring-starter unit tests | ||
working-directory: spring-cloud-generator | ||
run: | | ||
cd showcase/showcase-spring-starter && mvn verify |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
# Generator - Spring Boot Starters for Google Client Libraries | ||
|
||
|
||
## Development Workflow | ||
|
||
For local development in the `spring-cloud-generator` submodule, | ||
first build `spring-cloud-gcp` from root: | ||
|
||
``` | ||
mvn clean install -DskipTests | ||
``` | ||
|
||
### Generation of Spring Boot Starters | ||
|
||
Corresponding workflow file: [generateAutoConfigs.yml](/.github/workflows/generateAutoConfigs.yml) | ||
|
||
Script: [generate.sh](scripts/generate.sh) | ||
|
||
Requirements (to run commands below): | ||
* Java 17 | ||
* [bazelisk](https://github.com/bazelbuild/bazelisk) | ||
* [buildozer](https://github.com/bazelbuild/buildtools/tree/master/buildozer) | ||
* [jq](https://jqlang.github.io/jq/download/) | ||
* [xmllint](https://gnome.pages.gitlab.gnome.org/libxml2/xmllint.html) | ||
* For MacOS, set up [gnu-sed](https://formulae.brew.sh/formula/gnu-sed) to use as `sed` | ||
|
||
To execute the generation process locally, run (from the `spring-cloud-generator` directory): | ||
``` | ||
bash scripts/generate.sh | ||
``` | ||
|
||
### Showcase Testing for the Generator | ||
|
||
Corresponding workflow file: [showcaseTests.yml](/.github/workflows/showcaseTests.yml) | ||
|
||
Script: [generate-showcase.sh](scripts/generate-showcase.sh) | ||
|
||
Requirements (to run commands below): | ||
* Java 17 | ||
* [bazelisk](https://github.com/bazelbuild/bazelisk) | ||
* [buildozer](https://github.com/bazelbuild/buildtools/tree/master/buildozer) | ||
* For MacOS, set up [gnu-sed](https://formulae.brew.sh/formula/gnu-sed) to use as `sed` | ||
|
||
To execute showcase golden tests locally, run (from the `spring-cloud-generator` directory): | ||
``` | ||
bash scripts/generate-showcase.sh | ||
``` | ||
* This runs the generator for showcase clients and compares its output against the expected golden `showcase-spring-starter` module. | ||
|
||
To update showcase golden tests locally, run ((from the `spring-cloud-generator` directory): | ||
``` | ||
bash scripts/generate-showcase.sh -u | ||
``` | ||
* This runs the generator for showcase clients and overwrites the golden module `showcase-spring-starter`. | ||
|
||
To execute showcase unit tests locally, run (from the `spring-cloud-generator` directory): | ||
``` | ||
cd showcase/showcase-spring-starter && mvn verify | ||
``` | ||
* This compiles the generated `showcase-spring-starter` module and runs handwritten unit tests under `showcase-spring-starter/test`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
#!/bin/bash | ||
|
||
# To VERIFY: ./scripts/generate-showcase.sh | ||
# To UPDATE: /scripts/generate-showcase.sh -u | ||
UPDATE=0 | ||
while getopts u flag | ||
do | ||
case "${flag}" in | ||
u) UPDATE=1;; | ||
esac | ||
done | ||
|
||
# For reusing bazel setup modifications and post-processing steps | ||
source ./scripts/generate-steps.sh | ||
|
||
# If not set, assume working directory is spring-cloud-generator | ||
if [[ -z "$SPRING_GENERATOR_DIR" ]]; then | ||
SPRING_GENERATOR_DIR=`pwd` | ||
fi | ||
SPRING_ROOT_DIR=${SPRING_GENERATOR_DIR}/.. | ||
SHOWCASE_STARTER_OLD_DIR=${SPRING_GENERATOR_DIR}/showcase/showcase-spring-starter | ||
SHOWCASE_STARTER_NEW_DIR=${SPRING_GENERATOR_DIR}/showcase/showcase-spring-starter-generated | ||
|
||
# Verifies newly generated showcase-spring-starter against goldens | ||
# | ||
# $1 - directory containing existing showcase-spring-starter (golden) | ||
# $2 - directory containing newly generated showcase-spring-starter | ||
function verify(){ | ||
OLD_DIR=$1 | ||
NEW_DIR=$2 | ||
SHOWCASE_STARTER_DIFF=$(diff -r ${NEW_DIR}/src/main ${OLD_DIR}/src/main) | ||
SHOWCASE_STARTER_POM_DIFF=$(diff -r ${NEW_DIR}/pom.xml ${OLD_DIR}/pom.xml) | ||
if [ "$SHOWCASE_STARTER_DIFF" != "" ] || [ "$SHOWCASE_STARTER_POM_DIFF" != "" ] | ||
then | ||
echo "Differences detected in generated showcase starter module: " | ||
echo "Diff from src/main: " | ||
echo $SHOWCASE_STARTER_DIFF | ||
echo "Diff from pom.xml: " | ||
echo $SHOWCASE_STARTER_POM_DIFF | ||
exit 1; | ||
else | ||
echo "No differences found in showcase-spring-starter" | ||
rm -r ${NEW_DIR} | ||
fi | ||
} | ||
|
||
# Setup, generation, and post-processing steps for showcase-spring-starter | ||
# | ||
# $1 - target directory for generated starter | ||
function generate_showcase_spring_starter(){ | ||
SHOWCASE_STARTER_DIR=$1 | ||
|
||
# Compute the parent project version. | ||
cd ${SPRING_ROOT_DIR} | ||
PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) | ||
cd ${SPRING_GENERATOR_DIR} | ||
GAPIC_GENERATOR_JAVA_VERSION=$(mvn help:evaluate -Dexpression=gapic-generator-java-bom.version -q -DforceStdout) | ||
|
||
# Clone sdk-platform-java (with showcase library) | ||
git clone https://github.com/googleapis/sdk-platform-java.git | ||
git checkout "v${GAPIC_GENERATOR_JAVA_VERSION}" | ||
|
||
# Install showcase client libraries locally | ||
cd sdk-platform-java && mvn clean install -B -ntp -DskipTests -Dclirr.skip -Dcheckstyle.skip | ||
cd showcase && mvn clean install | ||
GAPIC_SHOWCASE_CLIENT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) | ||
|
||
# Alternative: if showcase client library is available on Maven Central, | ||
# Instead of downloading sdk-platform-java/showcase (for client library, and generation setup), | ||
# Can instead download googleapis (for generation setup) and gapic-showcase (for protos) | ||
|
||
# Modify sdk-platform-java/WORKSPACE | ||
modify_workspace_file "../WORKSPACE" ".." "../../scripts/resources/googleapis_modification_string.txt" | ||
# Modify sdk-platform-java/showcase/BUILD.bazel | ||
buildozer 'new_load @spring_cloud_generator//:java_gapic_spring.bzl java_gapic_spring_library' BUILD.bazel:__pkg__ | ||
modify_build_file "BUILD.bazel" | ||
|
||
# Invoke bazel target for generating showcase-spring-starter | ||
bazelisk build --tool_java_language_version=17 --tool_java_runtime_version=remotejdk_17 //showcase:showcase_java_gapic_spring | ||
|
||
# Post-process generated modules | ||
copy_and_unzip "../bazel-bin/showcase/showcase_java_gapic_spring-spring.srcjar" "showcase_java_gapic_spring-spring.srcjar" "${SPRING_GENERATOR_DIR}/showcase" ${SHOWCASE_STARTER_DIR} | ||
modify_starter_pom ${SHOWCASE_STARTER_DIR}/pom.xml "com.google.cloud" "gapic-showcase" $PROJECT_VERSION | ||
|
||
# Additional pom.xml modifications for showcase starter | ||
# Add explicit gapic-showcase version | ||
sed -i '/^ *<artifactId>gapic-showcase<\/artifactId>*/a \ \ \ \ \ \ <version>'"$GAPIC_SHOWCASE_CLIENT_VERSION"'</version>' ${SHOWCASE_STARTER_DIR}/pom.xml | ||
# Update relative path to parent pom (different repo structure from starters) | ||
RELATIVE_PATH="\ \ \ \ <relativePath>..\/..\/..\/spring-cloud-gcp-starters\/pom.xml<\/relativePath>" | ||
sed -i 's/^ *<relativePath>.*/'"$RELATIVE_PATH"'/g' ${SHOWCASE_STARTER_DIR}/pom.xml | ||
|
||
# Run google-java-format on generated code | ||
run_formatter ${SHOWCASE_STARTER_DIR} | ||
|
||
# Remove downloaded repos | ||
rm -rf ${SPRING_GENERATOR_DIR}/sdk-platform-java | ||
} | ||
|
||
if [[ UPDATE -ne 0 ]]; then | ||
echo "Running script to perform showcase-spring-starter update" | ||
generate_showcase_spring_starter ${SHOWCASE_STARTER_OLD_DIR} | ||
else | ||
echo "Running script to perform showcase-spring-starter verification" | ||
generate_showcase_spring_starter ${SHOWCASE_STARTER_NEW_DIR} | ||
verify ${SHOWCASE_STARTER_OLD_DIR} ${SHOWCASE_STARTER_NEW_DIR} | ||
fi |
Oops, something went wrong.