blob: 725a425fbfa6a02400010a1a0675bf4d29812053 [file] [log] [blame]
Craig Tiller26dab312015-12-07 14:43:47 -08001/*
2 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003 * Copyright 2015 gRPC authors.
Craig Tiller26dab312015-12-07 14:43:47 -08004 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
Craig Tiller26dab312015-12-07 14:43:47 -08008 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009 * http://www.apache.org/licenses/LICENSE-2.0
Craig Tiller26dab312015-12-07 14:43:47 -080010 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
Craig Tiller26dab312015-12-07 14:43:47 -080016 *
17 */
18
19#include "test/core/end2end/end2end_tests.h"
20
21#include <grpc/support/log.h>
22#include <grpc/support/sync.h>
23#include <grpc/support/thd.h>
24#include <grpc/support/time.h>
Craig Tillerfa057952017-01-30 10:16:02 -080025#include <grpc/support/useful.h>
Craig Tiller26dab312015-12-07 14:43:47 -080026
27#include "test/core/end2end/cq_verifier.h"
28
Yuchen Zengb4b6a0e2017-02-28 22:06:52 -080029#define PING_NUM 5
30
Craig Tillerbaa14a92017-11-03 09:09:36 -070031static void* tag(intptr_t t) { return (void*)t; }
Craig Tiller26dab312015-12-07 14:43:47 -080032
Yuchen Zengb4b6a0e2017-02-28 22:06:52 -080033static void test_ping(grpc_end2end_test_config config,
34 int min_time_between_pings_ms) {
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080035 grpc_end2end_test_fixture f = config.create_fixture(nullptr, nullptr);
Craig Tillerbaa14a92017-11-03 09:09:36 -070036 cq_verifier* cqv = cq_verifier_create(f.cq);
Craig Tiller28bf8912015-12-07 16:07:04 -080037 grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
Craig Tiller26dab312015-12-07 14:43:47 -080038 int i;
39
Yash Tibrewal34a57d02017-10-23 15:33:21 -070040 grpc_arg client_a[3];
41 client_a[0].type = GRPC_ARG_INTEGER;
42 client_a[0].key =
Yash Tibrewal40422d52017-11-06 14:39:17 -080043 const_cast<char*>(GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS);
Yash Tibrewal34a57d02017-10-23 15:33:21 -070044 client_a[0].value.integer = 10;
45 client_a[1].type = GRPC_ARG_INTEGER;
Yash Tibrewal40422d52017-11-06 14:39:17 -080046 client_a[1].key = const_cast<char*>(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA);
Yash Tibrewal34a57d02017-10-23 15:33:21 -070047 client_a[1].value.integer = 0;
48 client_a[2].type = GRPC_ARG_INTEGER;
Yash Tibrewal40422d52017-11-06 14:39:17 -080049 client_a[2].key = const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS);
Yash Tibrewal34a57d02017-10-23 15:33:21 -070050 client_a[2].value.integer = 1;
51 grpc_arg server_a[2];
52 server_a[0].type = GRPC_ARG_INTEGER;
53 server_a[0].key =
Yash Tibrewal40422d52017-11-06 14:39:17 -080054 const_cast<char*>(GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS);
Yash Tibrewal34a57d02017-10-23 15:33:21 -070055 server_a[0].value.integer = 0;
56 server_a[1].type = GRPC_ARG_INTEGER;
Yash Tibrewal40422d52017-11-06 14:39:17 -080057 server_a[1].key = const_cast<char*>(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS);
Yash Tibrewal34a57d02017-10-23 15:33:21 -070058 server_a[1].value.integer = 1;
59 grpc_channel_args client_args = {GPR_ARRAY_SIZE(client_a), client_a};
60 grpc_channel_args server_args = {GPR_ARRAY_SIZE(server_a), server_a};
Craig Tiller6360af62017-01-20 15:30:12 -080061
62 config.init_client(&f, &client_args);
Yuchen Zengaf5c5052017-02-28 16:24:00 -080063 config.init_server(&f, &server_args);
Craig Tiller26dab312015-12-07 14:43:47 -080064
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080065 grpc_channel_ping(f.client, f.cq, tag(0), nullptr);
Mark D. Roth7187ab92016-08-24 13:49:22 -070066 CQ_EXPECT_COMPLETION(cqv, tag(0), 0);
Craig Tiller28bf8912015-12-07 16:07:04 -080067
68 /* check that we're still in idle, and start connecting */
69 GPR_ASSERT(grpc_channel_check_connectivity_state(f.client, 1) ==
70 GRPC_CHANNEL_IDLE);
71 /* we'll go through some set of transitions (some might be missed), until
72 READY is reached */
73 while (state != GRPC_CHANNEL_READY) {
74 grpc_channel_watch_connectivity_state(
Yuchen Zengb4b6a0e2017-02-28 22:06:52 -080075 f.client, state,
76 gpr_time_add(grpc_timeout_seconds_to_deadline(3),
77 gpr_time_from_millis(min_time_between_pings_ms * PING_NUM,
78 GPR_TIMESPAN)),
79 f.cq, tag(99));
Mark D. Roth7187ab92016-08-24 13:49:22 -070080 CQ_EXPECT_COMPLETION(cqv, tag(99), 1);
Craig Tiller28bf8912015-12-07 16:07:04 -080081 cq_verify(cqv);
82 state = grpc_channel_check_connectivity_state(f.client, 0);
83 GPR_ASSERT(state == GRPC_CHANNEL_READY ||
84 state == GRPC_CHANNEL_CONNECTING ||
85 state == GRPC_CHANNEL_TRANSIENT_FAILURE);
86 }
87
Yuchen Zengb4b6a0e2017-02-28 22:06:52 -080088 for (i = 1; i <= PING_NUM; i++) {
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080089 grpc_channel_ping(f.client, f.cq, tag(i), nullptr);
Mark D. Roth7187ab92016-08-24 13:49:22 -070090 CQ_EXPECT_COMPLETION(cqv, tag(i), 1);
Craig Tiller26dab312015-12-07 14:43:47 -080091 cq_verify(cqv);
92 }
93
94 grpc_server_shutdown_and_notify(f.server, f.cq, tag(0xdead));
Mark D. Roth7187ab92016-08-24 13:49:22 -070095 CQ_EXPECT_COMPLETION(cqv, tag(0xdead), 1);
Craig Tiller26dab312015-12-07 14:43:47 -080096 cq_verify(cqv);
97
98 /* cleanup server */
99 grpc_server_destroy(f.server);
100
101 grpc_channel_destroy(f.client);
102 grpc_completion_queue_shutdown(f.cq);
103 grpc_completion_queue_destroy(f.cq);
Sree Kuchibhotla321881d2017-02-27 11:25:28 -0800104
105 /* f.shutdown_cq is not used in this test */
106 grpc_completion_queue_destroy(f.shutdown_cq);
Craig Tiller26dab312015-12-07 14:43:47 -0800107 config.tear_down_data(&f);
108
109 cq_verifier_destroy(cqv);
110}
111
Craig Tiller521423c2016-02-22 22:22:22 -0800112void ping(grpc_end2end_test_config config) {
Craig Tiller26dab312015-12-07 14:43:47 -0800113 GPR_ASSERT(config.feature_mask & FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION);
Yuchen Zengb4b6a0e2017-02-28 22:06:52 -0800114 test_ping(config, 0);
115 test_ping(config, 100);
Craig Tiller26dab312015-12-07 14:43:47 -0800116}
Craig Tiller9e9edbc2016-04-04 10:38:49 -0700117
118void ping_pre_init(void) {}