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
pull/29720/head
Jan Tattermusch 3 years ago committed by GitHub
parent ad2ca50712
commit b7034041de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 23
      src/objective-c/tests/BUILD
  2. 80
      src/objective-c/tests/PluginTest/plugin_option_test.sh
  3. 61
      src/objective-c/tests/PluginTest/plugin_test.sh
  4. 3
      tools/internal_ci/macos/grpc_objc_bazel_test.sh
  5. 6
      tools/run_tests/run_tests.py

@ -14,6 +14,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
load("//bazel:grpc_build_system.bzl", "grpc_sh_test")
load( load(
"//src/objective-c:grpc_objc_internal_library.bzl", "//src/objective-c:grpc_objc_internal_library.bzl",
"grpc_objc_testing_library", "grpc_objc_testing_library",
@ -241,3 +242,25 @@ tvos_unit_test(
":RxLibraryUnitTests-lib", ":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,
)

@ -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."

@ -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."

@ -50,6 +50,9 @@ TEST_TARGETS=(
# TODO(jtattermusch): make sure the //src/objective-c/tests:InteropTests test passes reliably under bazel # TODO(jtattermusch): make sure the //src/objective-c/tests:InteropTests test passes reliably under bazel
//src/objective-c/tests:MacTests //src/objective-c/tests:MacTests
//src/objective-c/tests:UnitTests //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 ==== # === BEGIN SECTION: run interop_server on the background ====

@ -1043,16 +1043,14 @@ class ObjCLanguage(object):
# 'FRAMEWORKS': 'NO' # '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( out.append(
self.config.job_spec(['src/objective-c/tests/run_plugin_tests.sh'], self.config.job_spec(['src/objective-c/tests/run_plugin_tests.sh'],
timeout_seconds=60 * 60, timeout_seconds=60 * 60,
shortname='ios-test-plugintest', shortname='ios-test-plugintest',
cpu_cost=1e6, cpu_cost=1e6,
environ=_FORCE_ENVIRON_FOR_WRAPPERS)) 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. # TODO(jtattermusch): Remove this task since the test already runs as part of the grpc_objc_bazel_test job.
# 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.
out.append( out.append(
self.config.job_spec( self.config.job_spec(
['src/objective-c/tests/run_plugin_option_tests.sh'], ['src/objective-c/tests/run_plugin_option_tests.sh'],

Loading…
Cancel
Save