aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar yang-g <yangg@google.com>2015-09-18 01:24:14 -0700
committerGravatar yang-g <yangg@google.com>2015-09-18 01:24:14 -0700
commitd886f339399e0936e26a55fd71519b2db588d2fc (patch)
treef72655d675888e292780182deb70cee71a393bbc
parenta63fe4e259d572b591ec8b4ea21101d242be4f62 (diff)
add a test
-rw-r--r--src/core/surface/channel_connectivity.c2
-rw-r--r--test/cpp/end2end/end2end_test.cc18
2 files changed, 19 insertions, 1 deletions
diff --git a/src/core/surface/channel_connectivity.c b/src/core/surface/channel_connectivity.c
index e89c80795a..5c55ad3655 100644
--- a/src/core/surface/channel_connectivity.c
+++ b/src/core/surface/channel_connectivity.c
@@ -78,6 +78,7 @@ typedef struct {
} state_watcher;
static void delete_state_watcher(state_watcher *w) {
+ GRPC_CHANNEL_INTERNAL_UNREF(w->channel, "watch_connectivity");
gpr_mu_destroy(&w->mu);
gpr_free(w);
}
@@ -117,7 +118,6 @@ static void partly_done(state_watcher *w, int due_to_completion) {
grpc_channel_get_channel_stack(w->channel));
grpc_client_channel_del_interested_party(client_channel_elem,
grpc_cq_pollset(w->cq));
- GRPC_CHANNEL_INTERNAL_UNREF(w->channel, "watch_connectivity");
}
gpr_mu_unlock(&w->mu);
if (due_to_completion) {
diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc
index bd829d96e1..c294d59454 100644
--- a/test/cpp/end2end/end2end_test.cc
+++ b/test/cpp/end2end/end2end_test.cc
@@ -1076,6 +1076,24 @@ TEST_F(End2endTest, ChannelState) {
EXPECT_EQ(GRPC_CHANNEL_CONNECTING, channel_->GetState(false));
}
+// Takes 10s.
+TEST_F(End2endTest, ChannelStateTimeout) {
+ int port = grpc_pick_unused_port_or_die();
+ std::ostringstream server_address;
+ server_address << "127.0.0.1:" << port;
+ // Channel to non-existing server
+ auto channel = CreateChannel(server_address.str(), InsecureCredentials());
+ // Start IDLE
+ EXPECT_EQ(GRPC_CHANNEL_IDLE, channel->GetState(true));
+
+ auto state = GRPC_CHANNEL_IDLE;
+ for (int i = 0; i < 10; i++) {
+ channel->WaitForStateChange(state, std::chrono::system_clock::now() +
+ std::chrono::milliseconds(1000));
+ state = channel->GetState(false);
+ }
+}
+
// Talking to a non-existing service.
TEST_F(End2endTest, NonExistingService) {
ResetChannel();