diff --git a/.gitignore b/.gitignore index 3c6c3e1a02..a484993351 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Bazel. bazel-* +.gradle/ # IDE .idea diff --git a/rules_bazel/java/integration_test.bzl b/rules_bazel/java/integration_test.bzl index e030b5f817..b5e2846113 100644 --- a/rules_bazel/java/integration_test.bzl +++ b/rules_bazel/java/integration_test.bzl @@ -1,103 +1,3 @@ -def _diff_integration_goldens_impl(ctx): - # Extract the Java source files from the generated 3 srcjars from API bazel target, - # and put them in the temporary folder `codegen_tmp`. - # Compare the `codegen_tmp` with the goldens folder e.g `test/integration/goldens/redis` - # and save the differences in output file `diff_output.txt`. - - diff_output = ctx.outputs.diff_output - check_diff_script = ctx.outputs.check_diff_script - gapic_library = ctx.attr.gapic_library - resource_name_library = ctx.attr.resource_name_library - test_library = ctx.attr.test_library - srcs = ctx.files.srcs - api_name = ctx.attr.name - - script = """ - mkdir codegen_tmp - unzip {input} -d codegen_tmp - unzip {input_resource_name} -d codegen_tmp - unzip {input_test} -d codegen_tmp - cd codegen_tmp - # Remove unneeded non-Java files, like MANIFEST - rm -rf $(find ./ -type f ! -name '*.java' -a ! -name '*gapic_metadata.json') - rm -rf $(find ./ -type f -name 'PlaceholderFile.java') - rm -r $(find ./ -type d -empty) - cd .. - diff -r codegen_tmp test/integration/goldens/{api_name} > {diff_output} - # Bash `diff` command will return exit code 1 when there are differences between the two - # folders. So we explicitly `exit 0` after the diff command to avoid build failure. - exit 0 - """.format( - diff_output = diff_output.path, - input = gapic_library[JavaInfo].source_jars[0].path, - input_resource_name = resource_name_library[JavaInfo].source_jars[0].path, - input_test = test_library[JavaInfo].source_jars[0].path, - api_name = api_name, - ) - ctx.actions.run_shell( - inputs = srcs + [ - gapic_library[JavaInfo].source_jars[0], - resource_name_library[JavaInfo].source_jars[0], - test_library[JavaInfo].source_jars[0], - ], - outputs = [diff_output], - command = script, - ) - - # Check the generated diff_output file, if it is empty, that means there is no difference - # between generated source code and goldens files, test should pass. If it is not empty, then - # test will fail by exiting 1. - - check_diff_script_content = """ - # This will not print diff_output to the console unless `--test_output=all` option - # is enabled, it only emits the comparison results to the test.log. - # We could not copy the diff_output.txt to the test.log ($XML_OUTPUT_FILE) because that - # file is not existing at the moment. It is generated once test is finished. - cat $PWD/test/integration/{api_name}_diff_output.txt - if [ -s $PWD/test/integration/{api_name}_diff_output.txt ] - then - exit 1 - fi - """.format( - api_name = api_name, - ) - - ctx.actions.write( - output = check_diff_script, - content = check_diff_script_content, - ) - runfiles = ctx.runfiles(files = [ctx.outputs.diff_output]) - return [DefaultInfo(executable = check_diff_script, runfiles = runfiles)] - -diff_integration_goldens_test = rule( - attrs = { - "gapic_library": attr.label(), - "resource_name_library": attr.label(), - "test_library": attr.label(), - "srcs": attr.label_list( - allow_files = True, - mandatory = True, - ), - }, - outputs = { - "diff_output": "%{name}_diff_output.txt", - "check_diff_script": "%{name}_check_diff_script.sh", - }, - implementation = _diff_integration_goldens_impl, - test = True, -) - -def integration_test(name, target, data): - # Bazel target `java_gapic_library` will generate 3 source jars including the - # the source Java code of the gapic_library, resource_name_library and test_library. - diff_integration_goldens_test( - name = name, - gapic_library = target, - resource_name_library = "%s_resource_name" % target, - test_library = "%s_test" % target, - srcs = data, - ) - def _overwrite_golden_impl(ctx): # Extract the Java source files from the generated 3 srcjars from API bazel target, # and put them in the temporary folder `codegen_tmp`, zip as `goldens_output_zip`. diff --git a/scripts/BUILD.bazel b/scripts/BUILD.bazel new file mode 100644 index 0000000000..351e77a8f4 --- /dev/null +++ b/scripts/BUILD.bazel @@ -0,0 +1,3 @@ +package(default_visibility = ["//test/integration:__pkg__"]) + +exports_files(["diff_gen_and_golden.sh"]) diff --git a/scripts/diff_gen_and_golden.sh b/scripts/diff_gen_and_golden.sh new file mode 100755 index 0000000000..40967d7430 --- /dev/null +++ b/scripts/diff_gen_and_golden.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +set -o errexit + +API_NAME=$1 +RAW_SRCJAR=$( find . -name '*_java_gapic_srcjar_raw.srcjar' ) + +mkdir unpacked src +cd unpacked +unzip -q -c "../${RAW_SRCJAR}" temp-codegen.srcjar | jar x +cp -rf src/main/java/* ../src +cp -rf src/test/java/* ../src +[ -d proto ] && cp -rf proto/src/main/java/* ../src +cd .. + +# Remove unneeded non-Java files, like MANIFEST +find src -type f ! -name '*.java' -a ! -name '*gapic_metadata.json' -delete +find src -type f -name 'PlaceholderFile.java' -delete +find src -type d -empty -delete + +# This will not print diff_output to the console unless `--test_output=all` option +# is enabled, it only emits the comparison results to the test.log. +diff -ru src test/integration/goldens/${API_NAME} diff --git a/test/integration/BUILD.bazel b/test/integration/BUILD.bazel index addd91b3e8..cd4f73c0ee 100644 --- a/test/integration/BUILD.bazel +++ b/test/integration/BUILD.bazel @@ -9,11 +9,7 @@ load( "java_gapic_assembly_gradle_pkg", ) load("@rules_gapic//:gapic.bzl", "proto_library_with_info") -load( - "//:rules_bazel/java/integration_test.bzl", - "golden_update", - "integration_test", -) +load("//:rules_bazel/java/integration_test.bzl", "golden_update") load("@rules_proto//proto:defs.bzl", "proto_library") package(default_visibility = ["//visibility:public"]) @@ -49,10 +45,14 @@ API_GAPIC_TARGETS = { "compute": "@com_google_googleapis_discovery//google/cloud/compute/v1:compute_small_java_gapic", } -[integration_test( +[sh_test( name = lib_name, - data = ["//test/integration/goldens/%s:goldens_files" % lib_name], - target = API_GAPIC_TARGETS[lib_name], + srcs = ["//scripts:diff_gen_and_golden.sh"], + args = [lib_name], + data = [ + API_GAPIC_TARGETS[lib_name] + "_srcjar_raw.srcjar", + "//test/integration/goldens/%s:goldens_files" % lib_name, + ], ) for lib_name in INTEGRATION_TEST_LIBRARIES] [golden_update(