From b7034041dec0ee6cf012879b033961b8a407e669 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 18 May 2022 14:54:29 +0200 Subject: [PATCH] Convert ObjC codegen plugin tests to bazel tests. (#29676) * add initial version of bazelified plugin tests * polish the bazel sh_test scripts * add objc_codegen_plugin tests * add objc plugin tests to bazel test job --- src/objective-c/tests/BUILD | 23 ++++++ .../tests/PluginTest/plugin_option_test.sh | 80 +++++++++++++++++++ .../tests/PluginTest/plugin_test.sh | 61 ++++++++++++++ .../internal_ci/macos/grpc_objc_bazel_test.sh | 3 + tools/run_tests/run_tests.py | 6 +- 5 files changed, 169 insertions(+), 4 deletions(-) create mode 100755 src/objective-c/tests/PluginTest/plugin_option_test.sh create mode 100755 src/objective-c/tests/PluginTest/plugin_test.sh diff --git a/src/objective-c/tests/BUILD b/src/objective-c/tests/BUILD index 382986e0ccd..dd52a76cd79 100644 --- a/src/objective-c/tests/BUILD +++ b/src/objective-c/tests/BUILD @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +load("//bazel:grpc_build_system.bzl", "grpc_sh_test") load( "//src/objective-c:grpc_objc_internal_library.bzl", "grpc_objc_testing_library", @@ -241,3 +242,25 @@ tvos_unit_test( ":RxLibraryUnitTests-lib", ], ) + +grpc_sh_test( + name = "objc_codegen_plugin_test", + srcs = ["PluginTest/plugin_test.sh"], + data = [ + "@com_google_protobuf//:protoc", + "//src/compiler:grpc_objective_c_plugin", + ] + glob(["PluginTest/*.proto"]), + uses_polling = False, +) + +grpc_sh_test( + name = "objc_codegen_plugin_option_test", + srcs = ["PluginTest/plugin_option_test.sh"], + data = [ + "@com_google_protobuf//:protoc", + "//src/compiler:grpc_objective_c_plugin", + # NOTE: the :well_known_protos has been recently renamed to :well_known_type_protos on protobuf's main branch + "@com_google_protobuf//:well_known_protos", + ] + glob(["RemoteTestClient/*.proto"]), + uses_polling = False, +) diff --git a/src/objective-c/tests/PluginTest/plugin_option_test.sh b/src/objective-c/tests/PluginTest/plugin_option_test.sh new file mode 100755 index 00000000000..721226e0eec --- /dev/null +++ b/src/objective-c/tests/PluginTest/plugin_option_test.sh @@ -0,0 +1,80 @@ +#!/bin/bash +# Copyright 2022 The gRPC Authors +# +# 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. + +# Run this script via bazel test +# It expects that protoc and grpc_objective_c_plugin have already been built. + +set -ev + +# protoc and grpc_objective_c_plugin binaries are supplied as "data" in bazel +PROTOC=./external/com_google_protobuf/protoc +PLUGIN=./src/compiler/grpc_objective_c_plugin +WELL_KNOWN_PROTOS_PATH=external/com_google_protobuf/src +RUNTIME_IMPORT_PREFIX=prefix/dir/ + +PROTO_OUT=./proto_out +rm -rf ${PROTO_OUT} +mkdir -p ${PROTO_OUT} + +$PROTOC \ + --plugin=protoc-gen-grpc=$PLUGIN \ + --objc_out=${PROTO_OUT} \ + --grpc_out=grpc_local_import_prefix=$RUNTIME_IMPORT_PREFIX,runtime_import_prefix=$RUNTIME_IMPORT_PREFIX:${PROTO_OUT} \ + -I . \ + -I ${WELL_KNOWN_PROTOS_PATH} \ + src/objective-c/tests/RemoteTestClient/*.proto + +# TODO(jtattermusch): rewrite the tests to make them more readable. +# Also, the way they are written, they need one extra command to run in order to +# clear $? after they run (see end of this script) + +# Verify the "runtime_import_prefix" option +# Verify the output proto filename +[ -e ${PROTO_OUT}/src/objective-c/tests/RemoteTestClient/Test.pbrpc.m ] || { + echo >&2 "protoc outputs wrong filename." + exit 1 +} + +# Verify paths of protobuf WKTs in generated code contain runtime import prefix. +[ "`cat ${PROTO_OUT}/src/objective-c/tests/RemoteTestClient/Test.pbrpc.m | + egrep '#import "'"${RUNTIME_IMPORT_PREFIX}"'GPBEmpty\.pbobjc\.h'`" ] || { + echo >&2 "protoc generated import with wrong filename." + exit 1 +} + +# Verify paths of non WKTs protos in generated code don't contain runtime import prefix. +[ "`cat ${PROTO_OUT}/src/objective-c/tests/RemoteTestClient/Test.pbrpc.m | + egrep '.*\Messages.pbobjc.h"$' | + egrep '#import "'"${RUNTIME_IMPORT_PREFIX}"`" ] && { + echo >&2 "protoc generated import with wrong filename." + exit 1 +} + +# Verify the "grpc_local_import_directory" option +# Verify system files are imported in a "local" way in header files. +[ "`cat ${PROTO_OUT}/src/objective-c/tests/RemoteTestClient/Test.pbrpc.h | + egrep '#import "'"${RUNTIME_IMPORT_PREFIX}"'/ProtoRPC/.*\.h'`"] || { + echo >&2 "grpc system files should be imported with full paths." +} + +# Verify system files are imported in a "local" way in source files. +[ "`cat ${PROTO_OUT}/src/objective-c/tests/RemoteTestClient/Test.pbrpc.m | + egrep '#import "'"${RUNTIME_IMPORT_PREFIX}"'/ProtoRPC/.*\.h'`"] || { + echo >&2 "grpc system files should be imported with full paths." +} + +# Run one extra command to clear $? before exiting the script to prevent +# failing even when tests pass. +echo "Plugin option tests passed." diff --git a/src/objective-c/tests/PluginTest/plugin_test.sh b/src/objective-c/tests/PluginTest/plugin_test.sh new file mode 100755 index 00000000000..a49ddb988ca --- /dev/null +++ b/src/objective-c/tests/PluginTest/plugin_test.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# Copyright 2022 The gRPC Authors +# +# 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. + +# Run this script via bazel test +# It expects that protoc and grpc_objective_c_plugin have already been built. + +set -ev + +# protoc and grpc_objective_c_plugin binaries are supplied as "data" in bazel +PROTOC=./external/com_google_protobuf/protoc +PLUGIN=./src/compiler/grpc_objective_c_plugin + +PROTO_OUT=./proto_out +rm -rf ${PROTO_OUT} +mkdir -p ${PROTO_OUT} + +$PROTOC \ + --plugin=protoc-gen-grpc=$PLUGIN \ + --objc_out=${PROTO_OUT} \ + --grpc_out=${PROTO_OUT} \ + -I src/objective-c/tests/PluginTest \ + src/objective-c/tests/PluginTest/*.proto + +# Verify the output proto filename +[ -e ${PROTO_OUT}/TestDashFilename.pbrpc.h ] || { + echo >&2 "protoc outputs wrong filename." + exit 1 +} + +# TODO(jtattermusch): rewrite the tests to make them more readable. +# Also, the way they are written, they need one extra command to run in order to +# clear $? after they run (see end of this script) +# Verify names of the imported protos in generated code don't contain dashes. +[ "`cat ${PROTO_OUT}/TestDashFilename.pbrpc.h | + egrep '#import ".*\.pb(objc|rpc)\.h"$' | + egrep '-'`" ] && { + echo >&2 "protoc generated import with wrong filename." + exit 1 +} +[ "`cat ${PROTO_OUT}/TestDashFilename.pbrpc.m | + egrep '#import ".*\.pb(objc|rpc)\.h"$' | + egrep '-'`" ] && { + echo >&2 "protoc generated import with wrong filename." + exit 1 +} + +# Run one extra command to clear $? before exiting the script to prevent +# failing even when tests pass. +echo "Plugin tests passed." diff --git a/tools/internal_ci/macos/grpc_objc_bazel_test.sh b/tools/internal_ci/macos/grpc_objc_bazel_test.sh index fe7fcb50d7c..5aab1137c42 100755 --- a/tools/internal_ci/macos/grpc_objc_bazel_test.sh +++ b/tools/internal_ci/macos/grpc_objc_bazel_test.sh @@ -50,6 +50,9 @@ TEST_TARGETS=( # TODO(jtattermusch): make sure the //src/objective-c/tests:InteropTests test passes reliably under bazel //src/objective-c/tests:MacTests //src/objective-c/tests:UnitTests + # codegen plugin tests + //src/objective-c/tests:objc_codegen_plugin_test + //src/objective-c/tests:objc_codegen_plugin_option_test ) # === BEGIN SECTION: run interop_server on the background ==== diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index c40a5bef836..73e69d0f323 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -1043,16 +1043,14 @@ class ObjCLanguage(object): # 'FRAMEWORKS': 'NO' # })) - # TODO(jtattermusch): Create bazel target for the test and remove the test from here + # TODO(jtattermusch): Remove this task since the test already runs as part of the grpc_objc_bazel_test job. out.append( self.config.job_spec(['src/objective-c/tests/run_plugin_tests.sh'], timeout_seconds=60 * 60, shortname='ios-test-plugintest', cpu_cost=1e6, environ=_FORCE_ENVIRON_FOR_WRAPPERS)) - # Note that this test basically tests whether the codegen plugin works correctly by running protoc and checking the contents of the generated *.pbrpc.* files. - # it doesn't really build any ObjC code. - # TODO(jtattermusch): turn this test into a bazel test or come up with a better place where to put this test. + # TODO(jtattermusch): Remove this task since the test already runs as part of the grpc_objc_bazel_test job. out.append( self.config.job_spec( ['src/objective-c/tests/run_plugin_option_tests.sh'],