Go to the documentation of this file.
27 #include <gmock/gmock.h>
29 #include "absl/synchronization/mutex.h"
30 #include "absl/synchronization/notification.h"
55 void*
Tag(
intptr_t t) {
return reinterpret_cast<void*
>(
t); }
59 GracefulShutdownTest() { SetupAndStart(); }
61 ~GracefulShutdownTest()
override { ShutdownAndDestroy(); }
64 void SetupAndStart() {
85 core_server->channel_args(),
91 [
this, &client_poller_thread_started_notification]() {
101 client_poller_thread_started_notification.
Notify();
112 constexpr
char kPrefix[] =
113 "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n\x00\x00\x00\x04\x00\x00\x00\x00\x00";
123 void ShutdownAndDestroy() {
144 GracefulShutdownTest*
self =
static_cast<GracefulShutdownTest*
>(
arg);
148 for (
size_t i = 0;
i <
self->read_buffer_.count; ++
i) {
152 self->read_cv_.SignalAll();
156 &
self->on_read_done_,
false, 1);
159 self->read_end_notification_.Notify();
165 std::atomic<bool>
done{
false};
181 for (
size_t i = 0;
i <
buffer.count; ++
i) {
185 WaitForReadBytes(expected_bytes);
188 void WaitForPing(
uint64_t opaque_data) {
193 void SendPingAck(
uint64_t opaque_data) {
215 &on_write_done_notification_,
nullptr);
227 on_write_done_notification_->
Notify();
245 TEST_F(GracefulShutdownTest, GracefulGoaway) {
249 WaitForGoaway((1
u << 31) - 1);
261 TEST_F(GracefulShutdownTest, RequestStartedBeforeFinalGoaway) {
274 WaitForGoaway((1u << 31) - 1);
278 constexpr
char kRequestFrame[] =
279 "\x00\x00\xbe\x01\x05\x00\x00\x00\x01"
280 "\x10\x05:path\x08/foo/bar"
281 "\x10\x07:scheme\x04http"
282 "\x10\x07:method\x04POST"
283 "\x10\x0a:authority\x09localhost"
287 "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip"
288 "\x10\x02te\x08trailers"
289 "\x10\x0auser-agent\x17grpc-c/0.12.0.0 (linux)";
306 TEST_F(GracefulShutdownTest, RequestStartedAfterFinalGoawayIsIgnored) {
319 constexpr
char kRequestFrame[] =
320 "\x00\x00\xbe\x01\x05\x00\x00\x00\x01"
321 "\x10\x05:path\x08/foo/bar"
322 "\x10\x07:scheme\x04http"
323 "\x10\x07:method\x04POST"
324 "\x10\x0a:authority\x09localhost"
328 "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip"
329 "\x10\x02te\x08trailers"
330 "\x10\x0auser-agent\x17grpc-c/0.12.0.0 (linux)";
338 WaitForGoaway((1u << 31) - 1);
347 constexpr
char kNewRequestFrame[] =
348 "\x00\x00\xbe\x01\x05\x00\x00\x00\x03"
349 "\x10\x05:path\x08/foo/bar"
350 "\x10\x07:scheme\x04http"
351 "\x10\x07:method\x04POST"
352 "\x10\x0a:authority\x09localhost"
356 "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip"
357 "\x10\x02te\x08trailers"
358 "\x10\x0auser-agent\x17grpc-c/0.12.0.0 (linux)";
399 TEST_F(GracefulShutdownTest, UnresponsiveClient) {
404 WaitForGoaway((1u << 31) - 1);
421 TEST_F(GracefulShutdownTest, GoawayReceivedOnServerDisconnect) {
436 int main(
int argc,
char** argv) {
int main(int argc, char **argv)
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
GPRAPI void grpc_slice_buffer_destroy(grpc_slice_buffer *sb)
GRPCAPI void grpc_call_details_destroy(grpc_call_details *details)
GRPCAPI void grpc_call_details_init(grpc_call_details *details)
void StrAppend(std::string *dest, const AlphaNum &a)
return memset(p, 0, total)
struct grpc_op::grpc_op_data::grpc_op_send_initial_metadata send_initial_metadata
grpc_transport * grpc_create_chttp2_transport(const grpc_channel_args *channel_args, grpc_endpoint *ep, bool is_client)
absl::string_view StringViewFromSlice(const grpc_slice &slice)
void grpc_endpoint_read(grpc_endpoint *ep, grpc_slice_buffer *slices, grpc_closure *cb, bool urgent, int min_progress_size)
grpc_completion_queue * cq_
GRPCAPI grpc_server * grpc_server_create(const grpc_channel_args *args, void *reserved)
OPENSSL_EXPORT pem_password_cb void * u
#define ABSL_GUARDED_BY(x)
grpc_closure on_write_done_
GRPCAPI void grpc_server_register_completion_queue(grpc_server *server, grpc_completion_queue *cq, void *reserved)
union grpc_op::grpc_op_data data
GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array *array)
GRPCAPI grpc_call_error grpc_server_request_call(grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new)
void grpc_chttp2_goaway_append(uint32_t last_stream_id, uint32_t error_code, const grpc_slice &debug_data, grpc_slice_buffer *slice_buffer)
@ GRPC_OP_SEND_STATUS_FROM_SERVER
grpc_closure on_read_done_
GRPCAPI void grpc_call_unref(grpc_call *call)
gpr_timespec grpc_timeout_milliseconds_to_deadline(int64_t time_ms)
void cq_verifier_destroy(cq_verifier *v)
GPRAPI void grpc_slice_buffer_reset_and_unref(grpc_slice_buffer *sb)
struct grpc_call grpc_call
unsigned __int64 uint64_t
grpc_pollset * grpc_cq_pollset(grpc_completion_queue *cq)
GPRAPI grpc_slice grpc_slice_from_static_string(const char *source)
cq_verifier * cq_verifier_create(grpc_completion_queue *cq)
TEST_F(AuthorizationMatchersTest, AlwaysAuthorizationMatcher)
GPRAPI grpc_slice grpc_empty_slice(void)
ABSL_NAMESPACE_BEGIN bool StrContains(absl::string_view haystack, absl::string_view needle) noexcept
struct grpc_server grpc_server
static grpc_metadata_array request_metadata_recv
void grpc_endpoint_shutdown(grpc_endpoint *ep, grpc_error_handle why)
GRPCAPI void grpc_server_destroy(grpc_server *server)
#define CQ_EXPECT_COMPLETION(v, tag, success)
grpc_slice grpc_chttp2_ping_create(uint8_t ack, uint64_t opaque_8bytes)
int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_
void grpc_endpoint_destroy(grpc_endpoint *ep)
GPRAPI void grpc_slice_buffer_init(grpc_slice_buffer *sb)
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
GRPCAPI void grpc_server_cancel_all_calls(grpc_server *server)
struct grpc_op::grpc_op_data::grpc_op_recv_close_on_server recv_close_on_server
constexpr Duration Seconds(T n)
ABSL_NAMESPACE_BEGIN Time Now()
#define GPR_ARRAY_SIZE(array)
GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer *sb, grpc_slice slice)
GTEST_API_ void InitGoogleTest(int *argc, char **argv)
struct grpc_op::grpc_op_data::grpc_op_send_status_from_server send_status_from_server
int Write(int fd, const void *buf, unsigned int count)
static StaticSlice FromStaticBuffer(const void *s, size_t len)
grpc_arg grpc_channel_arg_integer_create(char *name, int value)
GRPCAPI void grpc_completion_queue_destroy(grpc_completion_queue *cq)
absl::Notification read_end_notification_
std::atomic< bool > shutdown_
@ GRPC_OP_SEND_INITIAL_METADATA
grpc_core::ExecCtx exec_ctx
grpc_endpoint_pair grpc_iomgr_create_endpoint_pair(const char *name, grpc_channel_args *args)
size_t trailing_metadata_count
GRPCAPI void grpc_server_shutdown_and_notify(grpc_server *server, grpc_completion_queue *cq, void *tag)
#define GRPC_ARG_HTTP2_BDP_PROBE
GRPCAPI grpc_event grpc_completion_queue_next(grpc_completion_queue *cq, gpr_timespec deadline, void *reserved)
void cq_verify(cq_verifier *v, int timeout_sec)
grpc_slice_buffer read_buffer_
#define EXPECT_GE(val1, val2)
@ GRPC_OP_RECV_CLOSE_ON_SERVER
@ GRPC_STATUS_UNIMPLEMENTED
void grpc_endpoint_write(grpc_endpoint *ep, grpc_slice_buffer *slices, grpc_closure *cb, void *arg, int max_frame_size)
bool WaitForNotificationWithTimeout(absl::Duration timeout) const
std::unique_ptr< std::thread > client_poll_thread_
GRPCAPI grpc_completion_queue * grpc_completion_queue_create_for_next(void *reserved)
grpc_slice * status_details
#define GRPC_ARG_KEEPALIVE_TIME_MS
GRPCAPI void grpc_init(void)
GRPCAPI void grpc_server_start(grpc_server *server)
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END intern self
void grpc_endpoint_add_to_pollset(grpc_endpoint *ep, grpc_pollset *pollset)
static Server * FromC(grpc_server *c_type)
GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops, size_t nops, void *tag, void *reserved)
GRPCAPI void grpc_shutdown(void)
void grpc_chttp2_transport_start_reading(grpc_transport *transport, grpc_slice_buffer *read_buffer, grpc_closure *notify_on_receive_settings, grpc_closure *notify_on_close)
static grpc_call_details call_details
GRPCAPI void grpc_metadata_array_init(grpc_metadata_array *array)
void WaitForNotification() const
#define GRPC_ERROR_IS_NONE(err)
grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:44