error_test.cc 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*
  2. *
  3. * Copyright 2017 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/iomgr/error.h"
  19. #include <string.h>
  20. #include <gmock/gmock.h>
  21. #include <grpc/grpc.h>
  22. #include <grpc/support/alloc.h>
  23. #include <grpc/support/log.h>
  24. #include "test/core/util/test_config.h"
  25. TEST(ErrorTest, SetGetInt) {
  26. grpc_error_handle error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test");
  27. EXPECT_NE(error, GRPC_ERROR_NONE);
  28. intptr_t i = 0;
  29. #ifndef NDEBUG
  30. // GRPC_ERROR_INT_FILE_LINE is for debug only
  31. EXPECT_TRUE(grpc_error_get_int(error, GRPC_ERROR_INT_FILE_LINE, &i));
  32. EXPECT_TRUE(i); // line set will never be 0
  33. #endif
  34. EXPECT_TRUE(!grpc_error_get_int(error, GRPC_ERROR_INT_ERRNO, &i));
  35. EXPECT_TRUE(!grpc_error_get_int(error, GRPC_ERROR_INT_SIZE, &i));
  36. intptr_t errnumber = 314;
  37. error = grpc_error_set_int(error, GRPC_ERROR_INT_ERRNO, errnumber);
  38. EXPECT_TRUE(grpc_error_get_int(error, GRPC_ERROR_INT_ERRNO, &i));
  39. EXPECT_EQ(i, errnumber);
  40. intptr_t http = 2;
  41. error = grpc_error_set_int(error, GRPC_ERROR_INT_HTTP2_ERROR, http);
  42. EXPECT_TRUE(grpc_error_get_int(error, GRPC_ERROR_INT_HTTP2_ERROR, &i));
  43. EXPECT_EQ(i, http);
  44. GRPC_ERROR_UNREF(error);
  45. }
  46. TEST(ErrorTest, SetGetStr) {
  47. grpc_error_handle error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test");
  48. std::string str;
  49. EXPECT_TRUE(!grpc_error_get_str(error, GRPC_ERROR_STR_SYSCALL, &str));
  50. EXPECT_TRUE(!grpc_error_get_str(error, GRPC_ERROR_STR_TSI_ERROR, &str));
  51. #ifndef NDEBUG
  52. // GRPC_ERROR_STR_FILE is for debug only
  53. EXPECT_TRUE(grpc_error_get_str(error, GRPC_ERROR_STR_FILE, &str));
  54. EXPECT_THAT(str, testing::HasSubstr("error_test.c"));
  55. // __FILE__ expands differently on
  56. // Windows. All should at least
  57. // contain error_test.c
  58. #endif
  59. EXPECT_TRUE(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION, &str));
  60. EXPECT_EQ(str, "Test");
  61. error =
  62. grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "longer message");
  63. EXPECT_TRUE(grpc_error_get_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, &str));
  64. EXPECT_EQ(str, "longer message");
  65. GRPC_ERROR_UNREF(error);
  66. }
  67. TEST(ErrorTest, CopyAndUnRef) {
  68. // error1 has one ref
  69. grpc_error_handle error1 =
  70. grpc_error_set_str(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test"),
  71. GRPC_ERROR_STR_GRPC_MESSAGE, "message");
  72. std::string str;
  73. EXPECT_TRUE(grpc_error_get_str(error1, GRPC_ERROR_STR_GRPC_MESSAGE, &str));
  74. EXPECT_EQ(str, "message");
  75. // error 1 has two refs
  76. (void)GRPC_ERROR_REF(error1);
  77. // this gives error3 a ref to the new error, and decrements error1 to one ref
  78. grpc_error_handle error3 =
  79. grpc_error_set_str(error1, GRPC_ERROR_STR_SYSCALL, "syscall");
  80. EXPECT_NE(error3, error1); // should not be the same because of extra ref
  81. EXPECT_TRUE(grpc_error_get_str(error3, GRPC_ERROR_STR_GRPC_MESSAGE, &str));
  82. EXPECT_EQ(str, "message");
  83. // error 1 should not have a syscall but 3 should
  84. EXPECT_TRUE(!grpc_error_get_str(error1, GRPC_ERROR_STR_SYSCALL, &str));
  85. EXPECT_TRUE(grpc_error_get_str(error3, GRPC_ERROR_STR_SYSCALL, &str));
  86. EXPECT_EQ(str, "syscall");
  87. GRPC_ERROR_UNREF(error1);
  88. GRPC_ERROR_UNREF(error3);
  89. }
  90. TEST(ErrorTest, CreateReferencing) {
  91. grpc_error_handle child =
  92. grpc_error_set_str(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Child"),
  93. GRPC_ERROR_STR_GRPC_MESSAGE, "message");
  94. grpc_error_handle parent =
  95. GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Parent", &child, 1);
  96. EXPECT_NE(parent, GRPC_ERROR_NONE);
  97. GRPC_ERROR_UNREF(child);
  98. GRPC_ERROR_UNREF(parent);
  99. }
  100. TEST(ErrorTest, CreateReferencingMany) {
  101. grpc_error_handle children[3];
  102. children[0] =
  103. grpc_error_set_str(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Child1"),
  104. GRPC_ERROR_STR_GRPC_MESSAGE, "message");
  105. children[1] =
  106. grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Child2"),
  107. GRPC_ERROR_INT_HTTP2_ERROR, 5);
  108. children[2] =
  109. grpc_error_set_str(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Child3"),
  110. GRPC_ERROR_STR_GRPC_MESSAGE, "message 3");
  111. grpc_error_handle parent =
  112. GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Parent", children, 3);
  113. EXPECT_NE(parent, GRPC_ERROR_NONE);
  114. for (size_t i = 0; i < 3; ++i) {
  115. GRPC_ERROR_UNREF(children[i]);
  116. }
  117. GRPC_ERROR_UNREF(parent);
  118. }
  119. TEST(ErrorTest, PrintErrorString) {
  120. grpc_error_handle error =
  121. grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"),
  122. GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNIMPLEMENTED);
  123. error = grpc_error_set_int(error, GRPC_ERROR_INT_SIZE, 666);
  124. error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "message");
  125. // gpr_log(GPR_DEBUG, "%s", grpc_error_std_string(error).c_str());
  126. GRPC_ERROR_UNREF(error);
  127. }
  128. TEST(ErrorTest, PrintErrorStringReference) {
  129. grpc_error_handle children[2];
  130. children[0] = grpc_error_set_str(
  131. grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("1"),
  132. GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNIMPLEMENTED),
  133. GRPC_ERROR_STR_GRPC_MESSAGE, "message for child 1");
  134. children[1] = grpc_error_set_str(
  135. grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("2sd"),
  136. GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL),
  137. GRPC_ERROR_STR_GRPC_MESSAGE, "message for child 2");
  138. grpc_error_handle parent =
  139. GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Parent", children, 2);
  140. for (size_t i = 0; i < 2; ++i) {
  141. GRPC_ERROR_UNREF(children[i]);
  142. }
  143. GRPC_ERROR_UNREF(parent);
  144. }
  145. TEST(ErrorTest, TestOsError) {
  146. int fake_errno = 5;
  147. const char* syscall = "syscall name";
  148. grpc_error_handle error = GRPC_OS_ERROR(fake_errno, syscall);
  149. intptr_t i = 0;
  150. EXPECT_TRUE(grpc_error_get_int(error, GRPC_ERROR_INT_ERRNO, &i));
  151. EXPECT_EQ(i, fake_errno);
  152. std::string str;
  153. EXPECT_TRUE(grpc_error_get_str(error, GRPC_ERROR_STR_SYSCALL, &str));
  154. EXPECT_EQ(str, syscall);
  155. GRPC_ERROR_UNREF(error);
  156. }
  157. TEST(ErrorTest, Overflow) {
  158. // absl::Status doesn't have a limit so there is no overflow
  159. #ifndef GRPC_ERROR_IS_ABSEIL_STATUS
  160. grpc_error_handle error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Overflow");
  161. for (size_t i = 0; i < 150; ++i) {
  162. error = grpc_error_add_child(error,
  163. GRPC_ERROR_CREATE_FROM_STATIC_STRING("Child"));
  164. }
  165. error = grpc_error_set_int(error, GRPC_ERROR_INT_HTTP2_ERROR, 5);
  166. error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
  167. "message for child 2");
  168. error = grpc_error_set_int(error, GRPC_ERROR_INT_GRPC_STATUS, 5);
  169. intptr_t i;
  170. EXPECT_TRUE(grpc_error_get_int(error, GRPC_ERROR_INT_HTTP2_ERROR, &i));
  171. EXPECT_EQ(i, 5);
  172. EXPECT_TRUE(!grpc_error_get_int(error, GRPC_ERROR_INT_GRPC_STATUS, &i));
  173. error = grpc_error_set_int(error, GRPC_ERROR_INT_HTTP2_ERROR, 10);
  174. EXPECT_TRUE(grpc_error_get_int(error, GRPC_ERROR_INT_HTTP2_ERROR, &i));
  175. EXPECT_EQ(i, 10);
  176. GRPC_ERROR_UNREF(error);
  177. #endif
  178. }
  179. int main(int argc, char** argv) {
  180. grpc::testing::TestEnvironment env(argc, argv);
  181. ::testing::InitGoogleTest(&argc, argv);
  182. grpc_init();
  183. int retval = RUN_ALL_TESTS();
  184. grpc_shutdown();
  185. return retval;
  186. }