status_conversion_test.cc 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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/status_conversion.h"
  19. #include <grpc/support/log.h>
  20. #include "test/core/util/test_config.h"
  21. #define GRPC_STATUS_TO_HTTP2_ERROR(a, b) \
  22. GPR_ASSERT(grpc_status_to_http2_error(a) == (b))
  23. #define HTTP2_ERROR_TO_GRPC_STATUS(a, deadline, b) \
  24. do { \
  25. grpc_core::ExecCtx exec_ctx; \
  26. GPR_ASSERT(grpc_http2_error_to_grpc_status(a, deadline) == (b)); \
  27. \
  28. } while (0)
  29. #define GRPC_STATUS_TO_HTTP2_STATUS(a, b) \
  30. GPR_ASSERT(grpc_status_to_http2_status(a) == (b))
  31. #define HTTP2_STATUS_TO_GRPC_STATUS(a, b) \
  32. GPR_ASSERT(grpc_http2_status_to_grpc_status(a) == (b))
  33. static void test_grpc_status_to_http2_error() {
  34. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_OK, GRPC_HTTP2_NO_ERROR);
  35. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_CANCELLED, GRPC_HTTP2_CANCEL);
  36. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_UNKNOWN, GRPC_HTTP2_INTERNAL_ERROR);
  37. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_INVALID_ARGUMENT,
  38. GRPC_HTTP2_INTERNAL_ERROR);
  39. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_DEADLINE_EXCEEDED, GRPC_HTTP2_CANCEL);
  40. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_NOT_FOUND, GRPC_HTTP2_INTERNAL_ERROR);
  41. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_ALREADY_EXISTS,
  42. GRPC_HTTP2_INTERNAL_ERROR);
  43. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_PERMISSION_DENIED,
  44. GRPC_HTTP2_INADEQUATE_SECURITY);
  45. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_UNAUTHENTICATED,
  46. GRPC_HTTP2_INTERNAL_ERROR);
  47. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_RESOURCE_EXHAUSTED,
  48. GRPC_HTTP2_ENHANCE_YOUR_CALM);
  49. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_FAILED_PRECONDITION,
  50. GRPC_HTTP2_INTERNAL_ERROR);
  51. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_ABORTED, GRPC_HTTP2_INTERNAL_ERROR);
  52. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_OUT_OF_RANGE,
  53. GRPC_HTTP2_INTERNAL_ERROR);
  54. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_UNIMPLEMENTED,
  55. GRPC_HTTP2_INTERNAL_ERROR);
  56. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_INTERNAL, GRPC_HTTP2_INTERNAL_ERROR);
  57. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_UNAVAILABLE,
  58. GRPC_HTTP2_REFUSED_STREAM);
  59. GRPC_STATUS_TO_HTTP2_ERROR(GRPC_STATUS_DATA_LOSS, GRPC_HTTP2_INTERNAL_ERROR);
  60. }
  61. static void test_grpc_status_to_http2_status() {
  62. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_OK, 200);
  63. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_CANCELLED, 200);
  64. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_UNKNOWN, 200);
  65. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_INVALID_ARGUMENT, 200);
  66. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_DEADLINE_EXCEEDED, 200);
  67. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_NOT_FOUND, 200);
  68. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_ALREADY_EXISTS, 200);
  69. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_PERMISSION_DENIED, 200);
  70. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_UNAUTHENTICATED, 200);
  71. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_RESOURCE_EXHAUSTED, 200);
  72. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_FAILED_PRECONDITION, 200);
  73. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_ABORTED, 200);
  74. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_OUT_OF_RANGE, 200);
  75. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_UNIMPLEMENTED, 200);
  76. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_INTERNAL, 200);
  77. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_UNAVAILABLE, 200);
  78. GRPC_STATUS_TO_HTTP2_STATUS(GRPC_STATUS_DATA_LOSS, 200);
  79. }
  80. static void test_http2_error_to_grpc_status() {
  81. const grpc_core::Timestamp before_deadline =
  82. grpc_core::Timestamp::InfFuture();
  83. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_NO_ERROR, before_deadline,
  84. GRPC_STATUS_INTERNAL);
  85. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_PROTOCOL_ERROR, before_deadline,
  86. GRPC_STATUS_INTERNAL);
  87. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_INTERNAL_ERROR, before_deadline,
  88. GRPC_STATUS_INTERNAL);
  89. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_FLOW_CONTROL_ERROR, before_deadline,
  90. GRPC_STATUS_INTERNAL);
  91. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_SETTINGS_TIMEOUT, before_deadline,
  92. GRPC_STATUS_INTERNAL);
  93. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_STREAM_CLOSED, before_deadline,
  94. GRPC_STATUS_INTERNAL);
  95. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_FRAME_SIZE_ERROR, before_deadline,
  96. GRPC_STATUS_INTERNAL);
  97. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_REFUSED_STREAM, before_deadline,
  98. GRPC_STATUS_UNAVAILABLE);
  99. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_CANCEL, before_deadline,
  100. GRPC_STATUS_CANCELLED);
  101. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_COMPRESSION_ERROR, before_deadline,
  102. GRPC_STATUS_INTERNAL);
  103. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_CONNECT_ERROR, before_deadline,
  104. GRPC_STATUS_INTERNAL);
  105. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_ENHANCE_YOUR_CALM, before_deadline,
  106. GRPC_STATUS_RESOURCE_EXHAUSTED);
  107. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_INADEQUATE_SECURITY, before_deadline,
  108. GRPC_STATUS_PERMISSION_DENIED);
  109. const grpc_core::Timestamp after_deadline;
  110. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_NO_ERROR, after_deadline,
  111. GRPC_STATUS_INTERNAL);
  112. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_PROTOCOL_ERROR, after_deadline,
  113. GRPC_STATUS_INTERNAL);
  114. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_INTERNAL_ERROR, after_deadline,
  115. GRPC_STATUS_INTERNAL);
  116. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_FLOW_CONTROL_ERROR, after_deadline,
  117. GRPC_STATUS_INTERNAL);
  118. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_SETTINGS_TIMEOUT, after_deadline,
  119. GRPC_STATUS_INTERNAL);
  120. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_STREAM_CLOSED, after_deadline,
  121. GRPC_STATUS_INTERNAL);
  122. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_FRAME_SIZE_ERROR, after_deadline,
  123. GRPC_STATUS_INTERNAL);
  124. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_REFUSED_STREAM, after_deadline,
  125. GRPC_STATUS_UNAVAILABLE);
  126. // We only have millisecond granularity in our timing code. This sleeps for 5
  127. // millis to ensure that the status conversion code will pick up the fact
  128. // that the deadline has expired.
  129. gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
  130. gpr_time_from_millis(5, GPR_TIMESPAN)));
  131. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_CANCEL, after_deadline,
  132. GRPC_STATUS_DEADLINE_EXCEEDED);
  133. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_COMPRESSION_ERROR, after_deadline,
  134. GRPC_STATUS_INTERNAL);
  135. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_CONNECT_ERROR, after_deadline,
  136. GRPC_STATUS_INTERNAL);
  137. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_ENHANCE_YOUR_CALM, after_deadline,
  138. GRPC_STATUS_RESOURCE_EXHAUSTED);
  139. HTTP2_ERROR_TO_GRPC_STATUS(GRPC_HTTP2_INADEQUATE_SECURITY, after_deadline,
  140. GRPC_STATUS_PERMISSION_DENIED);
  141. }
  142. static void test_http2_status_to_grpc_status() {
  143. HTTP2_STATUS_TO_GRPC_STATUS(200, GRPC_STATUS_OK);
  144. HTTP2_STATUS_TO_GRPC_STATUS(400, GRPC_STATUS_INTERNAL);
  145. HTTP2_STATUS_TO_GRPC_STATUS(401, GRPC_STATUS_UNAUTHENTICATED);
  146. HTTP2_STATUS_TO_GRPC_STATUS(403, GRPC_STATUS_PERMISSION_DENIED);
  147. HTTP2_STATUS_TO_GRPC_STATUS(404, GRPC_STATUS_UNIMPLEMENTED);
  148. HTTP2_STATUS_TO_GRPC_STATUS(409, GRPC_STATUS_UNKNOWN);
  149. HTTP2_STATUS_TO_GRPC_STATUS(412, GRPC_STATUS_UNKNOWN);
  150. HTTP2_STATUS_TO_GRPC_STATUS(429, GRPC_STATUS_UNAVAILABLE);
  151. HTTP2_STATUS_TO_GRPC_STATUS(499, GRPC_STATUS_UNKNOWN);
  152. HTTP2_STATUS_TO_GRPC_STATUS(500, GRPC_STATUS_UNKNOWN);
  153. HTTP2_STATUS_TO_GRPC_STATUS(502, GRPC_STATUS_UNAVAILABLE);
  154. HTTP2_STATUS_TO_GRPC_STATUS(503, GRPC_STATUS_UNAVAILABLE);
  155. HTTP2_STATUS_TO_GRPC_STATUS(504, GRPC_STATUS_UNAVAILABLE);
  156. }
  157. int main(int argc, char** argv) {
  158. grpc::testing::TestEnvironment env(argc, argv);
  159. grpc_init();
  160. test_grpc_status_to_http2_error();
  161. test_grpc_status_to_http2_status();
  162. test_http2_error_to_grpc_status();
  163. test_http2_status_to_grpc_status();
  164. /* check all status values can be converted */
  165. for (int i = 0; i <= 999; i++) {
  166. grpc_http2_status_to_grpc_status(i);
  167. }
  168. grpc_shutdown();
  169. return 0;
  170. }