From af95eafb34c20f980b65342cac0ee7cea534b161 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Tue, 23 Jan 2024 10:15:09 -0800 Subject: [PATCH 1/2] [CI] Using clang-17 for clang tidy & format (#35595) Clang-17 is now better at formatting. Clang-16 used to do some questionable formatting. Closes #35595 PiperOrigin-RevId: 600829055 --- .clang-tidy | 7 +++++++ src/core/lib/gprpp/time.h | 4 ++-- src/core/lib/iomgr/combiner.cc | 2 +- src/core/lib/json/json_writer.cc | 2 +- src/core/tsi/fake_transport_security.cc | 2 +- src/objective-c/tests/InteropTests/InteropTests.m | 2 +- .../tools/dockerfile/grpc_clang_format/Dockerfile.template | 2 +- .../tools/dockerfile/grpc_clang_tidy/Dockerfile.template | 2 +- templates/tools/dockerfile/test/sanity/Dockerfile.template | 7 ++----- test/core/util/osa_distance.cc | 2 +- tools/bazelify_tests/dockerimage_current_versions.bzl | 2 +- tools/dockerfile/grpc_clang_format/Dockerfile | 2 +- tools/dockerfile/grpc_clang_tidy/Dockerfile | 2 +- tools/dockerfile/test/sanity.current_version | 2 +- tools/dockerfile/test/sanity/Dockerfile | 7 ++----- 15 files changed, 24 insertions(+), 23 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 70f083cec64b3..32eed8a70e651 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -32,6 +32,7 @@ # - bugprone-not-null-terminated-result # - bugprone-signed-char-misuse # - bugprone-sizeof-expression +# - bugprone-switch-missing-default-case # - bugprone-too-small-loop-variable # - bugprone-unchecked-optional-access # - clang-diagnostic-deprecated-declarations @@ -50,8 +51,10 @@ # - modernize-use-equals-default # - modernize-use-equals-delete # - modernize-use-using +# - performance-avoid-endl # - performance-no-automatic-move # - performance-no-int-to-ptr +# - performance-noexcept-swap # - performance-unnecessary-copy-initialization # - performance-unnecessary-value-param # - readability-else-after-return @@ -67,6 +70,7 @@ Checks: '-*, -bugprone-assignment-in-if-condition, -bugprone-branch-clone, -bugprone-easily-swappable-parameters, + -bugprone-empty-catch, -bugprone-exception-escape, -bugprone-implicit-widening-of-multiplication-result, -bugprone-infinite-loop, @@ -75,6 +79,7 @@ Checks: '-*, -bugprone-reserved-identifier, -bugprone-signed-char-misuse, -bugprone-sizeof-expression, + -bugprone-switch-missing-default-case, -bugprone-too-small-loop-variable, -bugprone-unchecked-optional-access, google-*, @@ -82,8 +87,10 @@ Checks: '-*, -google-runtime-int, -google-runtime-references, performance-*, + -performance-avoid-endl, -performance-no-automatic-move, -performance-no-int-to-ptr, + -performance-noexcept-swap, -performance-unnecessary-copy-initialization, -performance-unnecessary-value-param, clang-diagnostic-deprecated-declarations, diff --git a/src/core/lib/gprpp/time.h b/src/core/lib/gprpp/time.h index 32b1065e380b5..ac52a982af0f2 100644 --- a/src/core/lib/gprpp/time.h +++ b/src/core/lib/gprpp/time.h @@ -37,7 +37,7 @@ uint64_t now = grpc_core::Timestamp::FromTimespecRoundDown( \ gpr_now(GPR_CLOCK_MONOTONIC)) \ .milliseconds_after_process_epoch(); \ - if (prev == 0 || now - prev > (n)*1000) { \ + if (prev == 0 || now - prev > (n) * 1000) { \ prev = now; \ gpr_log(severity, format, __VA_ARGS__); \ } \ @@ -50,7 +50,7 @@ gpr_now(GPR_CLOCK_MONOTONIC)) \ .milliseconds_after_process_epoch(); \ uint64_t prev_tsamp = prev.exchange(now); \ - if (now - prev_tsamp > (n)*1000) { \ + if (now - prev_tsamp > (n) * 1000) { \ gpr_log(severity, format, __VA_ARGS__); \ } \ } while (0) diff --git a/src/core/lib/iomgr/combiner.cc b/src/core/lib/iomgr/combiner.cc index 0d77bb579d4cb..d0e635ffd22f0 100644 --- a/src/core/lib/iomgr/combiner.cc +++ b/src/core/lib/iomgr/combiner.cc @@ -258,7 +258,7 @@ bool grpc_combiner_continue_exec_ctx() { // Define a macro to ease readability of the following switch statement. #define OLD_STATE_WAS(orphaned, elem_count) \ (((orphaned) ? 0 : STATE_UNORPHANED) | \ - ((elem_count)*STATE_ELEM_COUNT_LOW_BIT)) + ((elem_count) * STATE_ELEM_COUNT_LOW_BIT)) // Depending on what the previous state was, we need to perform different // actions. switch (old_state) { diff --git a/src/core/lib/json/json_writer.cc b/src/core/lib/json/json_writer.cc index ef07c5e392562..a69884ce0d9d8 100644 --- a/src/core/lib/json/json_writer.cc +++ b/src/core/lib/json/json_writer.cc @@ -138,7 +138,7 @@ void JsonWriter::EscapeUtf16(uint16_t utf16) { OutputChar(hex[(utf16 >> 12) & 0x0f]); OutputChar(hex[(utf16 >> 8) & 0x0f]); OutputChar(hex[(utf16 >> 4) & 0x0f]); - OutputChar(hex[(utf16)&0x0f]); + OutputChar(hex[(utf16) & 0x0f]); } void JsonWriter::EscapeString(const std::string& string) { diff --git a/src/core/tsi/fake_transport_security.cc b/src/core/tsi/fake_transport_security.cc index b1371dcfc7503..d8e498e8181ea 100644 --- a/src/core/tsi/fake_transport_security.cc +++ b/src/core/tsi/fake_transport_security.cc @@ -121,7 +121,7 @@ static void store32_little_endian(uint32_t value, unsigned char* buf) { buf[3] = static_cast((value >> 24) & 0xFF); buf[2] = static_cast((value >> 16) & 0xFF); buf[1] = static_cast((value >> 8) & 0xFF); - buf[0] = static_cast((value)&0xFF); + buf[0] = static_cast((value) & 0xFF); } static uint32_t read_frame_size(const grpc_slice_buffer* sb) { diff --git a/src/objective-c/tests/InteropTests/InteropTests.m b/src/objective-c/tests/InteropTests/InteropTests.m index 3ce451fd1da66..24122b9a30f10 100644 --- a/src/objective-c/tests/InteropTests/InteropTests.m +++ b/src/objective-c/tests/InteropTests/InteropTests.m @@ -851,7 +851,7 @@ - (void)concurrentRPCsWithErrors { [call setResponseDispatchQueue:dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL)]; [call start]; } - while (completedCallCount 0) { + while (completedCallCount < kNumRpcs && [waitUntil timeIntervalSinceNow] > 0) { [cv waitUntilDate:waitUntil]; } [cv unlock]; diff --git a/templates/tools/dockerfile/grpc_clang_format/Dockerfile.template b/templates/tools/dockerfile/grpc_clang_format/Dockerfile.template index 3ada7cedb14df..2acff18204a16 100644 --- a/templates/tools/dockerfile/grpc_clang_format/Dockerfile.template +++ b/templates/tools/dockerfile/grpc_clang_format/Dockerfile.template @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. - FROM silkeh/clang:16-bullseye + FROM silkeh/clang:17-bullseye ADD clang_format_all_the_things.sh / diff --git a/templates/tools/dockerfile/grpc_clang_tidy/Dockerfile.template b/templates/tools/dockerfile/grpc_clang_tidy/Dockerfile.template index 814829d790d4a..a03ea3e894bad 100644 --- a/templates/tools/dockerfile/grpc_clang_tidy/Dockerfile.template +++ b/templates/tools/dockerfile/grpc_clang_tidy/Dockerfile.template @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. - FROM silkeh/clang:16-bullseye + FROM silkeh/clang:17-bullseye # Install prerequisites for the clang-tidy script RUN apt-get update && apt-get install -y python3 jq git && apt-get clean diff --git a/templates/tools/dockerfile/test/sanity/Dockerfile.template b/templates/tools/dockerfile/test/sanity/Dockerfile.template index 1ae00b5395bed..c061cc2028e48 100644 --- a/templates/tools/dockerfile/test/sanity/Dockerfile.template +++ b/templates/tools/dockerfile/test/sanity/Dockerfile.template @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. - FROM silkeh/clang:16-bullseye + FROM silkeh/clang:17-bullseye <%include file="../../apt_get_basic.include"/> @@ -52,10 +52,7 @@ RUN python3 -m pip install --upgrade --ignore-installed PyYAML==5.4.1 --user # Install prerequisites for the clang-tidy script - RUN apt-get update && apt-get install -y jq git - - # Install prerequisites for the iwyu script - RUN apt-get update && apt-get install -y jq git cmake zlib1g-dev libtinfo-dev libclang-16-dev && apt-get clean + RUN apt-get update && apt-get install -y jq git && apt-get clean <%include file="../../bazel.include"/> <%include file="../../buildifier.include"/> diff --git a/test/core/util/osa_distance.cc b/test/core/util/osa_distance.cc index f323e705af93a..1cf30d9886738 100644 --- a/test/core/util/osa_distance.cc +++ b/test/core/util/osa_distance.cc @@ -31,7 +31,7 @@ size_t OsaDistance(absl::string_view s1, absl::string_view s2) { const auto height = s2.size() + 1; std::vector matrix(width * height, std::numeric_limits::max()); -#define MATRIX_CELL(x, y) matrix[(y)*width + (x)] +#define MATRIX_CELL(x, y) matrix[(y) * width + (x)] MATRIX_CELL(0, 0) = 0; for (size_t i = 1; i <= s1.size(); ++i) { diff --git a/tools/bazelify_tests/dockerimage_current_versions.bzl b/tools/bazelify_tests/dockerimage_current_versions.bzl index eeca8dd9c8df0..a3824b0763fdb 100644 --- a/tools/bazelify_tests/dockerimage_current_versions.bzl +++ b/tools/bazelify_tests/dockerimage_current_versions.bzl @@ -111,5 +111,5 @@ DOCKERIMAGE_CURRENT_VERSIONS = { "tools/dockerfile/test/rbe_ubuntu2004.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/rbe_ubuntu2004@sha256:d3951aeadf43e3bee6adc5b86d26cdaf0b9d1b5baf790d7b2530d1c197adc9f8", "tools/dockerfile/test/ruby_debian11_arm64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/ruby_debian11_arm64@sha256:7e77cf17e2e8657f4cc23ac9f93630bf13213fff961799e0f16dae17cd45cf6d", "tools/dockerfile/test/ruby_debian11_x64.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/ruby_debian11_x64@sha256:e4cb502caccf2db733268ce2ddc951fda8a9df2f7f53d6b74523c33d40c83006", - "tools/dockerfile/test/sanity.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/sanity@sha256:f1f5ca30491698f793cae75d5989cb53887d159800aef662cf7e6c3df6f86a88", + "tools/dockerfile/test/sanity.current_version": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/sanity@sha256:ca65b29302e8e381aabf9deb1952281f4e9963654e19c3d681148b5aa972c8a2", } diff --git a/tools/dockerfile/grpc_clang_format/Dockerfile b/tools/dockerfile/grpc_clang_format/Dockerfile index f3d675bab2f77..ff99ca74274b9 100644 --- a/tools/dockerfile/grpc_clang_format/Dockerfile +++ b/tools/dockerfile/grpc_clang_format/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM silkeh/clang:16-bullseye +FROM silkeh/clang:17-bullseye ADD clang_format_all_the_things.sh / diff --git a/tools/dockerfile/grpc_clang_tidy/Dockerfile b/tools/dockerfile/grpc_clang_tidy/Dockerfile index 71125ada0d744..178d874b3bd15 100644 --- a/tools/dockerfile/grpc_clang_tidy/Dockerfile +++ b/tools/dockerfile/grpc_clang_tidy/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM silkeh/clang:16-bullseye +FROM silkeh/clang:17-bullseye # Install prerequisites for the clang-tidy script RUN apt-get update && apt-get install -y python3 jq git && apt-get clean diff --git a/tools/dockerfile/test/sanity.current_version b/tools/dockerfile/test/sanity.current_version index 776c3d349be7b..2a2d514f070bc 100644 --- a/tools/dockerfile/test/sanity.current_version +++ b/tools/dockerfile/test/sanity.current_version @@ -1 +1 @@ -us-docker.pkg.dev/grpc-testing/testing-images-public/sanity:091d8e85bebb7b9f089178ae96435926cdc82fb8@sha256:f1f5ca30491698f793cae75d5989cb53887d159800aef662cf7e6c3df6f86a88 \ No newline at end of file +us-docker.pkg.dev/grpc-testing/testing-images-public/sanity:2d20232b40465f3487deef87274f4bfd7122b201@sha256:ca65b29302e8e381aabf9deb1952281f4e9963654e19c3d681148b5aa972c8a2 \ No newline at end of file diff --git a/tools/dockerfile/test/sanity/Dockerfile b/tools/dockerfile/test/sanity/Dockerfile index e45bdfc00261c..b44b55827102b 100644 --- a/tools/dockerfile/test/sanity/Dockerfile +++ b/tools/dockerfile/test/sanity/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM silkeh/clang:16-bullseye +FROM silkeh/clang:17-bullseye #================= # Basic C core dependencies @@ -102,10 +102,7 @@ RUN python3 -m pip install simplejson mako virtualenv==16.7.9 lxml six RUN python3 -m pip install --upgrade --ignore-installed PyYAML==5.4.1 --user # Install prerequisites for the clang-tidy script -RUN apt-get update && apt-get install -y jq git - -# Install prerequisites for the iwyu script -RUN apt-get update && apt-get install -y jq git cmake zlib1g-dev libtinfo-dev libclang-16-dev && apt-get clean +RUN apt-get update && apt-get install -y jq git && apt-get clean #======================== # Bazel installation From 19f1b39829259f0f46ec8bd27c2208c7dfa4812d Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 23 Jan 2024 10:37:27 -0800 Subject: [PATCH 2/2] [fuzzer] Eliminate use of mock_endpoint in server fuzzer (#35625) Instead, connect a real client, which gives us the ability to exercise the listener portion of the code too. Closes #35625 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/35625 from ctiller:shush-connect b8f78993c6e552c901fdcdec45cfdf7e78472dae PiperOrigin-RevId: 600836565 --- include/grpc/support/port_platform.h | 4 + src/core/lib/iomgr/tcp_server_posix.cc | 2 + test/core/end2end/fuzzers/BUILD | 2 +- test/core/end2end/fuzzers/fuzzer_input.proto | 3 + test/core/end2end/fuzzers/network_input.cc | 145 ++++++++++++++++++ test/core/end2end/fuzzers/network_input.h | 6 + test/core/end2end/fuzzers/server_fuzzer.cc | 54 ++----- .../fuzzing_event_engine.h | 4 + 8 files changed, 179 insertions(+), 41 deletions(-) diff --git a/include/grpc/support/port_platform.h b/include/grpc/support/port_platform.h index d68aadc77de76..d2ef98e41baeb 100644 --- a/include/grpc/support/port_platform.h +++ b/include/grpc/support/port_platform.h @@ -671,11 +671,15 @@ typedef unsigned __int64 uint64_t; #endif #ifndef GRPC_REINITIALIZES +#if defined(__clang__) #if GPR_HAS_CPP_ATTRIBUTE(clang::reinitializes) #define GRPC_REINITIALIZES [[clang::reinitializes]] #else #define GRPC_REINITIALIZES #endif +#else +#define GRPC_REINITIALIZES +#endif #endif #ifndef GPR_HAS_ATTRIBUTE diff --git a/src/core/lib/iomgr/tcp_server_posix.cc b/src/core/lib/iomgr/tcp_server_posix.cc index faf579ff12360..34ff1bc666bc1 100644 --- a/src/core/lib/iomgr/tcp_server_posix.cc +++ b/src/core/lib/iomgr/tcp_server_posix.cc @@ -187,6 +187,8 @@ static grpc_error_handle CreateEventEngineListener( } else { EventEngine::Listener::AcceptCallback accept_cb = [s](std::unique_ptr ep, MemoryAllocator) { + grpc_core::ApplicationCallbackExecCtx app_ctx; + grpc_core::ExecCtx exec_ctx; s->on_accept_cb(s->on_accept_cb_arg, grpc_event_engine::experimental:: grpc_event_engine_endpoint_create(std::move(ep)), diff --git a/test/core/end2end/fuzzers/BUILD b/test/core/end2end/fuzzers/BUILD index 783c11f444d69..c422547a0e210 100644 --- a/test/core/end2end/fuzzers/BUILD +++ b/test/core/end2end/fuzzers/BUILD @@ -92,6 +92,7 @@ grpc_cc_library( "fuzzer_input_proto", "//:chttp2_frame", "//test/core/event_engine/fuzzing_event_engine", + "//test/core/util:fuzzing_channel_args", "//test/core/util:grpc_test_util_base", ], ) @@ -136,7 +137,6 @@ grpc_proto_fuzzer( "//:grpc", "//src/core:channel_args", "//test/core/util:fuzz_config_vars", - "//test/core/util:fuzzing_channel_args", "//test/core/util:grpc_test_util", "//test/core/util:grpc_test_util_base", ], diff --git a/test/core/end2end/fuzzers/fuzzer_input.proto b/test/core/end2end/fuzzers/fuzzer_input.proto index 8d019cd840cb9..77a83472f0787 100644 --- a/test/core/end2end/fuzzers/fuzzer_input.proto +++ b/test/core/end2end/fuzzers/fuzzer_input.proto @@ -139,6 +139,9 @@ message InputSegments { } message NetworkInput { + int32 connect_delay_ms = 3; + int32 connect_timeout_ms = 4; + grpc.testing.FuzzingChannelArgs endpoint_config = 5; oneof value { bytes single_read_bytes = 1; InputSegments input_segments = 2; diff --git a/test/core/end2end/fuzzers/network_input.cc b/test/core/end2end/fuzzers/network_input.cc index 0227fd89d8a3e..a2fdb343228aa 100644 --- a/test/core/end2end/fuzzers/network_input.cc +++ b/test/core/end2end/fuzzers/network_input.cc @@ -30,6 +30,11 @@ #include "src/core/ext/transport/chttp2/transport/frame.h" #include "src/core/ext/transport/chttp2/transport/varint.h" +#include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/channel/channel_args_preconditioning.h" +#include "src/core/lib/config/core_configuration.h" +#include "src/core/lib/event_engine/channel_args_endpoint_config.h" +#include "src/core/lib/event_engine/tcp_socket_utils.h" #include "src/core/lib/gpr/useful.h" #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/slice/slice.h" @@ -37,6 +42,8 @@ #include "test/core/end2end/fuzzers/fuzzer_input.pb.h" #include "test/core/util/mock_endpoint.h" +using grpc_event_engine::experimental::EventEngine; + namespace grpc_core { namespace { @@ -307,4 +314,142 @@ Duration ScheduleReads( }); return Duration::Milliseconds(delay + 2); } + +namespace { + +void ReadForever(std::shared_ptr ep) { + bool finished; + do { + auto buffer = + std::make_unique(); + auto buffer_ptr = buffer.get(); + finished = ep->Read( + [ep, buffer = std::move(buffer)](absl::Status status) mutable { + ExecCtx exec_ctx; + if (!status.ok()) return; + ReadForever(std::move(ep)); + }, + buffer_ptr, nullptr); + } while (finished); +} + +void ScheduleWritesForReads( + std::shared_ptr ep, + grpc_event_engine::experimental::FuzzingEventEngine* event_engine, + std::vector schedule) { + class Scheduler { + public: + Scheduler(std::shared_ptr ep, + grpc_event_engine::experimental::FuzzingEventEngine* event_engine, + std::vector schedule) + : ep_(std::move(ep)), + event_engine_(event_engine), + schedule_(std::move(schedule)), + it_(schedule_.begin()) { + ScheduleNext(); + } + + private: + void ScheduleNext() { + if (it_ == schedule_.end()) { + delete this; + return; + } + event_engine_->RunAfterExactly( + Duration::Milliseconds(it_->delay_ms - delay_consumed_), + [this]() mutable { + ExecCtx exec_ctx; + delay_consumed_ = it_->delay_ms; + writing_.Clear(); + writing_.Append( + grpc_event_engine::experimental::internal::SliceCast< + grpc_event_engine::experimental::Slice>( + it_->slices.JoinIntoSlice())); + if (ep_->Write( + [this](absl::Status status) { + ExecCtx exec_ctx; + FinishWrite(std::move(status)); + }, + &writing_, nullptr)) { + FinishWrite(absl::OkStatus()); + } + }); + } + + void FinishWrite(absl::Status status) { + if (!status.ok()) { + it_ = schedule_.end(); + } else { + ++it_; + } + ScheduleNext(); + } + + std::shared_ptr ep_; + grpc_event_engine::experimental::FuzzingEventEngine* event_engine_; + std::vector schedule_; + std::vector::iterator it_; + grpc_event_engine::experimental::SliceBuffer writing_; + int delay_consumed_ = 0; + }; + new Scheduler(std::move(ep), event_engine, std::move(schedule)); +} + +} // namespace + +Duration ScheduleConnection( + const fuzzer_input::NetworkInput& network_input, + grpc_event_engine::experimental::FuzzingEventEngine* event_engine, + testing::FuzzingEnvironment environment, int port) { + ChannelArgs channel_args = + CoreConfiguration::Get() + .channel_args_preconditioning() + .PreconditionChannelArgs( + CreateChannelArgsFromFuzzingConfiguration( + network_input.endpoint_config(), environment) + .ToC() + .get()); + auto schedule = MakeSchedule(network_input); + Duration delay = Duration::Zero(); + for (const auto& q : schedule) { + delay = std::max( + delay, + Duration::Milliseconds(q.delay_ms) + + Duration::NanosecondsRoundUp( + (q.slices.Length() * event_engine->max_delay_write()).count())); + } + delay += Duration::Milliseconds(network_input.connect_delay_ms() + + network_input.connect_timeout_ms()); + event_engine->RunAfterExactly( + Duration::Milliseconds(network_input.connect_delay_ms()), + [event_engine, channel_args, + connect_timeout_ms = network_input.connect_timeout_ms(), + schedule = std::move(schedule), port]() mutable { + event_engine->Connect( + [event_engine, schedule = std::move(schedule)]( + absl::StatusOr> + endpoint) mutable { + ExecCtx exec_ctx; + if (!endpoint.ok()) { + gpr_log(GPR_ERROR, "Failed to connect: %s", + endpoint.status().ToString().c_str()); + return; + } + std::shared_ptr ep = + std::move(endpoint.value()); + ReadForever(ep); + ScheduleWritesForReads(std::move(ep), event_engine, + std::move(schedule)); + }, + grpc_event_engine::experimental::ResolvedAddressMakeWild4(port), + grpc_event_engine::experimental::ChannelArgsEndpointConfig( + channel_args), + channel_args.GetObject() + ->memory_quota() + ->CreateMemoryAllocator("fuzzer"), + Duration::Milliseconds(connect_timeout_ms)); + }); + return delay; +} + } // namespace grpc_core diff --git a/test/core/end2end/fuzzers/network_input.h b/test/core/end2end/fuzzers/network_input.h index deb6ffd72ff56..615f82844130d 100644 --- a/test/core/end2end/fuzzers/network_input.h +++ b/test/core/end2end/fuzzers/network_input.h @@ -19,6 +19,7 @@ #include "src/core/lib/iomgr/endpoint.h" #include "test/core/end2end/fuzzers/fuzzer_input.pb.h" #include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h" +#include "test/core/util/fuzzing_channel_args.h" namespace grpc_core { @@ -27,6 +28,11 @@ Duration ScheduleReads( grpc_endpoint* mock_endpoint, grpc_event_engine::experimental::FuzzingEventEngine* event_engine); +Duration ScheduleConnection( + const fuzzer_input::NetworkInput& network_input, + grpc_event_engine::experimental::FuzzingEventEngine* event_engine, + testing::FuzzingEnvironment environment, int port); + } // namespace grpc_core #endif // GRPC_TEST_CORE_END2END_FUZZERS_NETWORK_INPUT_H diff --git a/test/core/end2end/fuzzers/server_fuzzer.cc b/test/core/end2end/fuzzers/server_fuzzer.cc index dabfb5fa5593b..fb794682c4b11 100644 --- a/test/core/end2end/fuzzers/server_fuzzer.cc +++ b/test/core/end2end/fuzzers/server_fuzzer.cc @@ -17,34 +17,23 @@ #include "absl/types/optional.h" #include +#include #include #include -#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" -#include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/channel/channel_args_preconditioning.h" -#include "src/core/lib/channel/channelz.h" -#include "src/core/lib/config/core_configuration.h" #include "src/core/lib/experiments/config.h" #include "src/core/lib/gprpp/env.h" -#include "src/core/lib/iomgr/endpoint.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/surface/server.h" -#include "src/core/lib/transport/transport.h" #include "src/libfuzzer/libfuzzer_macro.h" #include "test/core/end2end/fuzzers/api_fuzzer.pb.h" #include "test/core/end2end/fuzzers/fuzzer_input.pb.h" #include "test/core/end2end/fuzzers/fuzzing_common.h" #include "test/core/end2end/fuzzers/network_input.h" #include "test/core/util/fuzz_config_vars.h" -#include "test/core/util/fuzzing_channel_args.h" -#include "test/core/util/mock_endpoint.h" bool squelch = true; bool leak_check = true; -static void discard_write(grpc_slice /*slice*/) {} - static void dont_log(gpr_log_func_args* /*args*/) {} namespace grpc_core { @@ -55,37 +44,20 @@ class ServerFuzzer final : public BasicFuzzer { explicit ServerFuzzer(const fuzzer_input::Msg& msg) : BasicFuzzer(msg.event_engine_actions()) { ExecCtx exec_ctx; - UpdateMinimumRunTime( - ScheduleReads(msg.network_input(), mock_endpoint_, engine())); grpc_server_register_completion_queue(server_, cq(), nullptr); // TODO(ctiller): add more registered methods (one for POST, one for PUT) grpc_server_register_method(server_, "/reg", nullptr, {}, 0); + auto* creds = grpc_insecure_server_credentials_create(); + grpc_server_add_http2_port(server_, "0.0.0.0:1234", creds); + grpc_server_credentials_release(creds); grpc_server_start(server_); - ChannelArgs channel_args = - CoreConfiguration::Get() - .channel_args_preconditioning() - .PreconditionChannelArgs( - CreateChannelArgsFromFuzzingConfiguration( - msg.channel_args(), FuzzingEnvironment{resource_quota()}) - .ToC() - .get()); - Transport* transport = - grpc_create_chttp2_transport(channel_args, mock_endpoint_, false); - transport_setup_ok_ = - Server::FromC(server_) - ->SetupTransport(transport, nullptr, channel_args, nullptr) - .ok(); - if (transport_setup_ok_) { - grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr); - } else { - DestroyServer(); - } + UpdateMinimumRunTime( + ScheduleConnection(msg.network_input(), engine(), + FuzzingEnvironment{resource_quota()}, 1234)); } ~ServerFuzzer() { GPR_ASSERT(server_ == nullptr); } - bool transport_setup_ok() const { return transport_setup_ok_; } - private: Result CreateChannel( const api_fuzzer::CreateChannel& /* create_channel */) override { @@ -104,9 +76,7 @@ class ServerFuzzer final : public BasicFuzzer { grpc_server* server() override { return server_; } grpc_channel* channel() override { return nullptr; } - grpc_endpoint* mock_endpoint_ = grpc_mock_endpoint_create(discard_write); grpc_server* server_ = grpc_server_create(nullptr, nullptr); - bool transport_setup_ok_ = false; }; } // namespace testing @@ -116,9 +86,13 @@ DEFINE_PROTO_FUZZER(const fuzzer_input::Msg& msg) { if (squelch && !grpc_core::GetEnv("GRPC_TRACE_FUZZER").has_value()) { gpr_set_log_function(dont_log); } + static const int once = []() { + grpc_core::ForceEnableExperiment("event_engine_client", true); + grpc_core::ForceEnableExperiment("event_engine_listener", true); + return 42; + }(); + GPR_ASSERT(once == 42); // avoid unused variable warning grpc_core::ApplyFuzzConfigVars(msg.config_vars()); grpc_core::TestOnlyReloadExperimentsFromConfigVariables(); - grpc_core::testing::ServerFuzzer server_fuzzer(msg); - if (!server_fuzzer.transport_setup_ok()) return; - server_fuzzer.Run(msg.api_actions()); + grpc_core::testing::ServerFuzzer(msg).Run(msg.api_actions()); } diff --git a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h index 5f83f44c9ea8b..3c187a75d2005 100644 --- a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h +++ b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h @@ -116,6 +116,10 @@ class FuzzingEventEngine : public EventEngine { // each test. void UnsetGlobalHooks() ABSL_LOCKS_EXCLUDED(mu_); + Duration max_delay_write() const { + return max_delay_[static_cast(RunType::kWrite)]; + } + private: enum class RunType { kWrite,