Skip to content

Commit

Permalink
test: setup showcase testing for codegen modules (#1957)
Browse files Browse the repository at this point in the history
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
emmileaf authored Jul 7, 2023
1 parent 3172010 commit ceff216
Show file tree
Hide file tree
Showing 24 changed files with 4,046 additions and 55 deletions.
51 changes: 51 additions & 0 deletions .github/workflows/showcaseTests.yaml
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
60 changes: 60 additions & 0 deletions spring-cloud-generator/README.md
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`.
106 changes: 106 additions & 0 deletions spring-cloud-generator/scripts/generate-showcase.sh
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
Loading

0 comments on commit ceff216

Please sign in to comment.