connectivity_state_test.cc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. *
  3. * Copyright 2015 gRPC authors.
  4. *
  5. * 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
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * 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.
  16. *
  17. */
  18. #include "src/core/lib/transport/connectivity_state.h"
  19. #include <string.h>
  20. #include <grpc/support/log.h>
  21. #include "test/core/util/test_config.h"
  22. #define THE_ARG ((void*)(size_t)0xcafebabe)
  23. int g_counter;
  24. static void must_succeed(void* arg, grpc_error* error) {
  25. GPR_ASSERT(error == GRPC_ERROR_NONE);
  26. GPR_ASSERT(arg == THE_ARG);
  27. g_counter++;
  28. }
  29. static void must_fail(void* arg, grpc_error* error) {
  30. GPR_ASSERT(error != GRPC_ERROR_NONE);
  31. GPR_ASSERT(arg == THE_ARG);
  32. g_counter++;
  33. }
  34. static void test_connectivity_state_name(void) {
  35. gpr_log(GPR_DEBUG, "test_connectivity_state_name");
  36. GPR_ASSERT(0 ==
  37. strcmp(grpc_connectivity_state_name(GRPC_CHANNEL_IDLE), "IDLE"));
  38. GPR_ASSERT(0 == strcmp(grpc_connectivity_state_name(GRPC_CHANNEL_CONNECTING),
  39. "CONNECTING"));
  40. GPR_ASSERT(0 ==
  41. strcmp(grpc_connectivity_state_name(GRPC_CHANNEL_READY), "READY"));
  42. GPR_ASSERT(
  43. 0 == strcmp(grpc_connectivity_state_name(GRPC_CHANNEL_TRANSIENT_FAILURE),
  44. "TRANSIENT_FAILURE"));
  45. GPR_ASSERT(0 == strcmp(grpc_connectivity_state_name(GRPC_CHANNEL_SHUTDOWN),
  46. "SHUTDOWN"));
  47. }
  48. static void test_check(void) {
  49. grpc_connectivity_state_tracker tracker;
  50. grpc_core::ExecCtx _local_exec_ctx;
  51. grpc_error* error;
  52. gpr_log(GPR_DEBUG, "test_check");
  53. grpc_connectivity_state_init(&tracker, GRPC_CHANNEL_IDLE, "xxx");
  54. GPR_ASSERT(grpc_connectivity_state_get(&tracker, &error) ==
  55. GRPC_CHANNEL_IDLE);
  56. GPR_ASSERT(grpc_connectivity_state_check(&tracker) == GRPC_CHANNEL_IDLE);
  57. GPR_ASSERT(error == GRPC_ERROR_NONE);
  58. grpc_connectivity_state_destroy(&tracker);
  59. }
  60. static void test_subscribe_then_unsubscribe(void) {
  61. grpc_connectivity_state_tracker tracker;
  62. grpc_closure* closure =
  63. GRPC_CLOSURE_CREATE(must_fail, THE_ARG, grpc_schedule_on_exec_ctx);
  64. grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
  65. grpc_core::ExecCtx _local_exec_ctx;
  66. gpr_log(GPR_DEBUG, "test_subscribe_then_unsubscribe");
  67. g_counter = 0;
  68. grpc_connectivity_state_init(&tracker, GRPC_CHANNEL_IDLE, "xxx");
  69. GPR_ASSERT(grpc_connectivity_state_notify_on_state_change(&tracker, &state,
  70. closure));
  71. grpc_core::ExecCtx::Get()->Flush();
  72. GPR_ASSERT(state == GRPC_CHANNEL_IDLE);
  73. GPR_ASSERT(g_counter == 0);
  74. grpc_connectivity_state_notify_on_state_change(&tracker, NULL, closure);
  75. grpc_core::ExecCtx::Get()->Flush();
  76. GPR_ASSERT(state == GRPC_CHANNEL_IDLE);
  77. GPR_ASSERT(g_counter == 1);
  78. grpc_connectivity_state_destroy(&tracker);
  79. }
  80. static void test_subscribe_then_destroy(void) {
  81. grpc_connectivity_state_tracker tracker;
  82. grpc_closure* closure =
  83. GRPC_CLOSURE_CREATE(must_succeed, THE_ARG, grpc_schedule_on_exec_ctx);
  84. grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
  85. grpc_core::ExecCtx _local_exec_ctx;
  86. gpr_log(GPR_DEBUG, "test_subscribe_then_destroy");
  87. g_counter = 0;
  88. grpc_connectivity_state_init(&tracker, GRPC_CHANNEL_IDLE, "xxx");
  89. GPR_ASSERT(grpc_connectivity_state_notify_on_state_change(&tracker, &state,
  90. closure));
  91. grpc_core::ExecCtx::Get()->Flush();
  92. GPR_ASSERT(state == GRPC_CHANNEL_IDLE);
  93. GPR_ASSERT(g_counter == 0);
  94. grpc_connectivity_state_destroy(&tracker);
  95. GPR_ASSERT(state == GRPC_CHANNEL_SHUTDOWN);
  96. GPR_ASSERT(g_counter == 1);
  97. }
  98. static void test_subscribe_with_failure_then_destroy(void) {
  99. grpc_connectivity_state_tracker tracker;
  100. grpc_closure* closure =
  101. GRPC_CLOSURE_CREATE(must_fail, THE_ARG, grpc_schedule_on_exec_ctx);
  102. grpc_connectivity_state state = GRPC_CHANNEL_SHUTDOWN;
  103. grpc_core::ExecCtx _local_exec_ctx;
  104. gpr_log(GPR_DEBUG, "test_subscribe_with_failure_then_destroy");
  105. g_counter = 0;
  106. grpc_connectivity_state_init(&tracker, GRPC_CHANNEL_SHUTDOWN, "xxx");
  107. GPR_ASSERT(0 == grpc_connectivity_state_notify_on_state_change(
  108. &tracker, &state, closure));
  109. grpc_core::ExecCtx::Get()->Flush();
  110. GPR_ASSERT(state == GRPC_CHANNEL_SHUTDOWN);
  111. GPR_ASSERT(g_counter == 0);
  112. grpc_connectivity_state_destroy(&tracker);
  113. GPR_ASSERT(state == GRPC_CHANNEL_SHUTDOWN);
  114. GPR_ASSERT(g_counter == 1);
  115. }
  116. int main(int argc, char** argv) {
  117. grpc_test_init(argc, argv);
  118. grpc_connectivity_state_trace.value = 1;
  119. test_connectivity_state_name();
  120. test_check();
  121. test_subscribe_then_unsubscribe();
  122. test_subscribe_then_destroy();
  123. test_subscribe_with_failure_then_destroy();
  124. return 0;
  125. }