[fuzz] Turn core end2end tests into fuzzers (#33013)

Add a new binary that runs all core end2end tests in fuzzing mode.

In this mode FuzzingEventEngine is substituted for the default event
engine. This means that time is simulated, as is IO. The FEE gets
control of callback delays also.

In our tests the `Step()` function becomes, instead of a single call to
`completion_queue_next`, a series of calls to that function and
`FuzzingEventEngine::Tick`, driving forward the event loop until
progress can be made.

PR guide:
---

**New binaries**
`core_end2end_test_fuzzer` - the new fuzzer itself
`seed_end2end_corpus` - a tool that produces an interesting seed corpus

**Config changes for safe fuzzing**
The implementation tries to use the config fuzzing work we've previously
deployed in api_fuzzer to fuzz across experiments. Since some
experiments are far too experimental to be safe in such fuzzing (and
this will always be the case):
- a new flag is added to experiments to opt-out of this fuzzing
- a new hook is added to the config system to allow variables to
re-write their inputs before setting them during the fuzz

**Event manager/IO changes**
Changes are made to the event engine shims so that tcp_server_posix can
run with a non-FD carrying EventEngine. These are in my mind a bit
clunky, but they work and they're in code that we expect to delete in
the medium term, so I think overall the approach is good.

**Changes to time**
A small tweak is made to fix a bug initializing time for fuzzers in
time.cc - we were previously failing to initialize
`g_process_epoch_cycles`

**Changes to `Crash`**
A version that prints to stdio is added so that we can reliably print a
crash from the fuzzer.

**Changes to CqVerifier**
Hooks are added to allow the top level loop to hook the verification
functions with a function that steps time between CQ polls.

**Changes to end2end fixtures**
State machinery moves from the fixture to the test infra, to keep the
customizations for fuzzing or not in one place. This means that fixtures
are now just client/server factories, which is overall nice.

It did necessitate moving some bespoke machinery into
h2_ssl_cert_test.cc - this file is beginning to be problematic in
borrowing parts but not all of the e2e test machinery. Some future PR
needs to solve this.

A cq arg is added to the Make functions since the cq is now owned by the
test and not the fixture.

**Changes to test registration**
`TEST_P` is replaced by `CORE_END2END_TEST` and our own test registry is
used as a first depot for test information.

The gtest version of these tests: queries that registry to manually
register tests with gtest. This ultimately changes the name of our tests
again (I think for the last time) - the new names are shorter and more
readable, so I don't count this as a regression.

The fuzzer version of these tests: constructs a database of fuzzable
tests that it can consult to look up a particular suite/test/config
combination specified by the fuzzer to fuzz against. This gives us a
single fuzzer that can test all 3k-ish fuzzing ready tests and cross
polinate configuration between them.

**Changes to test config**
The zero size registry stuff was causing some problems with the event
engine feature macros, so instead I've removed those and used GTEST_SKIP
in the problematic tests. I think that's the approach we move towards in
the future.

**Which tests are included**
Configs that are compatible - those that do not do fd manipulation
directly (these are incompatible with FuzzingEventEngine), and those
that do not join threads on their shutdown path (as these are
incompatible with our cq wait methodology). Each we can talk about in
the future - fd manipulation would be a significant expansion of
FuzzingEventEngine, and is probably not worth it, however many uses of
background threads now should probably evolve to be EventEngine::Run
calls in the future, and then would be trivially enabled in the fuzzers.

Some tests currently fail in the fuzzing environment, a
`SKIP_IF_FUZZING` macro is used for these few to disable them if in the
fuzzing environment. We'll burn these down in the future.

**Changes to fuzzing_event_engine**
Changes are made to time: an exponential sweep forward is used now -
this catches small time precision things early, but makes decade long
timers (we have them) able to be used right now. In the future we'll
just skip time forward to the next scheduled timer, but that approach
doesn't yet work due to legacy timer system interactions.

Changes to port assignment: we ensure that ports are legal numbers
before assigning them via `grpc_pick_port_or_die`.

A race condition between time checking and io is fixed.

---------

Co-authored-by: ctiller <ctiller@users.noreply.github.com>
pull/33081/head^2
Craig Tiller 2 years ago committed by GitHub
parent ad2a5dd355
commit 4674f2ccf7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 40
      CMakeLists.txt
  2. 12
      build_autogenerated.yaml
  3. 6
      src/core/lib/config/config_vars.yaml
  4. 8
      src/core/lib/event_engine/shim.cc
  5. 1
      src/core/lib/experiments/config.h
  6. 37
      src/core/lib/experiments/experiments.cc
  7. 5
      src/core/lib/experiments/experiments.yaml
  8. 10
      src/core/lib/gprpp/crash.cc
  9. 3
      src/core/lib/gprpp/crash.h
  10. 1
      src/core/lib/gprpp/time.cc
  11. 255
      src/core/lib/iomgr/tcp_server_posix.cc
  12. 2
      src/core/lib/iomgr/tcp_server_utils_posix.h
  13. 3
      src/core/lib/promise/sleep.cc
  14. 357
      test/core/end2end/BUILD
  15. 28
      test/core/end2end/cq_verifier.cc
  16. 13
      test/core/end2end/cq_verifier.h
  17. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2FakeSecurityFullstack.textproto
  18. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2Fullstack.textproto
  19. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2FullstackCompression.textproto
  20. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2FullstackNoRetry.textproto
  21. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2FullstackWithCensus.textproto
  22. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2InsecureCredentials.textproto
  23. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2SimplSslFullstackTls12.textproto
  24. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2SimplSslFullstackTls13.textproto
  25. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2SimpleSslFullstack.textproto
  26. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2SimpleSslWithOauth2FullstackTls12.textproto
  27. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2SimpleSslWithOauth2FullstackTls13.textproto
  28. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2SslCredReloadTls12.textproto
  29. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_CallHostOverride_Chttp2SslCredReloadTls13.textproto
  30. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_DeadlineAfterAcceptWithServiceConfig_Chttp2FakeSecurityFullstack.textproto
  31. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_DeadlineAfterRoundTripWithServiceConfig_Chttp2FakeSecurityFullstack.textproto
  32. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_DefaultHost_Chttp2FakeSecurityFullstack.textproto
  33. 6
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_DisappearingServer_Chttp2FakeSecurityFullstack.textproto
  34. 3
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_SimpleDelayedRequestShort_Chttp2FakeSecurityFullstack.textproto
  35. 3
      test/core/end2end/end2end_test_corpus/CoreClientChannelTest_SubchannelFilterCallInitFails_Chttp2FakeSecurityFullstack.textproto
  36. 3
      test/core/end2end/end2end_test_corpus/CoreDeadlineTest_DeadlineAfterAccept_Chttp2FakeSecurityFullstack.textproto
  37. 3
      test/core/end2end/end2end_test_corpus/CoreDeadlineTest_DeadlineAfterAccept_Inproc.textproto
  38. 3
      test/core/end2end/end2end_test_corpus/CoreDeadlineTest_DeadlineAfterClientDone_Chttp2FakeSecurityFullstack.textproto
  39. 3
      test/core/end2end/end2end_test_corpus/CoreDeadlineTest_DeadlineAfterInvoke3_Chttp2FakeSecurityFullstack.textproto
  40. 3
      test/core/end2end/end2end_test_corpus/CoreDeadlineTest_DeadlineAfterInvoke4_Chttp2FakeSecurityFullstack.textproto
  41. 3
      test/core/end2end/end2end_test_corpus/CoreDeadlineTest_DeadlineAfterInvoke5_Chttp2FakeSecurityFullstack.textproto
  42. 3
      test/core/end2end/end2end_test_corpus/CoreDeadlineTest_DeadlineAfterInvoke6_Chttp2FakeSecurityFullstack.textproto
  43. 3
      test/core/end2end/end2end_test_corpus/CoreDeadlineTest_DeadlineAfterRoundTrip_Chttp2FakeSecurityFullstack.textproto
  44. 3
      test/core/end2end/end2end_test_corpus/CoreDeadlineTest_DeadlineInAVacuum_Chttp2FakeSecurityFullstack.textproto
  45. 3
      test/core/end2end/end2end_test_corpus/CoreDeadlineTest_NegativeDeadline_Chttp2FakeSecurityFullstack.textproto
  46. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_BadFlagsOnRecvInitialMetadata_Chttp2FakeSecurityFullstack.textproto
  47. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_BadFlagsOnRecvStatusOnClient_Chttp2FakeSecurityFullstack.textproto
  48. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_BadFlagsOnSendCloseFromClient_Chttp2FakeSecurityFullstack.textproto
  49. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_BadFlagsOnSendInitialMetadata_Chttp2FakeSecurityFullstack.textproto
  50. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_BadFlagsOnSendMessage_Chttp2FakeSecurityFullstack.textproto
  51. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_BinaryMetadataServerHttp2FallbackClientHttp2Fallback_Chttp2FakeSecurityFullstack.textproto
  52. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_BinaryMetadataServerHttp2FallbackClientTrueBinary_Chttp2FakeSecurityFullstack.textproto
  53. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_BinaryMetadataServerTrueBinaryClientHttp2Fallback_Chttp2FakeSecurityFullstack.textproto
  54. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_BinaryMetadataServerTrueBinaryClientTrueBinary_Chttp2FakeSecurityFullstack.textproto
  55. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelAfterAccept_Chttp2FakeSecurityFullstack.textproto
  56. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelAfterClientDone_Chttp2FakeSecurityFullstack.textproto
  57. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelAfterInvoke3_Chttp2FakeSecurityFullstack.textproto
  58. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelAfterInvoke4_Chttp2FakeSecurityFullstack.textproto
  59. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelAfterInvoke5_Chttp2FakeSecurityFullstack.textproto
  60. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelAfterInvoke6_Chttp2FakeSecurityFullstack.textproto
  61. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelAfterRoundTrip_Chttp2FakeSecurityFullstack.textproto
  62. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelBeforeInvoke1_Chttp2FakeSecurityFullstack.textproto
  63. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelBeforeInvoke2_Chttp2FakeSecurityFullstack.textproto
  64. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelBeforeInvoke3_Chttp2FakeSecurityFullstack.textproto
  65. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelBeforeInvoke4_Chttp2FakeSecurityFullstack.textproto
  66. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelBeforeInvoke5_Chttp2FakeSecurityFullstack.textproto
  67. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelBeforeInvoke6_Chttp2FakeSecurityFullstack.textproto
  68. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelInAVacuum_Chttp2FakeSecurityFullstack.textproto
  69. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelWithStatus1_Chttp2FakeSecurityFullstack.textproto
  70. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelWithStatus2_Chttp2FakeSecurityFullstack.textproto
  71. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelWithStatus3_Chttp2FakeSecurityFullstack.textproto
  72. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_CancelWithStatus4_Chttp2FakeSecurityFullstack.textproto
  73. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_ChannelzDisabled_Chttp2FakeSecurityFullstack.textproto
  74. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_ChannelzWithChannelTrace_Chttp2FakeSecurityFullstack.textproto
  75. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_Channelz_Chttp2FakeSecurityFullstack.textproto
  76. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_ClientFilterCallInitFails_Chttp2FakeSecurityFullstack.textproto
  77. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_ClientStreaming0_Chttp2FakeSecurityFullstack.textproto
  78. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_ClientStreaming10_Chttp2FakeSecurityFullstack.textproto
  79. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_ClientStreaming1_Chttp2FakeSecurityFullstack.textproto
  80. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_ClientStreaming30_Chttp2FakeSecurityFullstack.textproto
  81. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_ClientStreaming3_Chttp2FakeSecurityFullstack.textproto
  82. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_ContentLengthIsFiltered_Chttp2FakeSecurityFullstack.textproto
  83. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_EarlyServerShutdownFinishesInflightCalls_Chttp2FakeSecurityFullstack.textproto
  84. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_EmptyBatch_Chttp2FakeSecurityFullstack.textproto
  85. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_FilterCausesClose_Chttp2FakeSecurityFullstack.textproto
  86. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_FilterContext_Chttp2FakeSecurityFullstack.textproto
  87. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_Invoke10RegisteredCalls_Chttp2FakeSecurityFullstack.textproto
  88. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_InvokeRegisteredCall_Chttp2FakeSecurityFullstack.textproto
  89. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_MaxMessageLengthOnClientOnRequestViaChannelArg_Chttp2FakeSecurityFullstack.textproto
  90. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_MaxMessageLengthOnClientOnRequestViaServiceConfigWithIntegerJsonValue_Chttp2FakeSecurityFullstack.textproto
  91. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_MaxMessageLengthOnClientOnRequestViaServiceConfigWithStringJsonValue_Chttp2FakeSecurityFullstack.textproto
  92. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_MaxMessageLengthOnClientOnResponseViaChannelArg_Chttp2FakeSecurityFullstack.textproto
  93. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_MaxMessageLengthOnClientOnResponseViaServiceConfigWithIntegerJsonValue_Chttp2FakeSecurityFullstack.textproto
  94. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_MaxMessageLengthOnClientOnResponseViaServiceConfigWithStringJsonValue_Chttp2FakeSecurityFullstack.textproto
  95. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_MaxMessageLengthOnServerOnRequestViaChannelArg_Chttp2FakeSecurityFullstack.textproto
  96. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_MaxMessageLengthOnServerOnResponseViaChannelArg_Chttp2FakeSecurityFullstack.textproto
  97. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_NoOp_Chttp2FakeSecurityFullstack.textproto
  98. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_PingPongStreaming10_Chttp2FakeSecurityFullstack.textproto
  99. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_PingPongStreaming1_Chttp2FakeSecurityFullstack.textproto
  100. 3
      test/core/end2end/end2end_test_corpus/CoreEnd2endTest_PingPongStreaming30_Chttp2FakeSecurityFullstack.textproto
  101. Some files were not shown because too many files have changed in this diff Show More

40
CMakeLists.txt generated

@ -1086,6 +1086,7 @@ if(gRPC_BUILD_TESTS)
endif()
add_dependencies(buildtests_cxx orca_service_end2end_test)
add_dependencies(buildtests_cxx orphanable_test)
add_dependencies(buildtests_cxx osa_distance_test)
add_dependencies(buildtests_cxx out_of_bounds_bad_client_test)
add_dependencies(buildtests_cxx outlier_detection_lb_config_parser_test)
add_dependencies(buildtests_cxx outlier_detection_test)
@ -9325,6 +9326,7 @@ if(gRPC_BUILD_TESTS)
add_executable(core_end2end_tests
test/core/end2end/cq_verifier.cc
test/core/end2end/end2end_test_main.cc
test/core/end2end/end2end_test_suites.cc
test/core/end2end/end2end_tests.cc
test/core/end2end/fixtures/http_proxy_fixture.cc
test/core/end2end/fixtures/local_util.cc
@ -15972,6 +15974,44 @@ target_link_libraries(orphanable_test
)
endif()
if(gRPC_BUILD_TESTS)
add_executable(osa_distance_test
test/core/util/osa_distance.cc
test/core/util/osa_distance_test.cc
third_party/googletest/googletest/src/gtest-all.cc
third_party/googletest/googlemock/src/gmock-all.cc
)
target_compile_features(osa_distance_test PUBLIC cxx_std_14)
target_include_directories(osa_distance_test
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
${_gRPC_RE2_INCLUDE_DIR}
${_gRPC_SSL_INCLUDE_DIR}
${_gRPC_UPB_GENERATED_DIR}
${_gRPC_UPB_GRPC_GENERATED_DIR}
${_gRPC_UPB_INCLUDE_DIR}
${_gRPC_XXHASH_INCLUDE_DIR}
${_gRPC_ZLIB_INCLUDE_DIR}
third_party/googletest/googletest/include
third_party/googletest/googletest
third_party/googletest/googlemock/include
third_party/googletest/googlemock
${_gRPC_PROTO_GENS_DIR}
)
target_link_libraries(osa_distance_test
${_gRPC_BASELIB_LIBRARIES}
${_gRPC_PROTOBUF_LIBRARIES}
${_gRPC_ZLIB_LIBRARIES}
${_gRPC_ALLTARGETS_LIBRARIES}
absl::strings
)
endif()
if(gRPC_BUILD_TESTS)

@ -6236,6 +6236,7 @@ targets:
src:
- test/core/end2end/cq_verifier.cc
- test/core/end2end/end2end_test_main.cc
- test/core/end2end/end2end_test_suites.cc
- test/core/end2end/end2end_tests.cc
- test/core/end2end/fixtures/http_proxy_fixture.cc
- test/core/end2end/fixtures/local_util.cc
@ -9835,6 +9836,17 @@ targets:
- test/core/gprpp/orphanable_test.cc
deps:
- grpc_test_util
- name: osa_distance_test
gtest: true
build: test
language: c++
headers:
- test/core/util/osa_distance.h
src:
- test/core/util/osa_distance.cc
- test/core/util/osa_distance_test.cc
deps:
- absl/strings:strings
- name: out_of_bounds_bad_client_test
gtest: true
build: test

@ -25,7 +25,9 @@
# behavior for some environment variables.
#
# Optionally, fuzz: true can be added to enable fuzzers to explore variations
# in this config var with their regular fuzzing work.
# in this config var with their regular fuzzing work - or fuzz: FunctionName
# can be used to specify that the config space be explored, but FunctionName should be called to pre-format/validate the value for fuzzing.
# Such functions should be listed in fuzz_config_vars_helpers.h.
- name: experiments
type: string
@ -33,7 +35,7 @@
A comma separated list of currently active experiments. Experiments may be
prefixed with a '-' to disable them.
default:
fuzz: true
fuzz: ValidateExperimentsStringForFuzzing
- name: client_channel_backup_poll_interval_ms
type: int
default: 5000

@ -22,6 +22,12 @@
namespace grpc_event_engine {
namespace experimental {
#if defined(GRPC_POSIX_SOCKET_TCP) && !defined(GRPC_CFSTREAM)
bool g_event_engine_supports_fd = true;
#else
bool g_event_engine_supports_fd = false;
#endif
bool UseEventEngineClient() {
// TODO(hork, eryu): Adjust the ifdefs accordingly when event engines become
// available for other platforms.
@ -48,7 +54,7 @@ bool UseEventEngineListener() {
bool EventEngineSupportsFd() {
#if defined(GRPC_POSIX_SOCKET_TCP) && !defined(GRPC_CFSTREAM)
return true;
return g_event_engine_supports_fd;
#else
return false;
#endif

@ -46,6 +46,7 @@ struct ExperimentMetadata {
const char* name;
const char* description;
bool default_value;
bool allow_in_fuzzing_config;
};
} // namespace grpc_core

@ -67,27 +67,30 @@ const char* const description_work_stealing =
namespace grpc_core {
const ExperimentMetadata g_experiment_metadata[] = {
{"tcp_frame_size_tuning", description_tcp_frame_size_tuning, false},
{"tcp_rcv_lowat", description_tcp_rcv_lowat, false},
{"peer_state_based_framing", description_peer_state_based_framing, false},
{"flow_control_fixes", description_flow_control_fixes, true},
{"tcp_frame_size_tuning", description_tcp_frame_size_tuning, false, true},
{"tcp_rcv_lowat", description_tcp_rcv_lowat, false, true},
{"peer_state_based_framing", description_peer_state_based_framing, false,
true},
{"flow_control_fixes", description_flow_control_fixes, true, true},
{"memory_pressure_controller", description_memory_pressure_controller,
false},
false, true},
{"unconstrained_max_quota_buffer_size",
description_unconstrained_max_quota_buffer_size, false},
{"event_engine_client", description_event_engine_client, false},
{"monitoring_experiment", description_monitoring_experiment, true},
{"promise_based_client_call", description_promise_based_client_call, false},
{"free_large_allocator", description_free_large_allocator, false},
{"promise_based_server_call", description_promise_based_server_call, false},
description_unconstrained_max_quota_buffer_size, false, true},
{"event_engine_client", description_event_engine_client, false, true},
{"monitoring_experiment", description_monitoring_experiment, true, true},
{"promise_based_client_call", description_promise_based_client_call, false,
true},
{"free_large_allocator", description_free_large_allocator, false, true},
{"promise_based_server_call", description_promise_based_server_call, false,
true},
{"transport_supplies_client_latency",
description_transport_supplies_client_latency, false},
{"event_engine_listener", description_event_engine_listener, false},
description_transport_supplies_client_latency, false, true},
{"event_engine_listener", description_event_engine_listener, false, true},
{"schedule_cancellation_over_write",
description_schedule_cancellation_over_write, false},
{"trace_record_callops", description_trace_record_callops, false},
{"event_engine_dns", description_event_engine_dns, false},
{"work_stealing", description_work_stealing, false},
description_schedule_cancellation_over_write, false, true},
{"trace_record_callops", description_trace_record_callops, false, true},
{"event_engine_dns", description_event_engine_dns, false, false},
{"work_stealing", description_work_stealing, false, false},
};
} // namespace grpc_core

@ -27,6 +27,9 @@
# (date, YYYY/MM/DD)
# test_tags: a set of bazel tags, that if a test declares them signals
# that that test should be run with this experiment enabled in CI
# allow_in_fuzzing_config: optional boolean (true if not specified)
# if false, this experiment will not be included in fuzzers that
# explore the config space
#
# Well known test tags:
# core_end2end_test: all tests, fixtures in the core end2end suite
@ -145,6 +148,7 @@
expiry: 2023/06/01
owner: yijiem@google.com
test_tags: []
allow_in_fuzzing_config: false
- name: work_stealing
description:
If set, use a work stealing thread pool implementation in EventEngine
@ -152,3 +156,4 @@
expiry: 2023/06/01
owner: hork@google.com
test_tags: ["core_end2end_test"]
allow_in_fuzzing_config: false

@ -16,10 +16,13 @@
#include "src/core/lib/gprpp/crash.h"
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include "absl/strings/str_cat.h"
#include <grpc/support/log.h>
namespace grpc_core {
@ -30,4 +33,11 @@ void Crash(absl::string_view message, SourceLocation location) {
abort();
}
void CrashWithStdio(absl::string_view message, SourceLocation location) {
fputs(absl::StrCat(location.file(), ":", location.line(), ": ", message, "\n")
.c_str(),
stderr);
abort();
}
} // namespace grpc_core

@ -29,6 +29,9 @@ namespace grpc_core {
[[noreturn]] void Crash(absl::string_view message,
::grpc_core::SourceLocation location = {});
[[noreturn]] void CrashWithStdio(absl::string_view message,
::grpc_core::SourceLocation location = {});
} // namespace grpc_core
#endif // GRPC_SRC_CORE_LIB_GPRPP_CRASH_H

@ -229,6 +229,7 @@ Duration::operator grpc_event_engine::experimental::EventEngine::Duration()
void TestOnlySetProcessEpoch(gpr_timespec epoch) {
g_process_epoch_seconds.store(
gpr_convert_clock_type(epoch, GPR_CLOCK_MONOTONIC).tv_sec);
g_process_epoch_cycles.store(gpr_get_cycle_counter());
}
std::ostream& operator<<(std::ostream& out, Timestamp timestamp) {

@ -16,13 +16,16 @@
//
//
#include <grpc/support/port_platform.h>
#include <grpc/support/atm.h>
// FIXME: "posix" files shouldn't be depending on _GNU_SOURCE
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#include <grpc/event_engine/event_engine.h>
#endif
#include <grpc/support/port_platform.h>
#include "src/core/lib/iomgr/port.h"
#ifdef GRPC_POSIX_SOCKET_TCP_SERVER
@ -86,99 +89,118 @@ using ::grpc_event_engine::experimental::SliceBuffer;
static grpc_error_handle CreateEventEngineListener(
grpc_tcp_server* s, grpc_closure* shutdown_complete,
const EndpointConfig& config, grpc_tcp_server** server) {
PosixEventEngineWithFdSupport::PosixAcceptCallback accept_cb =
[s](int listener_fd, std::unique_ptr<EventEngine::Endpoint> ep,
bool is_external, MemoryAllocator /*allocator*/,
SliceBuffer* pending_data) {
grpc_core::ApplicationCallbackExecCtx app_ctx;
grpc_core::ExecCtx exec_ctx;
grpc_tcp_server_acceptor* acceptor =
static_cast<grpc_tcp_server_acceptor*>(
gpr_malloc(sizeof(*acceptor)));
acceptor->from_server = s;
acceptor->port_index = -1;
acceptor->fd_index = -1;
if (!is_external) {
auto it = s->listen_fd_to_index_map.find(listener_fd);
if (it != s->listen_fd_to_index_map.end()) {
acceptor->port_index = std::get<0>(it->second);
acceptor->fd_index = std::get<1>(it->second);
absl::StatusOr<std::unique_ptr<EventEngine::Listener>> listener;
if (grpc_event_engine::experimental::EventEngineSupportsFd()) {
PosixEventEngineWithFdSupport::PosixAcceptCallback accept_cb =
[s](int listener_fd, std::unique_ptr<EventEngine::Endpoint> ep,
bool is_external, MemoryAllocator /*allocator*/,
SliceBuffer* pending_data) {
grpc_core::ApplicationCallbackExecCtx app_ctx;
grpc_core::ExecCtx exec_ctx;
grpc_tcp_server_acceptor* acceptor =
static_cast<grpc_tcp_server_acceptor*>(
gpr_malloc(sizeof(*acceptor)));
acceptor->from_server = s;
acceptor->port_index = -1;
acceptor->fd_index = -1;
if (!is_external) {
auto it = s->listen_fd_to_index_map.find(listener_fd);
if (it != s->listen_fd_to_index_map.end()) {
acceptor->port_index = std::get<0>(it->second);
acceptor->fd_index = std::get<1>(it->second);
}
} else {
// External connection handling.
grpc_resolved_address addr;
memset(&addr, 0, sizeof(addr));
addr.len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
// Get the fd of the socket connected to peer.
int fd = reinterpret_cast<grpc_event_engine::experimental::
PosixEndpointWithFdSupport*>(ep.get())
->GetWrappedFd();
if (getpeername(fd, reinterpret_cast<struct sockaddr*>(addr.addr),
&(addr.len)) < 0) {
gpr_log(GPR_ERROR, "Failed getpeername: %s",
grpc_core::StrError(errno).c_str());
close(fd);
return;
}
(void)grpc_set_socket_no_sigpipe_if_possible(fd);
auto addr_uri = grpc_sockaddr_to_uri(&addr);
if (!addr_uri.ok()) {
gpr_log(GPR_ERROR, "Invalid address: %s",
addr_uri.status().ToString().c_str());
return;
}
if (grpc_tcp_trace.enabled()) {
gpr_log(GPR_INFO,
"SERVER_CONNECT: incoming external connection: %s",
addr_uri->c_str());
}
}
} else {
// External connection handling.
grpc_resolved_address addr;
memset(&addr, 0, sizeof(addr));
addr.len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
// Get the fd of the socket connected to peer.
int fd =
reinterpret_cast<
grpc_event_engine::experimental::PosixEndpointWithFdSupport*>(
ep.get())
->GetWrappedFd();
if (getpeername(fd, reinterpret_cast<struct sockaddr*>(addr.addr),
&(addr.len)) < 0) {
gpr_log(GPR_ERROR, "Failed getpeername: %s",
grpc_core::StrError(errno).c_str());
close(fd);
return;
}
(void)grpc_set_socket_no_sigpipe_if_possible(fd);
auto addr_uri = grpc_sockaddr_to_uri(&addr);
if (!addr_uri.ok()) {
gpr_log(GPR_ERROR, "Invalid address: %s",
addr_uri.status().ToString().c_str());
return;
grpc_pollset* read_notifier_pollset =
(*(s->pollsets))[static_cast<size_t>(gpr_atm_no_barrier_fetch_add(
&s->next_pollset_to_assign, 1)) %
s->pollsets->size()];
acceptor->external_connection = is_external;
acceptor->listener_fd = listener_fd;
grpc_byte_buffer* buf = nullptr;
if (pending_data != nullptr && pending_data->Length() > 0) {
buf = grpc_raw_byte_buffer_create(nullptr, 0);
grpc_slice_buffer_swap(&buf->data.raw.slice_buffer,
pending_data->c_slice_buffer());
pending_data->Clear();
}
if (grpc_tcp_trace.enabled()) {
gpr_log(GPR_INFO,
"SERVER_CONNECT: incoming external connection: %s",
addr_uri->c_str());
}
}
grpc_pollset* read_notifier_pollset =
(*(s->pollsets))[static_cast<size_t>(gpr_atm_no_barrier_fetch_add(
&s->next_pollset_to_assign, 1)) %
s->pollsets->size()];
acceptor->external_connection = is_external;
acceptor->listener_fd = listener_fd;
grpc_byte_buffer* buf = nullptr;
if (pending_data != nullptr && pending_data->Length() > 0) {
buf = grpc_raw_byte_buffer_create(nullptr, 0);
grpc_slice_buffer_swap(&buf->data.raw.slice_buffer,
pending_data->c_slice_buffer());
pending_data->Clear();
}
acceptor->pending_data = buf;
s->on_accept_cb(
s->on_accept_cb_arg,
grpc_event_engine::experimental::grpc_event_engine_endpoint_create(
std::move(ep)),
read_notifier_pollset, acceptor);
};
auto on_shutdown_complete_cb =
grpc_event_engine::experimental::GrpcClosureToStatusCallback(
shutdown_complete);
PosixEventEngineWithFdSupport* engine_ptr =
reinterpret_cast<PosixEventEngineWithFdSupport*>(
config.GetVoidPointer(GRPC_INTERNAL_ARG_EVENT_ENGINE));
// Keeps the engine alive for some tests that have not otherwise instantiated
// an EventEngine
std::shared_ptr<EventEngine> keeper;
if (engine_ptr == nullptr) {
keeper = grpc_event_engine::experimental::GetDefaultEventEngine();
engine_ptr = reinterpret_cast<PosixEventEngineWithFdSupport*>(keeper.get());
}
auto listener = engine_ptr->CreatePosixListener(
std::move(accept_cb),
[s, shutdown_complete](absl::Status status) {
grpc_event_engine::experimental::RunEventEngineClosure(
shutdown_complete, absl_status_to_grpc_error(status));
delete s->fd_handler;
delete s;
},
config,
std::make_unique<MemoryQuotaBasedMemoryAllocatorFactory>(
s->memory_quota));
acceptor->pending_data = buf;
s->on_accept_cb(s->on_accept_cb_arg,
grpc_event_engine::experimental::
grpc_event_engine_endpoint_create(std::move(ep)),
read_notifier_pollset, acceptor);
};
PosixEventEngineWithFdSupport* engine_ptr =
reinterpret_cast<PosixEventEngineWithFdSupport*>(
config.GetVoidPointer(GRPC_INTERNAL_ARG_EVENT_ENGINE));
// Keeps the engine alive for some tests that have not otherwise
// instantiated an EventEngine
std::shared_ptr<EventEngine> keeper;
if (engine_ptr == nullptr) {
keeper = grpc_event_engine::experimental::GetDefaultEventEngine();
engine_ptr =
reinterpret_cast<PosixEventEngineWithFdSupport*>(keeper.get());
}
listener = engine_ptr->CreatePosixListener(
std::move(accept_cb),
[s, shutdown_complete](absl::Status status) {
grpc_event_engine::experimental::RunEventEngineClosure(
shutdown_complete, absl_status_to_grpc_error(status));
delete s->fd_handler;
delete s;
},
config,
std::make_unique<MemoryQuotaBasedMemoryAllocatorFactory>(
s->memory_quota));
} else {
EventEngine::Listener::AcceptCallback accept_cb =
[s](std::unique_ptr<EventEngine::Endpoint> ep, MemoryAllocator) {
s->on_accept_cb(s->on_accept_cb_arg,
grpc_event_engine::experimental::
grpc_event_engine_endpoint_create(std::move(ep)),
nullptr, nullptr);
};
auto ee = grpc_event_engine::experimental::GetDefaultEventEngine();
listener = ee->CreateListener(
std::move(accept_cb),
[s, ee, shutdown_complete](absl::Status status) {
GPR_ASSERT(gpr_atm_no_barrier_load(&s->refs.count) == 0);
grpc_event_engine::experimental::RunEventEngineClosure(
shutdown_complete, absl_status_to_grpc_error(status));
delete s->fd_handler;
delete s;
},
config,
std::make_unique<MemoryQuotaBasedMemoryAllocatorFactory>(
s->memory_quota));
}
if (!listener.ok()) {
delete s;
*server = nullptr;
@ -565,16 +587,27 @@ static grpc_error_handle tcp_server_add_port(grpc_tcp_server* s,
return absl::UnknownError("Server already shutdown");
}
int fd_index = 0;
auto port = s->ee_listener->BindWithFd(
grpc_event_engine::experimental::CreateResolvedAddress(*addr),
[s, &fd_index](absl::StatusOr<int> listen_fd) {
if (!listen_fd.ok()) {
return;
}
GPR_DEBUG_ASSERT(*listen_fd > 0);
s->listen_fd_to_index_map.insert_or_assign(
*listen_fd, std::make_tuple(s->n_bind_ports, fd_index++));
});
absl::StatusOr<int> port;
if (grpc_event_engine::experimental::EventEngineSupportsFd()) {
port =
static_cast<
grpc_event_engine::experimental::PosixListenerWithFdSupport*>(
s->ee_listener.get())
->BindWithFd(
grpc_event_engine::experimental::CreateResolvedAddress(*addr),
[s, &fd_index](absl::StatusOr<int> listen_fd) {
if (!listen_fd.ok()) {
return;
}
GPR_DEBUG_ASSERT(*listen_fd > 0);
s->listen_fd_to_index_map.insert_or_assign(
*listen_fd,
std::make_tuple(s->n_bind_ports, fd_index++));
});
} else {
port = s->ee_listener->Bind(
grpc_event_engine::experimental::CreateResolvedAddress(*addr));
}
if (port.ok()) {
s->n_bind_ports++;
*out_port = *port;
@ -774,7 +807,11 @@ static void tcp_server_shutdown_listeners(grpc_tcp_server* s) {
gpr_mu_lock(&s->mu);
s->shutdown_listeners = true;
if (grpc_event_engine::experimental::UseEventEngineListener()) {
s->ee_listener->ShutdownListeningFds();
if (grpc_event_engine::experimental::EventEngineSupportsFd()) {
static_cast<grpc_event_engine::experimental::PosixListenerWithFdSupport*>(
s->ee_listener.get())
->ShutdownListeningFds();
}
}
/* shutdown all fd's */
if (s->active_ports) {
@ -804,15 +841,19 @@ class ExternalConnectionHandler : public grpc_core::TcpServerFdHandler {
// TODO(yangg) resolve duplicate code with on_read
void Handle(int listener_fd, int fd, grpc_byte_buffer* buf) override {
if (grpc_event_engine::experimental::UseEventEngineListener()) {
GPR_ASSERT(grpc_event_engine::experimental::EventEngineSupportsFd());
grpc_event_engine::experimental::SliceBuffer pending_data;
if (buf != nullptr) {
pending_data =
grpc_event_engine::experimental::SliceBuffer::TakeCSliceBuffer(
buf->data.raw.slice_buffer);
}
GPR_ASSERT(GRPC_LOG_IF_ERROR("listener_handle_external_connection",
s_->ee_listener->HandleExternalConnection(
listener_fd, fd, &pending_data)));
GPR_ASSERT(GRPC_LOG_IF_ERROR(
"listener_handle_external_connection",
static_cast<
grpc_event_engine::experimental::PosixListenerWithFdSupport*>(
s_->ee_listener.get())
->HandleExternalConnection(listener_fd, fd, &pending_data)));
return;
}
grpc_pollset* read_notifier_pollset;

@ -107,7 +107,7 @@ struct grpc_tcp_server {
/* used when event engine based servers are enabled */
int n_bind_ports = 0;
absl::flat_hash_map<int, std::tuple<int, int>> listen_fd_to_index_map;
std::unique_ptr<grpc_event_engine::experimental::PosixListenerWithFdSupport>
std::unique_ptr<grpc_event_engine::experimental::EventEngine::Listener>
ee_listener = nullptr;
/* used to store a pre-allocated FD assigned to a socket */
int pre_allocated_fd;

@ -41,8 +41,9 @@ Poll<absl::Status> Sleep::operator()() {
// Invalidate now so that we see a fresh version of the time.
// TODO(ctiller): the following can be safely removed when we remove ExecCtx.
ExecCtx::Get()->InvalidateNow();
const auto now = Timestamp::Now();
// If the deadline is earlier than now we can just return.
if (deadline_ <= Timestamp::Now()) return absl::OkStatus();
if (deadline_ <= now) return absl::OkStatus();
if (closure_ == nullptr) {
// TODO(ctiller): it's likely we'll want a pool of closures - probably per
// cpu? - to avoid allocating/deallocating on fast paths.

@ -12,7 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_cc_test", "grpc_package")
load("//bazel:grpc_build_system.bzl", "grpc_cc_binary", "grpc_cc_library", "grpc_cc_test", "grpc_package", "grpc_proto_library")
load("//test/core/util:grpc_fuzzer.bzl", "grpc_proto_fuzzer")
licenses(["notice"])
@ -111,7 +112,9 @@ grpc_cc_library(
"end2end_tests.h",
],
external_deps = [
"absl/functional:any_invocable",
"absl/memory",
"absl/meta:type_traits",
"absl/random",
"absl/strings",
"absl/types:optional",
@ -181,107 +184,114 @@ grpc_cc_library(
],
)
END2END_TEST_SRCS = [
"end2end_test_suites.cc",
"tests/bad_ping.cc",
"tests/binary_metadata.cc",
"tests/call_creds.cc",
"tests/call_host_override.cc",
"tests/cancel_after_accept.cc",
"tests/cancel_after_client_done.cc",
"tests/cancel_after_invoke.cc",
"tests/cancel_after_round_trip.cc",
"tests/cancel_before_invoke.cc",
"tests/cancel_in_a_vacuum.cc",
"tests/cancel_with_status.cc",
"tests/channelz.cc",
"tests/client_streaming.cc",
"tests/compressed_payload.cc",
"tests/connectivity.cc",
"tests/default_host.cc",
"tests/disappearing_server.cc",
"tests/empty_batch.cc",
"tests/filter_causes_close.cc",
"tests/filter_context.cc",
"tests/filter_init_fails.cc",
"tests/filtered_metadata.cc",
"tests/graceful_server_shutdown.cc",
"tests/grpc_authz.cc",
"tests/high_initial_seqno.cc",
"tests/hpack_size.cc",
"tests/invoke_large_request.cc",
"tests/keepalive_timeout.cc",
"tests/large_metadata.cc",
"tests/max_concurrent_streams.cc",
"tests/max_connection_age.cc",
"tests/max_connection_idle.cc",
"tests/max_message_length.cc",
"tests/negative_deadline.cc",
"tests/no_logging.cc",
"tests/no_op.cc",
"tests/payload.cc",
"tests/ping.cc",
"tests/ping_pong_streaming.cc",
"tests/proxy_auth.cc",
"tests/registered_call.cc",
"tests/request_with_flags.cc",
"tests/request_with_payload.cc",
"tests/resource_quota_server.cc",
"tests/retry.cc",
"tests/retry_cancel_after_first_attempt_starts.cc",
"tests/retry_cancel_during_delay.cc",
"tests/retry_cancel_with_multiple_send_batches.cc",
"tests/retry_cancellation.cc",
"tests/retry_disabled.cc",
"tests/retry_exceeds_buffer_size_in_delay.cc",
"tests/retry_exceeds_buffer_size_in_initial_batch.cc",
"tests/retry_exceeds_buffer_size_in_subsequent_batch.cc",
"tests/retry_lb_drop.cc",
"tests/retry_lb_fail.cc",
"tests/retry_non_retriable_status.cc",
"tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc",
"tests/retry_per_attempt_recv_timeout.cc",
"tests/retry_per_attempt_recv_timeout_on_last_attempt.cc",
"tests/retry_recv_initial_metadata.cc",
"tests/retry_recv_message.cc",
"tests/retry_recv_message_replay.cc",
"tests/retry_recv_trailing_metadata_error.cc",
"tests/retry_send_initial_metadata_refs.cc",
"tests/retry_send_op_fails.cc",
"tests/retry_send_recv_batch.cc",
"tests/retry_server_pushback_delay.cc",
"tests/retry_server_pushback_disabled.cc",
"tests/retry_streaming.cc",
"tests/retry_streaming_after_commit.cc",
"tests/retry_streaming_succeeds_before_replay_finished.cc",
"tests/retry_throttled.cc",
"tests/retry_too_many_attempts.cc",
"tests/retry_transparent_goaway.cc",
"tests/retry_transparent_max_concurrent_streams.cc",
"tests/retry_transparent_not_sent_on_wire.cc",
"tests/retry_unref_before_finish.cc",
"tests/retry_unref_before_recv.cc",
"tests/server_finishes_request.cc",
"tests/server_streaming.cc",
"tests/shutdown_finishes_calls.cc",
"tests/shutdown_finishes_tags.cc",
"tests/simple_delayed_request.cc",
"tests/simple_metadata.cc",
"tests/simple_request.cc",
"tests/streaming_error_response.cc",
"tests/trailing_metadata.cc",
"tests/write_buffering.cc",
"tests/write_buffering_at_end.cc",
]
END2END_TEST_DATA = [
"//src/core/tsi/test_creds:ca.pem",
"//src/core/tsi/test_creds:server1.key",
"//src/core/tsi/test_creds:server1.pem",
]
grpc_cc_test(
name = "core_end2end_tests",
timeout = "long",
srcs = [
"end2end_test_main.cc",
"tests/bad_ping.cc",
"tests/binary_metadata.cc",
"tests/call_creds.cc",
"tests/call_host_override.cc",
"tests/cancel_after_accept.cc",
"tests/cancel_after_client_done.cc",
"tests/cancel_after_invoke.cc",
"tests/cancel_after_round_trip.cc",
"tests/cancel_before_invoke.cc",
"tests/cancel_in_a_vacuum.cc",
"tests/cancel_with_status.cc",
"tests/channelz.cc",
"tests/client_streaming.cc",
"tests/compressed_payload.cc",
"tests/connectivity.cc",
"tests/default_host.cc",
"tests/disappearing_server.cc",
"tests/empty_batch.cc",
"tests/filter_causes_close.cc",
"tests/filter_context.cc",
"tests/filter_init_fails.cc",
"tests/filtered_metadata.cc",
"tests/graceful_server_shutdown.cc",
"tests/grpc_authz.cc",
"tests/high_initial_seqno.cc",
"tests/hpack_size.cc",
"tests/invoke_large_request.cc",
"tests/keepalive_timeout.cc",
"tests/large_metadata.cc",
"tests/max_concurrent_streams.cc",
"tests/max_connection_age.cc",
"tests/max_connection_idle.cc",
"tests/max_message_length.cc",
"tests/negative_deadline.cc",
"tests/no_logging.cc",
"tests/no_op.cc",
"tests/payload.cc",
"tests/ping.cc",
"tests/ping_pong_streaming.cc",
"tests/proxy_auth.cc",
"tests/registered_call.cc",
"tests/request_with_flags.cc",
"tests/request_with_payload.cc",
"tests/resource_quota_server.cc",
"tests/retry.cc",
"tests/retry_cancel_after_first_attempt_starts.cc",
"tests/retry_cancel_during_delay.cc",
"tests/retry_cancel_with_multiple_send_batches.cc",
"tests/retry_cancellation.cc",
"tests/retry_disabled.cc",
"tests/retry_exceeds_buffer_size_in_delay.cc",
"tests/retry_exceeds_buffer_size_in_initial_batch.cc",
"tests/retry_exceeds_buffer_size_in_subsequent_batch.cc",
"tests/retry_lb_drop.cc",
"tests/retry_lb_fail.cc",
"tests/retry_non_retriable_status.cc",
"tests/retry_non_retriable_status_before_recv_trailing_metadata_started.cc",
"tests/retry_per_attempt_recv_timeout.cc",
"tests/retry_per_attempt_recv_timeout_on_last_attempt.cc",
"tests/retry_recv_initial_metadata.cc",
"tests/retry_recv_message.cc",
"tests/retry_recv_message_replay.cc",
"tests/retry_recv_trailing_metadata_error.cc",
"tests/retry_send_initial_metadata_refs.cc",
"tests/retry_send_op_fails.cc",
"tests/retry_send_recv_batch.cc",
"tests/retry_server_pushback_delay.cc",
"tests/retry_server_pushback_disabled.cc",
"tests/retry_streaming.cc",
"tests/retry_streaming_after_commit.cc",
"tests/retry_streaming_succeeds_before_replay_finished.cc",
"tests/retry_throttled.cc",
"tests/retry_too_many_attempts.cc",
"tests/retry_transparent_goaway.cc",
"tests/retry_transparent_max_concurrent_streams.cc",
"tests/retry_transparent_not_sent_on_wire.cc",
"tests/retry_unref_before_finish.cc",
"tests/retry_unref_before_recv.cc",
"tests/server_finishes_request.cc",
"tests/server_streaming.cc",
"tests/shutdown_finishes_calls.cc",
"tests/shutdown_finishes_tags.cc",
"tests/simple_delayed_request.cc",
"tests/simple_metadata.cc",
"tests/simple_request.cc",
"tests/streaming_error_response.cc",
"tests/trailing_metadata.cc",
"tests/write_buffering.cc",
"tests/write_buffering_at_end.cc",
],
data = [
"//src/core/tsi/test_creds:ca.pem",
"//src/core/tsi/test_creds:server1.key",
"//src/core/tsi/test_creds:server1.pem",
],
] + END2END_TEST_SRCS,
data = END2END_TEST_DATA,
external_deps = [
"absl/functional:any_invocable",
"absl/status",
"absl/status:statusor",
"absl/strings",
@ -472,7 +482,9 @@ grpc_cc_test(
"h2_ssl_cert_test.cc",
],
external_deps = [
"absl/functional:any_invocable",
"absl/memory",
"absl/meta:type_traits",
"absl/strings",
"absl/types:optional",
"absl/types:variant",
@ -495,6 +507,7 @@ grpc_cc_test(
"//src/core:channel_args",
"//src/core:slice",
"//src/core:time",
"//test/core/event_engine:event_engine_test_utils",
"//test/core/util:grpc_test_util",
],
)
@ -556,3 +569,155 @@ grpc_cc_test(
"//test/core/util:grpc_test_util",
],
)
grpc_cc_binary(
name = "seed_end2end_corpus",
testonly = 1,
srcs = ["seed_end2end_corpus.cc"] + END2END_TEST_SRCS,
external_deps = [
"absl/cleanup",
"absl/status",
"absl/status:statusor",
"absl/strings",
"absl/strings:str_format",
"absl/types:optional",
"gtest",
],
deps = [
"cq_verifier",
"end2end_test_lib",
"fixture_support",
"http_proxy",
"proxy",
"//:channel_stack_builder",
"//:config",
"//:config_vars",
"//:debug_location",
"//:exec_ctx",
"//:gpr",
"//:grpc_authorization_provider",
"//:grpc_public_hdrs",
"//:grpc_security_base",
"//:grpc_trace",
"//:grpc_unsecure",
"//:legacy_context",
"//:orphanable",
"//:promise",
"//:ref_counted_ptr",
"//:stats",
"//src/core:arena_promise",
"//src/core:bitset",
"//src/core:channel_args",
"//src/core:channel_fwd",
"//src/core:channel_init",
"//src/core:channel_stack_type",
"//src/core:closure",
"//src/core:error",
"//src/core:experiments",
"//src/core:grpc_authorization_base",
"//src/core:grpc_fake_credentials",
"//src/core:iomgr_port",
"//src/core:json",
"//src/core:lb_policy",
"//src/core:lb_policy_factory",
"//src/core:no_destruct",
"//src/core:notification",
"//src/core:slice",
"//src/core:stats_data",
"//src/core:status_helper",
"//src/core:time",
"//test/core/util:grpc_test_util",
"//test/core/util:test_lb_policies",
],
)
grpc_proto_library(
name = "end2end_test_fuzzer_proto",
srcs = ["end2end_test_fuzzer.proto"],
has_services = False,
deps = [
"//test/core/event_engine/fuzzing_event_engine:fuzzing_event_engine_proto",
"//test/core/util:fuzz_config_vars_proto",
],
)
grpc_proto_fuzzer(
name = "core_end2end_test_fuzzer",
size = "enormous",
srcs = ["end2end_test_fuzzer.cc"] + END2END_TEST_SRCS,
corpus = "end2end_test_corpus",
data = END2END_TEST_DATA,
external_deps = [
"absl/functional:any_invocable",
"absl/status",
"absl/status:statusor",
"absl/strings",
"absl/strings:str_format",
"absl/types:optional",
"gtest",
],
language = "C++",
proto = None,
shard_count = 50,
tags = [
"no_mac",
"no_windows",
],
uses_event_engine = False,
uses_polling = False,
deps = [
"cq_verifier",
"end2end_test_fuzzer_proto",
"end2end_test_lib",
"fixture_support",
"http_proxy",
"proxy",
"//:channel_stack_builder",
"//:config",
"//:config_vars",
"//:debug_location",
"//:exec_ctx",
"//:gpr",
"//:grpc",
"//:grpc_authorization_provider",
"//:grpc_public_hdrs",
"//:grpc_security_base",
"//:grpc_trace",
"//:iomgr_timer",
"//:legacy_context",
"//:orphanable",
"//:promise",
"//:ref_counted_ptr",
"//:stats",
"//src/core:arena_promise",
"//src/core:bitset",
"//src/core:channel_args",
"//src/core:channel_fwd",
"//src/core:channel_init",
"//src/core:channel_stack_type",
"//src/core:closure",
"//src/core:default_event_engine",
"//src/core:env",
"//src/core:error",
"//src/core:experiments",
"//src/core:grpc_authorization_base",
"//src/core:grpc_fake_credentials",
"//src/core:iomgr_port",
"//src/core:json",
"//src/core:lb_policy",
"//src/core:lb_policy_factory",
"//src/core:no_destruct",
"//src/core:notification",
"//src/core:slice",
"//src/core:stats_data",
"//src/core:status_helper",
"//src/core:time",
"//test/core/event_engine/fuzzing_event_engine",
"//test/core/event_engine/fuzzing_event_engine:fuzzing_event_engine_proto",
"//test/core/util:fuzz_config_vars",
"//test/core/util:fuzz_config_vars_proto",
"//test/core/util:grpc_test_util",
"//test/core/util:osa_distance",
"//test/core/util:test_lb_policies",
],
)

@ -197,9 +197,12 @@ std::string TagStr(void* tag) {
namespace grpc_core {
CqVerifier::CqVerifier(grpc_completion_queue* cq,
absl::AnyInvocable<void(Failure)> fail)
: cq_(cq), fail_(std::move(fail)) {}
CqVerifier::CqVerifier(
grpc_completion_queue* cq, absl::AnyInvocable<void(Failure) const> fail,
absl::AnyInvocable<
void(grpc_event_engine::experimental::EventEngine::Duration) const>
step_fn)
: cq_(cq), fail_(std::move(fail)), step_fn_(std::move(step_fn)) {}
CqVerifier::~CqVerifier() { Verify(); }
@ -274,11 +277,26 @@ bool IsMaybe(const CqVerifier::ExpectedResult& r) {
}
} // namespace
grpc_event CqVerifier::Step(gpr_timespec deadline) {
if (step_fn_ != nullptr) {
while (true) {
grpc_event r = grpc_completion_queue_next(
cq_, gpr_inf_past(deadline.clock_type), nullptr);
if (r.type != GRPC_QUEUE_TIMEOUT) return r;
auto now = gpr_now(deadline.clock_type);
if (gpr_time_cmp(deadline, now) < 0) break;
step_fn_(Timestamp::FromTimespecRoundDown(deadline) - Timestamp::Now());
}
return grpc_event{GRPC_QUEUE_TIMEOUT, 0, nullptr};
}
return grpc_completion_queue_next(cq_, deadline, nullptr);
}
void CqVerifier::Verify(Duration timeout, SourceLocation location) {
const gpr_timespec deadline =
grpc_timeout_milliseconds_to_deadline(timeout.millis());
while (!expectations_.empty()) {
grpc_event ev = grpc_completion_queue_next(cq_, deadline, nullptr);
grpc_event ev = Step(deadline);
if (ev.type == GRPC_QUEUE_TIMEOUT) break;
if (ev.type != GRPC_OP_COMPLETE) {
FailUnexpectedEvent(&ev, location);
@ -334,7 +352,7 @@ void CqVerifier::VerifyEmpty(Duration timeout, SourceLocation location) {
const gpr_timespec deadline =
gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), timeout.as_timespec());
GPR_ASSERT(expectations_.empty());
grpc_event ev = grpc_completion_queue_next(cq_, deadline, nullptr);
grpc_event ev = Step(deadline);
if (ev.type != GRPC_QUEUE_TIMEOUT) {
FailUnexpectedEvent(&ev, location);
}

@ -28,8 +28,10 @@
#include "absl/functional/any_invocable.h"
#include "absl/types/variant.h"
#include <grpc/event_engine/event_engine.h>
#include <grpc/grpc.h>
#include <grpc/slice.h>
#include <grpc/support/time.h>
#include "src/core/lib/gprpp/debug_location.h"
#include "src/core/lib/gprpp/time.h"
@ -77,7 +79,10 @@ class CqVerifier {
// will produce nicer failure messages.
explicit CqVerifier(
grpc_completion_queue* cq,
absl::AnyInvocable<void(Failure)> fail = FailUsingGprCrash);
absl::AnyInvocable<void(Failure) const> fail = FailUsingGprCrash,
absl::AnyInvocable<
void(grpc_event_engine::experimental::EventEngine::Duration) const>
step_fn = nullptr);
~CqVerifier();
CqVerifier(const CqVerifier&) = delete;
@ -117,10 +122,14 @@ class CqVerifier {
void FailUnexpectedEvent(grpc_event* ev,
const SourceLocation& location) const;
bool AllMaybes() const;
grpc_event Step(gpr_timespec deadline);
grpc_completion_queue* const cq_;
std::vector<Expectation> expectations_;
mutable absl::AnyInvocable<void(Failure)> fail_;
absl::AnyInvocable<void(Failure) const> fail_;
absl::AnyInvocable<void(
grpc_event_engine::experimental::EventEngine::Duration) const>
step_fn_;
};
} // namespace grpc_core

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2FakeSecurityFullstack"
config_vars {
experiments: "tcp_frame_size_tuning"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2Fullstack"
config_vars {
experiments: "tcp_rcv_lowat"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2FullstackCompression"
config_vars {
experiments: "peer_state_based_framing"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2FullstackNoRetry"
config_vars {
experiments: "flow_control_fixes"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2FullstackWithCensus"
config_vars {
experiments: "memory_pressure_controller"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2InsecureCredentials"
config_vars {
experiments: "unconstrained_max_quota_buffer_size"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2SimplSslFullstackTls12"
config_vars {
experiments: "event_engine_client"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2SimplSslFullstackTls13"
config_vars {
experiments: "monitoring_experiment"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2SimpleSslFullstack"
config_vars {
experiments: "promise_based_client_call"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2SimpleSslWithOauth2FullstackTls12"
config_vars {
experiments: "free_large_allocator"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2SimpleSslWithOauth2FullstackTls13"
config_vars {
experiments: "promise_based_server_call"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2SslCredReloadTls12"
config_vars {
experiments: "transport_supplies_client_latency"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "CallHostOverride"
config: "Chttp2SslCredReloadTls13"
config_vars {
experiments: "event_engine_listener"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "DeadlineAfterAcceptWithServiceConfig"
config: "Chttp2FakeSecurityFullstack"
config_vars {
experiments: "schedule_cancellation_over_write"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "DeadlineAfterRoundTripWithServiceConfig"
config: "Chttp2FakeSecurityFullstack"
config_vars {
experiments: "trace_record_callops"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "DefaultHost"
config: "Chttp2FakeSecurityFullstack"
config_vars {
experiments: "event_engine_dns"
}

@ -0,0 +1,6 @@
suite: "CoreClientChannelTest"
test: "DisappearingServer"
config: "Chttp2FakeSecurityFullstack"
config_vars {
experiments: "work_stealing"
}

@ -0,0 +1,3 @@
suite: "CoreClientChannelTest"
test: "SimpleDelayedRequestShort"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreClientChannelTest"
test: "SubchannelFilterCallInitFails"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreDeadlineTest"
test: "DeadlineAfterAccept"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreDeadlineTest"
test: "DeadlineAfterAccept"
config: "Inproc"

@ -0,0 +1,3 @@
suite: "CoreDeadlineTest"
test: "DeadlineAfterClientDone"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreDeadlineTest"
test: "DeadlineAfterInvoke3"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreDeadlineTest"
test: "DeadlineAfterInvoke4"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreDeadlineTest"
test: "DeadlineAfterInvoke5"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreDeadlineTest"
test: "DeadlineAfterInvoke6"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreDeadlineTest"
test: "DeadlineAfterRoundTrip"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreDeadlineTest"
test: "DeadlineInAVacuum"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreDeadlineTest"
test: "NegativeDeadline"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "BadFlagsOnRecvInitialMetadata"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "BadFlagsOnRecvStatusOnClient"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "BadFlagsOnSendCloseFromClient"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "BadFlagsOnSendInitialMetadata"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "BadFlagsOnSendMessage"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "BinaryMetadataServerHttp2FallbackClientHttp2Fallback"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "BinaryMetadataServerHttp2FallbackClientTrueBinary"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "BinaryMetadataServerTrueBinaryClientHttp2Fallback"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "BinaryMetadataServerTrueBinaryClientTrueBinary"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelAfterAccept"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelAfterClientDone"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelAfterInvoke3"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelAfterInvoke4"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelAfterInvoke5"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelAfterInvoke6"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelAfterRoundTrip"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelBeforeInvoke1"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelBeforeInvoke2"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelBeforeInvoke3"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelBeforeInvoke4"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelBeforeInvoke5"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelBeforeInvoke6"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelInAVacuum"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelWithStatus1"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelWithStatus2"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelWithStatus3"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "CancelWithStatus4"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "ChannelzDisabled"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "ChannelzWithChannelTrace"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "Channelz"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "ClientFilterCallInitFails"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "ClientStreaming0"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "ClientStreaming10"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "ClientStreaming1"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "ClientStreaming30"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "ClientStreaming3"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "ContentLengthIsFiltered"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "EarlyServerShutdownFinishesInflightCalls"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "EmptyBatch"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "FilterCausesClose"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "FilterContext"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "Invoke10RegisteredCalls"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "InvokeRegisteredCall"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "MaxMessageLengthOnClientOnRequestViaChannelArg"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "MaxMessageLengthOnClientOnRequestViaServiceConfigWithIntegerJsonValue"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "MaxMessageLengthOnClientOnRequestViaServiceConfigWithStringJsonValue"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "MaxMessageLengthOnClientOnResponseViaChannelArg"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "MaxMessageLengthOnClientOnResponseViaServiceConfigWithIntegerJsonValue"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "MaxMessageLengthOnClientOnResponseViaServiceConfigWithStringJsonValue"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "MaxMessageLengthOnServerOnRequestViaChannelArg"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "MaxMessageLengthOnServerOnResponseViaChannelArg"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "NoOp"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "PingPongStreaming10"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "PingPongStreaming1"
config: "Chttp2FakeSecurityFullstack"

@ -0,0 +1,3 @@
suite: "CoreEnd2endTest"
test: "PingPongStreaming30"
config: "Chttp2FakeSecurityFullstack"

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save