diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/dockerfile/grpc_clang/Dockerfile | 32 | ||||
-rw-r--r-- | tools/dockerfile/grpc_cxx/Dockerfile | 2 | ||||
-rw-r--r-- | tools/dockerfile/grpc_go/Dockerfile | 8 | ||||
-rw-r--r-- | tools/dockerfile/grpc_java/Dockerfile | 2 | ||||
-rw-r--r-- | tools/dockerfile/grpc_java_base/Dockerfile | 3 | ||||
-rw-r--r-- | tools/dockerfile/grpc_node_base/Dockerfile | 4 | ||||
-rw-r--r-- | tools/dockerfile/grpc_php_base/Dockerfile | 2 | ||||
-rw-r--r-- | tools/dockerfile/grpc_python/Dockerfile | 38 | ||||
-rw-r--r-- | tools/dockerfile/grpc_python/README.md | 11 | ||||
-rw-r--r-- | tools/dockerfile/grpc_python_base/Dockerfile | 20 | ||||
-rw-r--r-- | tools/dockerfile/grpc_python_base/README.md | 7 | ||||
-rw-r--r-- | tools/dockerfile/grpc_ruby/Dockerfile | 2 | ||||
-rw-r--r-- | tools/dockerfile/grpc_ruby_base/Dockerfile | 2 | ||||
-rwxr-xr-x | tools/gce_setup/grpc_docker.sh | 4 | ||||
-rwxr-xr-x | tools/gce_setup/interop_test_runner.sh | 2 | ||||
-rwxr-xr-x | tools/run_tests/build_python.sh | 4 | ||||
-rwxr-xr-x | tools/run_tests/run_tests.py | 1 | ||||
-rw-r--r-- | tools/run_tests/tests.json | 230 |
18 files changed, 354 insertions, 20 deletions
diff --git a/tools/dockerfile/grpc_clang/Dockerfile b/tools/dockerfile/grpc_clang/Dockerfile new file mode 100644 index 0000000000..0928121755 --- /dev/null +++ b/tools/dockerfile/grpc_clang/Dockerfile @@ -0,0 +1,32 @@ +FROM ubuntu:latest + +RUN apt-get update && apt-get install -y \ + cmake \ + g++ \ + gcc \ + git \ + make \ + python \ + && apt-get clean + +RUN git clone -b release_36 http://llvm.org/git/llvm.git +RUN git clone -b release_36 http://llvm.org/git/clang.git +RUN git clone -b release_36 http://llvm.org/git/compiler-rt.git +RUN git clone -b release_36 http://llvm.org/git/clang-tools-extra.git +RUN git clone -b release_36 http://llvm.org/git/libcxx.git +RUN git clone -b release_36 http://llvm.org/git/libcxxabi.git + +RUN mv clang llvm/tools +RUN mv compiler-rt llvm/projects +RUN mv clang-tools-extra llvm/tools/clang/tools +RUN mv libcxx llvm/projects +RUN mv libcxxabi llvm/projects + +RUN mkdir llvm-build +RUN cd llvm-build && cmake \ + -DCMAKE_BUILD_TYPE:STRING=Release \ + -DLLVM_TARGETS_TO_BUILD:STRING=X86 \ + ../llvm +RUN make -C llvm-build && make -C llvm-build install && rm -rf llvm-build + +CMD ["bash"] diff --git a/tools/dockerfile/grpc_cxx/Dockerfile b/tools/dockerfile/grpc_cxx/Dockerfile index 9b20e7a58e..e1ddfcb2da 100644 --- a/tools/dockerfile/grpc_cxx/Dockerfile +++ b/tools/dockerfile/grpc_cxx/Dockerfile @@ -4,7 +4,7 @@ FROM grpc/base RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev # Get the source from GitHub -RUN git clone git@github.com:google/grpc.git /var/local/git/grpc +RUN git clone git@github.com:grpc/grpc.git /var/local/git/grpc RUN cd /var/local/git/grpc && \ git pull --recurse-submodules && \ git submodule update --init --recursive diff --git a/tools/dockerfile/grpc_go/Dockerfile b/tools/dockerfile/grpc_go/Dockerfile index 1b998152a7..42620ff3cf 100644 --- a/tools/dockerfile/grpc_go/Dockerfile +++ b/tools/dockerfile/grpc_go/Dockerfile @@ -17,11 +17,11 @@ RUN echo 'StrictHostKeyChecking no' >> $HOME/.ssh/config RUN git config --global url."git@github.com:".insteadOf "https://github.com/" # Get the source from GitHub -RUN go get github.com/google/grpc-go/rpc +RUN go get google.golang.org/grpc # Build the interop client and server -RUN cd src/github.com/google/grpc-go/rpc/interop/client && go install -RUN cd src/github.com/google/grpc-go/rpc/interop/server && go install +RUN cd src/google.golang.org/grpc/interop/client && go install +RUN cd src/google.golang.org/grpc/interop/server && go install # Specify the default command such that the interop server runs on its known testing port -CMD ["/bin/bash", "-c", "cd src/github.com/google/grpc-go/rpc/interop/server && go run server.go --use_tls=true --port=8020"] +CMD ["/bin/bash", "-c", "cd src/google.golang.org/grpc/interop/server && go run server.go --use_tls=true --port=8020"] diff --git a/tools/dockerfile/grpc_java/Dockerfile b/tools/dockerfile/grpc_java/Dockerfile index a5508cad7f..17682c63f0 100644 --- a/tools/dockerfile/grpc_java/Dockerfile +++ b/tools/dockerfile/grpc_java/Dockerfile @@ -1,7 +1,7 @@ # Dockerfile for the gRPC Java dev image FROM grpc/java_base -RUN git clone --recursive --depth 1 git@github.com:google/grpc-java.git /var/local/git/grpc-java +RUN git clone --recursive --depth 1 git@github.com:grpc/grpc-java.git /var/local/git/grpc-java RUN cd /var/local/git/grpc-java/lib/netty && \ mvn -pl codec-http2 -am -DskipTests install clean RUN cd /var/local/git/grpc-java && \ diff --git a/tools/dockerfile/grpc_java_base/Dockerfile b/tools/dockerfile/grpc_java_base/Dockerfile index 5dbd781f7b..6031be484a 100644 --- a/tools/dockerfile/grpc_java_base/Dockerfile +++ b/tools/dockerfile/grpc_java_base/Dockerfile @@ -34,11 +34,12 @@ RUN wget -O - https://github.com/google/protobuf/archive/master.tar.gz | \ # Install a GitHub SSH service credential that gives access to the GitHub repo while it's private # TODO: remove this once the repo is public COPY .ssh/github.rsa /root/.ssh/id_rsa +RUN chmod 600 /root/.ssh/id_rsa RUN echo 'Host github.com\nStrictHostKeyChecking no' > /root/.ssh/config # Trigger download of as many Maven and Gradle artifacts as possible. We don't build grpc-java # because we don't want to install netty -RUN git clone --recursive --depth 1 git@github.com:google/grpc-java.git && \ +RUN git clone --recursive --depth 1 git@github.com:grpc/grpc-java.git && \ cd grpc-java/lib/netty && \ mvn -pl codec-http2 -am -DskipTests verify && \ cd ../.. && \ diff --git a/tools/dockerfile/grpc_node_base/Dockerfile b/tools/dockerfile/grpc_node_base/Dockerfile index 28bd7b2556..20efde98ad 100644 --- a/tools/dockerfile/grpc_node_base/Dockerfile +++ b/tools/dockerfile/grpc_node_base/Dockerfile @@ -10,7 +10,7 @@ RUN apt-get update && apt-get install -y nodejs RUN npm install -g node-gyp # Get the source from GitHub, this gets the protobuf library as well -RUN git clone git@github.com:google/grpc.git /var/local/git/grpc +RUN git clone git@github.com:grpc/grpc.git /var/local/git/grpc RUN cd /var/local/git/grpc && \ git pull --recurse-submodules && \ git submodule update --init --recursive @@ -19,4 +19,4 @@ RUN cd /var/local/git/grpc && \ RUN make static_c shared_c -j12 -C /var/local/git/grpc # Define the default command. -CMD ["bash"]
\ No newline at end of file +CMD ["bash"] diff --git a/tools/dockerfile/grpc_php_base/Dockerfile b/tools/dockerfile/grpc_php_base/Dockerfile index ef58f3a887..f4bf3b09a4 100644 --- a/tools/dockerfile/grpc_php_base/Dockerfile +++ b/tools/dockerfile/grpc_php_base/Dockerfile @@ -62,7 +62,7 @@ ENV PATH /usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/s RUN rvm all do gem install ronn rake # Get the source from GitHub, this gets the protobuf library as well -RUN git clone git@github.com:google/grpc.git /var/local/git/grpc +RUN git clone git@github.com:grpc/grpc.git /var/local/git/grpc RUN cd /var/local/git/grpc && \ git pull --recurse-submodules && \ git submodule update --init --recursive diff --git a/tools/dockerfile/grpc_python/Dockerfile b/tools/dockerfile/grpc_python/Dockerfile new file mode 100644 index 0000000000..2390ed7bcf --- /dev/null +++ b/tools/dockerfile/grpc_python/Dockerfile @@ -0,0 +1,38 @@ +# Dockerfile for GRPC Python +FROM grpc/python_base + +# Build the C library +RUN cd /var/local/git/grpc \ + && git pull --recurse-submodules \ + && git submodule update --init --recursive + +# Build the C core. +RUN make install_c -C /var/local/git/grpc + +# Build Python GRPC +RUN cd /var/local/git/grpc \ + && pip install src/python/src \ + && pip install src/python/interop + +# Run Python GRPC's tests +RUN cd /var/local/git/grpc \ + # TODO(nathaniel): It would be nice for these to be auto-discoverable? + && python2.7 -B -m _adapter._blocking_invocation_inline_service_test + && python2.7 -B -m _adapter._c_test + && python2.7 -B -m _adapter._event_invocation_synchronous_event_service_test + && python2.7 -B -m _adapter._future_invocation_asynchronous_event_service_test + && python2.7 -B -m _adapter._links_test + && python2.7 -B -m _adapter._lonely_rear_link_test + && python2.7 -B -m _adapter._low_test + && python2.7 -B -m _framework.base.packets.implementations_test + && python2.7 -B -m _framework.face.blocking_invocation_inline_service_test + && python2.7 -B -m _framework.face.event_invocation_synchronous_event_service_test + && python2.7 -B -m _framework.face.future_invocation_asynchronous_event_service_test + && python2.7 -B -m _framework.foundation._later_test + && python2.7 -B -m _framework.foundation._logging_pool_test + +# Add a cacerts directory containing the Google root pem file, allowing the interop client to access the production test instance +ADD cacerts cacerts + +# Specify the default command such that the interop server runs on its known testing port +CMD ["/bin/bash", "-l", "-c", "python2.7 -m interop.server --use_tls --port 8050"] diff --git a/tools/dockerfile/grpc_python/README.md b/tools/dockerfile/grpc_python/README.md new file mode 100644 index 0000000000..efbdbeff82 --- /dev/null +++ b/tools/dockerfile/grpc_python/README.md @@ -0,0 +1,11 @@ +GRPC Python Dockerfile +==================== + +Dockerfile for creating the Python development instances + +As of 2015/02 this +- is based on the GRPC Python base +- adds a pull of the HEAD GRPC Python source from GitHub +- builds it +- runs its tests and aborts image creation if the tests don't pass +- specifies the Python GRPC interop test server as default command diff --git a/tools/dockerfile/grpc_python_base/Dockerfile b/tools/dockerfile/grpc_python_base/Dockerfile new file mode 100644 index 0000000000..01292c2e12 --- /dev/null +++ b/tools/dockerfile/grpc_python_base/Dockerfile @@ -0,0 +1,20 @@ +# Base Dockerfile for GRPC Python. +# +# Includes Python environment and installation dependencies. +FROM grpc/base + +# Allows 'source' to work +RUN rm /bin/sh && ln -s /bin/bash /bin/sh + +# Install Python development +RUN apt-get update && apt-get install -y \ + python-all-dev \ + python3-all-dev \ + python-pip \ + python-virtualenv \ + +# Install Python packages from PyPI +RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.0.0-alpha-1 + +# Get the GRPC source from GitHub +RUN git clone --recursive git@github.com:google/grpc.git /var/local/git/grpc diff --git a/tools/dockerfile/grpc_python_base/README.md b/tools/dockerfile/grpc_python_base/README.md new file mode 100644 index 0000000000..1d4767ce5c --- /dev/null +++ b/tools/dockerfile/grpc_python_base/README.md @@ -0,0 +1,7 @@ +GRPC Python Base Dockerfile +======================== + +Dockerfile for creating the Python GRPC development Docker instance. + +As of 2015/02 this +- installs tools and dependencies needed to build GRPC Python diff --git a/tools/dockerfile/grpc_ruby/Dockerfile b/tools/dockerfile/grpc_ruby/Dockerfile index 47972e7eff..ff1b99ba37 100644 --- a/tools/dockerfile/grpc_ruby/Dockerfile +++ b/tools/dockerfile/grpc_ruby/Dockerfile @@ -6,7 +6,7 @@ RUN cd /var/local/git/grpc \ && git pull --recurse-submodules \ && git submodule update --init --recursive -# Build the C core. +# Build the C core RUN make install_c -C /var/local/git/grpc # Build ruby gRPC and run its tests diff --git a/tools/dockerfile/grpc_ruby_base/Dockerfile b/tools/dockerfile/grpc_ruby_base/Dockerfile index ec4544d2fd..a3a80daf9b 100644 --- a/tools/dockerfile/grpc_ruby_base/Dockerfile +++ b/tools/dockerfile/grpc_ruby_base/Dockerfile @@ -43,7 +43,7 @@ RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.1' >> ~/.bashrc" RUN /bin/bash -l -c "gem install bundler --no-ri --no-rdoc" # Get the source from GitHub -RUN git clone git@github.com:google/grpc.git /var/local/git/grpc +RUN git clone git@github.com:grpc/grpc.git /var/local/git/grpc RUN cd /var/local/git/grpc && \ git pull --recurse-submodules && \ git submodule update --init --recursive diff --git a/tools/gce_setup/grpc_docker.sh b/tools/gce_setup/grpc_docker.sh index 2e02653864..1c38582cb8 100755 --- a/tools/gce_setup/grpc_docker.sh +++ b/tools/gce_setup/grpc_docker.sh @@ -24,6 +24,10 @@ # Allows gcloud ssh commands to run on freshly started docker instances. _grpc_ensure_gcloud_ssh() { local default_key_file="$HOME/.ssh/google_compute_engine" + if [ "$HOME" == "/" ] + then + default_key_file="/root/.ssh/google_compute_engine" + fi [ -f $default_key_file ] || { ssh-keygen -f $default_key_file -N '' > /dev/null || { echo "could not precreate $default_key_file" 1>&2 diff --git a/tools/gce_setup/interop_test_runner.sh b/tools/gce_setup/interop_test_runner.sh index 456ad4b472..9ddbac75aa 100755 --- a/tools/gce_setup/interop_test_runner.sh +++ b/tools/gce_setup/interop_test_runner.sh @@ -8,7 +8,7 @@ main() { source grpc_docker.sh test_cases=(large_unary empty_unary ping_pong client_streaming server_streaming) clients=(cxx java go ruby node) - servers=(cxx java go ruby node) + servers=(cxx java go ruby node python) for test_case in "${test_cases[@]}" do for client in "${clients[@]}" diff --git a/tools/run_tests/build_python.sh b/tools/run_tests/build_python.sh index b45b9d6106..36254127c9 100755 --- a/tools/run_tests/build_python.sh +++ b/tools/run_tests/build_python.sh @@ -11,5 +11,5 @@ root=`pwd` virtualenv python2.7_virtual_environment ln -sf $root/include/grpc python2.7_virtual_environment/include/grpc source python2.7_virtual_environment/bin/activate -pip install enum34==1.0.4 futures==2.2.0 protobuf==2.6.1 -CFLAGS=-I$root/include LDFLAGS=-L$root/libs/opt pip install src/python +pip install enum34==1.0.4 futures==2.2.0 protobuf==3.0.0-alpha-1 +CFLAGS=-I$root/include LDFLAGS=-L$root/libs/opt pip install src/python/src diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index ab6728b4ee..0f3222b78c 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -111,6 +111,7 @@ _CONFIGS = { 'tsan': SimpleConfig('tsan', environ={ 'TSAN_OPTIONS': 'suppressions=tools/tsan_suppressions.txt'}), 'msan': SimpleConfig('msan'), + 'ubsan': SimpleConfig('ubsan'), 'asan': SimpleConfig('asan', environ={ 'ASAN_OPTIONS': 'detect_leaks=1:color=always:suppressions=tools/tsan_suppressions.txt'}), 'gcov': SimpleConfig('gcov'), diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index 197dc3b2ba..2b3e6702c5 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -215,6 +215,10 @@ }, { "language": "c", + "name": "multi_init_test" + }, + { + "language": "c", "name": "murmur_hash_test" }, { @@ -279,23 +283,23 @@ }, { "language": "c++", - "name": "status_test" + "name": "pubsub_publisher_test" }, { "language": "c++", - "name": "sync_client_async_server_test" + "name": "pubsub_subscriber_test" }, { "language": "c++", - "name": "thread_pool_test" + "name": "status_test" }, { "language": "c++", - "name": "tips_publisher_test" + "name": "sync_client_async_server_test" }, { "language": "c++", - "name": "tips_subscriber_test" + "name": "thread_pool_test" }, { "language": "c", @@ -335,6 +339,10 @@ }, { "language": "c", + "name": "chttp2_fake_security_empty_batch_test" + }, + { + "language": "c", "name": "chttp2_fake_security_graceful_server_shutdown_test" }, { @@ -523,6 +531,10 @@ }, { "language": "c", + "name": "chttp2_fullstack_empty_batch_test" + }, + { + "language": "c", "name": "chttp2_fullstack_graceful_server_shutdown_test" }, { @@ -675,6 +687,198 @@ }, { "language": "c", + "name": "chttp2_fullstack_uds_cancel_after_accept_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_cancel_after_invoke_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_cancel_before_invoke_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_census_simple_request_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_disappearing_server_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_empty_batch_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_graceful_server_shutdown_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_invoke_large_request_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_max_concurrent_streams_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_no_op_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_ping_pong_streaming_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_request_response_with_payload_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_request_with_large_metadata_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_request_with_payload_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_simple_delayed_request_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_simple_request_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_thread_stress_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_cancel_after_accept_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_cancel_after_invoke_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_cancel_before_invoke_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_census_simple_request_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_disappearing_server_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_graceful_server_shutdown_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_invoke_large_request_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_max_concurrent_streams_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_no_op_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_ping_pong_streaming_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_request_response_with_payload_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_request_response_with_trailing_metadata_and_payload_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_request_with_large_metadata_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_request_with_payload_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_simple_delayed_request_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_simple_request_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_thread_stress_legacy_test" + }, + { + "language": "c", + "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_legacy_test" + }, + { + "language": "c", "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_test" }, { @@ -711,6 +915,10 @@ }, { "language": "c", + "name": "chttp2_simple_ssl_fullstack_empty_batch_test" + }, + { + "language": "c", "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_test" }, { @@ -899,6 +1107,10 @@ }, { "language": "c", + "name": "chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test" + }, + { + "language": "c", "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test" }, { @@ -1087,6 +1299,10 @@ }, { "language": "c", + "name": "chttp2_socket_pair_empty_batch_test" + }, + { + "language": "c", "name": "chttp2_socket_pair_graceful_server_shutdown_test" }, { @@ -1275,6 +1491,10 @@ }, { "language": "c", + "name": "chttp2_socket_pair_one_byte_at_a_time_empty_batch_test" + }, + { + "language": "c", "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test" }, { |