status_unittest.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. // Licensed to the Apache Software Foundation (ASF) under one
  2. // or more contributor license agreements. See the NOTICE file
  3. // distributed with this work for additional information
  4. // regarding copyright ownership. The ASF licenses this file
  5. // to you under the Apache License, Version 2.0 (the
  6. // "License"); you may not use this file except in compliance
  7. // with the License. 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,
  12. // software distributed under the License is distributed on an
  13. // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  14. // KIND, either express or implied. See the License for the
  15. // specific language governing permissions and limitations
  16. // under the License.
  17. #include <errno.h>
  18. #include <gtest/gtest.h>
  19. #include "butil/status.h"
  20. namespace {
  21. class StatusTest : public ::testing::Test{
  22. protected:
  23. StatusTest(){
  24. };
  25. virtual ~StatusTest(){};
  26. virtual void SetUp() {
  27. srand(time(0));
  28. };
  29. virtual void TearDown() {
  30. };
  31. };
  32. TEST_F(StatusTest, success_status) {
  33. std::ostringstream oss;
  34. butil::Status st;
  35. ASSERT_TRUE(st.ok());
  36. ASSERT_EQ(0, st.error_code());
  37. ASSERT_STREQ("OK", st.error_cstr());
  38. ASSERT_EQ("OK", st.error_str());
  39. oss.str("");
  40. oss << st;
  41. ASSERT_EQ("OK", oss.str());
  42. butil::Status st2(0, "blahblah");
  43. ASSERT_TRUE(st2.ok());
  44. ASSERT_EQ(0, st2.error_code());
  45. ASSERT_STREQ("OK", st2.error_cstr());
  46. ASSERT_EQ("OK", st2.error_str());
  47. oss.str("");
  48. oss << st2;
  49. ASSERT_EQ("OK", oss.str());
  50. butil::Status st3 = butil::Status::OK();
  51. ASSERT_TRUE(st3.ok());
  52. ASSERT_EQ(0, st3.error_code());
  53. ASSERT_STREQ("OK", st3.error_cstr());
  54. ASSERT_EQ("OK", st3.error_str());
  55. oss.str("");
  56. oss << st3;
  57. ASSERT_EQ("OK", oss.str());
  58. }
  59. #define NO_MEMORY_STR "No memory"
  60. #define NO_CPU_STR "No CPU"
  61. TEST_F(StatusTest, failed_status) {
  62. std::ostringstream oss;
  63. butil::Status st1(ENOMEM, NO_MEMORY_STR);
  64. ASSERT_FALSE(st1.ok());
  65. ASSERT_EQ(ENOMEM, st1.error_code());
  66. ASSERT_STREQ(NO_MEMORY_STR, st1.error_cstr());
  67. ASSERT_EQ(NO_MEMORY_STR, st1.error_str());
  68. oss.str("");
  69. oss << st1;
  70. ASSERT_EQ(NO_MEMORY_STR, oss.str());
  71. butil::Status st2(EINVAL, "%s%s", NO_MEMORY_STR, NO_CPU_STR);
  72. ASSERT_FALSE(st2.ok());
  73. ASSERT_EQ(EINVAL, st2.error_code());
  74. ASSERT_STREQ(NO_MEMORY_STR NO_CPU_STR, st2.error_cstr());
  75. ASSERT_EQ(NO_MEMORY_STR NO_CPU_STR, st2.error_str());
  76. oss.str("");
  77. oss << st2;
  78. ASSERT_EQ(NO_MEMORY_STR NO_CPU_STR, oss.str());
  79. butil::Status st3(ENOMEM, NO_MEMORY_STR);
  80. ASSERT_FALSE(st3.ok());
  81. ASSERT_EQ(ENOMEM, st3.error_code());
  82. ASSERT_STREQ(NO_MEMORY_STR, st3.error_cstr());
  83. ASSERT_EQ(NO_MEMORY_STR, st3.error_str());
  84. oss.str("");
  85. oss << st3;
  86. ASSERT_EQ(NO_MEMORY_STR, oss.str());
  87. butil::Status st4(EINVAL, "%s%s", NO_MEMORY_STR, NO_CPU_STR);
  88. ASSERT_FALSE(st4.ok());
  89. ASSERT_EQ(EINVAL, st4.error_code());
  90. ASSERT_STREQ(NO_MEMORY_STR NO_CPU_STR, st4.error_cstr());
  91. ASSERT_EQ(NO_MEMORY_STR NO_CPU_STR, st4.error_str());
  92. oss.str("");
  93. oss << st4;
  94. ASSERT_EQ(NO_MEMORY_STR NO_CPU_STR, oss.str());
  95. butil::Status st5(EINVAL, "Blah");
  96. ASSERT_FALSE(st5.ok());
  97. ASSERT_EQ(EINVAL, st5.error_code());
  98. ASSERT_STREQ("Blah", st5.error_cstr());
  99. ASSERT_EQ(std::string("Blah"), st5.error_str());
  100. oss.str("");
  101. oss << st5;
  102. ASSERT_EQ(std::string("Blah"), oss.str());
  103. }
  104. #define VERYLONGERROR \
  105. "verylongverylongverylongverylongverylongverylongverylongverylong" \
  106. "verylongverylongverylongverylongverylongverylongverylongverylong" \
  107. "verylongverylongverylongverylongverylongverylongverylongverylong" \
  108. "verylongverylongverylongverylongverylongverylongverylongverylong" \
  109. "verylongverylongverylongverylongverylongverylongverylongverylong" \
  110. "verylongverylongverylongverylongverylongverylongverylongverylong" \
  111. "verylongverylongverylongverylongverylongverylongverylongverylong" \
  112. "verylongverylongverylongverylongverylongverylongverylongverylong" \
  113. "verylongverylongverylongverylongverylongverylongverylongverylong" \
  114. "verylongverylongverylongverylongverylongverylongverylongverylong" \
  115. "verylongverylongverylongverylongverylongverylongverylongverylong" \
  116. " error"
  117. TEST_F(StatusTest, reset) {
  118. std::ostringstream oss;
  119. butil::Status st1(ENOMEM, NO_MEMORY_STR);
  120. ASSERT_FALSE(st1.ok());
  121. ASSERT_EQ(ENOMEM, st1.error_code());
  122. ASSERT_STREQ(NO_MEMORY_STR, st1.error_cstr());
  123. ASSERT_EQ(NO_MEMORY_STR, st1.error_str());
  124. oss.str("");
  125. oss << st1;
  126. ASSERT_EQ(NO_MEMORY_STR, oss.str());
  127. ASSERT_EQ(0, st1.set_error(EINVAL, "%s%s", NO_MEMORY_STR, NO_CPU_STR));
  128. ASSERT_FALSE(st1.ok());
  129. ASSERT_EQ(EINVAL, st1.error_code());
  130. ASSERT_STREQ(NO_MEMORY_STR NO_CPU_STR, st1.error_cstr());
  131. ASSERT_EQ(NO_MEMORY_STR NO_CPU_STR, st1.error_str());
  132. oss.str("");
  133. oss << st1;
  134. ASSERT_EQ(NO_MEMORY_STR NO_CPU_STR, oss.str());
  135. ASSERT_EQ(0, st1.set_error(ENOMEM, NO_MEMORY_STR));
  136. ASSERT_FALSE(st1.ok());
  137. ASSERT_EQ(ENOMEM, st1.error_code());
  138. ASSERT_STREQ(NO_MEMORY_STR, st1.error_cstr());
  139. ASSERT_EQ(NO_MEMORY_STR, st1.error_str());
  140. oss.str("");
  141. oss << st1;
  142. ASSERT_EQ(NO_MEMORY_STR, oss.str());
  143. st1.reset();
  144. ASSERT_TRUE(st1.ok());
  145. ASSERT_EQ(0, st1.error_code());
  146. ASSERT_STREQ("OK", st1.error_cstr());
  147. ASSERT_EQ("OK", st1.error_str());
  148. oss.str("");
  149. oss << st1;
  150. ASSERT_EQ("OK", oss.str());
  151. ASSERT_EQ(0, st1.set_error(ENOMEM, "%s", VERYLONGERROR));
  152. ASSERT_FALSE(st1.ok());
  153. ASSERT_EQ(ENOMEM, st1.error_code());
  154. ASSERT_STREQ(VERYLONGERROR, st1.error_cstr());
  155. ASSERT_EQ(VERYLONGERROR, st1.error_str());
  156. oss.str("");
  157. oss << st1;
  158. ASSERT_EQ(VERYLONGERROR, oss.str());
  159. }
  160. TEST_F(StatusTest, copy) {
  161. std::ostringstream oss;
  162. butil::Status st1(ENOMEM, NO_MEMORY_STR);
  163. ASSERT_FALSE(st1.ok());
  164. ASSERT_EQ(ENOMEM, st1.error_code());
  165. ASSERT_STREQ(NO_MEMORY_STR, st1.error_cstr());
  166. ASSERT_EQ(NO_MEMORY_STR, st1.error_str());
  167. oss.str("");
  168. oss << st1;
  169. ASSERT_EQ(NO_MEMORY_STR, oss.str());
  170. butil::Status st2;
  171. ASSERT_TRUE(st2.ok());
  172. ASSERT_EQ(0, st2.error_code());
  173. ASSERT_STREQ("OK", st2.error_cstr());
  174. ASSERT_EQ("OK", st2.error_str());
  175. oss.str("");
  176. oss << st2;
  177. ASSERT_EQ("OK", oss.str());
  178. st2 = st1;
  179. ASSERT_FALSE(st2.ok());
  180. ASSERT_EQ(ENOMEM, st2.error_code());
  181. ASSERT_STREQ(NO_MEMORY_STR, st2.error_cstr());
  182. ASSERT_EQ(NO_MEMORY_STR, st2.error_str());
  183. oss.str("");
  184. oss << st2;
  185. ASSERT_EQ(NO_MEMORY_STR, oss.str());
  186. ASSERT_EQ(0, st1.set_error(EINVAL, "%s%s", NO_MEMORY_STR, NO_CPU_STR));
  187. ASSERT_FALSE(st1.ok());
  188. ASSERT_EQ(EINVAL, st1.error_code());
  189. ASSERT_STREQ(NO_MEMORY_STR NO_CPU_STR, st1.error_cstr());
  190. ASSERT_EQ(NO_MEMORY_STR NO_CPU_STR, st1.error_str());
  191. oss.str("");
  192. oss << st1;
  193. ASSERT_EQ(NO_MEMORY_STR NO_CPU_STR, oss.str());
  194. ASSERT_FALSE(st2.ok());
  195. ASSERT_EQ(ENOMEM, st2.error_code());
  196. ASSERT_STREQ(NO_MEMORY_STR, st2.error_cstr());
  197. ASSERT_EQ(NO_MEMORY_STR, st2.error_str());
  198. oss.str("");
  199. oss << st2;
  200. ASSERT_EQ(NO_MEMORY_STR, oss.str());
  201. st2 = st1;
  202. ASSERT_FALSE(st2.ok());
  203. ASSERT_EQ(EINVAL, st2.error_code());
  204. ASSERT_STREQ(NO_MEMORY_STR NO_CPU_STR, st2.error_cstr());
  205. ASSERT_EQ(NO_MEMORY_STR NO_CPU_STR, st2.error_str());
  206. oss.str("");
  207. oss << st2;
  208. ASSERT_EQ(NO_MEMORY_STR NO_CPU_STR, oss.str());
  209. ASSERT_EQ(0, st1.set_error(ENOMEM, NO_MEMORY_STR));
  210. ASSERT_FALSE(st1.ok());
  211. ASSERT_EQ(ENOMEM, st1.error_code());
  212. ASSERT_STREQ(NO_MEMORY_STR, st1.error_cstr());
  213. ASSERT_EQ(NO_MEMORY_STR, st1.error_str());
  214. oss.str("");
  215. oss << st1;
  216. ASSERT_EQ(NO_MEMORY_STR, oss.str());
  217. // assign shorter to longer, no memory allocation.
  218. st2 = st1;
  219. ASSERT_FALSE(st2.ok());
  220. ASSERT_EQ(ENOMEM, st2.error_code());
  221. ASSERT_STREQ(NO_MEMORY_STR, st2.error_cstr());
  222. ASSERT_EQ(NO_MEMORY_STR, st2.error_str());
  223. oss.str("");
  224. oss << st2;
  225. ASSERT_EQ(NO_MEMORY_STR, oss.str());
  226. }
  227. TEST_F(StatusTest, message_has_zero) {
  228. std::ostringstream oss;
  229. char str[32] = "hello world";
  230. butil::StringPiece slice(str);
  231. ASSERT_EQ(11UL, slice.as_string().size());
  232. str[5] = '\0';
  233. ASSERT_EQ(11UL, slice.as_string().size());
  234. butil::Status st1(ENOMEM, slice);
  235. ASSERT_FALSE(st1.ok());
  236. ASSERT_EQ(ENOMEM, st1.error_code());
  237. ASSERT_STREQ("hello", st1.error_cstr());
  238. oss.str("");
  239. oss << st1;
  240. ASSERT_EQ(st1.error_str(), oss.str());
  241. }
  242. }