diff options
82 files changed, 4015 insertions, 999 deletions
diff --git a/.travis.yml b/.travis.yml index 165f8923c0..7d8634506c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,12 +4,13 @@ before_install: - sudo add-apt-repository ppa:h-rayflood/llvm -y - sudo apt-get update -qq - sudo apt-get install -qq libgtest-dev libgflags-dev python-virtualenv clang-3.5 - - sudo pip install cpp-coveralls + - sudo pip install cpp-coveralls mako simplejson env: global: - RUBY_VERSION=2.1 - COVERALLS_PARALLEL=true matrix: + - CONFIG=opt TEST=sanity - CONFIG=dbg TEST=c - CONFIG=dbg TEST=c++ - CONFIG=opt TEST=c @@ -186,6 +186,8 @@ cc_library( "src/core/json/json_common.h", "src/core/json/json_reader.h", "src/core/json/json_writer.h", + "src/core/profiling/timers.h", + "src/core/profiling/timers_preciseclock.h", "src/core/statistics/census_interface.h", "src/core/statistics/census_log.h", "src/core/statistics/census_rpc_stats.h", @@ -265,6 +267,7 @@ cc_library( "src/core/iomgr/alarm_heap.c", "src/core/iomgr/endpoint.c", "src/core/iomgr/endpoint_pair_posix.c", + "src/core/iomgr/endpoint_pair_windows.c", "src/core/iomgr/fd_posix.c", "src/core/iomgr/iocp_windows.c", "src/core/iomgr/iomgr.c", @@ -297,6 +300,7 @@ cc_library( "src/core/json/json_reader.c", "src/core/json/json_string.c", "src/core/json/json_writer.c", + "src/core/profiling/timers.c", "src/core/statistics/census_init.c", "src/core/statistics/census_log.c", "src/core/statistics/census_rpc_stats.c", @@ -413,6 +417,8 @@ cc_library( "src/core/json/json_common.h", "src/core/json/json_reader.h", "src/core/json/json_writer.h", + "src/core/profiling/timers.h", + "src/core/profiling/timers_preciseclock.h", "src/core/statistics/census_interface.h", "src/core/statistics/census_log.h", "src/core/statistics/census_rpc_stats.h", @@ -472,6 +478,7 @@ cc_library( "src/core/iomgr/alarm_heap.c", "src/core/iomgr/endpoint.c", "src/core/iomgr/endpoint_pair_posix.c", + "src/core/iomgr/endpoint_pair_windows.c", "src/core/iomgr/fd_posix.c", "src/core/iomgr/iocp_windows.c", "src/core/iomgr/iomgr.c", @@ -504,6 +511,7 @@ cc_library( "src/core/json/json_reader.c", "src/core/json/json_string.c", "src/core/json/json_writer.c", + "src/core/profiling/timers.c", "src/core/statistics/census_init.c", "src/core/statistics/census_log.c", "src/core/statistics/census_rpc_stats.c", @@ -85,6 +85,15 @@ CPPFLAGS_opt = -O2 LDFLAGS_opt = DEFINES_opt = NDEBUG +VALID_CONFIG_latprof = 1 +CC_latprof = $(DEFAULT_CC) +CXX_latprof = $(DEFAULT_CXX) +LD_latprof = $(DEFAULT_CC) +LDXX_latprof = $(DEFAULT_CXX) +CPPFLAGS_latprof = -O2 -DGRPC_LATENCY_PROFILER +LDFLAGS_latprof = +DEFINES_latprof = NDEBUG + VALID_CONFIG_dbg = 1 CC_dbg = $(DEFAULT_CC) CXX_dbg = $(DEFAULT_CXX) @@ -621,6 +630,7 @@ tcp_server_posix_test: $(BINDIR)/$(CONFIG)/tcp_server_posix_test time_averaged_stats_test: $(BINDIR)/$(CONFIG)/time_averaged_stats_test time_test: $(BINDIR)/$(CONFIG)/time_test timeout_encoding_test: $(BINDIR)/$(CONFIG)/timeout_encoding_test +timers_test: $(BINDIR)/$(CONFIG)/timers_test transport_metadata_test: $(BINDIR)/$(CONFIG)/transport_metadata_test transport_security_test: $(BINDIR)/$(CONFIG)/transport_security_test async_end2end_test: $(BINDIR)/$(CONFIG)/async_end2end_test @@ -1081,7 +1091,7 @@ privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/ buildtests: buildtests_c buildtests_cxx -buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/census_hash_table_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_circular_buffer_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_test $(BINDIR)/$(CONFIG)/census_statistics_performance_test $(BINDIR)/$(CONFIG)/census_statistics_quick_test $(BINDIR)/$(CONFIG)/census_statistics_small_log_test $(BINDIR)/$(CONFIG)/census_stub_test $(BINDIR)/$(CONFIG)/census_window_stats_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/chttp2_transport_end2end_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/echo_client $(BINDIR)/$(CONFIG)/echo_server $(BINDIR)/$(CONFIG)/echo_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cancellable_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/metadata_buffer_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/poll_kick_posix_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/time_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_legacy_test +buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/census_hash_table_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_circular_buffer_test $(BINDIR)/$(CONFIG)/census_statistics_multiple_writers_test $(BINDIR)/$(CONFIG)/census_statistics_performance_test $(BINDIR)/$(CONFIG)/census_statistics_quick_test $(BINDIR)/$(CONFIG)/census_statistics_small_log_test $(BINDIR)/$(CONFIG)/census_stub_test $(BINDIR)/$(CONFIG)/census_window_stats_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/chttp2_transport_end2end_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/echo_client $(BINDIR)/$(CONFIG)/echo_server $(BINDIR)/$(CONFIG)/echo_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cancellable_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/metadata_buffer_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/poll_kick_posix_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/time_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_writes_done_hangs_with_pending_read_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_thread_stress_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_disappearing_server_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_thread_stress_legacy_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_legacy_test buildtests_cxx: privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/qps_driver $(BINDIR)/$(CONFIG)/qps_smoke_test $(BINDIR)/$(CONFIG)/qps_worker $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/thread_pool_test @@ -1220,6 +1230,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/time_test || ( echo test time_test failed ; exit 1 ) $(E) "[RUN] Testing timeout_encoding_test" $(Q) $(BINDIR)/$(CONFIG)/timeout_encoding_test || ( echo test timeout_encoding_test failed ; exit 1 ) + $(E) "[RUN] Testing timers_test" + $(Q) $(BINDIR)/$(CONFIG)/timers_test || ( echo test timers_test failed ; exit 1 ) $(E) "[RUN] Testing transport_metadata_test" $(Q) $(BINDIR)/$(CONFIG)/transport_metadata_test || ( echo test transport_metadata_test failed ; exit 1 ) $(E) "[RUN] Testing transport_security_test" @@ -2597,6 +2609,7 @@ LIBGRPC_SRC = \ src/core/iomgr/alarm_heap.c \ src/core/iomgr/endpoint.c \ src/core/iomgr/endpoint_pair_posix.c \ + src/core/iomgr/endpoint_pair_windows.c \ src/core/iomgr/fd_posix.c \ src/core/iomgr/iocp_windows.c \ src/core/iomgr/iomgr.c \ @@ -2629,6 +2642,7 @@ LIBGRPC_SRC = \ src/core/json/json_reader.c \ src/core/json/json_string.c \ src/core/json/json_writer.c \ + src/core/profiling/timers.c \ src/core/statistics/census_init.c \ src/core/statistics/census_log.c \ src/core/statistics/census_rpc_stats.c \ @@ -2744,6 +2758,7 @@ src/core/iomgr/alarm.c: $(OPENSSL_DEP) src/core/iomgr/alarm_heap.c: $(OPENSSL_DEP) src/core/iomgr/endpoint.c: $(OPENSSL_DEP) src/core/iomgr/endpoint_pair_posix.c: $(OPENSSL_DEP) +src/core/iomgr/endpoint_pair_windows.c: $(OPENSSL_DEP) src/core/iomgr/fd_posix.c: $(OPENSSL_DEP) src/core/iomgr/iocp_windows.c: $(OPENSSL_DEP) src/core/iomgr/iomgr.c: $(OPENSSL_DEP) @@ -2776,6 +2791,7 @@ src/core/json/json.c: $(OPENSSL_DEP) src/core/json/json_reader.c: $(OPENSSL_DEP) src/core/json/json_string.c: $(OPENSSL_DEP) src/core/json/json_writer.c: $(OPENSSL_DEP) +src/core/profiling/timers.c: $(OPENSSL_DEP) src/core/statistics/census_init.c: $(OPENSSL_DEP) src/core/statistics/census_log.c: $(OPENSSL_DEP) src/core/statistics/census_rpc_stats.c: $(OPENSSL_DEP) @@ -2907,6 +2923,7 @@ $(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm_heap.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_posix.o: +$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_windows.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/fd_posix.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/iocp_windows.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr.o: @@ -2939,6 +2956,7 @@ $(OBJDIR)/$(CONFIG)/src/core/json/json.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_reader.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_string.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_writer.o: +$(OBJDIR)/$(CONFIG)/src/core/profiling/timers.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_init.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_log.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_rpc_stats.o: @@ -2996,6 +3014,7 @@ LIBGRPC_TEST_UTIL_SRC = \ test/core/util/grpc_profiler.c \ test/core/util/parse_hexstring.c \ test/core/util/port_posix.c \ + test/core/util/port_windows.c \ test/core/util/slice_splitter.c \ @@ -3025,6 +3044,7 @@ test/core/transport/transport_end2end_tests.c: $(OPENSSL_DEP) test/core/util/grpc_profiler.c: $(OPENSSL_DEP) test/core/util/parse_hexstring.c: $(OPENSSL_DEP) test/core/util/port_posix.c: $(OPENSSL_DEP) +test/core/util/port_windows.c: $(OPENSSL_DEP) test/core/util/slice_splitter.c: $(OPENSSL_DEP) endif @@ -3058,6 +3078,7 @@ $(OBJDIR)/$(CONFIG)/test/core/transport/transport_end2end_tests.o: $(OBJDIR)/$(CONFIG)/test/core/util/grpc_profiler.o: $(OBJDIR)/$(CONFIG)/test/core/util/parse_hexstring.o: $(OBJDIR)/$(CONFIG)/test/core/util/port_posix.o: +$(OBJDIR)/$(CONFIG)/test/core/util/port_windows.o: $(OBJDIR)/$(CONFIG)/test/core/util/slice_splitter.o: @@ -3083,6 +3104,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/iomgr/alarm_heap.c \ src/core/iomgr/endpoint.c \ src/core/iomgr/endpoint_pair_posix.c \ + src/core/iomgr/endpoint_pair_windows.c \ src/core/iomgr/fd_posix.c \ src/core/iomgr/iocp_windows.c \ src/core/iomgr/iomgr.c \ @@ -3115,6 +3137,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/json/json_reader.c \ src/core/json/json_string.c \ src/core/json/json_writer.c \ + src/core/profiling/timers.c \ src/core/statistics/census_init.c \ src/core/statistics/census_log.c \ src/core/statistics/census_rpc_stats.c \ @@ -3223,6 +3246,7 @@ $(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/alarm_heap.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_posix.o: +$(OBJDIR)/$(CONFIG)/src/core/iomgr/endpoint_pair_windows.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/fd_posix.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/iocp_windows.o: $(OBJDIR)/$(CONFIG)/src/core/iomgr/iomgr.o: @@ -3255,6 +3279,7 @@ $(OBJDIR)/$(CONFIG)/src/core/json/json.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_reader.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_string.o: $(OBJDIR)/$(CONFIG)/src/core/json/json_writer.o: +$(OBJDIR)/$(CONFIG)/src/core/profiling/timers.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_init.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_log.o: $(OBJDIR)/$(CONFIG)/src/core/statistics/census_rpc_stats.o: @@ -4054,8 +4079,13 @@ $(OBJDIR)/$(CONFIG)/examples/pubsub/subscriber.o: $(GENDIR)/examples/pubsub/ LIBQPS_SRC = \ $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc \ + test/cpp/qps/client_async.cc \ + test/cpp/qps/client_sync.cc \ test/cpp/qps/driver.cc \ + test/cpp/qps/qps_worker.cc \ test/cpp/qps/report.cc \ + test/cpp/qps/server_async.cc \ + test/cpp/qps/server_sync.cc \ test/cpp/qps/timer.cc \ @@ -4084,8 +4114,13 @@ ifneq ($(OPENSSL_DEP),) # installing headers to their final destination on the drive. We need this # otherwise parallel compilation will fail if a source is compiled first. test/cpp/qps/qpstest.proto: $(OPENSSL_DEP) +test/cpp/qps/client_async.cc: $(OPENSSL_DEP) +test/cpp/qps/client_sync.cc: $(OPENSSL_DEP) test/cpp/qps/driver.cc: $(OPENSSL_DEP) +test/cpp/qps/qps_worker.cc: $(OPENSSL_DEP) test/cpp/qps/report.cc: $(OPENSSL_DEP) +test/cpp/qps/server_async.cc: $(OPENSSL_DEP) +test/cpp/qps/server_sync.cc: $(OPENSSL_DEP) test/cpp/qps/timer.cc: $(OPENSSL_DEP) endif @@ -4112,8 +4147,13 @@ endif endif +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc $(OBJDIR)/$(CONFIG)/test/cpp/qps/driver.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/qps_worker.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc $(OBJDIR)/$(CONFIG)/test/cpp/qps/report.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc $(OBJDIR)/$(CONFIG)/test/cpp/qps/timer.o: $(GENDIR)/test/cpp/qps/qpstest.pb.cc $(GENDIR)/test/cpp/qps/qpstest.grpc.pb.cc @@ -8268,6 +8308,37 @@ endif endif +TIMERS_TEST_SRC = \ + test/core/profiling/timers_test.c \ + +TIMERS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TIMERS_TEST_SRC)))) + +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL with ALPN. + +$(BINDIR)/$(CONFIG)/timers_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/timers_test: $(TIMERS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(TIMERS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/timers_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/profiling/timers_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_timers_test: $(TIMERS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(TIMERS_TEST_OBJS:.o=.dep) +endif +endif + + TRANSPORT_METADATA_TEST_SRC = \ test/core/transport/metadata_test.c \ @@ -9119,10 +9190,6 @@ endif QPS_WORKER_SRC = \ - test/cpp/qps/client_async.cc \ - test/cpp/qps/client_sync.cc \ - test/cpp/qps/server_async.cc \ - test/cpp/qps/server_sync.cc \ test/cpp/qps/worker.cc \ QPS_WORKER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(QPS_WORKER_SRC)))) @@ -9153,10 +9220,6 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_async.o: $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a -$(OBJDIR)/$(CONFIG)/test/cpp/qps/client_sync.o: $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a -$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_async.o: $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a -$(OBJDIR)/$(CONFIG)/test/cpp/qps/server_sync.o: $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(OBJDIR)/$(CONFIG)/test/cpp/qps/worker.o: $(LIBDIR)/$(CONFIG)/libqps.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_qps_worker: $(QPS_WORKER_OBJS:.o=.dep) diff --git a/build.json b/build.json index a17df3cb79..ce0726ba26 100644 --- a/build.json +++ b/build.json @@ -137,6 +137,8 @@ "src/core/json/json_common.h", "src/core/json/json_reader.h", "src/core/json/json_writer.h", + "src/core/profiling/timers.h", + "src/core/profiling/timers_preciseclock.h", "src/core/statistics/census_interface.h", "src/core/statistics/census_log.h", "src/core/statistics/census_rpc_stats.h", @@ -197,6 +199,7 @@ "src/core/iomgr/alarm_heap.c", "src/core/iomgr/endpoint.c", "src/core/iomgr/endpoint_pair_posix.c", + "src/core/iomgr/endpoint_pair_windows.c", "src/core/iomgr/fd_posix.c", "src/core/iomgr/iocp_windows.c", "src/core/iomgr/iomgr.c", @@ -229,6 +232,7 @@ "src/core/json/json_reader.c", "src/core/json/json_string.c", "src/core/json/json_writer.c", + "src/core/profiling/timers.c", "src/core/statistics/census_init.c", "src/core/statistics/census_log.c", "src/core/statistics/census_rpc_stats.c", @@ -444,6 +448,7 @@ "test/core/util/grpc_profiler.c", "test/core/util/parse_hexstring.c", "test/core/util/port_posix.c", + "test/core/util/port_windows.c", "test/core/util/slice_splitter.c" ], "deps": [ @@ -636,13 +641,19 @@ "language": "c++", "headers": [ "test/cpp/qps/driver.h", + "test/cpp/qps/qps_worker.h", "test/cpp/qps/report.h", "test/cpp/qps/timer.h" ], "src": [ "test/cpp/qps/qpstest.proto", + "test/cpp/qps/client_async.cc", + "test/cpp/qps/client_sync.cc", "test/cpp/qps/driver.cc", + "test/cpp/qps/qps_worker.cc", "test/cpp/qps/report.cc", + "test/cpp/qps/server_async.cc", + "test/cpp/qps/server_sync.cc", "test/cpp/qps/timer.cc" ] }, @@ -941,6 +952,9 @@ "grpc", "gpr_test_util", "gpr" + ], + "platforms": [ + "posix" ] }, { @@ -1755,6 +1769,20 @@ ] }, { + "name": "timers_test", + "build": "test", + "language": "c", + "src": [ + "test/core/profiling/timers_test.c" + ], + "deps": [ + "grpc_test_util", + "grpc", + "gpr_test_util", + "gpr" + ] + }, + { "name": "transport_metadata_test", "build": "test", "language": "c", @@ -2097,10 +2125,6 @@ "test/cpp/qps/server.h" ], "src": [ - "test/cpp/qps/client_async.cc", - "test/cpp/qps/client_sync.cc", - "test/cpp/qps/server_async.cc", - "test/cpp/qps/server_sync.cc", "test/cpp/qps/worker.cc" ], "deps": [ diff --git a/include/grpc/support/slice_buffer.h b/include/grpc/support/slice_buffer.h index c7e5dbc647..1545dbfd76 100644 --- a/include/grpc/support/slice_buffer.h +++ b/include/grpc/support/slice_buffer.h @@ -40,6 +40,8 @@ extern "C" { #endif +#define GRPC_SLICE_BUFFER_INLINE_ELEMENTS 8 + /* Represents an expandable array of slices, to be interpreted as a single item TODO(ctiller): inline some small number of elements into the struct, to avoid per-call allocations */ @@ -52,6 +54,8 @@ typedef struct { size_t capacity; /* the combined length of all slices in the array */ size_t length; + /* inlined elements to avoid allocations */ + gpr_slice inlined[GRPC_SLICE_BUFFER_INLINE_ELEMENTS]; } gpr_slice_buffer; /* initialize a slice buffer */ @@ -78,9 +82,11 @@ gpr_uint8 *gpr_slice_buffer_tiny_add(gpr_slice_buffer *sb, unsigned len); void gpr_slice_buffer_pop(gpr_slice_buffer *sb); /* clear a slice buffer, unref all elements */ void gpr_slice_buffer_reset_and_unref(gpr_slice_buffer *sb); +/* swap the contents of two slice buffers */ +void gpr_slice_buffer_swap(gpr_slice_buffer *a, gpr_slice_buffer *b); #ifdef __cplusplus } #endif -#endif /* GRPC_SUPPORT_SLICE_BUFFER_H */ +#endif /* GRPC_SUPPORT_SLICE_BUFFER_H */ diff --git a/src/core/iomgr/endpoint_pair_windows.c b/src/core/iomgr/endpoint_pair_windows.c new file mode 100644 index 0000000000..d78b6ea957 --- /dev/null +++ b/src/core/iomgr/endpoint_pair_windows.c @@ -0,0 +1,85 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include <grpc/support/port_platform.h> + +#ifdef GPR_WINSOCK_SOCKET +#include "src/core/iomgr/sockaddr_utils.h" +#include "src/core/iomgr/endpoint_pair.h" + +#include <errno.h> +#include <fcntl.h> +#include <string.h> + +#include "src/core/iomgr/tcp_windows.h" +#include "src/core/iomgr/socket_windows.h" +#include <grpc/support/log.h> + +static void create_sockets(SOCKET sv[2]) { + SOCKET svr_sock = INVALID_SOCKET; + SOCKET lst_sock = INVALID_SOCKET; + SOCKET cli_sock = INVALID_SOCKET; + SOCKADDR_IN addr; + int addr_len; + + lst_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); + GPR_ASSERT(lst_sock != INVALID_SOCKET); + + memset(&addr, 0, sizeof(addr)); + GPR_ASSERT(bind(lst_sock, (struct sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR); + GPR_ASSERT(listen(lst_sock, SOMAXCONN) != SOCKET_ERROR); + GPR_ASSERT(getsockname(lst_sock, (struct sockaddr*)&addr, &addr_len) != SOCKET_ERROR); + + cli_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); + GPR_ASSERT(cli_sock != INVALID_SOCKET); + + GPR_ASSERT(WSAConnect(cli_sock, (struct sockaddr*)&addr, addr_len, NULL, NULL, NULL, NULL) == 0); + svr_sock = accept(lst_sock, (struct sockaddr*)&addr, &addr_len); + GPR_ASSERT(svr_sock != INVALID_SOCKET); + + closesocket(lst_sock); + + sv[1] = cli_sock; + sv[0] = svr_sock; +} + +grpc_endpoint_pair grpc_iomgr_create_endpoint_pair(size_t read_slice_size) { + SOCKET sv[2]; + grpc_endpoint_pair p; + create_sockets(sv); + p.client = grpc_tcp_create(grpc_winsocket_create(sv[1])); + p.server = grpc_tcp_create(grpc_winsocket_create(sv[0])); + return p; +} + +#endif diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c index 895f85fc68..7e31f2d7a5 100644 --- a/src/core/iomgr/tcp_server_posix.c +++ b/src/core/iomgr/tcp_server_posix.c @@ -174,7 +174,6 @@ void grpc_tcp_server_destroy( while (s->active_ports) { gpr_cv_wait(&s->cv, &s->mu, gpr_inf_future); } - gpr_mu_unlock(&s->mu); /* delete ALL the things */ if (s->nports) { @@ -185,7 +184,9 @@ void grpc_tcp_server_destroy( } grpc_fd_orphan(sp->emfd, destroyed_port, s); } + gpr_mu_unlock(&s->mu); } else { + gpr_mu_unlock(&s->mu); finish_shutdown(s); } } diff --git a/src/core/profiling/timers.c b/src/core/profiling/timers.c new file mode 100644 index 0000000000..478397d1bf --- /dev/null +++ b/src/core/profiling/timers.c @@ -0,0 +1,138 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifdef GRPC_LATENCY_PROFILER + +#include "src/core/profiling/timers.h" +#include "src/core/profiling/timers_preciseclock.h" + +#include <grpc/support/alloc.h> +#include <grpc/support/log.h> +#include <grpc/support/time.h> +#include <grpc/support/sync.h> +#include <stdio.h> + +typedef struct grpc_timer_entry { + grpc_precise_clock tm; + const char* tag; + int seq; + const char* file; + int line; +} grpc_timer_entry; + +struct grpc_timers_log { + gpr_mu mu; + grpc_timer_entry* log; + int num_entries; + int capacity; + int capacity_limit; + FILE* fp; +}; + +grpc_timers_log* grpc_timers_log_global = NULL; + +grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE* dump) { + grpc_timers_log* log = gpr_malloc(sizeof(*log)); + + /* TODO (vpai): Allow allocation below limit */ + log->log = gpr_malloc(capacity_limit * sizeof(*log->log)); + + /* TODO (vpai): Improve concurrency, do per-thread logging? */ + gpr_mu_init(&log->mu); + + log->num_entries = 0; + log->capacity = log->capacity_limit = capacity_limit; + + log->fp = dump; + + return log; +} + +static void log_report_locked(grpc_timers_log* log) { + FILE* fp = log->fp; + int i; + for (i = 0; i < log->num_entries; i++) { + grpc_timer_entry* entry = &(log->log[i]); + fprintf(fp, "GRPC_LAT_PROF "); + grpc_precise_clock_print(&entry->tm, fp); + fprintf(fp, " %s#%d,%s:%d\n", entry->tag, entry->seq, entry->file, + entry->line); + } + + /* Now clear out the log */ + log->num_entries = 0; +} + +void grpc_timers_log_destroy(grpc_timers_log* log) { + gpr_mu_lock(&log->mu); + log_report_locked(log); + gpr_mu_unlock(&log->mu); + + gpr_free(log->log); + gpr_mu_destroy(&log->mu); + + gpr_free(log); +} + +void grpc_timers_log_add(grpc_timers_log* log, const char* tag, int seq, + const char* file, int line) { + grpc_timer_entry* entry; + + /* TODO (vpai) : Improve concurrency */ + gpr_mu_lock(&log->mu); + if (log->num_entries == log->capacity_limit) { + log_report_locked(log); + } + + entry = &log->log[log->num_entries++]; + + grpc_precise_clock_now(&entry->tm); + entry->tag = tag; + entry->seq = seq; + entry->file = file; + entry->line = line; + + gpr_mu_unlock(&log->mu); +} + +void grpc_timers_log_global_init(void) { + grpc_timers_log_global = grpc_timers_log_create(100000, stdout); +} + +void grpc_timers_log_global_destroy(void) { + grpc_timers_log_destroy(grpc_timers_log_global); +} +#else /* !GRPC_LATENCY_PROFILER */ +void grpc_timers_log_global_init(void) {} +void grpc_timers_log_global_destroy(void) {} +#endif /* GRPC_LATENCY_PROFILER */ diff --git a/src/core/profiling/timers.h b/src/core/profiling/timers.h new file mode 100644 index 0000000000..ef4cad112a --- /dev/null +++ b/src/core/profiling/timers.h @@ -0,0 +1,70 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_CORE_PROFILING_TIMERS_H +#define GRPC_CORE_PROFILING_TIMERS_H + +#include <stdio.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef GRPC_LATENCY_PROFILER + +typedef struct grpc_timers_log grpc_timers_log; + +grpc_timers_log *grpc_timers_log_create(int capacity_limit, FILE *dump); +void grpc_timers_log_add(grpc_timers_log *, const char *tag, int seq, + const char *file, int line); +void grpc_timers_log_destroy(grpc_timers_log *); + +extern grpc_timers_log *grpc_timers_log_global; + +#define GRPC_TIMER_MARK(x, s) \ + grpc_timers_log_add(grpc_timers_log_global, #x, s, __FILE__, __LINE__) + +#else /* !GRPC_LATENCY_PROFILER */ +#define GRPC_TIMER_MARK(x, s) \ + do { \ + } while (0) +#endif /* GRPC_LATENCY_PROFILER */ + +void grpc_timers_log_global_init(void); +void grpc_timers_log_global_destroy(void); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_CORE_PROFILING_TIMERS_H */ diff --git a/src/core/profiling/timers_preciseclock.h b/src/core/profiling/timers_preciseclock.h new file mode 100644 index 0000000000..bf4a0eab8a --- /dev/null +++ b/src/core/profiling/timers_preciseclock.h @@ -0,0 +1,56 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H +#define GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H + +#include <grpc/support/time.h> +#include <stdio.h> + +typedef struct grpc_precise_clock grpc_precise_clock; + +#ifdef GRPC_TIMERS_RDTSC +#error RDTSC timers not currently supported +#else +struct grpc_precise_clock { + gpr_timespec clock; +}; +static void grpc_precise_clock_now(grpc_precise_clock* clk) { + clk->clock = gpr_now(); +} +static void grpc_precise_clock_print(const grpc_precise_clock* clk, FILE* fp) { + fprintf(fp, "%ld.%09d", clk->clock.tv_sec, clk->clock.tv_nsec); +} +#endif /* GRPC_TIMERS_RDTSC */ + +#endif /* GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H */ diff --git a/src/core/security/credentials.c b/src/core/security/credentials.c index 698e099134..e6d2e9e332 100644 --- a/src/core/security/credentials.c +++ b/src/core/security/credentials.c @@ -111,6 +111,11 @@ void grpc_credentials_get_request_metadata(grpc_credentials *creds, creds->vtable->get_request_metadata(creds, service_url, cb, user_data); } +grpc_mdctx *grpc_credentials_get_metadata_context(grpc_credentials *creds) { + if (creds == NULL) return NULL; + return creds->vtable->get_metadata_context(creds); +} + void grpc_server_credentials_release(grpc_server_credentials *creds) { if (creds == NULL) return; creds->vtable->destroy(creds); @@ -167,8 +172,13 @@ static int ssl_has_request_metadata_only(const grpc_credentials *creds) { return 0; } +static grpc_mdctx *ssl_get_metadata_context(grpc_credentials *creds) { + return NULL; +} + static grpc_credentials_vtable ssl_vtable = { - ssl_destroy, ssl_has_request_metadata, ssl_has_request_metadata_only, NULL}; + ssl_destroy, ssl_has_request_metadata, ssl_has_request_metadata_only, + ssl_get_metadata_context, NULL}; static grpc_server_credentials_vtable ssl_server_vtable = {ssl_server_destroy}; @@ -371,9 +381,14 @@ static void jwt_get_request_metadata(grpc_credentials *creds, } } +static grpc_mdctx *jwt_get_metadata_context(grpc_credentials *creds) { + grpc_jwt_credentials *c = (grpc_jwt_credentials *)creds; + return c->md_ctx; +} + static grpc_credentials_vtable jwt_vtable = { jwt_destroy, jwt_has_request_metadata, jwt_has_request_metadata_only, - jwt_get_request_metadata}; + jwt_get_metadata_context, jwt_get_request_metadata}; grpc_credentials *grpc_jwt_credentials_create(const char *json_key, gpr_timespec token_lifetime) { @@ -585,11 +600,19 @@ static void init_oauth2_token_fetcher(grpc_oauth2_token_fetcher_credentials *c, c->fetch_func = fetch_func; } +static grpc_mdctx *oauth2_token_fetcher_get_metadata_context( + grpc_credentials *creds) { + grpc_oauth2_token_fetcher_credentials *c = + (grpc_oauth2_token_fetcher_credentials *)creds; + return c->md_ctx; +} + /* -- ComputeEngine credentials. -- */ static grpc_credentials_vtable compute_engine_vtable = { oauth2_token_fetcher_destroy, oauth2_token_fetcher_has_request_metadata, oauth2_token_fetcher_has_request_metadata_only, + oauth2_token_fetcher_get_metadata_context, oauth2_token_fetcher_get_request_metadata}; static void compute_engine_fetch_oauth2( @@ -633,6 +656,7 @@ static void service_account_destroy(grpc_credentials *creds) { static grpc_credentials_vtable service_account_vtable = { service_account_destroy, oauth2_token_fetcher_has_request_metadata, oauth2_token_fetcher_has_request_metadata_only, + oauth2_token_fetcher_get_metadata_context, oauth2_token_fetcher_get_request_metadata}; static void service_account_fetch_oauth2( @@ -706,6 +730,7 @@ static void refresh_token_destroy(grpc_credentials *creds) { static grpc_credentials_vtable refresh_token_vtable = { refresh_token_destroy, oauth2_token_fetcher_has_request_metadata, oauth2_token_fetcher_has_request_metadata_only, + oauth2_token_fetcher_get_metadata_context, oauth2_token_fetcher_get_request_metadata}; static void refresh_token_fetch_oauth2( @@ -801,9 +826,15 @@ static void fake_oauth2_get_request_metadata(grpc_credentials *creds, } } +static grpc_mdctx *fake_oauth2_get_metadata_context(grpc_credentials *creds) { + grpc_fake_oauth2_credentials *c = (grpc_fake_oauth2_credentials *)creds; + return c->md_ctx; +} + static grpc_credentials_vtable fake_oauth2_vtable = { fake_oauth2_destroy, fake_oauth2_has_request_metadata, - fake_oauth2_has_request_metadata_only, fake_oauth2_get_request_metadata}; + fake_oauth2_has_request_metadata_only, fake_oauth2_get_metadata_context, + fake_oauth2_get_request_metadata}; grpc_credentials *grpc_fake_oauth2_credentials_create( const char *token_md_value, int is_async) { @@ -842,10 +873,16 @@ static int fake_transport_security_has_request_metadata_only( return 0; } +static grpc_mdctx *fake_transport_security_get_metadata_context( + grpc_credentials *c) { + return NULL; +} + static grpc_credentials_vtable fake_transport_security_credentials_vtable = { fake_transport_security_credentials_destroy, fake_transport_security_has_request_metadata, - fake_transport_security_has_request_metadata_only, NULL}; + fake_transport_security_has_request_metadata_only, + fake_transport_security_get_metadata_context, NULL}; static grpc_server_credentials_vtable fake_transport_security_server_credentials_vtable = { @@ -995,9 +1032,26 @@ static void composite_get_request_metadata(grpc_credentials *creds, GPR_ASSERT(0); /* Should have exited before. */ } +static grpc_mdctx *composite_get_metadata_context(grpc_credentials *creds) { + grpc_composite_credentials *c = (grpc_composite_credentials *)creds; + grpc_mdctx *ctx = NULL; + size_t i; + for (i = 0; i < c->inner.num_creds; i++) { + grpc_credentials *inner_creds = c->inner.creds_array[i]; + grpc_mdctx *inner_ctx = grpc_credentials_get_metadata_context(inner_creds); + if (inner_ctx) { + GPR_ASSERT(ctx == NULL && + "can only have one metadata context per composite credential"); + ctx = inner_ctx; + } + } + return ctx; +} + static grpc_credentials_vtable composite_credentials_vtable = { composite_destroy, composite_has_request_metadata, - composite_has_request_metadata_only, composite_get_request_metadata}; + composite_has_request_metadata_only, composite_get_metadata_context, + composite_get_request_metadata}; static grpc_credentials_array get_creds_array(grpc_credentials **creds_addr) { grpc_credentials_array result; @@ -1102,9 +1156,14 @@ static void iam_get_request_metadata(grpc_credentials *creds, cb(user_data, md_array, 2, GRPC_CREDENTIALS_OK); } +static grpc_mdctx *iam_get_metadata_context(grpc_credentials *creds) { + grpc_iam_credentials *c = (grpc_iam_credentials *)creds; + return c->md_ctx; +} + static grpc_credentials_vtable iam_vtable = { iam_destroy, iam_has_request_metadata, iam_has_request_metadata_only, - iam_get_request_metadata}; + iam_get_metadata_context, iam_get_request_metadata}; grpc_credentials *grpc_iam_credentials_create(const char *token, const char *authority_selector) { diff --git a/src/core/security/credentials.h b/src/core/security/credentials.h index 0f70670ced..562b3faa33 100644 --- a/src/core/security/credentials.h +++ b/src/core/security/credentials.h @@ -94,6 +94,7 @@ typedef struct { void (*destroy)(grpc_credentials *c); int (*has_request_metadata)(const grpc_credentials *c); int (*has_request_metadata_only)(const grpc_credentials *c); + grpc_mdctx *(*get_metadata_context)(grpc_credentials *c); void (*get_request_metadata)(grpc_credentials *c, const char *service_url, grpc_credentials_metadata_cb cb, @@ -114,6 +115,8 @@ void grpc_credentials_get_request_metadata(grpc_credentials *creds, const char *service_url, grpc_credentials_metadata_cb cb, void *user_data); +grpc_mdctx *grpc_credentials_get_metadata_context(grpc_credentials *creds); + typedef struct { unsigned char *pem_private_key; size_t pem_private_key_size; diff --git a/src/core/security/factories.c b/src/core/security/factories.c index 02267d5545..3d9216aac4 100644 --- a/src/core/security/factories.c +++ b/src/core/security/factories.c @@ -50,3 +50,19 @@ grpc_channel *grpc_secure_channel_create(grpc_credentials *creds, return grpc_secure_channel_create_with_factories( factories, GPR_ARRAY_SIZE(factories), creds, target, args); } + +grpc_security_status grpc_server_security_context_create( + grpc_server_credentials *creds, grpc_security_context **ctx) { + grpc_security_status status = GRPC_SECURITY_ERROR; + + *ctx = NULL; + if (strcmp(creds->type, GRPC_CREDENTIALS_TYPE_SSL) == 0) { + status = grpc_ssl_server_security_context_create( + grpc_ssl_server_credentials_get_config(creds), ctx); + } else if (strcmp(creds->type, + GRPC_CREDENTIALS_TYPE_FAKE_TRANSPORT_SECURITY) == 0) { + *ctx = grpc_fake_server_security_context_create(); + status = GRPC_SECURITY_OK; + } + return status; +} diff --git a/src/core/security/security_context.c b/src/core/security/security_context.c index e180cad52b..08137803a3 100644 --- a/src/core/security/security_context.c +++ b/src/core/security/security_context.c @@ -165,6 +165,16 @@ static int check_request_metadata_creds(grpc_credentials *creds) { return 1; } +static grpc_mdctx *get_or_create_mdctx(grpc_credentials *creds) { + grpc_mdctx *mdctx = grpc_credentials_get_metadata_context(creds); + if (mdctx == NULL) { + mdctx = grpc_mdctx_create(); + } else { + grpc_mdctx_ref(mdctx); + } + return mdctx; +} + /* -- Fake implementation. -- */ typedef struct { @@ -626,7 +636,8 @@ grpc_channel *grpc_ssl_channel_create(grpc_credentials *ssl_creds, arg.key = GRPC_ARG_HTTP2_SCHEME; arg.value.string = "https"; new_args = grpc_channel_args_copy_and_add(args, &arg); - channel = grpc_secure_channel_create_internal(target, new_args, ctx); + channel = grpc_secure_channel_create_internal( + target, new_args, ctx, get_or_create_mdctx(request_metadata_creds)); grpc_security_context_unref(&ctx->base); grpc_channel_args_destroy(new_args); return channel; @@ -637,8 +648,8 @@ grpc_channel *grpc_fake_transport_security_channel_create( const char *target, const grpc_channel_args *args) { grpc_channel_security_context *ctx = grpc_fake_channel_security_context_create(request_metadata_creds, 1); - grpc_channel *channel = - grpc_secure_channel_create_internal(target, args, ctx); + grpc_channel *channel = grpc_secure_channel_create_internal( + target, args, ctx, get_or_create_mdctx(request_metadata_creds)); grpc_security_context_unref(&ctx->base); return channel; } diff --git a/src/core/security/security_context.h b/src/core/security/security_context.h index 0b5821c3c0..8e7ba34cac 100644 --- a/src/core/security/security_context.h +++ b/src/core/security/security_context.h @@ -190,7 +190,7 @@ grpc_channel *grpc_fake_transport_security_channel_create( grpc_channel *grpc_secure_channel_create_internal( const char *target, const grpc_channel_args *args, - grpc_channel_security_context *ctx); + grpc_channel_security_context *ctx, grpc_mdctx *mdctx); typedef grpc_channel *(*grpc_secure_channel_factory_func)( grpc_credentials *transport_security_creds, @@ -206,10 +206,9 @@ grpc_channel *grpc_secure_channel_create_with_factories( const grpc_secure_channel_factory *factories, size_t num_factories, grpc_credentials *creds, const char *target, const grpc_channel_args *args); -/* Secure server creation. */ +/* Secure server context creation. */ -grpc_server *grpc_secure_server_create_internal(grpc_completion_queue *cq, - const grpc_channel_args *args, - grpc_security_context *ctx); +grpc_security_status grpc_server_security_context_create( + grpc_server_credentials *creds, grpc_security_context **ctx); #endif /* GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H */ diff --git a/src/core/security/server_secure_chttp2.c b/src/core/security/server_secure_chttp2.c index 081272724c..165ed5474f 100644 --- a/src/core/security/server_secure_chttp2.c +++ b/src/core/security/server_secure_chttp2.c @@ -141,16 +141,7 @@ int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr, /* create security context */ if (creds == NULL) goto error; - - if (strcmp(creds->type, GRPC_CREDENTIALS_TYPE_SSL) == 0) { - status = grpc_ssl_server_security_context_create( - grpc_ssl_server_credentials_get_config(creds), &ctx); - } else if (strcmp(creds->type, - GRPC_CREDENTIALS_TYPE_FAKE_TRANSPORT_SECURITY) == 0) { - ctx = grpc_fake_server_security_context_create(); - status = GRPC_SECURITY_OK; - } - + status = grpc_server_security_context_create(creds, &ctx); if (status != GRPC_SECURITY_OK) { gpr_log(GPR_ERROR, "Unable to create secure server with credentials of type %s.", diff --git a/src/core/support/slice_buffer.c b/src/core/support/slice_buffer.c index b280e4bd02..3b1daa07c5 100644 --- a/src/core/support/slice_buffer.c +++ b/src/core/support/slice_buffer.c @@ -38,21 +38,34 @@ #include <grpc/support/alloc.h> #include <grpc/support/log.h> -/* initial allocation size (# of slices) */ -#define INITIAL_CAPACITY 4 -/* grow a buffer; requires INITIAL_CAPACITY > 1 */ +/* grow a buffer; requires GRPC_SLICE_BUFFER_INLINE_ELEMENTS > 1 */ #define GROW(x) (3 * (x) / 2) +static void maybe_embiggen(gpr_slice_buffer *sb) { + if (sb->count == sb->capacity) { + sb->capacity = GROW(sb->capacity); + GPR_ASSERT(sb->capacity > sb->count); + if (sb->slices == sb->inlined) { + sb->slices = gpr_malloc(sb->capacity * sizeof(gpr_slice)); + memcpy(sb->slices, sb->inlined, sb->count * sizeof(gpr_slice)); + } else { + sb->slices = gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice)); + } + } +} + void gpr_slice_buffer_init(gpr_slice_buffer *sb) { sb->count = 0; sb->length = 0; - sb->capacity = INITIAL_CAPACITY; - sb->slices = gpr_malloc(sizeof(gpr_slice) * INITIAL_CAPACITY); + sb->capacity = GRPC_SLICE_BUFFER_INLINE_ELEMENTS; + sb->slices = sb->inlined; } void gpr_slice_buffer_destroy(gpr_slice_buffer *sb) { gpr_slice_buffer_reset_and_unref(sb); - gpr_free(sb->slices); + if (sb->slices != sb->inlined) { + gpr_free(sb->slices); + } } gpr_uint8 *gpr_slice_buffer_tiny_add(gpr_slice_buffer *sb, unsigned n) { @@ -71,11 +84,7 @@ gpr_uint8 *gpr_slice_buffer_tiny_add(gpr_slice_buffer *sb, unsigned n) { return out; add_new: - if (sb->count == sb->capacity) { - sb->capacity = GROW(sb->capacity); - GPR_ASSERT(sb->capacity > sb->count); - sb->slices = gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice)); - } + maybe_embiggen(sb); back = &sb->slices[sb->count]; sb->count++; back->refcount = NULL; @@ -85,11 +94,7 @@ add_new: size_t gpr_slice_buffer_add_indexed(gpr_slice_buffer *sb, gpr_slice s) { size_t out = sb->count; - if (out == sb->capacity) { - sb->capacity = GROW(sb->capacity); - GPR_ASSERT(sb->capacity > sb->count); - sb->slices = gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice)); - } + maybe_embiggen(sb); sb->slices[out] = s; sb->length += GPR_SLICE_LENGTH(s); sb->count = out + 1; @@ -116,12 +121,7 @@ void gpr_slice_buffer_add(gpr_slice_buffer *sb, gpr_slice s) { memcpy(back->data.inlined.bytes + back->data.inlined.length, s.data.inlined.bytes, cp1); back->data.inlined.length = GPR_SLICE_INLINED_SIZE; - if (n == sb->capacity) { - sb->capacity = GROW(sb->capacity); - GPR_ASSERT(sb->capacity > sb->count); - sb->slices = - gpr_realloc(sb->slices, sb->capacity * sizeof(gpr_slice)); - } + maybe_embiggen(sb); back = &sb->slices[n]; sb->count = n + 1; back->refcount = NULL; @@ -160,3 +160,16 @@ void gpr_slice_buffer_reset_and_unref(gpr_slice_buffer *sb) { sb->count = 0; sb->length = 0; } + +void gpr_slice_buffer_swap(gpr_slice_buffer *a, gpr_slice_buffer *b) { + gpr_slice_buffer temp = *a; + *a = *b; + *b = temp; + + if (a->slices == b->inlined) { + a->slices = a->inlined; + } + if (b->slices == a->inlined) { + b->slices = b->inlined; + } +} diff --git a/src/core/support/time_win32.c b/src/core/support/time_win32.c index f221cb5790..539470bccf 100644 --- a/src/core/support/time_win32.c +++ b/src/core/support/time_win32.c @@ -39,6 +39,7 @@ #include <grpc/support/time.h> #include <sys/timeb.h> +#include <windows.h> gpr_timespec gpr_now(void) { gpr_timespec now_tv; @@ -49,4 +50,23 @@ gpr_timespec gpr_now(void) { return now_tv; } +void gpr_sleep_until(gpr_timespec until) { + gpr_timespec now; + gpr_timespec delta; + DWORD sleep_millis; + + for (;;) { + /* We could simplify by using clock_nanosleep instead, but it might be + * slightly less portable. */ + now = gpr_now(); + if (gpr_time_cmp(until, now) <= 0) { + return; + } + + delta = gpr_time_sub(until, now); + sleep_millis = delta.tv_sec * GPR_MS_PER_SEC + delta.tv_nsec / GPR_NS_PER_MS; + Sleep(sleep_millis); + } +} + #endif /* GPR_WIN32 */ diff --git a/src/core/surface/init.c b/src/core/surface/init.c index d4f0eb40e8..4de51a666f 100644 --- a/src/core/surface/init.c +++ b/src/core/surface/init.c @@ -32,10 +32,11 @@ */ #include <grpc/grpc.h> -#include "src/core/iomgr/iomgr.h" +#include "src/core/channel/channel_stack.h" #include "src/core/debug/trace.h" +#include "src/core/iomgr/iomgr.h" #include "src/core/statistics/census_interface.h" -#include "src/core/channel/channel_stack.h" +#include "src/core/profiling/timers.h" #include "src/core/surface/call.h" #include "src/core/surface/init.h" #include "src/core/surface/surface_trace.h" @@ -63,6 +64,7 @@ void grpc_init(void) { grpc_tracer_init("GRPC_TRACE"); grpc_iomgr_init(); census_init(); + grpc_timers_log_global_init(); } gpr_mu_unlock(&g_init_mu); } @@ -72,6 +74,7 @@ void grpc_shutdown(void) { if (--g_initializations == 0) { grpc_iomgr_shutdown(); census_shutdown(); + grpc_timers_log_global_destroy(); } gpr_mu_unlock(&g_init_mu); } diff --git a/src/core/surface/secure_channel_create.c b/src/core/surface/secure_channel_create.c index 8e56868d42..96b2fe04fa 100644 --- a/src/core/surface/secure_channel_create.c +++ b/src/core/surface/secure_channel_create.c @@ -205,12 +205,11 @@ static grpc_transport_setup_result complete_setup(void *channel_stack, - perform handshakes */ grpc_channel *grpc_secure_channel_create_internal( const char *target, const grpc_channel_args *args, - grpc_channel_security_context *context) { + grpc_channel_security_context *context, grpc_mdctx *mdctx) { setup *s; grpc_channel *channel; grpc_arg context_arg; grpc_channel_args *args_copy; - grpc_mdctx *mdctx = grpc_mdctx_create(); #define MAX_FILTERS 3 const grpc_channel_filter *filters[MAX_FILTERS]; int n = 0; diff --git a/src/core/transport/chttp2/stream_encoder.c b/src/core/transport/chttp2/stream_encoder.c index 79cce553fa..708bb06c7f 100644 --- a/src/core/transport/chttp2/stream_encoder.c +++ b/src/core/transport/chttp2/stream_encoder.c @@ -171,13 +171,15 @@ static gpr_uint8 *add_tiny_header_data(framer_state *st, int len) { return gpr_slice_buffer_tiny_add(st->output, len); } -static void add_elem(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem) { +/* add an element to the decoder table: returns metadata element to unref */ +static grpc_mdelem *add_elem(grpc_chttp2_hpack_compressor *c, + grpc_mdelem *elem) { gpr_uint32 key_hash = elem->key->hash; gpr_uint32 elem_hash = GRPC_MDSTR_KV_HASH(key_hash, elem->value->hash); gpr_uint32 new_index = c->tail_remote_index + c->table_elems + 1; gpr_uint32 elem_size = 32 + GPR_SLICE_LENGTH(elem->key->slice) + GPR_SLICE_LENGTH(elem->value->slice); - int drop_ref; + grpc_mdelem *elem_to_unref; /* Reserve space for this element in the remote table: if this overflows the current table, drop elements until it fits, matching the decompressor @@ -204,34 +206,32 @@ static void add_elem(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem) { if (c->entries_elems[HASH_FRAGMENT_2(elem_hash)] == elem) { /* already there: update with new index */ c->indices_elems[HASH_FRAGMENT_2(elem_hash)] = new_index; - drop_ref = 1; + elem_to_unref = elem; } else if (c->entries_elems[HASH_FRAGMENT_3(elem_hash)] == elem) { /* already there (cuckoo): update with new index */ c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index; - drop_ref = 1; + elem_to_unref = elem; } else if (c->entries_elems[HASH_FRAGMENT_2(elem_hash)] == NULL) { /* not there, but a free element: add */ c->entries_elems[HASH_FRAGMENT_2(elem_hash)] = elem; c->indices_elems[HASH_FRAGMENT_2(elem_hash)] = new_index; - drop_ref = 0; + elem_to_unref = NULL; } else if (c->entries_elems[HASH_FRAGMENT_3(elem_hash)] == NULL) { /* not there (cuckoo), but a free element: add */ c->entries_elems[HASH_FRAGMENT_3(elem_hash)] = elem; c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index; - drop_ref = 0; + elem_to_unref = NULL; } else if (c->indices_elems[HASH_FRAGMENT_2(elem_hash)] < c->indices_elems[HASH_FRAGMENT_3(elem_hash)]) { /* not there: replace oldest */ - grpc_mdelem_unref(c->entries_elems[HASH_FRAGMENT_2(elem_hash)]); + elem_to_unref = c->entries_elems[HASH_FRAGMENT_2(elem_hash)]; c->entries_elems[HASH_FRAGMENT_2(elem_hash)] = elem; c->indices_elems[HASH_FRAGMENT_2(elem_hash)] = new_index; - drop_ref = 0; } else { /* not there: replace oldest */ - grpc_mdelem_unref(c->entries_elems[HASH_FRAGMENT_3(elem_hash)]); + elem_to_unref = c->entries_elems[HASH_FRAGMENT_3(elem_hash)]; c->entries_elems[HASH_FRAGMENT_3(elem_hash)] = elem; c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index; - drop_ref = 0; } /* do exactly the same for the key (so we can find by that again too) */ @@ -257,9 +257,7 @@ static void add_elem(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem) { c->indices_keys[HASH_FRAGMENT_3(key_hash)] = new_index; } - if (drop_ref) { - grpc_mdelem_unref(elem); - } + return elem_to_unref; } static void emit_indexed(grpc_chttp2_hpack_compressor *c, gpr_uint32 index, @@ -348,9 +346,9 @@ static gpr_uint32 dynidx(grpc_chttp2_hpack_compressor *c, gpr_uint32 index) { c->table_elems - index; } -/* encode an mdelem, taking ownership of it */ -static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, - framer_state *st) { +/* encode an mdelem; returns metadata element to unref */ +static grpc_mdelem *hpack_enc(grpc_chttp2_hpack_compressor *c, + grpc_mdelem *elem, framer_state *st) { gpr_uint32 key_hash = elem->key->hash; gpr_uint32 elem_hash = GRPC_MDSTR_KV_HASH(key_hash, elem->value->hash); size_t decoder_space_usage; @@ -366,8 +364,7 @@ static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, /* HIT: complete element (first cuckoo hash) */ emit_indexed(c, dynidx(c, c->indices_elems[HASH_FRAGMENT_2(elem_hash)]), st); - grpc_mdelem_unref(elem); - return; + return elem; } if (c->entries_elems[HASH_FRAGMENT_3(elem_hash)] == elem && @@ -375,8 +372,7 @@ static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, /* HIT: complete element (second cuckoo hash) */ emit_indexed(c, dynidx(c, c->indices_elems[HASH_FRAGMENT_3(elem_hash)]), st); - grpc_mdelem_unref(elem); - return; + return elem; } /* should this elem be in the table? */ @@ -394,12 +390,12 @@ static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, /* HIT: key (first cuckoo hash) */ if (should_add_elem) { emit_lithdr_incidx(c, dynidx(c, indices_key), elem, st); - add_elem(c, elem); + return add_elem(c, elem); } else { emit_lithdr_noidx(c, dynidx(c, indices_key), elem, st); - grpc_mdelem_unref(elem); + return elem; } - return; + abort(); } indices_key = c->indices_keys[HASH_FRAGMENT_3(key_hash)]; @@ -408,23 +404,24 @@ static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, /* HIT: key (first cuckoo hash) */ if (should_add_elem) { emit_lithdr_incidx(c, dynidx(c, indices_key), elem, st); - add_elem(c, elem); + return add_elem(c, elem); } else { emit_lithdr_noidx(c, dynidx(c, indices_key), elem, st); - grpc_mdelem_unref(elem); + return elem; } - return; + abort(); } /* no elem, key in the table... fall back to literal emission */ if (should_add_elem) { emit_lithdr_incidx_v(c, elem, st); - add_elem(c, elem); + return add_elem(c, elem); } else { emit_lithdr_noidx_v(c, elem, st); - grpc_mdelem_unref(elem); + return elem; } + abort(); } #define STRLEN_LIT(x) (sizeof(x) - 1) @@ -433,11 +430,13 @@ static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem, static void deadline_enc(grpc_chttp2_hpack_compressor *c, gpr_timespec deadline, framer_state *st) { char timeout_str[GRPC_CHTTP2_TIMEOUT_ENCODE_MIN_BUFSIZE]; + grpc_mdelem *mdelem; grpc_chttp2_encode_timeout(gpr_time_sub(deadline, gpr_now()), timeout_str); - hpack_enc(c, grpc_mdelem_from_metadata_strings( - c->mdctx, grpc_mdstr_ref(c->timeout_key_str), - grpc_mdstr_from_string(c->mdctx, timeout_str)), - st); + mdelem = grpc_mdelem_from_metadata_strings( + c->mdctx, grpc_mdstr_ref(c->timeout_key_str), + grpc_mdstr_from_string(c->mdctx, timeout_str)); + mdelem = hpack_enc(c, mdelem, st); + if (mdelem) grpc_mdelem_unref(mdelem); } gpr_slice grpc_chttp2_data_frame_create_empty_close(gpr_uint32 id) { @@ -542,6 +541,9 @@ void grpc_chttp2_encode(grpc_stream_op *ops, size_t ops_count, int eof, grpc_stream_op *op; gpr_uint32 max_take_size; gpr_uint32 curop = 0; + gpr_uint32 unref_op; + grpc_mdctx *mdctx = compressor->mdctx; + int need_unref = 0; GPR_ASSERT(stream_id != 0); @@ -564,7 +566,12 @@ void grpc_chttp2_encode(grpc_stream_op *ops, size_t ops_count, int eof, curop++; break; case GRPC_OP_METADATA: - hpack_enc(compressor, op->data.metadata, &st); + /* Encode a metadata element; store the returned value, representing + a metadata element that needs to be unreffed back into the metadata + slot. THIS MAY NOT BE THE SAME ELEMENT (if a decoder table slot got + updated). After this loop, we'll do a batch unref of elements. */ + op->data.metadata = hpack_enc(compressor, op->data.metadata, &st); + need_unref |= op->data.metadata != NULL; curop++; break; case GRPC_OP_DEADLINE: @@ -601,4 +608,15 @@ void grpc_chttp2_encode(grpc_stream_op *ops, size_t ops_count, int eof, begin_frame(&st, DATA); } finish_frame(&st, 1, eof); + + if (need_unref) { + grpc_mdctx_lock(mdctx); + for (unref_op = 0; unref_op < curop; unref_op++) { + op = &ops[unref_op]; + if (op->type != GRPC_OP_METADATA) continue; + if (!op->data.metadata) continue; + grpc_mdctx_locked_mdelem_unref(mdctx, op->data.metadata); + } + grpc_mdctx_unlock(mdctx); + } } diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c index 4c0394d46f..110a4b544f 100644 --- a/src/core/transport/chttp2_transport.c +++ b/src/core/transport/chttp2_transport.c @@ -834,13 +834,10 @@ static void push_setting(transport *t, grpc_chttp2_setting_id id, static int prepare_write(transport *t) { stream *s; - gpr_slice_buffer tempbuf; gpr_uint32 window_delta; /* simple writes are queued to qbuf, and flushed here */ - tempbuf = t->qbuf; - t->qbuf = t->outbuf; - t->outbuf = tempbuf; + gpr_slice_buffer_swap(&t->qbuf, &t->outbuf); GPR_ASSERT(t->qbuf.count == 0); if (t->dirtied_local_settings && !t->sent_local_settings) { diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c index 066cc263a1..44f6591c95 100644 --- a/src/core/transport/metadata.c +++ b/src/core/transport/metadata.c @@ -34,10 +34,12 @@ #include "src/core/iomgr/sockaddr.h" #include "src/core/transport/metadata.h" +#include <assert.h> #include <stddef.h> #include <string.h> #include <grpc/support/alloc.h> +#include <grpc/support/atm.h> #include <grpc/support/log.h> #include "src/core/support/murmur_hash.h" #include "src/core/transport/chttp2/bin_encoder.h" @@ -68,11 +70,12 @@ typedef struct internal_metadata { internal_string *key; internal_string *value; + gpr_atm refcnt; + /* private only data */ void *user_data; void (*destroy_user_data)(void *user_data); - gpr_uint32 refs; grpc_mdctx *context; struct internal_metadata *bucket_next; } internal_metadata; @@ -129,8 +132,8 @@ static void unlock(grpc_mdctx *ctx) { gpr_mu_unlock(&ctx->mu); } -static void ref_md(internal_metadata *md) { - if (0 == md->refs++) { +static void ref_md_locked(internal_metadata *md) { + if (0 == gpr_atm_no_barrier_fetch_add(&md->refcnt, 1)) { md->context->mdtab_free--; } } @@ -168,7 +171,7 @@ static void discard_metadata(grpc_mdctx *ctx) { for (i = 0; i < ctx->mdtab_capacity; i++) { cur = ctx->mdtab[i]; while (cur) { - GPR_ASSERT(cur->refs == 0); + GPR_ASSERT(gpr_atm_acq_load(&cur->refcnt) == 0); next = cur->bucket_next; internal_string_unref(cur->key); internal_string_unref(cur->value); @@ -349,7 +352,7 @@ static void gc_mdtab(grpc_mdctx *ctx) { prev_next = &ctx->mdtab[i]; for (md = ctx->mdtab[i]; md; md = next) { next = md->bucket_next; - if (md->refs == 0) { + if (gpr_atm_acq_load(&md->refcnt) == 0) { internal_string_unref(md->key); internal_string_unref(md->value); if (md->user_data) { @@ -415,7 +418,7 @@ grpc_mdelem *grpc_mdelem_from_metadata_strings(grpc_mdctx *ctx, /* search for an existing pair */ for (md = ctx->mdtab[hash % ctx->mdtab_capacity]; md; md = md->bucket_next) { if (md->key == key && md->value == value) { - ref_md(md); + ref_md_locked(md); internal_string_unref(key); internal_string_unref(value); unlock(ctx); @@ -425,7 +428,7 @@ grpc_mdelem *grpc_mdelem_from_metadata_strings(grpc_mdctx *ctx, /* not found: create a new pair */ md = gpr_malloc(sizeof(internal_metadata)); - md->refs = 1; + gpr_atm_rel_store(&md->refcnt, 1); md->context = ctx; md->key = key; md->value = value; @@ -468,10 +471,12 @@ grpc_mdelem *grpc_mdelem_from_string_and_buffer(grpc_mdctx *ctx, grpc_mdelem *grpc_mdelem_ref(grpc_mdelem *gmd) { internal_metadata *md = (internal_metadata *)gmd; - grpc_mdctx *ctx = md->context; - lock(ctx); - ref_md(md); - unlock(ctx); + /* we can assume the ref count is >= 1 as the application is calling + this function - meaning that no adjustment to mdtab_free is necessary, + simplifying the logic here to be just an atomic increment */ + /* use C assert to have this removed in opt builds */ + assert(gpr_atm_no_barrier_load(&md->refcnt) >= 1); + gpr_atm_no_barrier_fetch_add(&md->refcnt, 1); return gmd; } @@ -479,8 +484,8 @@ void grpc_mdelem_unref(grpc_mdelem *gmd) { internal_metadata *md = (internal_metadata *)gmd; grpc_mdctx *ctx = md->context; lock(ctx); - GPR_ASSERT(md->refs); - if (0 == --md->refs) { + assert(gpr_atm_no_barrier_load(&md->refcnt) >= 1); + if (1 == gpr_atm_full_fetch_add(&md->refcnt, -1)) { ctx->mdtab_free++; } unlock(ctx); @@ -550,3 +555,17 @@ gpr_slice grpc_mdstr_as_base64_encoded_and_huffman_compressed(grpc_mdstr *gs) { unlock(ctx); return slice; } + +void grpc_mdctx_lock(grpc_mdctx *ctx) { lock(ctx); } + +void grpc_mdctx_locked_mdelem_unref(grpc_mdctx *ctx, grpc_mdelem *gmd) { + internal_metadata *md = (internal_metadata *)gmd; + grpc_mdctx *elem_ctx = md->context; + GPR_ASSERT(ctx == elem_ctx); + assert(gpr_atm_no_barrier_load(&md->refcnt) >= 1); + if (1 == gpr_atm_full_fetch_add(&md->refcnt, -1)) { + ctx->mdtab_free++; + } +} + +void grpc_mdctx_unlock(grpc_mdctx *ctx) { unlock(ctx); } diff --git a/src/core/transport/metadata.h b/src/core/transport/metadata.h index b8afbeb1e3..21b8ae2b78 100644 --- a/src/core/transport/metadata.h +++ b/src/core/transport/metadata.h @@ -135,6 +135,18 @@ void grpc_mdelem_unref(grpc_mdelem *md); Does not promise that the returned string has no embedded nulls however. */ const char *grpc_mdstr_as_c_string(grpc_mdstr *s); +/* Batch mode metadata functions. + These API's have equivalents above, but allow taking the mdctx just once, + performing a bunch of work, and then leaving the mdctx. */ + +/* Lock the metadata context: it's only safe to call _locked_ functions against + this context from the calling thread until grpc_mdctx_unlock is called */ +void grpc_mdctx_lock(grpc_mdctx *ctx); +/* Unref a metadata element */ +void grpc_mdctx_locked_mdelem_unref(grpc_mdctx *ctx, grpc_mdelem *elem); +/* Unlock the metadata context */ +void grpc_mdctx_unlock(grpc_mdctx *ctx); + #define GRPC_MDSTR_KV_HASH(k_hash, v_hash) (GPR_ROTL((k_hash), 2) ^ (v_hash)) #endif /* GRPC_INTERNAL_CORE_TRANSPORT_METADATA_H */ diff --git a/src/node/examples/math_server.js b/src/node/examples/math_server.js index ae548c89e4..3fac193d64 100644 --- a/src/node/examples/math_server.js +++ b/src/node/examples/math_server.js @@ -33,10 +33,6 @@ 'use strict'; -var util = require('util'); - -var Transform = require('stream').Transform; - var grpc = require('..'); var math = grpc.load(__dirname + '/math.proto').math; @@ -54,11 +50,12 @@ function mathDiv(call, cb) { // Unary + is explicit coersion to integer if (+req.divisor === 0) { cb(new Error('cannot divide by zero')); + } else { + cb(null, { + quotient: req.dividend / req.divisor, + remainder: req.dividend % req.divisor + }); } - cb(null, { - quotient: req.dividend / req.divisor, - remainder: req.dividend % req.divisor - }); } /** @@ -97,24 +94,19 @@ function mathSum(call, cb) { } function mathDivMany(stream) { - // Here, call is a standard duplex Node object Stream - util.inherits(DivTransform, Transform); - function DivTransform() { - var options = {objectMode: true}; - Transform.call(this, options); - } - DivTransform.prototype._transform = function(div_args, encoding, callback) { + stream.on('data', function(div_args) { if (+div_args.divisor === 0) { - callback(new Error('cannot divide by zero')); + stream.emit('error', new Error('cannot divide by zero')); + } else { + stream.write({ + quotient: div_args.dividend / div_args.divisor, + remainder: div_args.dividend % div_args.divisor + }); } - callback(null, { - quotient: div_args.dividend / div_args.divisor, - remainder: div_args.dividend % div_args.divisor - }); - }; - var transform = new DivTransform(); - stream.pipe(transform); - transform.pipe(stream); + }); + stream.on('end', function() { + stream.end(); + }); } var server = new Server({ diff --git a/src/node/package.json b/src/node/package.json index 9f52f8c988..fc3ca1f103 100644 --- a/src/node/package.json +++ b/src/node/package.json @@ -1,6 +1,6 @@ { "name": "grpc", - "version": "0.6.0", + "version": "0.6.1", "author": "Google Inc.", "description": "gRPC Library for Node", "homepage": "http://www.grpc.io/", diff --git a/src/node/src/server.js b/src/node/src/server.js index 05de16294d..eef705c44c 100644 --- a/src/node/src/server.js +++ b/src/node/src/server.js @@ -360,7 +360,9 @@ function handleUnary(call, handler, metadata) { } handler.func(emitter, function sendUnaryData(err, value, trailer) { if (err) { - err.metadata = trailer; + if (trailer) { + err.metadata = trailer; + } handleError(call, err); } else { sendUnaryResponse(call, value, handler.serialize, trailer); @@ -406,7 +408,9 @@ function handleClientStreaming(call, handler, metadata) { handler.func(stream, function(err, value, trailer) { stream.terminate(); if (err) { - err.metadata = trailer; + if (trailer) { + err.metadata = trailer; + } handleError(call, err); } else { sendUnaryResponse(call, value, handler.serialize, trailer); diff --git a/src/node/test/math_client_test.js b/src/node/test/math_client_test.js index d83f64116f..79df97871b 100644 --- a/src/node/test/math_client_test.js +++ b/src/node/test/math_client_test.js @@ -68,6 +68,13 @@ describe('Math client', function() { done(); }); }); + it('should handle an error from a unary request', function(done) { + var arg = {dividend: 7, divisor: 0}; + math_client.div(arg, function handleDivResult(err, value) { + assert(err); + done(); + }); + }); it('should handle a server streaming request', function(done) { var call = math_client.fib({limit: 7}); var expected_results = [1, 1, 2, 3, 5, 8, 13]; @@ -115,4 +122,17 @@ describe('Math client', function() { done(); }); }); + it('should handle an error from a bidi request', function(done) { + var call = math_client.divMany(); + call.on('data', function(value) { + assert.fail(value, undefined, 'Unexpected data response on failing call', + '!='); + }); + call.write({dividend: 7, divisor: 0}); + call.end(); + call.on('status', function checkStatus(status) { + assert.notEqual(status.code, grpc.status.OK); + done(); + }); + }); }); diff --git a/src/python/interop/interop/client.py b/src/python/interop/interop/client.py index bae5e17460..41f0d94539 100644 --- a/src/python/interop/interop/client.py +++ b/src/python/interop/interop/client.py @@ -64,7 +64,7 @@ def _args(): return parser.parse_args() def _oauth_access_token(args): - credentials = client.GoogleCredentials.get_application_default() + credentials = oauth2client_client.GoogleCredentials.get_application_default() scoped_credentials = credentials.create_scoped([args.oauth_scope]) return scoped_credentials.get_access_token().access_token diff --git a/src/python/interop/interop/methods.py b/src/python/interop/interop/methods.py index c69771dff1..909b738bd1 100644 --- a/src/python/interop/interop/methods.py +++ b/src/python/interop/interop/methods.py @@ -292,7 +292,7 @@ def _service_account_creds(stub, args): if wanted_email != response.username: raise ValueError( 'expected username %s, got %s' % (wanted_email, response.username)) - if response.oauth_scope in args.oauth_scope: + if args.oauth_scope.find(response.oauth_scope) == -1: raise ValueError( 'expected to find oauth scope "%s" in received "%s"' % (response.oauth_scope, args.oauth_scope)) diff --git a/src/python/src/grpc/early_adopter/implementations.py b/src/python/src/grpc/early_adopter/implementations.py index 35456d38c6..f3f2a043eb 100644 --- a/src/python/src/grpc/early_adopter/implementations.py +++ b/src/python/src/grpc/early_adopter/implementations.py @@ -223,7 +223,8 @@ def stub( breakdown = _face_utilities.break_down_invocation(service_name, methods) return _Stub( breakdown, host, port, secure, root_certificates, private_key, - certificate_chain, server_host_override=server_host_override) + certificate_chain, server_host_override=server_host_override, + metadata_transformer=metadata_transformer) def server( diff --git a/src/ruby/.rubocop_todo.yml b/src/ruby/.rubocop_todo.yml index d5bb55e5a8..d9fe0a5835 100644 --- a/src/ruby/.rubocop_todo.yml +++ b/src/ruby/.rubocop_todo.yml @@ -1,42 +1,30 @@ # This configuration was generated by `rubocop --auto-gen-config` -# on 2015-01-16 02:30:04 -0800 using RuboCop version 0.28.0. +# on 2015-04-14 09:35:44 -0700 using RuboCop version 0.29.1. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. -# Offense count: 3 -# Lint/UselessAssignment: -# Enabled: false - -# Offense count: 33 +# Offense count: 32 Metrics/AbcSize: - Max: 39 + Max: 36 -# Offense count: 3 +# Offense count: 2 # Configuration parameters: CountComments. Metrics/ClassLength: - Max: 231 - -# Offense count: 2 -Metrics/CyclomaticComplexity: - Max: 8 + Max: 183 -# Offense count: 36 +# Offense count: 35 # Configuration parameters: CountComments. Metrics/MethodLength: - Max: 37 + Max: 36 -# Offense count: 8 +# Offense count: 7 # Configuration parameters: CountKeywordArgs. Metrics/ParameterLists: Max: 8 -# Offense count: 2 -Metrics/PerceivedComplexity: - Max: 10 - -# Offense count: 7 +# Offense count: 6 # Configuration parameters: AllowedVariables. Style/GlobalVars: Enabled: false @@ -50,3 +38,7 @@ Style/Next: # Configuration parameters: Methods. Style/SingleLineBlockParams: Enabled: false + +# Offense count: 1 +Style/StructInheritance: + Enabled: false diff --git a/src/ruby/CHANGELOG.md b/src/ruby/CHANGELOG.md new file mode 100644 index 0000000000..8ec6e3cfdb --- /dev/null +++ b/src/ruby/CHANGELOG.md @@ -0,0 +1,11 @@ +## 0.6.1 (2015-04-14) + +### Changes + +* Begins this ChangeLog ([@tbetbetbe][]) +* Updates to version 0.4 of googleauth. ([@tbetbetbe][]) +* Switch the extension to use the call API. ([@tbetbetbe][]) +* Refactor the C extension to avoid identifiers used by ruby ([@yugui][]) + +[@tbetbetbe]: https://github.com/tbetbetbe +[@yugui]: https://github.com/yugui diff --git a/src/ruby/bin/apis/pubsub_demo.rb b/src/ruby/bin/apis/pubsub_demo.rb index 9bb324ff64..6d69b0f21e 100755 --- a/src/ruby/bin/apis/pubsub_demo.rb +++ b/src/ruby/bin/apis/pubsub_demo.rb @@ -71,7 +71,7 @@ end # Builds the metadata authentication update proc. def auth_proc(opts) - auth_creds = Google::Auth.get_application_default(opts.oauth_scope) + auth_creds = Google::Auth.get_application_default return auth_creds.updater_proc end @@ -213,17 +213,14 @@ class NamedActions end # Args is used to hold the command line info. -Args = Struct.new(:host, :oauth_scope, :port, :action, :project_id, :topic_name, +Args = Struct.new(:host, :port, :action, :project_id, :topic_name, :sub_name) # validates the the command line options, returning them as an Arg. def parse_args args = Args.new('pubsub-staging.googleapis.com', - 'https://www.googleapis.com/auth/pubsub', 443, 'list_some_topics', 'stoked-keyword-656') OptionParser.new do |opts| - opts.on('--oauth_scope scope', - 'Scope for OAuth tokens') { |v| args['oauth_scope'] = v } opts.on('--server_host SERVER_HOST', 'server hostname') do |v| args.host = v end @@ -250,7 +247,7 @@ def parse_args end def _check_args(args) - %w(host port action oauth_scope).each do |a| + %w(host port action).each do |a| if args[a].nil? raise OptionParser::MissingArgument.new("please specify --#{a}") end diff --git a/src/ruby/bin/interop/interop_client.rb b/src/ruby/bin/interop/interop_client.rb index b2a8711c79..af7a1d5b15 100755 --- a/src/ruby/bin/interop/interop_client.rb +++ b/src/ruby/bin/interop/interop_client.rb @@ -110,6 +110,11 @@ def create_stub(opts) end end + if opts.test_case == 'jwt_token_creds' # don't use a scope + auth_creds = Google::Auth.get_application_default + stub_opts[:update_metadata] = auth_creds.updater_proc + end + logger.info("... connecting securely to #{address}") Grpc::Testing::TestService::Stub.new(address, **stub_opts) else @@ -201,6 +206,15 @@ class NamedTests p 'OK: service_account_creds' end + def jwt_token_creds + json_key = File.read(ENV[AUTH_ENV]) + wanted_email = MultiJson.load(json_key)['client_email'] + resp = perform_large_unary(fill_username: true) + assert_equal(wanted_email, resp.username, + 'service_account_creds: incorrect username') + p 'OK: jwt_token_creds' + end + def compute_engine_creds resp = perform_large_unary(fill_username: true, fill_oauth_scope: true) diff --git a/src/ruby/grpc.gemspec b/src/ruby/grpc.gemspec index 45cbacfeb0..a50d0351da 100755 --- a/src/ruby/grpc.gemspec +++ b/src/ruby/grpc.gemspec @@ -22,7 +22,7 @@ Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.add_dependency 'google-protobuf', '~> 3.0.0alpha.1.1' - s.add_dependency 'googleauth', '~> 0.1' + s.add_dependency 'googleauth', '~> 0.4' s.add_dependency 'logging', '~> 1.8' s.add_dependency 'minitest', '~> 5.4' # reqd for interop tests s.add_dependency 'xray', '~> 1.1' diff --git a/src/ruby/lib/grpc/generic/client_stub.rb b/src/ruby/lib/grpc/generic/client_stub.rb index 6547a1499e..dc7672d359 100644 --- a/src/ruby/lib/grpc/generic/client_stub.rb +++ b/src/ruby/lib/grpc/generic/client_stub.rb @@ -52,6 +52,14 @@ module GRPC Core::Channel.new(host, kw, creds) end + def self.update_with_jwt_aud_uri(a_hash, host, method) + last_slash_idx, res = method.rindex('/'), a_hash.clone + return res if last_slash_idx.nil? + service_name = method[0..(last_slash_idx - 1)] + res[:jwt_aud_uri] = "https://#{host}#{service_name}" + res + end + # check_update_metadata is used by #initialize verify that it's a Proc. def self.check_update_metadata(update_metadata) return update_metadata if update_metadata.nil? @@ -147,7 +155,8 @@ module GRPC def request_response(method, req, marshal, unmarshal, timeout = nil, return_op: false, **kw) c = new_active_call(method, marshal, unmarshal, timeout) - md = @update_metadata.nil? ? kw : @update_metadata.call(kw.clone) + kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method) + md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri) return c.request_response(req, **md) unless return_op # return the operation view of the active_call; define #execute as a @@ -204,7 +213,8 @@ module GRPC def client_streamer(method, requests, marshal, unmarshal, timeout = nil, return_op: false, **kw) c = new_active_call(method, marshal, unmarshal, timeout) - md = @update_metadata.nil? ? kw : @update_metadata.call(kw.clone) + kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method) + md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri) return c.client_streamer(requests, **md) unless return_op # return the operation view of the active_call; define #execute as a @@ -270,7 +280,8 @@ module GRPC def server_streamer(method, req, marshal, unmarshal, timeout = nil, return_op: false, **kw, &blk) c = new_active_call(method, marshal, unmarshal, timeout) - md = @update_metadata.nil? ? kw : @update_metadata.call(kw.clone) + kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method) + md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri) return c.server_streamer(req, **md, &blk) unless return_op # return the operation view of the active_call; define #execute @@ -375,7 +386,8 @@ module GRPC def bidi_streamer(method, requests, marshal, unmarshal, timeout = nil, return_op: false, **kw, &blk) c = new_active_call(method, marshal, unmarshal, timeout) - md = @update_metadata.nil? ? kw : @update_metadata.call(kw.clone) + kw_with_jwt_uri = self.class.update_with_jwt_aud_uri(kw, @host, method) + md = @update_metadata.nil? ? kw : @update_metadata.call(kw_with_jwt_uri) return c.bidi_streamer(requests, **md, &blk) unless return_op # return the operation view of the active_call; define #execute diff --git a/src/ruby/lib/grpc/version.rb b/src/ruby/lib/grpc/version.rb index bfd0cbb393..072fb9b1aa 100644 --- a/src/ruby/lib/grpc/version.rb +++ b/src/ruby/lib/grpc/version.rb @@ -29,5 +29,5 @@ # GRPC contains the General RPC module. module GRPC - VERSION = '0.6.0' + VERSION = '0.6.1' end diff --git a/src/ruby/spec/channel_spec.rb b/src/ruby/spec/channel_spec.rb index 31e38d71b8..d471ff5db6 100644 --- a/src/ruby/spec/channel_spec.rb +++ b/src/ruby/spec/channel_spec.rb @@ -58,7 +58,7 @@ describe GRPC::Core::Channel do it 'does not take a hash with bad values as channel args' do blk = construct_with_args(symbol: Object.new) expect(&blk).to raise_error TypeError - blk = construct_with_args('1' => Hash.new) + blk = construct_with_args('1' => {}) expect(&blk).to raise_error TypeError end diff --git a/src/ruby/spec/client_server_spec.rb b/src/ruby/spec/client_server_spec.rb index 1a2afbe1f9..68af79f907 100644 --- a/src/ruby/spec/client_server_spec.rb +++ b/src/ruby/spec/client_server_spec.rb @@ -192,11 +192,11 @@ shared_examples 'GRPC metadata delivery works OK' do describe 'from client => server' do before(:example) do n = 7 # arbitrary number of metadata - diff_keys_fn = proc { |i| [sprintf('k%d', i), sprintf('v%d', i)] } + diff_keys_fn = proc { |i| [format('k%d', i), format('v%d', i)] } diff_keys = Hash[n.times.collect { |x| diff_keys_fn.call x }] - null_vals_fn = proc { |i| [sprintf('k%d', i), sprintf('v\0%d', i)] } + null_vals_fn = proc { |i| [format('k%d', i), format('v\0%d', i)] } null_vals = Hash[n.times.collect { |x| null_vals_fn.call x }] - same_keys_fn = proc { |i| [sprintf('k%d', i), [sprintf('v%d', i)] * n] } + same_keys_fn = proc { |i| [format('k%d', i), [format('v%d', i)] * n] } same_keys = Hash[n.times.collect { |x| same_keys_fn.call x }] symbol_key = { a_key: 'a val' } @valid_metadata = [diff_keys, same_keys, null_vals, symbol_key] @@ -242,11 +242,11 @@ shared_examples 'GRPC metadata delivery works OK' do describe 'from server => client' do before(:example) do n = 7 # arbitrary number of metadata - diff_keys_fn = proc { |i| [sprintf('k%d', i), sprintf('v%d', i)] } + diff_keys_fn = proc { |i| [format('k%d', i), format('v%d', i)] } diff_keys = Hash[n.times.collect { |x| diff_keys_fn.call x }] - null_vals_fn = proc { |i| [sprintf('k%d', i), sprintf('v\0%d', i)] } + null_vals_fn = proc { |i| [format('k%d', i), format('v\0%d', i)] } null_vals = Hash[n.times.collect { |x| null_vals_fn.call x }] - same_keys_fn = proc { |i| [sprintf('k%d', i), [sprintf('v%d', i)] * n] } + same_keys_fn = proc { |i| [format('k%d', i), [format('v%d', i)] * n] } same_keys = Hash[n.times.collect { |x| same_keys_fn.call x }] symbol_key = { a_key: 'a val' } @valid_metadata = [diff_keys, same_keys, null_vals, symbol_key] diff --git a/src/ruby/spec/generic/rpc_server_spec.rb b/src/ruby/spec/generic/rpc_server_spec.rb index f409d73e2f..245999ea03 100644 --- a/src/ruby/spec/generic/rpc_server_spec.rb +++ b/src/ruby/spec/generic/rpc_server_spec.rb @@ -400,7 +400,8 @@ describe GRPC::RpcServer do end stub = EchoStub.new(@host, **@client_opts) expect(stub.an_rpc(req, k1: 'v1', k2: 'v2')).to be_a(EchoMsg) - wanted_md = [{ 'k1' => 'updated-v1', 'k2' => 'v2' }] + wanted_md = [{ 'k1' => 'updated-v1', 'k2' => 'v2', + 'jwt_aud_uri' => "https://#{@host}/EchoService" }] expect(service.received_md).to eq(wanted_md) @srv.stop t.join diff --git a/src/ruby/spec/server_spec.rb b/src/ruby/spec/server_spec.rb index a47e484f97..bb566d1b1f 100644 --- a/src/ruby/spec/server_spec.rb +++ b/src/ruby/spec/server_spec.rb @@ -152,7 +152,7 @@ describe Server do it 'does not take a hash with bad values as channel args' do blk = construct_with_args(symbol: Object.new) expect(&blk).to raise_error TypeError - blk = construct_with_args('1' => Hash.new) + blk = construct_with_args('1' => {}) expect(&blk).to raise_error TypeError end diff --git a/templates/Makefile.template b/templates/Makefile.template index 331141fb24..73f7945074 100644 --- a/templates/Makefile.template +++ b/templates/Makefile.template @@ -96,6 +96,15 @@ CPPFLAGS_opt = -O2 LDFLAGS_opt = DEFINES_opt = NDEBUG +VALID_CONFIG_latprof = 1 +CC_latprof = $(DEFAULT_CC) +CXX_latprof = $(DEFAULT_CXX) +LD_latprof = $(DEFAULT_CC) +LDXX_latprof = $(DEFAULT_CXX) +CPPFLAGS_latprof = -O2 -DGRPC_LATENCY_PROFILER +LDFLAGS_latprof = +DEFINES_latprof = NDEBUG + VALID_CONFIG_dbg = 1 CC_dbg = $(DEFAULT_CC) CXX_dbg = $(DEFAULT_CXX) diff --git a/templates/tools/run_tests/tests.json.template b/templates/tools/run_tests/tests.json.template index 6d7520bc0f..337858d9f1 100644 --- a/templates/tools/run_tests/tests.json.template +++ b/templates/tools/run_tests/tests.json.template @@ -4,7 +4,8 @@ import json ${json.dumps([{"name": tgt.name, "language": tgt.language, - "flaky": tgt.get("flaky", False)} + "platforms": tgt.platforms, + "flaky": tgt.flaky} for tgt in targets if tgt.get('run', True) and tgt.build == 'test'], sort_keys=True, indent=2)} diff --git a/templates/vsprojects/vs2013/Grpc.mak.template b/templates/vsprojects/vs2013/Grpc.mak.template index 8e1b33bba7..c1c15df5c6 100644 --- a/templates/vsprojects/vs2013/Grpc.mak.template +++ b/templates/vsprojects/vs2013/Grpc.mak.template @@ -32,8 +32,12 @@ <%def name="to_windows_path(path)">${path.replace('/','\\')}</%def>\ <% allowed_dependencies = set(['gpr', 'grpc', 'gpr_test_util', 'grpc_test_util']) - buildable_targets = [ target for target in targets if set(target.deps).issubset(allowed_dependencies) and all([src.endswith('.c') for src in target.src])] - test_targets = [ target for target in buildable_targets if target.name.endswith('_test') ] + buildable_targets = [ target for target in targets + if set(target.deps).issubset(allowed_dependencies) and + all([src.endswith('.c') for src in target.src]) and + 'windows' in target.platforms ] + c_test_targets = [ target for target in buildable_targets if target.build == 'test' and not target.language == 'c++' ] + cxx_test_targets = [ target for target in buildable_targets if target.build == 'test' and target.language == 'c++' ] %>\ # NMake file to build secondary gRPC targets on Windows. # Use grpc.sln to solution to build the gRPC libraries. @@ -62,29 +66,24 @@ grpc_test_util: $(OUT_DIR): mkdir $(OUT_DIR) -buildtests: \ -% for target in test_targets: +buildtests: buildtests_c buildtests_cxx + +buildtests_c: \ +% for target in c_test_targets: ${target.name}.exe \ % endfor echo All tests built. -test: \ -% for target in test_targets: -${target.name} \ -% endfor - - echo All tests ran. - -test_gpr: \ -% for target in [ tgt for tgt in test_targets if tgt.name.startswith('gpr_')]: -${target.name} \ +buildtests_cxx: \ +% for target in cxx_test_targets: +${target.name}.exe \ % endfor - echo All tests ran. + echo All tests built. % for target in buildable_targets: -${target.name}.exe: grpc_test_util +${target.name}.exe: grpc_test_util $(OUT_DIR) echo Building ${target.name} $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ \ %for source in target.src: diff --git a/test/core/end2end/dualstack_socket_test.c b/test/core/end2end/dualstack_socket_test.c index 66b76dc052..29097661bc 100644 --- a/test/core/end2end/dualstack_socket_test.c +++ b/test/core/end2end/dualstack_socket_test.c @@ -192,7 +192,7 @@ int main(int argc, char **argv) { do_ipv6 = 0; } - /* For coverage, test with and without dualstack sockets. */ + /* For coverage, test with and without dualstack sockets. */ for (grpc_forbid_dualstack_sockets_for_testing = 0; grpc_forbid_dualstack_sockets_for_testing <= 1; grpc_forbid_dualstack_sockets_for_testing++) { diff --git a/test/core/iomgr/alarm_test.c b/test/core/iomgr/alarm_test.c index 8d49332fa6..e677ba30dd 100644 --- a/test/core/iomgr/alarm_test.c +++ b/test/core/iomgr/alarm_test.c @@ -37,13 +37,9 @@ #include <ctype.h> #include <errno.h> #include <fcntl.h> -#include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <sys/socket.h> -#include <sys/time.h> -#include <unistd.h> #include <grpc/support/alloc.h> #include <grpc/support/log.h> diff --git a/test/core/profiling/timers_test.c b/test/core/profiling/timers_test.c new file mode 100644 index 0000000000..55e59c969e --- /dev/null +++ b/test/core/profiling/timers_test.c @@ -0,0 +1,83 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "src/core/profiling/timers.h" +#include <stdlib.h> +#include "test/core/util/test_config.h" + +void test_log_events(int num_seqs) { + int start = 0; + int *state; + state = calloc(num_seqs, sizeof(state[0])); + while (start < num_seqs) { + int i; + int row; + if (state[start] == 3) { /* Already done with this posn */ + start++; + continue; + } + + row = rand() % 10; /* how many in a row */ + for (i = start; (i < start + row) && (i < num_seqs); i++) { + int j; + int advance = 1 + rand() % 3; /* how many to advance by */ + for (j = 0; j < advance; j++) { + switch (state[i]) { + case 0: + GRPC_TIMER_MARK(STATE_0, i); + state[i]++; + break; + case 1: + GRPC_TIMER_MARK(STATE_1, i); + state[i]++; + break; + case 2: + GRPC_TIMER_MARK(STATE_2, i); + state[i]++; + break; + case 3: + break; + } + } + } + } + free(state); +} + +int main(int argc, char **argv) { + grpc_test_init(argc, argv); + grpc_timers_log_global_init(); + test_log_events(1000000); + grpc_timers_log_global_destroy(); + return 0; +} diff --git a/test/core/transport/chttp2_transport_end2end_test.c b/test/core/transport/chttp2_transport_end2end_test.c index b90fe22999..766fd19960 100644 --- a/test/core/transport/chttp2_transport_end2end_test.c +++ b/test/core/transport/chttp2_transport_end2end_test.c @@ -38,8 +38,6 @@ #include <string.h> #include <signal.h> #include <sys/types.h> -#include <sys/socket.h> -#include <unistd.h> #include "test/core/util/test_config.h" #include "src/core/iomgr/iomgr.h" diff --git a/test/core/util/port_posix.c b/test/core/util/port_posix.c index 7467c2f9ea..b07df391f9 100644 --- a/test/core/util/port_posix.c +++ b/test/core/util/port_posix.c @@ -44,10 +44,37 @@ #include <string.h> #include <unistd.h> +#include <grpc/support/alloc.h> #include <grpc/support/log.h> #define NUM_RANDOM_PORTS_TO_PICK 100 +static int *chosen_ports = NULL; +static size_t num_chosen_ports = 0; + +static int has_port_been_chosen(int port) { + size_t i; + for (i = 0; i < num_chosen_ports; i++) { + if (chosen_ports[i] == port) { + return 1; + } + } + return 0; +} + +static void free_chosen_ports() { + gpr_free(chosen_ports); +} + +static void chose_port(int port) { + if (chosen_ports == NULL) { + atexit(free_chosen_ports); + } + num_chosen_ports++; + chosen_ports = gpr_realloc(chosen_ports, sizeof(int) * num_chosen_ports); + chosen_ports[num_chosen_ports - 1] = port; +} + static int is_port_available(int *port, int is_tcp) { const int proto = is_tcp ? IPPROTO_TCP : 0; const int fd = socket(AF_INET, is_tcp ? SOCK_STREAM : SOCK_DGRAM, proto); @@ -127,6 +154,10 @@ int grpc_pick_unused_port(void) { port = 0; } + if (has_port_been_chosen(port)) { + continue; + } + if (!is_port_available(&port, is_tcp)) { continue; } @@ -140,9 +171,7 @@ int grpc_pick_unused_port(void) { continue; } - /* TODO(ctiller): consider caching this port in some structure, to avoid - handing it out again */ - + chose_port(port); return port; } diff --git a/test/core/util/port_windows.c b/test/core/util/port_windows.c new file mode 100644 index 0000000000..17058c3353 --- /dev/null +++ b/test/core/util/port_windows.c @@ -0,0 +1,158 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include <grpc/support/port_platform.h> +#include "test/core/util/test_config.h" +#if defined(GPR_WINSOCK_SOCKET) && defined(GRPC_TEST_PICK_PORT) + +#include "src/core/iomgr/sockaddr_utils.h" +#include "test/core/util/port.h" + +#include <process.h> +#include <stdio.h> +#include <errno.h> +#include <string.h> + +#include <grpc/support/log.h> + +#define NUM_RANDOM_PORTS_TO_PICK 100 + +static int is_port_available(int *port, int is_tcp) { + const int proto = is_tcp ? IPPROTO_TCP : 0; + const SOCKET fd = socket(AF_INET, is_tcp ? SOCK_STREAM : SOCK_DGRAM, proto); + int one = 1; + struct sockaddr_in addr; + socklen_t alen = sizeof(addr); + int actual_port; + + GPR_ASSERT(*port >= 0); + GPR_ASSERT(*port <= 65535); + if (fd < 0) { + gpr_log(GPR_ERROR, "socket() failed: %s", strerror(errno)); + return 0; + } + + /* Reuseaddr lets us start up a server immediately after it exits */ + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&one, sizeof(one)) < 0) { + gpr_log(GPR_ERROR, "setsockopt() failed: %s", strerror(errno)); + closesocket(fd); + return 0; + } + + /* Try binding to port */ + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_port = htons(*port); + if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + gpr_log(GPR_DEBUG, "bind(port=%d) failed: %s", *port, strerror(errno)); + closesocket(fd); + return 0; + } + + /* Get the bound port number */ + if (getsockname(fd, (struct sockaddr *)&addr, &alen) < 0) { + gpr_log(GPR_ERROR, "getsockname() failed: %s", strerror(errno)); + closesocket(fd); + return 0; + } + GPR_ASSERT(alen <= sizeof(addr)); + actual_port = ntohs(addr.sin_port); + GPR_ASSERT(actual_port > 0); + if (*port == 0) { + *port = actual_port; + } else { + GPR_ASSERT(*port == actual_port); + } + + closesocket(fd); + return 1; +} + +int grpc_pick_unused_port(void) { + /* We repeatedly pick a port and then see whether or not it is + available for use both as a TCP socket and a UDP socket. First, we + pick a random large port number. For subsequent + iterations, we bind to an anonymous port and let the OS pick the + port number. The random port picking reduces the probability of + races with other processes on kernels that want to reuse the same + port numbers over and over. */ + + /* In alternating iterations we try UDP ports before TCP ports UDP + ports -- it could be the case that this machine has been using up + UDP ports and they are scarcer. */ + + /* Type of port to first pick in next iteration */ + int is_tcp = 1; + int try = 0; + + for (;;) { + int port; + try++; + if (try == 1) { + port = _getpid() % (65536 - 30000) + 30000; + } else if (try <= NUM_RANDOM_PORTS_TO_PICK) { + port = rand() % (65536 - 30000) + 30000; + } else { + port = 0; + } + + if (!is_port_available(&port, is_tcp)) { + continue; + } + + GPR_ASSERT(port > 0); + /* Check that the port # is free for the other type of socket also */ + if (!is_port_available(&port, !is_tcp)) { + /* In the next iteration try to bind to the other type first + because perhaps it is more rare. */ + is_tcp = !is_tcp; + continue; + } + + /* TODO(ctiller): consider caching this port in some structure, to avoid + handing it out again */ + + return port; + } + + /* The port iterator reached the end without finding a suitable port. */ + return 0; +} + +int grpc_pick_unused_port_or_die(void) { + int port = grpc_pick_unused_port(); + GPR_ASSERT(port > 0); + return port; +} + +#endif /* GPR_WINSOCK_SOCKET && GRPC_TEST_PICK_PORT */ diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index f44883783d..9f7d3b56a4 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -42,21 +42,25 @@ #include <grpc++/stream.h> #include <list> #include <thread> +#include <deque> #include <vector> #include "test/cpp/qps/histogram.h" +#include "test/cpp/qps/qps_worker.h" +#include "test/core/util/port.h" using std::list; using std::thread; using std::unique_ptr; +using std::deque; using std::vector; namespace grpc { namespace testing { -static vector<string> get_hosts(const string& name) { +static deque<string> get_hosts(const string& name) { char* env = gpr_getenv(name.c_str()); - if (!env) return vector<string>(); + if (!env) return deque<string>(); - vector<string> out; + deque<string> out; char* p = env; for (;;) { char* comma = strchr(p, ','); @@ -76,7 +80,8 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, const ServerConfig& server_config, size_t num_servers, int warmup_seconds, - int benchmark_seconds) { + int benchmark_seconds, + int spawn_local_worker_count) { // ClientContext allocator (all are destroyed at scope exit) list<ClientContext> contexts; auto alloc_context = [&contexts]() { @@ -88,6 +93,21 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config, auto workers = get_hosts("QPS_WORKERS"); ClientConfig client_config = initial_client_config; + // Spawn some local workers if desired + vector<unique_ptr<QpsWorker>> local_workers; + for (int i = 0; i < abs(spawn_local_worker_count); i++) { + int driver_port = grpc_pick_unused_port_or_die(); + int benchmark_port = grpc_pick_unused_port_or_die(); + local_workers.emplace_back(new QpsWorker(driver_port, benchmark_port)); + char addr[256]; + sprintf(addr, "localhost:%d", driver_port); + if (spawn_local_worker_count < 0) { + workers.push_front(addr); + } else { + workers.push_back(addr); + } + } + // TODO(ctiller): support running multiple configurations, and binpack // client/server pairs // to available workers diff --git a/test/cpp/qps/driver.h b/test/cpp/qps/driver.h index b3a8bf8cc4..eb7119a89d 100644 --- a/test/cpp/qps/driver.h +++ b/test/cpp/qps/driver.h @@ -56,7 +56,8 @@ ScenarioResult RunScenario(const grpc::testing::ClientConfig& client_config, const grpc::testing::ServerConfig& server_config, size_t num_servers, int warmup_seconds, - int benchmark_seconds); + int benchmark_seconds, + int spawn_local_worker_count); } // namespace testing } // namespace grpc diff --git a/test/cpp/qps/qps_driver.cc b/test/cpp/qps/qps_driver.cc index 220f826118..8959f7b97e 100644 --- a/test/cpp/qps/qps_driver.cc +++ b/test/cpp/qps/qps_driver.cc @@ -42,6 +42,7 @@ DEFINE_int32(num_servers, 1, "Number of server binaries"); DEFINE_int32(warmup_seconds, 5, "Warmup time (in seconds)"); DEFINE_int32(benchmark_seconds, 30, "Benchmark time (in seconds)"); +DEFINE_int32(local_workers, 0, "Number of local workers to start"); // Common config DEFINE_bool(enable_ssl, false, "Use SSL"); @@ -102,7 +103,8 @@ int main(int argc, char** argv) { auto result = RunScenario(client_config, FLAGS_num_clients, server_config, FLAGS_num_servers, - FLAGS_warmup_seconds, FLAGS_benchmark_seconds); + FLAGS_warmup_seconds, FLAGS_benchmark_seconds, + FLAGS_local_workers); ReportQPSPerCore(result, server_config); ReportLatency(result); diff --git a/test/cpp/qps/qps_worker.cc b/test/cpp/qps/qps_worker.cc new file mode 100644 index 0000000000..46d70dce52 --- /dev/null +++ b/test/cpp/qps/qps_worker.cc @@ -0,0 +1,233 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "qps_worker.h" + +#include <cassert> +#include <memory> +#include <mutex> +#include <string> +#include <thread> +#include <vector> +#include <sstream> + +#include <grpc/grpc.h> +#include <grpc/support/alloc.h> +#include <grpc/support/histogram.h> +#include <grpc/support/log.h> +#include <grpc/support/host_port.h> +#include <grpc++/client_context.h> +#include <grpc++/status.h> +#include <grpc++/server.h> +#include <grpc++/server_builder.h> +#include <grpc++/server_credentials.h> +#include <grpc++/stream.h> +#include "test/core/util/grpc_profiler.h" +#include "test/cpp/util/create_test_channel.h" +#include "test/cpp/qps/qpstest.pb.h" +#include "test/cpp/qps/client.h" +#include "test/cpp/qps/server.h" + +namespace grpc { +namespace testing { + +std::unique_ptr<Client> CreateClient(const ClientConfig& config) { + switch (config.client_type()) { + case ClientType::SYNCHRONOUS_CLIENT: + return (config.rpc_type() == RpcType::UNARY) ? + CreateSynchronousUnaryClient(config) : + CreateSynchronousStreamingClient(config); + case ClientType::ASYNC_CLIENT: + return (config.rpc_type() == RpcType::UNARY) ? + CreateAsyncUnaryClient(config) : CreateAsyncStreamingClient(config); + } + abort(); +} + +std::unique_ptr<Server> CreateServer(const ServerConfig& config, int server_port) { + switch (config.server_type()) { + case ServerType::SYNCHRONOUS_SERVER: + return CreateSynchronousServer(config, server_port); + case ServerType::ASYNC_SERVER: + return CreateAsyncServer(config, server_port); + } + abort(); +} + +class WorkerImpl GRPC_FINAL : public Worker::Service { + public: + explicit WorkerImpl(int server_port) : server_port_(server_port), acquired_(false) {} + + Status RunTest(ServerContext* ctx, + ServerReaderWriter<ClientStatus, ClientArgs>* stream) + GRPC_OVERRIDE { + InstanceGuard g(this); + if (!g.Acquired()) { + return Status(RESOURCE_EXHAUSTED); + } + + grpc_profiler_start("qps_client.prof"); + Status ret = RunTestBody(ctx,stream); + grpc_profiler_stop(); + return ret; + } + + Status RunServer(ServerContext* ctx, + ServerReaderWriter<ServerStatus, ServerArgs>* stream) + GRPC_OVERRIDE { + InstanceGuard g(this); + if (!g.Acquired()) { + return Status(RESOURCE_EXHAUSTED); + } + + grpc_profiler_start("qps_server.prof"); + Status ret = RunServerBody(ctx,stream); + grpc_profiler_stop(); + return ret; + } + + private: + // Protect against multiple clients using this worker at once. + class InstanceGuard { + public: + InstanceGuard(WorkerImpl* impl) + : impl_(impl), acquired_(impl->TryAcquireInstance()) {} + ~InstanceGuard() { + if (acquired_) { + impl_->ReleaseInstance(); + } + } + + bool Acquired() const { return acquired_; } + + private: + WorkerImpl* const impl_; + const bool acquired_; + }; + + bool TryAcquireInstance() { + std::lock_guard<std::mutex> g(mu_); + if (acquired_) return false; + acquired_ = true; + return true; + } + + void ReleaseInstance() { + std::lock_guard<std::mutex> g(mu_); + GPR_ASSERT(acquired_); + acquired_ = false; + } + + Status RunTestBody(ServerContext* ctx, + ServerReaderWriter<ClientStatus, ClientArgs>* stream) { + ClientArgs args; + if (!stream->Read(&args)) { + return Status(INVALID_ARGUMENT); + } + if (!args.has_setup()) { + return Status(INVALID_ARGUMENT); + } + auto client = CreateClient(args.setup()); + if (!client) { + return Status(INVALID_ARGUMENT); + } + ClientStatus status; + if (!stream->Write(status)) { + return Status(UNKNOWN); + } + while (stream->Read(&args)) { + if (!args.has_mark()) { + return Status(INVALID_ARGUMENT); + } + *status.mutable_stats() = client->Mark(); + stream->Write(status); + } + + return Status::OK; + } + + Status RunServerBody(ServerContext* ctx, + ServerReaderWriter<ServerStatus, ServerArgs>* stream) { + ServerArgs args; + if (!stream->Read(&args)) { + return Status(INVALID_ARGUMENT); + } + if (!args.has_setup()) { + return Status(INVALID_ARGUMENT); + } + auto server = CreateServer(args.setup(), server_port_); + if (!server) { + return Status(INVALID_ARGUMENT); + } + ServerStatus status; + status.set_port(server_port_); + if (!stream->Write(status)) { + return Status(UNKNOWN); + } + while (stream->Read(&args)) { + if (!args.has_mark()) { + return Status(INVALID_ARGUMENT); + } + *status.mutable_stats() = server->Mark(); + stream->Write(status); + } + + return Status::OK; + } + + const int server_port_; + + std::mutex mu_; + bool acquired_; +}; + +QpsWorker::QpsWorker(int driver_port, int server_port) { + impl_.reset(new WorkerImpl(server_port)); + + char* server_address = NULL; + gpr_join_host_port(&server_address, "::", driver_port); + + ServerBuilder builder; + builder.AddListeningPort(server_address, InsecureServerCredentials()); + builder.RegisterService(impl_.get()); + + gpr_free(server_address); + + server_ = std::move(builder.BuildAndStart()); +} + +QpsWorker::~QpsWorker() { +} + +} // namespace testing +} // namespace grpc diff --git a/test/cpp/qps/qps_worker.h b/test/cpp/qps/qps_worker.h new file mode 100644 index 0000000000..861588907e --- /dev/null +++ b/test/cpp/qps/qps_worker.h @@ -0,0 +1,60 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef QPS_WORKER_H +#define QPS_WORKER_H + +#include <memory> + +namespace grpc { + +class Server; + +namespace testing { + +class WorkerImpl; + +class QpsWorker { + public: + QpsWorker(int driver_port, int server_port); + ~QpsWorker(); + + private: + std::unique_ptr<WorkerImpl> impl_; + std::unique_ptr<Server> server_; +}; + +} // namespace testing +} // namespace grpc + +#endif diff --git a/test/cpp/qps/smoke_test.cc b/test/cpp/qps/smoke_test.cc index c9d321f133..9531913b00 100644 --- a/test/cpp/qps/smoke_test.cc +++ b/test/cpp/qps/smoke_test.cc @@ -58,7 +58,7 @@ static void RunSynchronousUnaryPingPong() { server_config.set_enable_ssl(false); server_config.set_threads(1); - auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK); + auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); ReportQPS(result); ReportLatency(result); @@ -80,7 +80,7 @@ static void RunSynchronousStreamingPingPong() { server_config.set_enable_ssl(false); server_config.set_threads(1); - auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK); + auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); ReportQPS(result); ReportLatency(result); @@ -103,7 +103,7 @@ static void RunAsyncUnaryPingPong() { server_config.set_enable_ssl(false); server_config.set_threads(1); - auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK); + auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); ReportQPS(result); ReportLatency(result); @@ -126,7 +126,7 @@ static void RunQPS() { server_config.set_enable_ssl(false); server_config.set_threads(4); - auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK); + auto result = RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2); ReportQPSPerCore(result, server_config); ReportLatency(result); diff --git a/test/cpp/qps/smoke_test.sh b/test/cpp/qps/smoke_test.sh deleted file mode 100755 index ba7f0a4f27..0000000000 --- a/test/cpp/qps/smoke_test.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -# performs a single qps run with one client and one server - -set -ex - -cd $(dirname $0)/../../.. - -killall qps_worker || true - -config=opt - -NUMCPUS=`python2.7 -c 'import multiprocessing; print multiprocessing.cpu_count()'` - -make CONFIG=$config qps_worker qps_smoke_test -j$NUMCPUS - -bins/$config/qps_worker -driver_port 10000 -server_port 10001 & -PID1=$! -bins/$config/qps_worker -driver_port 10010 -server_port 10011 & -PID2=$! - -export QPS_WORKERS="localhost:10000,localhost:10010" - -bins/$config/qps_smoke_test $* - -kill -2 $PID1 $PID2 -wait - diff --git a/test/cpp/qps/worker.cc b/test/cpp/qps/worker.cc index 101eb9f969..1ef5313b66 100644 --- a/test/cpp/qps/worker.cc +++ b/test/cpp/qps/worker.cc @@ -31,33 +31,15 @@ * */ -#include <cassert> -#include <memory> -#include <mutex> -#include <string> -#include <thread> -#include <vector> -#include <sstream> - #include <sys/signal.h> +#include <chrono> +#include <thread> + #include <grpc/grpc.h> -#include <grpc/support/alloc.h> -#include <grpc/support/histogram.h> -#include <grpc/support/log.h> -#include <grpc/support/host_port.h> #include <gflags/gflags.h> -#include <grpc++/client_context.h> -#include <grpc++/status.h> -#include <grpc++/server.h> -#include <grpc++/server_builder.h> -#include <grpc++/server_credentials.h> -#include <grpc++/stream.h> -#include "test/core/util/grpc_profiler.h" -#include "test/cpp/util/create_test_channel.h" -#include "test/cpp/qps/qpstest.grpc.pb.h" -#include "test/cpp/qps/client.h" -#include "test/cpp/qps/server.h" + +#include "qps_worker.h" DEFINE_int32(driver_port, 0, "Driver server port."); DEFINE_int32(server_port, 0, "Spawned server port."); @@ -76,167 +58,8 @@ static void sigint_handler(int x) {got_sigint = true;} namespace grpc { namespace testing { -std::unique_ptr<Client> CreateClient(const ClientConfig& config) { - switch (config.client_type()) { - case ClientType::SYNCHRONOUS_CLIENT: - return (config.rpc_type() == RpcType::UNARY) ? - CreateSynchronousUnaryClient(config) : - CreateSynchronousStreamingClient(config); - case ClientType::ASYNC_CLIENT: - return (config.rpc_type() == RpcType::UNARY) ? - CreateAsyncUnaryClient(config) : CreateAsyncStreamingClient(config); - } - abort(); -} - -std::unique_ptr<Server> CreateServer(const ServerConfig& config) { - switch (config.server_type()) { - case ServerType::SYNCHRONOUS_SERVER: - return CreateSynchronousServer(config, FLAGS_server_port); - case ServerType::ASYNC_SERVER: - return CreateAsyncServer(config, FLAGS_server_port); - } - abort(); -} - -class WorkerImpl GRPC_FINAL : public Worker::Service { - public: - WorkerImpl() : acquired_(false) {} - - Status RunTest(ServerContext* ctx, - ServerReaderWriter<ClientStatus, ClientArgs>* stream) - GRPC_OVERRIDE { - InstanceGuard g(this); - if (!g.Acquired()) { - return Status(RESOURCE_EXHAUSTED); - } - - grpc_profiler_start("qps_client.prof"); - Status ret = RunTestBody(ctx,stream); - grpc_profiler_stop(); - return ret; - } - - Status RunServer(ServerContext* ctx, - ServerReaderWriter<ServerStatus, ServerArgs>* stream) - GRPC_OVERRIDE { - InstanceGuard g(this); - if (!g.Acquired()) { - return Status(RESOURCE_EXHAUSTED); - } - - grpc_profiler_start("qps_server.prof"); - Status ret = RunServerBody(ctx,stream); - grpc_profiler_stop(); - return ret; - } - - private: - // Protect against multiple clients using this worker at once. - class InstanceGuard { - public: - InstanceGuard(WorkerImpl* impl) - : impl_(impl), acquired_(impl->TryAcquireInstance()) {} - ~InstanceGuard() { - if (acquired_) { - impl_->ReleaseInstance(); - } - } - - bool Acquired() const { return acquired_; } - - private: - WorkerImpl* const impl_; - const bool acquired_; - }; - - bool TryAcquireInstance() { - std::lock_guard<std::mutex> g(mu_); - if (acquired_) return false; - acquired_ = true; - return true; - } - - void ReleaseInstance() { - std::lock_guard<std::mutex> g(mu_); - GPR_ASSERT(acquired_); - acquired_ = false; - } - - Status RunTestBody(ServerContext* ctx, - ServerReaderWriter<ClientStatus, ClientArgs>* stream) { - ClientArgs args; - if (!stream->Read(&args)) { - return Status(INVALID_ARGUMENT); - } - if (!args.has_setup()) { - return Status(INVALID_ARGUMENT); - } - auto client = CreateClient(args.setup()); - if (!client) { - return Status(INVALID_ARGUMENT); - } - ClientStatus status; - if (!stream->Write(status)) { - return Status(UNKNOWN); - } - while (stream->Read(&args)) { - if (!args.has_mark()) { - return Status(INVALID_ARGUMENT); - } - *status.mutable_stats() = client->Mark(); - stream->Write(status); - } - - return Status::OK; - } - - Status RunServerBody(ServerContext* ctx, - ServerReaderWriter<ServerStatus, ServerArgs>* stream) { - ServerArgs args; - if (!stream->Read(&args)) { - return Status(INVALID_ARGUMENT); - } - if (!args.has_setup()) { - return Status(INVALID_ARGUMENT); - } - auto server = CreateServer(args.setup()); - if (!server) { - return Status(INVALID_ARGUMENT); - } - ServerStatus status; - status.set_port(FLAGS_server_port); - if (!stream->Write(status)) { - return Status(UNKNOWN); - } - while (stream->Read(&args)) { - if (!args.has_mark()) { - return Status(INVALID_ARGUMENT); - } - *status.mutable_stats() = server->Mark(); - stream->Write(status); - } - - return Status::OK; - } - - std::mutex mu_; - bool acquired_; -}; - static void RunServer() { - char* server_address = NULL; - gpr_join_host_port(&server_address, "::", FLAGS_driver_port); - - WorkerImpl service; - - ServerBuilder builder; - builder.AddListeningPort(server_address, InsecureServerCredentials()); - builder.RegisterService(&service); - - gpr_free(server_address); - - auto server = builder.BuildAndStart(); + QpsWorker worker(FLAGS_driver_port, FLAGS_server_port); while (!got_sigint) { std::this_thread::sleep_for(std::chrono::seconds(5)); diff --git a/tools/buildgen/generate_projects.sh b/tools/buildgen/generate_projects.sh index 45f08df38f..a09395c9e0 100755 --- a/tools/buildgen/generate_projects.sh +++ b/tools/buildgen/generate_projects.sh @@ -46,13 +46,11 @@ end2end_test_build=`mktemp /tmp/genXXXXXX` $gen_build_json > $end2end_test_build global_plugins=`find ./tools/buildgen/plugins -name '*.py' | - sort | grep -v __init__ | - while read p ; do echo -n "-p $p " ; done` + sort | grep -v __init__ | awk ' { printf "-p %s ", $0 } '` for dir in . ; do local_plugins=`find $dir/templates -name '*.py' | - sort | grep -v __init__ | - while read p ; do echo -n "-p $p " ; done` + sort | grep -v __init__ | awk ' { printf "-p %s ", $0 } '` plugins="$global_plugins $local_plugins" @@ -60,7 +58,7 @@ for dir in . ; do out=${dir}/${file#$dir/templates/} # strip templates dir prefix out=${out%.*} # strip template extension json_files="build.json $end2end_test_build" - data=`for i in $json_files; do echo -n "-d $i "; done` + data=`for i in $json_files ; do echo $i ; done | awk ' { printf "-d %s ", $0 } '` if [ "x$TEST" = "xtrue" ] ; then actual_out=$out out=`mktemp /tmp/gentXXXXXX` diff --git a/tools/buildgen/plugins/expand_bin_attrs.py b/tools/buildgen/plugins/expand_bin_attrs.py new file mode 100755 index 0000000000..0896a5a165 --- /dev/null +++ b/tools/buildgen/plugins/expand_bin_attrs.py @@ -0,0 +1,51 @@ +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Buildgen expand binary attributes plugin. + +This fills in any optional attributes. + +""" + + +def mako_plugin(dictionary): + """The exported plugin code for expand_filegroups. + + The list of libs in the build.json file can contain "filegroups" tags. + These refer to the filegroups in the root object. We will expand and + merge filegroups on the src, headers and public_headers properties. + + """ + + targets = dictionary.get('targets') + + for tgt in targets: + tgt['flaky'] = tgt.get('flaky', False) + tgt['platforms'] = tgt.get('platforms', ['windows', 'posix']) + diff --git a/tools/gce_setup/cloud_prod_runner.sh b/tools/gce_setup/cloud_prod_runner.sh index e236c921ec..0389ac9dc1 100755 --- a/tools/gce_setup/cloud_prod_runner.sh +++ b/tools/gce_setup/cloud_prod_runner.sh @@ -32,21 +32,25 @@ thisfile=$(readlink -ne "${BASH_SOURCE[0]}") current_time=$(date "+%Y-%m-%d-%H-%M-%S") result_file_name=cloud_prod_result.$current_time.html echo $result_file_name +log_link=https://pantheon.corp.google.com/m/cloudstorage/b/stoked-keyword-656-output/o/log_history main() { source grpc_docker.sh test_cases=(large_unary empty_unary ping_pong client_streaming server_streaming cancel_after_begin cancel_after_first_response) auth_test_cases=(service_account_creds compute_engine_creds jwt_token_creds) - clients=(cxx java go ruby node csharp_mono) + clients=(cxx java go ruby node csharp_mono python) for test_case in "${test_cases[@]}" do for client in "${clients[@]}" do - if grpc_cloud_prod_test $test_case grpc-docker-testclients $client + log_file_name=cloud_{$test_case}_{$client}.txt + if grpc_cloud_prod_test $test_case grpc-docker-testclients $client > /tmp/$log_file_name 2>&1 then - echo " ['$test_case', '$client', 'prod', true]," >> /tmp/cloud_prod_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', 'prod', true, '<a href="$log_link/$log_file_name">log</a>']," >> /tmp/cloud_prod_result.txt else - echo " ['$test_case', '$client', 'prod', false]," >> /tmp/cloud_prod_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', 'prod', false, '<a href="$log_link/$log_file_name">log</a>']," >> /tmp/cloud_prod_result.txt fi done done @@ -54,11 +58,14 @@ main() { do for client in "${clients[@]}" do - if grpc_cloud_prod_auth_test $test_case grpc-docker-testclients $client + log_file_name=cloud_{$test_case}_{$client}.txt + if grpc_cloud_prod_auth_test $test_case grpc-docker-testclients $client > /tmp/$log_file_name 2>&1 then - echo " ['$test_case', '$client', 'prod', true]," >> /tmp/cloud_prod_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', 'prod', true, '<a href="$log_link/$log_file_name">log</a>']," >> /tmp/cloud_prod_result.txt else - echo " ['$test_case', '$client', 'prod', false]," >> /tmp/cloud_prod_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', 'prod', false, '<a href="$log_link/$log_file_name">log</a>']," >> /tmp/cloud_prod_result.txt fi done done @@ -69,6 +76,7 @@ main() { gsutil cp /tmp/cloud_prod_result.html gs://stoked-keyword-656-output/result_history/$result_file_name rm /tmp/cloud_prod_result.txt rm /tmp/cloud_prod_result.html + rm /tmp/cloud*.txt fi } diff --git a/tools/gce_setup/grpc_docker.sh b/tools/gce_setup/grpc_docker.sh index c68903b816..c8481c4211 100755 --- a/tools/gce_setup/grpc_docker.sh +++ b/tools/gce_setup/grpc_docker.sh @@ -1041,6 +1041,19 @@ grpc_interop_gen_python_cmd() { echo $the_cmd } +# constructs the full dockerized python interop test cmd. +# +# call-seq: +# flags= .... # generic flags to include the command +# cmd=$($grpc_gen_test_cmd $flags) +grpc_cloud_prod_gen_python_cmd() { + local cmd_prefix="sudo docker run grpc/python bin/bash -l -c" + local gfe_flags=$(_grpc_prod_gfe_flags) + local env_prefix="SSL_CERT_FILE=/cacerts/roots.pem" + local the_cmd="$cmd_prefix '$env_prefix python -B -m interop.client --use_tls $gfe_flags $@'" + echo $the_cmd +} + # constructs the full dockerized python service_account auth interop test cmd. # # call-seq: @@ -1070,7 +1083,7 @@ grpc_cloud_prod_auth_compute_engine_creds_gen_python_cmd() { echo $the_cmd } -# constructs the full dockerized java interop test cmd. +# constructs the full dockerized ruby interop test cmd. # # call-seq: # flags= .... # generic flags to include the command @@ -1150,6 +1163,23 @@ grpc_cloud_prod_auth_compute_engine_creds_gen_ruby_cmd() { echo $the_cmd } +# constructs the full dockerized ruby jwt_tokens auth interop test cmd. +# +# call-seq: +# flags= .... # generic flags to include the command +# cmd=$($grpc_gen_test_cmd $flags) +grpc_cloud_prod_auth_jwt_token_creds_gen_ruby_cmd() { + local cmd_prefix="sudo docker run grpc/ruby bin/bash -l -c"; + local test_script="/var/local/git/grpc/src/ruby/bin/interop/interop_client.rb" + local test_script+=" --use_tls" + local gfe_flags=$(_grpc_prod_gfe_flags) + local added_gfe_flags=$(_grpc_jwt_token_test_flags) + local env_prefix="SSL_CERT_FILE=/cacerts/roots.pem" + env_prefix+=" GOOGLE_APPLICATION_CREDENTIALS=/service_account/stubbyCloudTestingTest-7dd63462c60c.json" + local the_cmd="$cmd_prefix '$env_prefix ruby $test_script $gfe_flags $added_gfe_flags $@'" + echo $the_cmd +} + # constructs the full dockerized Go interop test cmd. # # call-seq: diff --git a/tools/gce_setup/interop_test_runner.sh b/tools/gce_setup/interop_test_runner.sh index 1c6122e9ae..b9f026e545 100755 --- a/tools/gce_setup/interop_test_runner.sh +++ b/tools/gce_setup/interop_test_runner.sh @@ -32,6 +32,7 @@ thisfile=$(readlink -ne "${BASH_SOURCE[0]}") current_time=$(date "+%Y-%m-%d-%H-%M-%S") result_file_name=interop_result.$current_time.html echo $result_file_name +log_link=https://pantheon.corp.google.com/m/cloudstorage/b/stoked-keyword-656-output/o/log_history main() { source grpc_docker.sh @@ -44,11 +45,14 @@ main() { do for server in "${servers[@]}" do - if grpc_interop_test $test_case grpc-docker-testclients $client grpc-docker-server $server + log_file_name=interop_{$test_case}_{$client}_{$server}.txt + if grpc_interop_test $test_case grpc-docker-testclients $client grpc-docker-server $server > /tmp/$log_file_name 2>&1 then - echo " ['$test_case', '$client', '$server', true]," >> /tmp/interop_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', '$server', true, '<a href="$log_link/$log_file_name">log</a>']," >> /tmp/interop_result.txt else - echo " ['$test_case', '$client', '$server', false]," >> /tmp/interop_result.txt + gsutil cp /tmp/$log_file_name gs://stoked-keyword-656-output/log_history/$log_file_name + echo " ['$test_case', '$client', '$server', false, '<a href="$log_link/$log_file_name">log</a>']," >> /tmp/interop_result.txt fi done done @@ -60,6 +64,7 @@ main() { gsutil cp /tmp/interop_result.html gs://stoked-keyword-656-output/result_history/$result_file_name rm /tmp/interop_result.txt rm /tmp/interop_result.html + rm /tmp/interop*.txt fi } diff --git a/tools/gce_setup/post.html b/tools/gce_setup/post.html index 57cbc8c369..2cea050c08 100644 --- a/tools/gce_setup/post.html +++ b/tools/gce_setup/post.html @@ -1,8 +1,7 @@ ]); var table = new google.visualization.Table(document.getElementById('table_div')); - - table.draw(data, {showRowNumber: true}); + table.draw(data, {showRowNumber: true, allowHtml: true}); } </script> </head> diff --git a/tools/gce_setup/pre.html b/tools/gce_setup/pre.html index 74ce5ce202..79aa8fa394 100644 --- a/tools/gce_setup/pre.html +++ b/tools/gce_setup/pre.html @@ -11,4 +11,5 @@ data.addColumn('string', 'Client'); data.addColumn('string', 'Server'); data.addColumn('boolean', 'Pass'); + data.addColumn('string', 'LogLink'); data.addRows([ diff --git a/tools/run_tests/jobset.py b/tools/run_tests/jobset.py index 81cdd0e6e4..efe040aeb6 100755 --- a/tools/run_tests/jobset.py +++ b/tools/run_tests/jobset.py @@ -32,6 +32,7 @@ import hashlib import multiprocessing import os +import platform import random import signal import subprocess @@ -43,17 +44,19 @@ import time _DEFAULT_MAX_JOBS = 16 * multiprocessing.cpu_count() -have_alarm = False -def alarm_handler(unused_signum, unused_frame): - global have_alarm - have_alarm = False - - # setup a signal handler so that signal.pause registers 'something' # when a child finishes # not using futures and threading to avoid a dependency on subprocess32 -signal.signal(signal.SIGCHLD, lambda unused_signum, unused_frame: None) -signal.signal(signal.SIGALRM, alarm_handler) +if platform.system() == "Windows": + pass +else: + have_alarm = False + def alarm_handler(unused_signum, unused_frame): + global have_alarm + have_alarm = False + + signal.signal(signal.SIGCHLD, lambda unused_signum, unused_frame: None) + signal.signal(signal.SIGALRM, alarm_handler) def shuffle_iteratable(it): @@ -109,6 +112,11 @@ _TAG_COLOR = { def message(tag, message, explanatory_text=None, do_newline=False): + if platform.system() == 'Windows': + if explanatory_text: + print explanatory_text + print '%s: %s' % (tag, message) + return try: sys.stdout.write('%s%s%s\x1b[%d;%dm%s\x1b[0m: %s%s' % ( _BEGINNING_OF_LINE, @@ -136,7 +144,7 @@ def which(filename): class JobSpec(object): """Specifies what to run for a job.""" - def __init__(self, cmdline, shortname=None, environ=None, hash_targets=None): + def __init__(self, cmdline, shortname=None, environ=None, hash_targets=None, cwd=None): """ Arguments: cmdline: a list of arguments to pass as the command line @@ -152,6 +160,7 @@ class JobSpec(object): self.environ = environ self.shortname = cmdline[0] if shortname is None else shortname self.hash_targets = hash_targets or [] + self.cwd = cwd def identity(self): return '%r %r %r' % (self.cmdline, self.environ, self.hash_targets) @@ -177,6 +186,7 @@ class Job(object): self._process = subprocess.Popen(args=spec.cmdline, stderr=subprocess.STDOUT, stdout=self._tempfile, + cwd=spec.cwd, env=env) self._state = _RUNNING self._newline_on_success = newline_on_success @@ -241,10 +251,15 @@ class Jobset(object): bin_hash = None should_run = True if should_run: - self._running.add(Job(spec, - bin_hash, - self._newline_on_success, - self._travis)) + try: + self._running.add(Job(spec, + bin_hash, + self._newline_on_success, + self._travis)) + except: + message('FAILED', spec.shortname) + self._cancelled = True + return False return True def reap(self): @@ -264,11 +279,14 @@ class Jobset(object): if (not self._travis): message('WAITING', '%d jobs running, %d complete, %d failed' % ( len(self._running), self._completed, self._failures)) - global have_alarm - if not have_alarm: - have_alarm = True - signal.alarm(10) - signal.pause() + if platform.system() == 'Windows': + time.sleep(0.1) + else: + global have_alarm + if not have_alarm: + have_alarm = True + signal.alarm(10) + signal.pause() def cancelled(self): """Poll for cancellation.""" diff --git a/tools/run_tests/run_sanity.sh b/tools/run_tests/run_sanity.sh new file mode 100755 index 0000000000..e915af93d4 --- /dev/null +++ b/tools/run_tests/run_sanity.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +set -e + +export TEST=true + +cd `dirname $0`/../.. + +./tools/buildgen/generate_projects.sh diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index 14ee1790c6..a443b17a97 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -39,6 +39,7 @@ import os import re import sys import time +import platform import jobset import watch_dirs @@ -101,9 +102,16 @@ class CLanguage(object): def __init__(self, make_target, test_lang): self.make_target = make_target + if platform.system() == 'Windows': + plat = 'windows' + else: + plat = 'posix' with open('tools/run_tests/tests.json') as f: js = json.load(f) - self.binaries = [tgt for tgt in js if tgt['language'] == test_lang] + self.binaries = [tgt + for tgt in js + if tgt['language'] == test_lang and + plat in tgt['platforms']] def test_specs(self, config, travis): out = [] @@ -190,6 +198,7 @@ class PythonLanguage(object): def __str__(self): return 'python' + class RubyLanguage(object): def test_specs(self, config, travis): @@ -207,6 +216,7 @@ class RubyLanguage(object): def __str__(self): return 'ruby' + class CSharpLanguage(object): def test_specs(self, config, travis): @@ -224,6 +234,25 @@ class CSharpLanguage(object): def __str__(self): return 'csharp' + +class Sanity(object): + + def test_specs(self, config, travis): + return [config.job_spec('tools/run_tests/run_sanity.sh', None)] + + def make_targets(self): + return ['run_dep_checks'] + + def build_steps(self): + return [] + + def supports_multi_config(self): + return False + + def __str__(self): + return 'sanity' + + class Build(object): def test_specs(self, config, travis): @@ -267,6 +296,7 @@ _LANGUAGES = { 'python': PythonLanguage(), 'ruby': RubyLanguage(), 'csharp': CSharpLanguage(), + 'sanity': Sanity(), 'build': Build(), } @@ -314,17 +344,27 @@ if len(build_configs) > 1: print language, 'does not support multiple build configurations' sys.exit(1) -build_steps = [jobset.JobSpec(['make', - '-j', '%d' % (multiprocessing.cpu_count() + 1), - 'EXTRA_DEFINES=GRPC_TEST_SLOWDOWN_MACHINE_FACTOR=%f' % args.slowdown, - 'CONFIG=%s' % cfg] + list(set( - itertools.chain.from_iterable( - l.make_targets() for l in languages)))) - for cfg in build_configs] + list(set( +if platform.system() == 'Windows': + def make_jobspec(cfg, targets): + return jobset.JobSpec(['nmake', '/f', 'Grpc.mak', 'CONFIG=%s' % cfg] + targets, + cwd='vsprojects\\vs2013') +else: + def make_jobspec(cfg, targets): + return jobset.JobSpec(['make', + '-j', '%d' % (multiprocessing.cpu_count() + 1), + 'EXTRA_DEFINES=GRPC_TEST_SLOWDOWN_MACHINE_FACTOR=%f' % + args.slowdown, + 'CONFIG=%s' % cfg] + targets) + +build_steps = [make_jobspec(cfg, + list(set(itertools.chain.from_iterable( + l.make_targets() for l in languages)))) + for cfg in build_configs] +build_steps.extend(set( jobset.JobSpec(cmdline, environ={'CONFIG': cfg}) for cfg in build_configs for l in languages - for cmdline in l.build_steps())) + for cmdline in l.build_steps())) one_run = set( spec for config in run_configs diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index 05f5e47955..e284d1790f 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -4,2107 +4,3799 @@ { "flaky": false, "language": "c", - "name": "alarm_heap_test" + "name": "alarm_heap_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "alarm_list_test" + "name": "alarm_list_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "alarm_test" + "name": "alarm_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "alpn_test" + "name": "alpn_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "bin_encoder_test" + "name": "bin_encoder_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_hash_table_test" + "name": "census_hash_table_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": true, "language": "c", - "name": "census_statistics_multiple_writers_circular_buffer_test" + "name": "census_statistics_multiple_writers_circular_buffer_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_statistics_multiple_writers_test" + "name": "census_statistics_multiple_writers_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_statistics_performance_test" + "name": "census_statistics_performance_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_statistics_quick_test" + "name": "census_statistics_quick_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": true, "language": "c", - "name": "census_statistics_small_log_test" + "name": "census_statistics_small_log_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_stub_test" + "name": "census_stub_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "census_window_stats_test" + "name": "census_window_stats_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_status_conversion_test" + "name": "chttp2_status_conversion_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_stream_encoder_test" + "name": "chttp2_stream_encoder_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_stream_map_test" + "name": "chttp2_stream_map_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_transport_end2end_test" + "name": "chttp2_transport_end2end_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "dualstack_socket_test" + "name": "dualstack_socket_test", + "platforms": [ + "posix" + ] }, { "flaky": false, "language": "c", - "name": "echo_test" + "name": "echo_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "fd_posix_test" + "name": "fd_posix_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "fling_stream_test" + "name": "fling_stream_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "fling_test" + "name": "fling_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_cancellable_test" + "name": "gpr_cancellable_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_cmdline_test" + "name": "gpr_cmdline_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_env_test" + "name": "gpr_env_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_file_test" + "name": "gpr_file_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_histogram_test" + "name": "gpr_histogram_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_host_port_test" + "name": "gpr_host_port_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_log_test" + "name": "gpr_log_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_slice_buffer_test" + "name": "gpr_slice_buffer_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_slice_test" + "name": "gpr_slice_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_string_test" + "name": "gpr_string_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_sync_test" + "name": "gpr_sync_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_thd_test" + "name": "gpr_thd_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_time_test" + "name": "gpr_time_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_tls_test" + "name": "gpr_tls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "gpr_useful_test" + "name": "gpr_useful_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_base64_test" + "name": "grpc_base64_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_byte_buffer_reader_test" + "name": "grpc_byte_buffer_reader_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_channel_stack_test" + "name": "grpc_channel_stack_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_completion_queue_test" + "name": "grpc_completion_queue_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_credentials_test" + "name": "grpc_credentials_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_json_token_test" + "name": "grpc_json_token_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "grpc_stream_op_test" + "name": "grpc_stream_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "hpack_parser_test" + "name": "hpack_parser_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "hpack_table_test" + "name": "hpack_table_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "httpcli_format_request_test" + "name": "httpcli_format_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "httpcli_parser_test" + "name": "httpcli_parser_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "json_rewrite_test" + "name": "json_rewrite_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "json_test" + "name": "json_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "lame_client_test" + "name": "lame_client_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "message_compress_test" + "name": "message_compress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "metadata_buffer_test" + "name": "metadata_buffer_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "multi_init_test" + "name": "multi_init_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "murmur_hash_test" + "name": "murmur_hash_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "no_server_test" + "name": "no_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "poll_kick_posix_test" + "name": "poll_kick_posix_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "resolve_address_test" + "name": "resolve_address_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "secure_endpoint_test" + "name": "secure_endpoint_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "sockaddr_utils_test" + "name": "sockaddr_utils_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "tcp_client_posix_test" + "name": "tcp_client_posix_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "tcp_posix_test" + "name": "tcp_posix_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "tcp_server_posix_test" + "name": "tcp_server_posix_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "time_averaged_stats_test" + "name": "time_averaged_stats_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "time_test" + "name": "time_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "timeout_encoding_test" + "name": "timeout_encoding_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "transport_metadata_test" + "name": "timers_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "transport_security_test" + "name": "transport_metadata_test", + "platforms": [ + "windows", + "posix" + ] + }, + { + "flaky": false, + "language": "c", + "name": "transport_security_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "async_end2end_test" + "name": "async_end2end_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "channel_arguments_test" + "name": "channel_arguments_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "cli_call_test" + "name": "cli_call_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "credentials_test" + "name": "credentials_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "cxx_time_test" + "name": "cxx_time_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "end2end_test" + "name": "end2end_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "generic_end2end_test" + "name": "generic_end2end_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "interop_test" + "name": "interop_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "status_test" + "name": "status_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c++", - "name": "thread_pool_test" + "name": "thread_pool_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_bad_hostname_test" + "name": "chttp2_fake_security_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_accept_test" + "name": "chttp2_fake_security_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_invoke_test" + "name": "chttp2_fake_security_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_before_invoke_test" + "name": "chttp2_fake_security_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_in_a_vacuum_test" + "name": "chttp2_fake_security_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_census_simple_request_test" + "name": "chttp2_fake_security_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_disappearing_server_test" + "name": "chttp2_fake_security_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_test" + "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_empty_batch_test" + "name": "chttp2_fake_security_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_graceful_server_shutdown_test" + "name": "chttp2_fake_security_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_invoke_large_request_test" + "name": "chttp2_fake_security_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_max_concurrent_streams_test" + "name": "chttp2_fake_security_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_no_op_test" + "name": "chttp2_fake_security_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_ping_pong_streaming_test" + "name": "chttp2_fake_security_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_metadata_and_payload_test" + "name": "chttp2_fake_security_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_payload_test" + "name": "chttp2_fake_security_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_with_large_metadata_test" + "name": "chttp2_fake_security_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_with_payload_test" + "name": "chttp2_fake_security_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_simple_delayed_request_test" + "name": "chttp2_fake_security_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_simple_request_test" + "name": "chttp2_fake_security_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_thread_stress_test" + "name": "chttp2_fake_security_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_test" + "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_accept_legacy_test" + "name": "chttp2_fake_security_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_fake_security_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_after_invoke_legacy_test" + "name": "chttp2_fake_security_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_before_invoke_legacy_test" + "name": "chttp2_fake_security_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_fake_security_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_census_simple_request_legacy_test" + "name": "chttp2_fake_security_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_disappearing_server_legacy_test" + "name": "chttp2_fake_security_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_fake_security_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_graceful_server_shutdown_legacy_test" + "name": "chttp2_fake_security_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_invoke_large_request_legacy_test" + "name": "chttp2_fake_security_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_max_concurrent_streams_legacy_test" + "name": "chttp2_fake_security_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_no_op_legacy_test" + "name": "chttp2_fake_security_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_ping_pong_streaming_legacy_test" + "name": "chttp2_fake_security_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_fake_security_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_fake_security_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_payload_legacy_test" + "name": "chttp2_fake_security_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_fake_security_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_with_large_metadata_legacy_test" + "name": "chttp2_fake_security_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_request_with_payload_legacy_test" + "name": "chttp2_fake_security_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_simple_delayed_request_legacy_test" + "name": "chttp2_fake_security_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_simple_request_legacy_test" + "name": "chttp2_fake_security_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_thread_stress_legacy_test" + "name": "chttp2_fake_security_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_fake_security_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_bad_hostname_test" + "name": "chttp2_fullstack_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_accept_test" + "name": "chttp2_fullstack_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_invoke_test" + "name": "chttp2_fullstack_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_before_invoke_test" + "name": "chttp2_fullstack_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_in_a_vacuum_test" + "name": "chttp2_fullstack_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_census_simple_request_test" + "name": "chttp2_fullstack_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_disappearing_server_test" + "name": "chttp2_fullstack_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_test" + "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_empty_batch_test" + "name": "chttp2_fullstack_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_graceful_server_shutdown_test" + "name": "chttp2_fullstack_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_invoke_large_request_test" + "name": "chttp2_fullstack_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_max_concurrent_streams_test" + "name": "chttp2_fullstack_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_no_op_test" + "name": "chttp2_fullstack_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_ping_pong_streaming_test" + "name": "chttp2_fullstack_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_metadata_and_payload_test" + "name": "chttp2_fullstack_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_payload_test" + "name": "chttp2_fullstack_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_with_large_metadata_test" + "name": "chttp2_fullstack_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_with_payload_test" + "name": "chttp2_fullstack_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_simple_delayed_request_test" + "name": "chttp2_fullstack_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_simple_request_test" + "name": "chttp2_fullstack_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_thread_stress_test" + "name": "chttp2_fullstack_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_test" + "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_accept_legacy_test" + "name": "chttp2_fullstack_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_fullstack_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_after_invoke_legacy_test" + "name": "chttp2_fullstack_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_before_invoke_legacy_test" + "name": "chttp2_fullstack_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_fullstack_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_census_simple_request_legacy_test" + "name": "chttp2_fullstack_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_disappearing_server_legacy_test" + "name": "chttp2_fullstack_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_fullstack_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_graceful_server_shutdown_legacy_test" + "name": "chttp2_fullstack_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_invoke_large_request_legacy_test" + "name": "chttp2_fullstack_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_max_concurrent_streams_legacy_test" + "name": "chttp2_fullstack_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_no_op_legacy_test" + "name": "chttp2_fullstack_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_ping_pong_streaming_legacy_test" + "name": "chttp2_fullstack_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_payload_legacy_test" + "name": "chttp2_fullstack_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_with_large_metadata_legacy_test" + "name": "chttp2_fullstack_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_request_with_payload_legacy_test" + "name": "chttp2_fullstack_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_simple_delayed_request_legacy_test" + "name": "chttp2_fullstack_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_simple_request_legacy_test" + "name": "chttp2_fullstack_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_thread_stress_legacy_test" + "name": "chttp2_fullstack_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_fullstack_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_bad_hostname_test" + "name": "chttp2_fullstack_uds_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_accept_test" + "name": "chttp2_fullstack_uds_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_invoke_test" + "name": "chttp2_fullstack_uds_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_before_invoke_test" + "name": "chttp2_fullstack_uds_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_test" + "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_census_simple_request_test" + "name": "chttp2_fullstack_uds_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_disappearing_server_test" + "name": "chttp2_fullstack_uds_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_test" + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_empty_batch_test" + "name": "chttp2_fullstack_uds_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_graceful_server_shutdown_test" + "name": "chttp2_fullstack_uds_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_invoke_large_request_test" + "name": "chttp2_fullstack_uds_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_max_concurrent_streams_test" + "name": "chttp2_fullstack_uds_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_no_op_test" + "name": "chttp2_fullstack_uds_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_ping_pong_streaming_test" + "name": "chttp2_fullstack_uds_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_test" + "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_payload_test" + "name": "chttp2_fullstack_uds_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_with_large_metadata_test" + "name": "chttp2_fullstack_uds_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_with_payload_test" + "name": "chttp2_fullstack_uds_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_simple_delayed_request_test" + "name": "chttp2_fullstack_uds_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_simple_request_test" + "name": "chttp2_fullstack_uds_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_thread_stress_test" + "name": "chttp2_fullstack_uds_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_test" + "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_accept_legacy_test" + "name": "chttp2_fullstack_uds_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_fullstack_uds_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_after_invoke_legacy_test" + "name": "chttp2_fullstack_uds_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_before_invoke_legacy_test" + "name": "chttp2_fullstack_uds_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_fullstack_uds_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_census_simple_request_legacy_test" + "name": "chttp2_fullstack_uds_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_disappearing_server_legacy_test" + "name": "chttp2_fullstack_uds_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_fullstack_uds_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_graceful_server_shutdown_legacy_test" + "name": "chttp2_fullstack_uds_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_invoke_large_request_legacy_test" + "name": "chttp2_fullstack_uds_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_max_concurrent_streams_legacy_test" + "name": "chttp2_fullstack_uds_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_no_op_legacy_test" + "name": "chttp2_fullstack_uds_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_ping_pong_streaming_legacy_test" + "name": "chttp2_fullstack_uds_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_uds_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_uds_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_payload_legacy_test" + "name": "chttp2_fullstack_uds_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_fullstack_uds_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_with_large_metadata_legacy_test" + "name": "chttp2_fullstack_uds_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_request_with_payload_legacy_test" + "name": "chttp2_fullstack_uds_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_simple_delayed_request_legacy_test" + "name": "chttp2_fullstack_uds_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_simple_request_legacy_test" + "name": "chttp2_fullstack_uds_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_thread_stress_legacy_test" + "name": "chttp2_fullstack_uds_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_fullstack_uds_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_bad_hostname_test" + "name": "chttp2_simple_ssl_fullstack_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_test" + "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test" + "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_census_simple_request_test" + "name": "chttp2_simple_ssl_fullstack_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_disappearing_server_test" + "name": "chttp2_simple_ssl_fullstack_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test" + "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_empty_batch_test" + "name": "chttp2_simple_ssl_fullstack_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_test" + "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_invoke_large_request_test" + "name": "chttp2_simple_ssl_fullstack_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_test" + "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_no_op_test" + "name": "chttp2_simple_ssl_fullstack_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_test" + "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_test" + "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_with_payload_test" + "name": "chttp2_simple_ssl_fullstack_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_test" + "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_simple_request_test" + "name": "chttp2_simple_ssl_fullstack_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_thread_stress_test" + "name": "chttp2_simple_ssl_fullstack_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_test" + "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_legacy_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_legacy_test" + "name": "chttp2_simple_ssl_fullstack_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_legacy_test" + "name": "chttp2_simple_ssl_fullstack_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_census_simple_request_legacy_test" + "name": "chttp2_simple_ssl_fullstack_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_disappearing_server_legacy_test" + "name": "chttp2_simple_ssl_fullstack_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_legacy_test" + "name": "chttp2_simple_ssl_fullstack_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_invoke_large_request_legacy_test" + "name": "chttp2_simple_ssl_fullstack_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_legacy_test" + "name": "chttp2_simple_ssl_fullstack_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_no_op_legacy_test" + "name": "chttp2_simple_ssl_fullstack_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_legacy_test" + "name": "chttp2_simple_ssl_fullstack_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_request_with_payload_legacy_test" + "name": "chttp2_simple_ssl_fullstack_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_legacy_test" + "name": "chttp2_simple_ssl_fullstack_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_simple_request_legacy_test" + "name": "chttp2_simple_ssl_fullstack_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_thread_stress_legacy_test" + "name": "chttp2_simple_ssl_fullstack_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_simple_ssl_fullstack_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_simple_ssl_with_oauth2_fullstack_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_bad_hostname_test" + "name": "chttp2_socket_pair_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_accept_test" + "name": "chttp2_socket_pair_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_invoke_test" + "name": "chttp2_socket_pair_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_before_invoke_test" + "name": "chttp2_socket_pair_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_in_a_vacuum_test" + "name": "chttp2_socket_pair_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_census_simple_request_test" + "name": "chttp2_socket_pair_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_disappearing_server_test" + "name": "chttp2_socket_pair_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_test" + "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_empty_batch_test" + "name": "chttp2_socket_pair_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_graceful_server_shutdown_test" + "name": "chttp2_socket_pair_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_invoke_large_request_test" + "name": "chttp2_socket_pair_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_max_concurrent_streams_test" + "name": "chttp2_socket_pair_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_no_op_test" + "name": "chttp2_socket_pair_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_ping_pong_streaming_test" + "name": "chttp2_socket_pair_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_test" + "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_payload_test" + "name": "chttp2_socket_pair_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_with_large_metadata_test" + "name": "chttp2_socket_pair_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_with_payload_test" + "name": "chttp2_socket_pair_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_simple_delayed_request_test" + "name": "chttp2_socket_pair_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_simple_request_test" + "name": "chttp2_socket_pair_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_thread_stress_test" + "name": "chttp2_socket_pair_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_test" + "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_accept_legacy_test" + "name": "chttp2_socket_pair_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_socket_pair_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_after_invoke_legacy_test" + "name": "chttp2_socket_pair_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_before_invoke_legacy_test" + "name": "chttp2_socket_pair_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_socket_pair_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_census_simple_request_legacy_test" + "name": "chttp2_socket_pair_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_disappearing_server_legacy_test" + "name": "chttp2_socket_pair_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_socket_pair_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_graceful_server_shutdown_legacy_test" + "name": "chttp2_socket_pair_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_invoke_large_request_legacy_test" + "name": "chttp2_socket_pair_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_max_concurrent_streams_legacy_test" + "name": "chttp2_socket_pair_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_no_op_legacy_test" + "name": "chttp2_socket_pair_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_ping_pong_streaming_legacy_test" + "name": "chttp2_socket_pair_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_payload_legacy_test" + "name": "chttp2_socket_pair_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_with_large_metadata_legacy_test" + "name": "chttp2_socket_pair_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_request_with_payload_legacy_test" + "name": "chttp2_socket_pair_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_simple_delayed_request_legacy_test" + "name": "chttp2_socket_pair_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_simple_request_legacy_test" + "name": "chttp2_socket_pair_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_thread_stress_legacy_test" + "name": "chttp2_socket_pair_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_socket_pair_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_empty_batch_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_empty_batch_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_census_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_disappearing_server_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_no_op_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_request_with_payload_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_simple_delayed_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_simple_request_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_thread_stress_legacy_test", + "platforms": [ + "windows", + "posix" + ] }, { "flaky": false, "language": "c", - "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_legacy_test" + "name": "chttp2_socket_pair_one_byte_at_a_time_writes_done_hangs_with_pending_read_legacy_test", + "platforms": [ + "windows", + "posix" + ] } ] diff --git a/vsprojects/vs2010/Grpc.mak b/vsprojects/vs2010/Grpc.mak index 727aa37781..93689a42af 100644 --- a/vsprojects/vs2010/Grpc.mak +++ b/vsprojects/vs2010/Grpc.mak @@ -53,10 +53,10 @@ grpc_test_util: $(OUT_DIR): mkdir $(OUT_DIR) -buildtests: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stats_store_test.exe census_stub_test.exe census_trace_store_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe chttp2_transport_end2end_test.exe dualstack_socket_test.exe echo_test.exe fd_posix_test.exe fling_stream_test.exe fling_test.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe transport_metadata_test.exe transport_security_test.exe +buildtests: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stats_store_test.exe census_stub_test.exe census_trace_store_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe chttp2_transport_end2end_test.exe dualstack_socket_test.exe echo_test.exe fd_posix_test.exe fling_stream_test.exe fling_test.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe timers_test.exe transport_metadata_test.exe transport_security_test.exe echo All tests built. -test: alarm_heap_test alarm_list_test alarm_test alpn_test bin_encoder_test census_hash_table_test census_statistics_multiple_writers_circular_buffer_test census_statistics_multiple_writers_test census_statistics_performance_test census_statistics_quick_test census_statistics_small_log_test census_stats_store_test census_stub_test census_trace_store_test census_window_stats_test chttp2_status_conversion_test chttp2_stream_encoder_test chttp2_stream_map_test chttp2_transport_end2end_test dualstack_socket_test echo_test fd_posix_test fling_stream_test fling_test gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test grpc_base64_test grpc_byte_buffer_reader_test grpc_channel_stack_test grpc_completion_queue_test grpc_credentials_test grpc_json_token_test grpc_stream_op_test hpack_parser_test hpack_table_test httpcli_format_request_test httpcli_parser_test httpcli_test json_rewrite_test json_test lame_client_test message_compress_test metadata_buffer_test multi_init_test murmur_hash_test no_server_test poll_kick_posix_test resolve_address_test secure_endpoint_test sockaddr_utils_test tcp_client_posix_test tcp_posix_test tcp_server_posix_test time_averaged_stats_test time_test timeout_encoding_test transport_metadata_test transport_security_test +test: alarm_heap_test alarm_list_test alarm_test alpn_test bin_encoder_test census_hash_table_test census_statistics_multiple_writers_circular_buffer_test census_statistics_multiple_writers_test census_statistics_performance_test census_statistics_quick_test census_statistics_small_log_test census_stats_store_test census_stub_test census_trace_store_test census_window_stats_test chttp2_status_conversion_test chttp2_stream_encoder_test chttp2_stream_map_test chttp2_transport_end2end_test dualstack_socket_test echo_test fd_posix_test fling_stream_test fling_test gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test grpc_base64_test grpc_byte_buffer_reader_test grpc_channel_stack_test grpc_completion_queue_test grpc_credentials_test grpc_json_token_test grpc_stream_op_test hpack_parser_test hpack_table_test httpcli_format_request_test httpcli_parser_test httpcli_test json_rewrite_test json_test lame_client_test message_compress_test metadata_buffer_test multi_init_test murmur_hash_test no_server_test poll_kick_posix_test resolve_address_test secure_endpoint_test sockaddr_utils_test tcp_client_posix_test tcp_posix_test tcp_server_posix_test time_averaged_stats_test time_test timeout_encoding_test timers_test transport_metadata_test transport_security_test echo All tests ran. test_gpr: gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test @@ -702,6 +702,14 @@ timeout_encoding_test: timeout_encoding_test.exe echo Running timeout_encoding_test $(OUT_DIR)\timeout_encoding_test.exe +timers_test.exe: grpc_test_util + echo Building timers_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\profiling\timers_test.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\timers_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\timers_test.obj +timers_test: timers_test.exe + echo Running timers_test + $(OUT_DIR)\timers_test.exe + transport_metadata_test.exe: grpc_test_util echo Building transport_metadata_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\metadata_test.c diff --git a/vsprojects/vs2010/grpc.vcxproj b/vsprojects/vs2010/grpc.vcxproj index 203ca347d3..d18c33bf27 100644 --- a/vsprojects/vs2010/grpc.vcxproj +++ b/vsprojects/vs2010/grpc.vcxproj @@ -148,6 +148,8 @@ <ClInclude Include="..\..\src\core\json\json_common.h" /> <ClInclude Include="..\..\src\core\json\json_reader.h" /> <ClInclude Include="..\..\src\core\json\json_writer.h" /> + <ClInclude Include="..\..\src\core\profiling\timers.h" /> + <ClInclude Include="..\..\src\core\profiling\timers_preciseclock.h" /> <ClInclude Include="..\..\src\core\statistics\census_interface.h" /> <ClInclude Include="..\..\src\core\statistics\census_log.h" /> <ClInclude Include="..\..\src\core\statistics\census_rpc_stats.h" /> @@ -270,6 +272,8 @@ </ClCompile> <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c"> </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c"> + </ClCompile> <ClCompile Include="..\..\src\core\iomgr\fd_posix.c"> </ClCompile> <ClCompile Include="..\..\src\core\iomgr\iocp_windows.c"> @@ -334,6 +338,8 @@ </ClCompile> <ClCompile Include="..\..\src\core\json\json_writer.c"> </ClCompile> + <ClCompile Include="..\..\src\core\profiling\timers.c"> + </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_init.c"> </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_log.c"> diff --git a/vsprojects/vs2010/grpc.vcxproj.filters b/vsprojects/vs2010/grpc.vcxproj.filters index 20dbe8c444..7774a78040 100644 --- a/vsprojects/vs2010/grpc.vcxproj.filters +++ b/vsprojects/vs2010/grpc.vcxproj.filters @@ -124,6 +124,9 @@ <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c"> <Filter>src\core\iomgr</Filter> </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c"> + <Filter>src\core\iomgr</Filter> + </ClCompile> <ClCompile Include="..\..\src\core\iomgr\fd_posix.c"> <Filter>src\core\iomgr</Filter> </ClCompile> @@ -220,6 +223,9 @@ <ClCompile Include="..\..\src\core\json\json_writer.c"> <Filter>src\core\json</Filter> </ClCompile> + <ClCompile Include="..\..\src\core\profiling\timers.c"> + <Filter>src\core\profiling</Filter> + </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_init.c"> <Filter>src\core\statistics</Filter> </ClCompile> @@ -566,6 +572,12 @@ <ClInclude Include="..\..\src\core\json\json_writer.h"> <Filter>src\core\json</Filter> </ClInclude> + <ClInclude Include="..\..\src\core\profiling\timers.h"> + <Filter>src\core\profiling</Filter> + </ClInclude> + <ClInclude Include="..\..\src\core\profiling\timers_preciseclock.h"> + <Filter>src\core\profiling</Filter> + </ClInclude> <ClInclude Include="..\..\src\core\statistics\census_interface.h"> <Filter>src\core\statistics</Filter> </ClInclude> @@ -713,6 +725,9 @@ <Filter Include="src\core\json"> <UniqueIdentifier>{e665cc0e-b994-d7c5-cc18-2007392019f0}</UniqueIdentifier> </Filter> + <Filter Include="src\core\profiling"> + <UniqueIdentifier>{87674b72-0f05-0469-481a-bd8c7af9ad80}</UniqueIdentifier> + </Filter> <Filter Include="src\core\security"> <UniqueIdentifier>{1d850ac6-e639-4eab-5338-4ba40272fcc9}</UniqueIdentifier> </Filter> diff --git a/vsprojects/vs2010/grpc_test_util.vcxproj b/vsprojects/vs2010/grpc_test_util.vcxproj index 967543f78a..d3559d4dde 100644 --- a/vsprojects/vs2010/grpc_test_util.vcxproj +++ b/vsprojects/vs2010/grpc_test_util.vcxproj @@ -96,6 +96,8 @@ </ClCompile> <ClCompile Include="..\..\test\core\util\port_posix.c"> </ClCompile> + <ClCompile Include="..\..\test\core\util\port_windows.c"> + </ClCompile> <ClCompile Include="..\..\test\core\util\slice_splitter.c"> </ClCompile> </ItemGroup> diff --git a/vsprojects/vs2010/grpc_unsecure.vcxproj b/vsprojects/vs2010/grpc_unsecure.vcxproj index 1558d72514..78d538b70e 100644 --- a/vsprojects/vs2010/grpc_unsecure.vcxproj +++ b/vsprojects/vs2010/grpc_unsecure.vcxproj @@ -132,6 +132,8 @@ <ClInclude Include="..\..\src\core\json\json_common.h" /> <ClInclude Include="..\..\src\core\json\json_reader.h" /> <ClInclude Include="..\..\src\core\json\json_writer.h" /> + <ClInclude Include="..\..\src\core\profiling\timers.h" /> + <ClInclude Include="..\..\src\core\profiling\timers_preciseclock.h" /> <ClInclude Include="..\..\src\core\statistics\census_interface.h" /> <ClInclude Include="..\..\src\core\statistics\census_log.h" /> <ClInclude Include="..\..\src\core\statistics\census_rpc_stats.h" /> @@ -214,6 +216,8 @@ </ClCompile> <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c"> </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c"> + </ClCompile> <ClCompile Include="..\..\src\core\iomgr\fd_posix.c"> </ClCompile> <ClCompile Include="..\..\src\core\iomgr\iocp_windows.c"> @@ -278,6 +282,8 @@ </ClCompile> <ClCompile Include="..\..\src\core\json\json_writer.c"> </ClCompile> + <ClCompile Include="..\..\src\core\profiling\timers.c"> + </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_init.c"> </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_log.c"> diff --git a/vsprojects/vs2010/grpc_unsecure.vcxproj.filters b/vsprojects/vs2010/grpc_unsecure.vcxproj.filters index 4b758d6113..cec8f78bae 100644 --- a/vsprojects/vs2010/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vs2010/grpc_unsecure.vcxproj.filters @@ -64,6 +64,9 @@ <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c"> <Filter>src\core\iomgr</Filter> </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c"> + <Filter>src\core\iomgr</Filter> + </ClCompile> <ClCompile Include="..\..\src\core\iomgr\fd_posix.c"> <Filter>src\core\iomgr</Filter> </ClCompile> @@ -160,6 +163,9 @@ <ClCompile Include="..\..\src\core\json\json_writer.c"> <Filter>src\core\json</Filter> </ClCompile> + <ClCompile Include="..\..\src\core\profiling\timers.c"> + <Filter>src\core\profiling</Filter> + </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_init.c"> <Filter>src\core\statistics</Filter> </ClCompile> @@ -458,6 +464,12 @@ <ClInclude Include="..\..\src\core\json\json_writer.h"> <Filter>src\core\json</Filter> </ClInclude> + <ClInclude Include="..\..\src\core\profiling\timers.h"> + <Filter>src\core\profiling</Filter> + </ClInclude> + <ClInclude Include="..\..\src\core\profiling\timers_preciseclock.h"> + <Filter>src\core\profiling</Filter> + </ClInclude> <ClInclude Include="..\..\src\core\statistics\census_interface.h"> <Filter>src\core\statistics</Filter> </ClInclude> @@ -602,6 +614,9 @@ <Filter Include="src\core\json"> <UniqueIdentifier>{443ffc61-1bea-2477-6e54-1ddf8c139264}</UniqueIdentifier> </Filter> + <Filter Include="src\core\profiling"> + <UniqueIdentifier>{7f91d9bf-c9de-835a-d74d-b16f843b89a9}</UniqueIdentifier> + </Filter> <Filter Include="src\core\statistics"> <UniqueIdentifier>{e084164c-a069-00e3-db35-4e0b1cd6f0b7}</UniqueIdentifier> </Filter> diff --git a/vsprojects/vs2013/Grpc.mak b/vsprojects/vs2013/Grpc.mak index 727aa37781..1a96a2f3f8 100644 --- a/vsprojects/vs2013/Grpc.mak +++ b/vsprojects/vs2013/Grpc.mak @@ -53,16 +53,15 @@ grpc_test_util: $(OUT_DIR): mkdir $(OUT_DIR) -buildtests: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stats_store_test.exe census_stub_test.exe census_trace_store_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe chttp2_transport_end2end_test.exe dualstack_socket_test.exe echo_test.exe fd_posix_test.exe fling_stream_test.exe fling_test.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe transport_metadata_test.exe transport_security_test.exe - echo All tests built. +buildtests: buildtests_c buildtests_cxx -test: alarm_heap_test alarm_list_test alarm_test alpn_test bin_encoder_test census_hash_table_test census_statistics_multiple_writers_circular_buffer_test census_statistics_multiple_writers_test census_statistics_performance_test census_statistics_quick_test census_statistics_small_log_test census_stats_store_test census_stub_test census_trace_store_test census_window_stats_test chttp2_status_conversion_test chttp2_stream_encoder_test chttp2_stream_map_test chttp2_transport_end2end_test dualstack_socket_test echo_test fd_posix_test fling_stream_test fling_test gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test grpc_base64_test grpc_byte_buffer_reader_test grpc_channel_stack_test grpc_completion_queue_test grpc_credentials_test grpc_json_token_test grpc_stream_op_test hpack_parser_test hpack_table_test httpcli_format_request_test httpcli_parser_test httpcli_test json_rewrite_test json_test lame_client_test message_compress_test metadata_buffer_test multi_init_test murmur_hash_test no_server_test poll_kick_posix_test resolve_address_test secure_endpoint_test sockaddr_utils_test tcp_client_posix_test tcp_posix_test tcp_server_posix_test time_averaged_stats_test time_test timeout_encoding_test transport_metadata_test transport_security_test - echo All tests ran. +buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe census_hash_table_test.exe census_statistics_multiple_writers_circular_buffer_test.exe census_statistics_multiple_writers_test.exe census_statistics_performance_test.exe census_statistics_quick_test.exe census_statistics_small_log_test.exe census_stub_test.exe census_window_stats_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe chttp2_transport_end2end_test.exe echo_client.exe echo_server.exe echo_test.exe fd_posix_test.exe fling_client.exe fling_server.exe fling_stream_test.exe fling_test.exe gpr_cancellable_test.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe httpcli_test.exe json_rewrite.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe metadata_buffer_test.exe multi_init_test.exe murmur_hash_test.exe no_server_test.exe poll_kick_posix_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe tcp_client_posix_test.exe tcp_posix_test.exe tcp_server_posix_test.exe time_averaged_stats_test.exe time_test.exe timeout_encoding_test.exe timers_test.exe transport_metadata_test.exe transport_security_test.exe + echo All tests built. -test_gpr: gpr_cancellable_test gpr_cmdline_test gpr_env_test gpr_file_test gpr_histogram_test gpr_host_port_test gpr_log_test gpr_slice_buffer_test gpr_slice_test gpr_string_test gpr_sync_test gpr_thd_test gpr_time_test gpr_tls_test gpr_useful_test - echo All tests ran. +buildtests_cxx: + echo All tests built. -alarm_heap_test.exe: grpc_test_util +alarm_heap_test.exe: grpc_test_util $(OUT_DIR) echo Building alarm_heap_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\alarm_heap_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alarm_heap_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alarm_heap_test.obj @@ -70,7 +69,7 @@ alarm_heap_test: alarm_heap_test.exe echo Running alarm_heap_test $(OUT_DIR)\alarm_heap_test.exe -alarm_list_test.exe: grpc_test_util +alarm_list_test.exe: grpc_test_util $(OUT_DIR) echo Building alarm_list_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\alarm_list_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alarm_list_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alarm_list_test.obj @@ -78,7 +77,7 @@ alarm_list_test: alarm_list_test.exe echo Running alarm_list_test $(OUT_DIR)\alarm_list_test.exe -alarm_test.exe: grpc_test_util +alarm_test.exe: grpc_test_util $(OUT_DIR) echo Building alarm_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\alarm_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alarm_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alarm_test.obj @@ -86,7 +85,7 @@ alarm_test: alarm_test.exe echo Running alarm_test $(OUT_DIR)\alarm_test.exe -alpn_test.exe: grpc_test_util +alpn_test.exe: grpc_test_util $(OUT_DIR) echo Building alpn_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\alpn_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\alpn_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\alpn_test.obj @@ -94,7 +93,7 @@ alpn_test: alpn_test.exe echo Running alpn_test $(OUT_DIR)\alpn_test.exe -bin_encoder_test.exe: grpc_test_util +bin_encoder_test.exe: grpc_test_util $(OUT_DIR) echo Building bin_encoder_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\bin_encoder_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\bin_encoder_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\bin_encoder_test.obj @@ -102,7 +101,7 @@ bin_encoder_test: bin_encoder_test.exe echo Running bin_encoder_test $(OUT_DIR)\bin_encoder_test.exe -census_hash_table_test.exe: grpc_test_util +census_hash_table_test.exe: grpc_test_util $(OUT_DIR) echo Building census_hash_table_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\hash_table_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_hash_table_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\hash_table_test.obj @@ -110,7 +109,7 @@ census_hash_table_test: census_hash_table_test.exe echo Running census_hash_table_test $(OUT_DIR)\census_hash_table_test.exe -census_statistics_multiple_writers_circular_buffer_test.exe: grpc_test_util +census_statistics_multiple_writers_circular_buffer_test.exe: grpc_test_util $(OUT_DIR) echo Building census_statistics_multiple_writers_circular_buffer_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\multiple_writers_circular_buffer_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_multiple_writers_circular_buffer_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\multiple_writers_circular_buffer_test.obj @@ -118,7 +117,7 @@ census_statistics_multiple_writers_circular_buffer_test: census_statistics_multi echo Running census_statistics_multiple_writers_circular_buffer_test $(OUT_DIR)\census_statistics_multiple_writers_circular_buffer_test.exe -census_statistics_multiple_writers_test.exe: grpc_test_util +census_statistics_multiple_writers_test.exe: grpc_test_util $(OUT_DIR) echo Building census_statistics_multiple_writers_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\multiple_writers_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_multiple_writers_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\multiple_writers_test.obj @@ -126,7 +125,7 @@ census_statistics_multiple_writers_test: census_statistics_multiple_writers_test echo Running census_statistics_multiple_writers_test $(OUT_DIR)\census_statistics_multiple_writers_test.exe -census_statistics_performance_test.exe: grpc_test_util +census_statistics_performance_test.exe: grpc_test_util $(OUT_DIR) echo Building census_statistics_performance_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\performance_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_performance_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\performance_test.obj @@ -134,7 +133,7 @@ census_statistics_performance_test: census_statistics_performance_test.exe echo Running census_statistics_performance_test $(OUT_DIR)\census_statistics_performance_test.exe -census_statistics_quick_test.exe: grpc_test_util +census_statistics_quick_test.exe: grpc_test_util $(OUT_DIR) echo Building census_statistics_quick_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\quick_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_quick_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\quick_test.obj @@ -142,7 +141,7 @@ census_statistics_quick_test: census_statistics_quick_test.exe echo Running census_statistics_quick_test $(OUT_DIR)\census_statistics_quick_test.exe -census_statistics_small_log_test.exe: grpc_test_util +census_statistics_small_log_test.exe: grpc_test_util $(OUT_DIR) echo Building census_statistics_small_log_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\small_log_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_statistics_small_log_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\small_log_test.obj @@ -150,7 +149,7 @@ census_statistics_small_log_test: census_statistics_small_log_test.exe echo Running census_statistics_small_log_test $(OUT_DIR)\census_statistics_small_log_test.exe -census_stats_store_test.exe: grpc_test_util +census_stats_store_test.exe: grpc_test_util $(OUT_DIR) echo Building census_stats_store_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\rpc_stats_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_stats_store_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\rpc_stats_test.obj @@ -158,7 +157,7 @@ census_stats_store_test: census_stats_store_test.exe echo Running census_stats_store_test $(OUT_DIR)\census_stats_store_test.exe -census_stub_test.exe: grpc_test_util +census_stub_test.exe: grpc_test_util $(OUT_DIR) echo Building census_stub_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\census_stub_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_stub_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\census_stub_test.obj @@ -166,7 +165,7 @@ census_stub_test: census_stub_test.exe echo Running census_stub_test $(OUT_DIR)\census_stub_test.exe -census_trace_store_test.exe: grpc_test_util +census_trace_store_test.exe: grpc_test_util $(OUT_DIR) echo Building census_trace_store_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\trace_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_trace_store_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\trace_test.obj @@ -174,7 +173,7 @@ census_trace_store_test: census_trace_store_test.exe echo Running census_trace_store_test $(OUT_DIR)\census_trace_store_test.exe -census_window_stats_test.exe: grpc_test_util +census_window_stats_test.exe: grpc_test_util $(OUT_DIR) echo Building census_window_stats_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\statistics\window_stats_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\census_window_stats_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\window_stats_test.obj @@ -182,7 +181,7 @@ census_window_stats_test: census_window_stats_test.exe echo Running census_window_stats_test $(OUT_DIR)\census_window_stats_test.exe -chttp2_status_conversion_test.exe: grpc_test_util +chttp2_status_conversion_test.exe: grpc_test_util $(OUT_DIR) echo Building chttp2_status_conversion_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\status_conversion_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_status_conversion_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\status_conversion_test.obj @@ -190,7 +189,7 @@ chttp2_status_conversion_test: chttp2_status_conversion_test.exe echo Running chttp2_status_conversion_test $(OUT_DIR)\chttp2_status_conversion_test.exe -chttp2_stream_encoder_test.exe: grpc_test_util +chttp2_stream_encoder_test.exe: grpc_test_util $(OUT_DIR) echo Building chttp2_stream_encoder_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\stream_encoder_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_stream_encoder_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\stream_encoder_test.obj @@ -198,7 +197,7 @@ chttp2_stream_encoder_test: chttp2_stream_encoder_test.exe echo Running chttp2_stream_encoder_test $(OUT_DIR)\chttp2_stream_encoder_test.exe -chttp2_stream_map_test.exe: grpc_test_util +chttp2_stream_map_test.exe: grpc_test_util $(OUT_DIR) echo Building chttp2_stream_map_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\stream_map_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_stream_map_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\stream_map_test.obj @@ -206,7 +205,7 @@ chttp2_stream_map_test: chttp2_stream_map_test.exe echo Running chttp2_stream_map_test $(OUT_DIR)\chttp2_stream_map_test.exe -chttp2_transport_end2end_test.exe: grpc_test_util +chttp2_transport_end2end_test.exe: grpc_test_util $(OUT_DIR) echo Building chttp2_transport_end2end_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2_transport_end2end_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\chttp2_transport_end2end_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\chttp2_transport_end2end_test.obj @@ -214,15 +213,7 @@ chttp2_transport_end2end_test: chttp2_transport_end2end_test.exe echo Running chttp2_transport_end2end_test $(OUT_DIR)\chttp2_transport_end2end_test.exe -dualstack_socket_test.exe: grpc_test_util - echo Building dualstack_socket_test - $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\end2end\dualstack_socket_test.c - $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\dualstack_socket_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\dualstack_socket_test.obj -dualstack_socket_test: dualstack_socket_test.exe - echo Running dualstack_socket_test - $(OUT_DIR)\dualstack_socket_test.exe - -echo_client.exe: grpc_test_util +echo_client.exe: grpc_test_util $(OUT_DIR) echo Building echo_client $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\echo\client.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\echo_client.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\client.obj @@ -230,7 +221,7 @@ echo_client: echo_client.exe echo Running echo_client $(OUT_DIR)\echo_client.exe -echo_server.exe: grpc_test_util +echo_server.exe: grpc_test_util $(OUT_DIR) echo Building echo_server $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\echo\server.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\echo_server.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\server.obj @@ -238,7 +229,7 @@ echo_server: echo_server.exe echo Running echo_server $(OUT_DIR)\echo_server.exe -echo_test.exe: grpc_test_util +echo_test.exe: grpc_test_util $(OUT_DIR) echo Building echo_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\echo\echo_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\echo_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\echo_test.obj @@ -246,7 +237,7 @@ echo_test: echo_test.exe echo Running echo_test $(OUT_DIR)\echo_test.exe -fd_posix_test.exe: grpc_test_util +fd_posix_test.exe: grpc_test_util $(OUT_DIR) echo Building fd_posix_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\fd_posix_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fd_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fd_posix_test.obj @@ -254,7 +245,7 @@ fd_posix_test: fd_posix_test.exe echo Running fd_posix_test $(OUT_DIR)\fd_posix_test.exe -fling_client.exe: grpc_test_util +fling_client.exe: grpc_test_util $(OUT_DIR) echo Building fling_client $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\client.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_client.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\client.obj @@ -262,7 +253,7 @@ fling_client: fling_client.exe echo Running fling_client $(OUT_DIR)\fling_client.exe -fling_server.exe: grpc_test_util +fling_server.exe: grpc_test_util $(OUT_DIR) echo Building fling_server $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\server.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_server.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\server.obj @@ -270,7 +261,7 @@ fling_server: fling_server.exe echo Running fling_server $(OUT_DIR)\fling_server.exe -fling_stream_test.exe: grpc_test_util +fling_stream_test.exe: grpc_test_util $(OUT_DIR) echo Building fling_stream_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\fling_stream_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_stream_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fling_stream_test.obj @@ -278,7 +269,7 @@ fling_stream_test: fling_stream_test.exe echo Running fling_stream_test $(OUT_DIR)\fling_stream_test.exe -fling_test.exe: grpc_test_util +fling_test.exe: grpc_test_util $(OUT_DIR) echo Building fling_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\fling\fling_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fling_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fling_test.obj @@ -286,7 +277,7 @@ fling_test: fling_test.exe echo Running fling_test $(OUT_DIR)\fling_test.exe -gen_hpack_tables.exe: grpc_test_util +gen_hpack_tables.exe: grpc_test_util $(OUT_DIR) echo Building gen_hpack_tables $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\src\core\transport\chttp2\gen_hpack_tables.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gen_hpack_tables.exe" Debug\grpc_test_util.lib Debug\gpr.lib Debug\grpc.lib $(LIBS) $(OUT_DIR)\gen_hpack_tables.obj @@ -294,7 +285,7 @@ gen_hpack_tables: gen_hpack_tables.exe echo Running gen_hpack_tables $(OUT_DIR)\gen_hpack_tables.exe -gpr_cancellable_test.exe: grpc_test_util +gpr_cancellable_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_cancellable_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\cancellable_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_cancellable_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\cancellable_test.obj @@ -302,7 +293,7 @@ gpr_cancellable_test: gpr_cancellable_test.exe echo Running gpr_cancellable_test $(OUT_DIR)\gpr_cancellable_test.exe -gpr_cmdline_test.exe: grpc_test_util +gpr_cmdline_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_cmdline_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\cmdline_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_cmdline_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\cmdline_test.obj @@ -310,7 +301,7 @@ gpr_cmdline_test: gpr_cmdline_test.exe echo Running gpr_cmdline_test $(OUT_DIR)\gpr_cmdline_test.exe -gpr_env_test.exe: grpc_test_util +gpr_env_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_env_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\env_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_env_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\env_test.obj @@ -318,7 +309,7 @@ gpr_env_test: gpr_env_test.exe echo Running gpr_env_test $(OUT_DIR)\gpr_env_test.exe -gpr_file_test.exe: grpc_test_util +gpr_file_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_file_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\file_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_file_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\file_test.obj @@ -326,7 +317,7 @@ gpr_file_test: gpr_file_test.exe echo Running gpr_file_test $(OUT_DIR)\gpr_file_test.exe -gpr_histogram_test.exe: grpc_test_util +gpr_histogram_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_histogram_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\histogram_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_histogram_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\histogram_test.obj @@ -334,7 +325,7 @@ gpr_histogram_test: gpr_histogram_test.exe echo Running gpr_histogram_test $(OUT_DIR)\gpr_histogram_test.exe -gpr_host_port_test.exe: grpc_test_util +gpr_host_port_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_host_port_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\host_port_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_host_port_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\host_port_test.obj @@ -342,7 +333,7 @@ gpr_host_port_test: gpr_host_port_test.exe echo Running gpr_host_port_test $(OUT_DIR)\gpr_host_port_test.exe -gpr_log_test.exe: grpc_test_util +gpr_log_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_log_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\log_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_log_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\log_test.obj @@ -350,7 +341,7 @@ gpr_log_test: gpr_log_test.exe echo Running gpr_log_test $(OUT_DIR)\gpr_log_test.exe -gpr_slice_buffer_test.exe: grpc_test_util +gpr_slice_buffer_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_slice_buffer_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\slice_buffer_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_slice_buffer_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\slice_buffer_test.obj @@ -358,7 +349,7 @@ gpr_slice_buffer_test: gpr_slice_buffer_test.exe echo Running gpr_slice_buffer_test $(OUT_DIR)\gpr_slice_buffer_test.exe -gpr_slice_test.exe: grpc_test_util +gpr_slice_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_slice_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\slice_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_slice_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\slice_test.obj @@ -366,7 +357,7 @@ gpr_slice_test: gpr_slice_test.exe echo Running gpr_slice_test $(OUT_DIR)\gpr_slice_test.exe -gpr_string_test.exe: grpc_test_util +gpr_string_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_string_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\string_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_string_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\string_test.obj @@ -374,7 +365,7 @@ gpr_string_test: gpr_string_test.exe echo Running gpr_string_test $(OUT_DIR)\gpr_string_test.exe -gpr_sync_test.exe: grpc_test_util +gpr_sync_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_sync_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\sync_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_sync_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\sync_test.obj @@ -382,7 +373,7 @@ gpr_sync_test: gpr_sync_test.exe echo Running gpr_sync_test $(OUT_DIR)\gpr_sync_test.exe -gpr_thd_test.exe: grpc_test_util +gpr_thd_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_thd_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\thd_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_thd_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\thd_test.obj @@ -390,7 +381,7 @@ gpr_thd_test: gpr_thd_test.exe echo Running gpr_thd_test $(OUT_DIR)\gpr_thd_test.exe -gpr_time_test.exe: grpc_test_util +gpr_time_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_time_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\time_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_time_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\time_test.obj @@ -398,7 +389,7 @@ gpr_time_test: gpr_time_test.exe echo Running gpr_time_test $(OUT_DIR)\gpr_time_test.exe -gpr_tls_test.exe: grpc_test_util +gpr_tls_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_tls_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\tls_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_tls_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tls_test.obj @@ -406,7 +397,7 @@ gpr_tls_test: gpr_tls_test.exe echo Running gpr_tls_test $(OUT_DIR)\gpr_tls_test.exe -gpr_useful_test.exe: grpc_test_util +gpr_useful_test.exe: grpc_test_util $(OUT_DIR) echo Building gpr_useful_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\useful_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gpr_useful_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\useful_test.obj @@ -414,7 +405,7 @@ gpr_useful_test: gpr_useful_test.exe echo Running gpr_useful_test $(OUT_DIR)\gpr_useful_test.exe -grpc_base64_test.exe: grpc_test_util +grpc_base64_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_base64_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\base64_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_base64_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\base64_test.obj @@ -422,7 +413,7 @@ grpc_base64_test: grpc_base64_test.exe echo Running grpc_base64_test $(OUT_DIR)\grpc_base64_test.exe -grpc_byte_buffer_reader_test.exe: grpc_test_util +grpc_byte_buffer_reader_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_byte_buffer_reader_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\byte_buffer_reader_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_byte_buffer_reader_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\byte_buffer_reader_test.obj @@ -430,7 +421,7 @@ grpc_byte_buffer_reader_test: grpc_byte_buffer_reader_test.exe echo Running grpc_byte_buffer_reader_test $(OUT_DIR)\grpc_byte_buffer_reader_test.exe -grpc_channel_stack_test.exe: grpc_test_util +grpc_channel_stack_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_channel_stack_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\channel\channel_stack_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_channel_stack_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\channel_stack_test.obj @@ -438,7 +429,7 @@ grpc_channel_stack_test: grpc_channel_stack_test.exe echo Running grpc_channel_stack_test $(OUT_DIR)\grpc_channel_stack_test.exe -grpc_completion_queue_benchmark.exe: grpc_test_util +grpc_completion_queue_benchmark.exe: grpc_test_util $(OUT_DIR) echo Building grpc_completion_queue_benchmark $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\completion_queue_benchmark.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_completion_queue_benchmark.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\completion_queue_benchmark.obj @@ -446,7 +437,7 @@ grpc_completion_queue_benchmark: grpc_completion_queue_benchmark.exe echo Running grpc_completion_queue_benchmark $(OUT_DIR)\grpc_completion_queue_benchmark.exe -grpc_completion_queue_test.exe: grpc_test_util +grpc_completion_queue_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_completion_queue_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\completion_queue_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_completion_queue_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\completion_queue_test.obj @@ -454,7 +445,7 @@ grpc_completion_queue_test: grpc_completion_queue_test.exe echo Running grpc_completion_queue_test $(OUT_DIR)\grpc_completion_queue_test.exe -grpc_create_jwt.exe: grpc_test_util +grpc_create_jwt.exe: grpc_test_util $(OUT_DIR) echo Building grpc_create_jwt $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\create_jwt.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_create_jwt.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\create_jwt.obj @@ -462,7 +453,7 @@ grpc_create_jwt: grpc_create_jwt.exe echo Running grpc_create_jwt $(OUT_DIR)\grpc_create_jwt.exe -grpc_credentials_test.exe: grpc_test_util +grpc_credentials_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_credentials_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\credentials_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_credentials_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\credentials_test.obj @@ -470,7 +461,7 @@ grpc_credentials_test: grpc_credentials_test.exe echo Running grpc_credentials_test $(OUT_DIR)\grpc_credentials_test.exe -grpc_fetch_oauth2.exe: grpc_test_util +grpc_fetch_oauth2.exe: grpc_test_util $(OUT_DIR) echo Building grpc_fetch_oauth2 $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\fetch_oauth2.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_fetch_oauth2.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\fetch_oauth2.obj @@ -478,7 +469,7 @@ grpc_fetch_oauth2: grpc_fetch_oauth2.exe echo Running grpc_fetch_oauth2 $(OUT_DIR)\grpc_fetch_oauth2.exe -grpc_json_token_test.exe: grpc_test_util +grpc_json_token_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_json_token_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\json_token_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_json_token_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_token_test.obj @@ -486,7 +477,7 @@ grpc_json_token_test: grpc_json_token_test.exe echo Running grpc_json_token_test $(OUT_DIR)\grpc_json_token_test.exe -grpc_print_google_default_creds_token.exe: grpc_test_util +grpc_print_google_default_creds_token.exe: grpc_test_util $(OUT_DIR) echo Building grpc_print_google_default_creds_token $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\print_google_default_creds_token.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_print_google_default_creds_token.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\print_google_default_creds_token.obj @@ -494,7 +485,7 @@ grpc_print_google_default_creds_token: grpc_print_google_default_creds_token.exe echo Running grpc_print_google_default_creds_token $(OUT_DIR)\grpc_print_google_default_creds_token.exe -grpc_stream_op_test.exe: grpc_test_util +grpc_stream_op_test.exe: grpc_test_util $(OUT_DIR) echo Building grpc_stream_op_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\stream_op_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_stream_op_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\stream_op_test.obj @@ -502,7 +493,7 @@ grpc_stream_op_test: grpc_stream_op_test.exe echo Running grpc_stream_op_test $(OUT_DIR)\grpc_stream_op_test.exe -hpack_parser_test.exe: grpc_test_util +hpack_parser_test.exe: grpc_test_util $(OUT_DIR) echo Building hpack_parser_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\hpack_parser_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\hpack_parser_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\hpack_parser_test.obj @@ -510,7 +501,7 @@ hpack_parser_test: hpack_parser_test.exe echo Running hpack_parser_test $(OUT_DIR)\hpack_parser_test.exe -hpack_table_test.exe: grpc_test_util +hpack_table_test.exe: grpc_test_util $(OUT_DIR) echo Building hpack_table_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\hpack_table_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\hpack_table_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\hpack_table_test.obj @@ -518,7 +509,7 @@ hpack_table_test: hpack_table_test.exe echo Running hpack_table_test $(OUT_DIR)\hpack_table_test.exe -httpcli_format_request_test.exe: grpc_test_util +httpcli_format_request_test.exe: grpc_test_util $(OUT_DIR) echo Building httpcli_format_request_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\httpcli\format_request_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\httpcli_format_request_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\format_request_test.obj @@ -526,7 +517,7 @@ httpcli_format_request_test: httpcli_format_request_test.exe echo Running httpcli_format_request_test $(OUT_DIR)\httpcli_format_request_test.exe -httpcli_parser_test.exe: grpc_test_util +httpcli_parser_test.exe: grpc_test_util $(OUT_DIR) echo Building httpcli_parser_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\httpcli\parser_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\httpcli_parser_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\parser_test.obj @@ -534,7 +525,7 @@ httpcli_parser_test: httpcli_parser_test.exe echo Running httpcli_parser_test $(OUT_DIR)\httpcli_parser_test.exe -httpcli_test.exe: grpc_test_util +httpcli_test.exe: grpc_test_util $(OUT_DIR) echo Building httpcli_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\httpcli\httpcli_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\httpcli_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\httpcli_test.obj @@ -542,7 +533,7 @@ httpcli_test: httpcli_test.exe echo Running httpcli_test $(OUT_DIR)\httpcli_test.exe -json_rewrite.exe: grpc_test_util +json_rewrite.exe: grpc_test_util $(OUT_DIR) echo Building json_rewrite $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\json\json_rewrite.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\json_rewrite.exe" Debug\grpc.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_rewrite.obj @@ -550,7 +541,7 @@ json_rewrite: json_rewrite.exe echo Running json_rewrite $(OUT_DIR)\json_rewrite.exe -json_rewrite_test.exe: grpc_test_util +json_rewrite_test.exe: grpc_test_util $(OUT_DIR) echo Building json_rewrite_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\json\json_rewrite_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\json_rewrite_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_rewrite_test.obj @@ -558,7 +549,7 @@ json_rewrite_test: json_rewrite_test.exe echo Running json_rewrite_test $(OUT_DIR)\json_rewrite_test.exe -json_test.exe: grpc_test_util +json_test.exe: grpc_test_util $(OUT_DIR) echo Building json_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\json\json_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\json_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\json_test.obj @@ -566,7 +557,7 @@ json_test: json_test.exe echo Running json_test $(OUT_DIR)\json_test.exe -lame_client_test.exe: grpc_test_util +lame_client_test.exe: grpc_test_util $(OUT_DIR) echo Building lame_client_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\lame_client_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\lame_client_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\lame_client_test.obj @@ -574,7 +565,7 @@ lame_client_test: lame_client_test.exe echo Running lame_client_test $(OUT_DIR)\lame_client_test.exe -low_level_ping_pong_benchmark.exe: grpc_test_util +low_level_ping_pong_benchmark.exe: grpc_test_util $(OUT_DIR) echo Building low_level_ping_pong_benchmark $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\network_benchmarks\low_level_ping_pong.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\low_level_ping_pong_benchmark.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\low_level_ping_pong.obj @@ -582,7 +573,7 @@ low_level_ping_pong_benchmark: low_level_ping_pong_benchmark.exe echo Running low_level_ping_pong_benchmark $(OUT_DIR)\low_level_ping_pong_benchmark.exe -message_compress_test.exe: grpc_test_util +message_compress_test.exe: grpc_test_util $(OUT_DIR) echo Building message_compress_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\compression\message_compress_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\message_compress_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\message_compress_test.obj @@ -590,7 +581,7 @@ message_compress_test: message_compress_test.exe echo Running message_compress_test $(OUT_DIR)\message_compress_test.exe -metadata_buffer_test.exe: grpc_test_util +metadata_buffer_test.exe: grpc_test_util $(OUT_DIR) echo Building metadata_buffer_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\channel\metadata_buffer_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\metadata_buffer_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\metadata_buffer_test.obj @@ -598,7 +589,7 @@ metadata_buffer_test: metadata_buffer_test.exe echo Running metadata_buffer_test $(OUT_DIR)\metadata_buffer_test.exe -multi_init_test.exe: grpc_test_util +multi_init_test.exe: grpc_test_util $(OUT_DIR) echo Building multi_init_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\surface\multi_init_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\multi_init_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\multi_init_test.obj @@ -606,7 +597,7 @@ multi_init_test: multi_init_test.exe echo Running multi_init_test $(OUT_DIR)\multi_init_test.exe -murmur_hash_test.exe: grpc_test_util +murmur_hash_test.exe: grpc_test_util $(OUT_DIR) echo Building murmur_hash_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\murmur_hash_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\murmur_hash_test.exe" Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\murmur_hash_test.obj @@ -614,7 +605,7 @@ murmur_hash_test: murmur_hash_test.exe echo Running murmur_hash_test $(OUT_DIR)\murmur_hash_test.exe -no_server_test.exe: grpc_test_util +no_server_test.exe: grpc_test_util $(OUT_DIR) echo Building no_server_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\end2end\no_server_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\no_server_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\no_server_test.obj @@ -622,7 +613,7 @@ no_server_test: no_server_test.exe echo Running no_server_test $(OUT_DIR)\no_server_test.exe -poll_kick_posix_test.exe: grpc_test_util +poll_kick_posix_test.exe: grpc_test_util $(OUT_DIR) echo Building poll_kick_posix_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\poll_kick_posix_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\poll_kick_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\poll_kick_posix_test.obj @@ -630,7 +621,7 @@ poll_kick_posix_test: poll_kick_posix_test.exe echo Running poll_kick_posix_test $(OUT_DIR)\poll_kick_posix_test.exe -resolve_address_test.exe: grpc_test_util +resolve_address_test.exe: grpc_test_util $(OUT_DIR) echo Building resolve_address_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\resolve_address_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\resolve_address_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\resolve_address_test.obj @@ -638,7 +629,7 @@ resolve_address_test: resolve_address_test.exe echo Running resolve_address_test $(OUT_DIR)\resolve_address_test.exe -secure_endpoint_test.exe: grpc_test_util +secure_endpoint_test.exe: grpc_test_util $(OUT_DIR) echo Building secure_endpoint_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\secure_endpoint_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\secure_endpoint_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\secure_endpoint_test.obj @@ -646,7 +637,7 @@ secure_endpoint_test: secure_endpoint_test.exe echo Running secure_endpoint_test $(OUT_DIR)\secure_endpoint_test.exe -sockaddr_utils_test.exe: grpc_test_util +sockaddr_utils_test.exe: grpc_test_util $(OUT_DIR) echo Building sockaddr_utils_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\sockaddr_utils_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\sockaddr_utils_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\sockaddr_utils_test.obj @@ -654,7 +645,7 @@ sockaddr_utils_test: sockaddr_utils_test.exe echo Running sockaddr_utils_test $(OUT_DIR)\sockaddr_utils_test.exe -tcp_client_posix_test.exe: grpc_test_util +tcp_client_posix_test.exe: grpc_test_util $(OUT_DIR) echo Building tcp_client_posix_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\tcp_client_posix_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\tcp_client_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tcp_client_posix_test.obj @@ -662,7 +653,7 @@ tcp_client_posix_test: tcp_client_posix_test.exe echo Running tcp_client_posix_test $(OUT_DIR)\tcp_client_posix_test.exe -tcp_posix_test.exe: grpc_test_util +tcp_posix_test.exe: grpc_test_util $(OUT_DIR) echo Building tcp_posix_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\tcp_posix_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\tcp_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tcp_posix_test.obj @@ -670,7 +661,7 @@ tcp_posix_test: tcp_posix_test.exe echo Running tcp_posix_test $(OUT_DIR)\tcp_posix_test.exe -tcp_server_posix_test.exe: grpc_test_util +tcp_server_posix_test.exe: grpc_test_util $(OUT_DIR) echo Building tcp_server_posix_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\tcp_server_posix_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\tcp_server_posix_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\tcp_server_posix_test.obj @@ -678,7 +669,7 @@ tcp_server_posix_test: tcp_server_posix_test.exe echo Running tcp_server_posix_test $(OUT_DIR)\tcp_server_posix_test.exe -time_averaged_stats_test.exe: grpc_test_util +time_averaged_stats_test.exe: grpc_test_util $(OUT_DIR) echo Building time_averaged_stats_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\iomgr\time_averaged_stats_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\time_averaged_stats_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\time_averaged_stats_test.obj @@ -686,7 +677,7 @@ time_averaged_stats_test: time_averaged_stats_test.exe echo Running time_averaged_stats_test $(OUT_DIR)\time_averaged_stats_test.exe -time_test.exe: grpc_test_util +time_test.exe: grpc_test_util $(OUT_DIR) echo Building time_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\support\time_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\time_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\time_test.obj @@ -694,7 +685,7 @@ time_test: time_test.exe echo Running time_test $(OUT_DIR)\time_test.exe -timeout_encoding_test.exe: grpc_test_util +timeout_encoding_test.exe: grpc_test_util $(OUT_DIR) echo Building timeout_encoding_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\chttp2\timeout_encoding_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\timeout_encoding_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\timeout_encoding_test.obj @@ -702,7 +693,15 @@ timeout_encoding_test: timeout_encoding_test.exe echo Running timeout_encoding_test $(OUT_DIR)\timeout_encoding_test.exe -transport_metadata_test.exe: grpc_test_util +timers_test.exe: grpc_test_util $(OUT_DIR) + echo Building timers_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\profiling\timers_test.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\timers_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\timers_test.obj +timers_test: timers_test.exe + echo Running timers_test + $(OUT_DIR)\timers_test.exe + +transport_metadata_test.exe: grpc_test_util $(OUT_DIR) echo Building transport_metadata_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\transport\metadata_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\transport_metadata_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\metadata_test.obj @@ -710,7 +709,7 @@ transport_metadata_test: transport_metadata_test.exe echo Running transport_metadata_test $(OUT_DIR)\transport_metadata_test.exe -transport_security_test.exe: grpc_test_util +transport_security_test.exe: grpc_test_util $(OUT_DIR) echo Building transport_security_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\tsi\transport_security_test.c $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\transport_security_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\transport_security_test.obj diff --git a/vsprojects/vs2013/grpc.vcxproj b/vsprojects/vs2013/grpc.vcxproj index a88eb34ab8..4c7f0fad2e 100644 --- a/vsprojects/vs2013/grpc.vcxproj +++ b/vsprojects/vs2013/grpc.vcxproj @@ -150,6 +150,8 @@ <ClInclude Include="..\..\src\core\json\json_common.h" /> <ClInclude Include="..\..\src\core\json\json_reader.h" /> <ClInclude Include="..\..\src\core\json\json_writer.h" /> + <ClInclude Include="..\..\src\core\profiling\timers.h" /> + <ClInclude Include="..\..\src\core\profiling\timers_preciseclock.h" /> <ClInclude Include="..\..\src\core\statistics\census_interface.h" /> <ClInclude Include="..\..\src\core\statistics\census_log.h" /> <ClInclude Include="..\..\src\core\statistics\census_rpc_stats.h" /> @@ -272,6 +274,8 @@ </ClCompile> <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c"> </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c"> + </ClCompile> <ClCompile Include="..\..\src\core\iomgr\fd_posix.c"> </ClCompile> <ClCompile Include="..\..\src\core\iomgr\iocp_windows.c"> @@ -336,6 +340,8 @@ </ClCompile> <ClCompile Include="..\..\src\core\json\json_writer.c"> </ClCompile> + <ClCompile Include="..\..\src\core\profiling\timers.c"> + </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_init.c"> </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_log.c"> diff --git a/vsprojects/vs2013/grpc.vcxproj.filters b/vsprojects/vs2013/grpc.vcxproj.filters index 20dbe8c444..7774a78040 100644 --- a/vsprojects/vs2013/grpc.vcxproj.filters +++ b/vsprojects/vs2013/grpc.vcxproj.filters @@ -124,6 +124,9 @@ <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c"> <Filter>src\core\iomgr</Filter> </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c"> + <Filter>src\core\iomgr</Filter> + </ClCompile> <ClCompile Include="..\..\src\core\iomgr\fd_posix.c"> <Filter>src\core\iomgr</Filter> </ClCompile> @@ -220,6 +223,9 @@ <ClCompile Include="..\..\src\core\json\json_writer.c"> <Filter>src\core\json</Filter> </ClCompile> + <ClCompile Include="..\..\src\core\profiling\timers.c"> + <Filter>src\core\profiling</Filter> + </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_init.c"> <Filter>src\core\statistics</Filter> </ClCompile> @@ -566,6 +572,12 @@ <ClInclude Include="..\..\src\core\json\json_writer.h"> <Filter>src\core\json</Filter> </ClInclude> + <ClInclude Include="..\..\src\core\profiling\timers.h"> + <Filter>src\core\profiling</Filter> + </ClInclude> + <ClInclude Include="..\..\src\core\profiling\timers_preciseclock.h"> + <Filter>src\core\profiling</Filter> + </ClInclude> <ClInclude Include="..\..\src\core\statistics\census_interface.h"> <Filter>src\core\statistics</Filter> </ClInclude> @@ -713,6 +725,9 @@ <Filter Include="src\core\json"> <UniqueIdentifier>{e665cc0e-b994-d7c5-cc18-2007392019f0}</UniqueIdentifier> </Filter> + <Filter Include="src\core\profiling"> + <UniqueIdentifier>{87674b72-0f05-0469-481a-bd8c7af9ad80}</UniqueIdentifier> + </Filter> <Filter Include="src\core\security"> <UniqueIdentifier>{1d850ac6-e639-4eab-5338-4ba40272fcc9}</UniqueIdentifier> </Filter> diff --git a/vsprojects/vs2013/grpc_test_util.vcxproj b/vsprojects/vs2013/grpc_test_util.vcxproj index 4756f53928..d25fd7cbf1 100644 --- a/vsprojects/vs2013/grpc_test_util.vcxproj +++ b/vsprojects/vs2013/grpc_test_util.vcxproj @@ -98,6 +98,8 @@ </ClCompile> <ClCompile Include="..\..\test\core\util\port_posix.c"> </ClCompile> + <ClCompile Include="..\..\test\core\util\port_windows.c"> + </ClCompile> <ClCompile Include="..\..\test\core\util\slice_splitter.c"> </ClCompile> </ItemGroup> diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj b/vsprojects/vs2013/grpc_unsecure.vcxproj index 98c14c2fdb..a31d82aa5f 100644 --- a/vsprojects/vs2013/grpc_unsecure.vcxproj +++ b/vsprojects/vs2013/grpc_unsecure.vcxproj @@ -134,6 +134,8 @@ <ClInclude Include="..\..\src\core\json\json_common.h" /> <ClInclude Include="..\..\src\core\json\json_reader.h" /> <ClInclude Include="..\..\src\core\json\json_writer.h" /> + <ClInclude Include="..\..\src\core\profiling\timers.h" /> + <ClInclude Include="..\..\src\core\profiling\timers_preciseclock.h" /> <ClInclude Include="..\..\src\core\statistics\census_interface.h" /> <ClInclude Include="..\..\src\core\statistics\census_log.h" /> <ClInclude Include="..\..\src\core\statistics\census_rpc_stats.h" /> @@ -216,6 +218,8 @@ </ClCompile> <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c"> </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c"> + </ClCompile> <ClCompile Include="..\..\src\core\iomgr\fd_posix.c"> </ClCompile> <ClCompile Include="..\..\src\core\iomgr\iocp_windows.c"> @@ -280,6 +284,8 @@ </ClCompile> <ClCompile Include="..\..\src\core\json\json_writer.c"> </ClCompile> + <ClCompile Include="..\..\src\core\profiling\timers.c"> + </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_init.c"> </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_log.c"> diff --git a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters index 4b758d6113..cec8f78bae 100644 --- a/vsprojects/vs2013/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vs2013/grpc_unsecure.vcxproj.filters @@ -64,6 +64,9 @@ <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_posix.c"> <Filter>src\core\iomgr</Filter> </ClCompile> + <ClCompile Include="..\..\src\core\iomgr\endpoint_pair_windows.c"> + <Filter>src\core\iomgr</Filter> + </ClCompile> <ClCompile Include="..\..\src\core\iomgr\fd_posix.c"> <Filter>src\core\iomgr</Filter> </ClCompile> @@ -160,6 +163,9 @@ <ClCompile Include="..\..\src\core\json\json_writer.c"> <Filter>src\core\json</Filter> </ClCompile> + <ClCompile Include="..\..\src\core\profiling\timers.c"> + <Filter>src\core\profiling</Filter> + </ClCompile> <ClCompile Include="..\..\src\core\statistics\census_init.c"> <Filter>src\core\statistics</Filter> </ClCompile> @@ -458,6 +464,12 @@ <ClInclude Include="..\..\src\core\json\json_writer.h"> <Filter>src\core\json</Filter> </ClInclude> + <ClInclude Include="..\..\src\core\profiling\timers.h"> + <Filter>src\core\profiling</Filter> + </ClInclude> + <ClInclude Include="..\..\src\core\profiling\timers_preciseclock.h"> + <Filter>src\core\profiling</Filter> + </ClInclude> <ClInclude Include="..\..\src\core\statistics\census_interface.h"> <Filter>src\core\statistics</Filter> </ClInclude> @@ -602,6 +614,9 @@ <Filter Include="src\core\json"> <UniqueIdentifier>{443ffc61-1bea-2477-6e54-1ddf8c139264}</UniqueIdentifier> </Filter> + <Filter Include="src\core\profiling"> + <UniqueIdentifier>{7f91d9bf-c9de-835a-d74d-b16f843b89a9}</UniqueIdentifier> + </Filter> <Filter Include="src\core\statistics"> <UniqueIdentifier>{e084164c-a069-00e3-db35-4e0b1cd6f0b7}</UniqueIdentifier> </Filter> |