bvar_status_unittest.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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. // Date 2014/10/13 19:47:59
  18. #include <pthread.h> // pthread_*
  19. #include <cstddef>
  20. #include <memory>
  21. #include <iostream>
  22. #include <sstream>
  23. #include "butil/time.h"
  24. #include "butil/macros.h"
  25. #include "bvar/bvar.h"
  26. #include <gtest/gtest.h>
  27. namespace {
  28. class StatusTest : public testing::Test {
  29. protected:
  30. void SetUp() {
  31. }
  32. void TearDown() {
  33. ASSERT_EQ(0UL, bvar::Variable::count_exposed());
  34. }
  35. };
  36. TEST_F(StatusTest, status) {
  37. bvar::Status<std::string> st1;
  38. st1.set_value("hello %d", 9);
  39. #ifdef BAIDU_INTERNAL
  40. boost::any v1;
  41. st1.get_value(&v1);
  42. ASSERT_EQ("hello 9", boost::any_cast<std::string>(v1));
  43. #endif
  44. ASSERT_EQ(0, st1.expose("var1"));
  45. ASSERT_EQ("hello 9", bvar::Variable::describe_exposed("var1"));
  46. ASSERT_EQ("\"hello 9\"", bvar::Variable::describe_exposed("var1", true));
  47. std::vector<std::string> vars;
  48. bvar::Variable::list_exposed(&vars);
  49. ASSERT_EQ(1UL, vars.size());
  50. ASSERT_EQ("var1", vars[0]);
  51. ASSERT_EQ(1UL, bvar::Variable::count_exposed());
  52. bvar::Status<std::string> st2;
  53. st2.set_value("world %d", 10);
  54. ASSERT_EQ(-1, st2.expose("var1"));
  55. ASSERT_EQ(1UL, bvar::Variable::count_exposed());
  56. ASSERT_EQ("world 10", st2.get_description());
  57. ASSERT_EQ("hello 9", bvar::Variable::describe_exposed("var1"));
  58. ASSERT_EQ(1UL, bvar::Variable::count_exposed());
  59. ASSERT_TRUE(st1.hide());
  60. ASSERT_EQ(0UL, bvar::Variable::count_exposed());
  61. ASSERT_EQ("", bvar::Variable::describe_exposed("var1"));
  62. ASSERT_EQ(0, st1.expose("var1"));
  63. ASSERT_EQ(1UL, bvar::Variable::count_exposed());
  64. ASSERT_EQ("hello 9",
  65. bvar::Variable::describe_exposed("var1"));
  66. ASSERT_EQ(0, st2.expose("var2"));
  67. ASSERT_EQ(2UL, bvar::Variable::count_exposed());
  68. ASSERT_EQ("hello 9", bvar::Variable::describe_exposed("var1"));
  69. ASSERT_EQ("world 10", bvar::Variable::describe_exposed("var2"));
  70. bvar::Variable::list_exposed(&vars);
  71. ASSERT_EQ(2UL, vars.size());
  72. ASSERT_EQ("var1", vars[0]);
  73. ASSERT_EQ("var2", vars[1]);
  74. ASSERT_TRUE(st2.hide());
  75. ASSERT_EQ(1UL, bvar::Variable::count_exposed());
  76. ASSERT_EQ("", bvar::Variable::describe_exposed("var2"));
  77. bvar::Variable::list_exposed(&vars);
  78. ASSERT_EQ(1UL, vars.size());
  79. ASSERT_EQ("var1", vars[0]);
  80. st2.expose("var2 again");
  81. ASSERT_EQ("world 10", bvar::Variable::describe_exposed("var2_again"));
  82. bvar::Variable::list_exposed(&vars);
  83. ASSERT_EQ(2UL, vars.size());
  84. ASSERT_EQ("var1", vars[0]);
  85. ASSERT_EQ("var2_again", vars[1]);
  86. ASSERT_EQ(2UL, bvar::Variable::count_exposed());
  87. bvar::Status<std::string> st3("var3", "foobar");
  88. ASSERT_EQ("var3", st3.name());
  89. ASSERT_EQ(3UL, bvar::Variable::count_exposed());
  90. ASSERT_EQ("foobar", bvar::Variable::describe_exposed("var3"));
  91. bvar::Variable::list_exposed(&vars);
  92. ASSERT_EQ(3UL, vars.size());
  93. ASSERT_EQ("var1", vars[0]);
  94. ASSERT_EQ("var3", vars[1]);
  95. ASSERT_EQ("var2_again", vars[2]);
  96. ASSERT_EQ(3UL, bvar::Variable::count_exposed());
  97. bvar::Status<int> st4("var4", 9);
  98. ASSERT_EQ("var4", st4.name());
  99. ASSERT_EQ(4UL, bvar::Variable::count_exposed());
  100. #ifdef BAIDU_INTERNAL
  101. boost::any v4;
  102. st4.get_value(&v4);
  103. ASSERT_EQ(9, boost::any_cast<int>(v4));
  104. #endif
  105. ASSERT_EQ("9", bvar::Variable::describe_exposed("var4"));
  106. bvar::Variable::list_exposed(&vars);
  107. ASSERT_EQ(4UL, vars.size());
  108. ASSERT_EQ("var1", vars[0]);
  109. ASSERT_EQ("var3", vars[1]);
  110. ASSERT_EQ("var4", vars[2]);
  111. ASSERT_EQ("var2_again", vars[3]);
  112. bvar::Status<void*> st5((void*)19UL);
  113. LOG(INFO) << st5;
  114. #ifdef BAIDU_INTERNAL
  115. boost::any v5;
  116. st5.get_value(&v5);
  117. ASSERT_EQ((void*)19UL, boost::any_cast<void*>(v5));
  118. #endif
  119. ASSERT_EQ("0x13", st5.get_description());
  120. }
  121. void print1(std::ostream& os, void* arg) {
  122. os << arg;
  123. }
  124. int64_t print2(void* arg) {
  125. return *(int64_t*)arg;
  126. }
  127. TEST_F(StatusTest, passive_status) {
  128. bvar::BasicPassiveStatus<std::string> st1("var11", print1, (void*)9UL);
  129. LOG(INFO) << st1;
  130. #ifdef BAIDU_INTERNAL
  131. boost::any v1;
  132. st1.get_value(&v1);
  133. ASSERT_EQ("0x9", boost::any_cast<std::string>(v1));
  134. #endif
  135. std::ostringstream ss;
  136. ASSERT_EQ(0, bvar::Variable::describe_exposed("var11", ss));
  137. ASSERT_EQ("0x9", ss.str());
  138. std::vector<std::string> vars;
  139. bvar::Variable::list_exposed(&vars);
  140. ASSERT_EQ(1UL, vars.size());
  141. ASSERT_EQ("var11", vars[0]);
  142. ASSERT_EQ(1UL, bvar::Variable::count_exposed());
  143. int64_t tmp2 = 9;
  144. bvar::BasicPassiveStatus<int64_t> st2("var12", print2, &tmp2);
  145. #ifdef BAIDU_INTERNAL
  146. boost::any v2;
  147. st2.get_value(&v2);
  148. try {
  149. boost::any_cast<int32_t>(v2);
  150. ASSERT_TRUE(false);
  151. } catch (boost::bad_any_cast & e) {
  152. LOG(INFO) << "Casting int64_t to int32_t throws.";
  153. }
  154. ASSERT_EQ(9, boost::any_cast<int64_t>(v2));
  155. #endif
  156. ss.str("");
  157. ASSERT_EQ(0, bvar::Variable::describe_exposed("var12", ss));
  158. ASSERT_EQ("9", ss.str());
  159. bvar::Variable::list_exposed(&vars);
  160. ASSERT_EQ(2UL, vars.size());
  161. ASSERT_EQ("var11", vars[0]);
  162. ASSERT_EQ("var12", vars[1]);
  163. ASSERT_EQ(2UL, bvar::Variable::count_exposed());
  164. }
  165. struct Foo {
  166. int x;
  167. Foo() : x(0) {}
  168. explicit Foo(int x2) : x(x2) {}
  169. Foo operator+(const Foo& rhs) const {
  170. return Foo(x + rhs.x);
  171. }
  172. };
  173. std::ostream& operator<<(std::ostream& os, const Foo& f) {
  174. return os << "Foo{" << f.x << "}";
  175. }
  176. TEST_F(StatusTest, non_primitive) {
  177. bvar::Status<Foo> st;
  178. ASSERT_EQ(0, st.get_value().x);
  179. st.set_value(Foo(1));
  180. ASSERT_EQ(1, st.get_value().x);
  181. #ifdef BAIDU_INTERNAL
  182. boost::any a1;
  183. st.get_value(&a1);
  184. ASSERT_EQ(1, boost::any_cast<Foo>(a1).x);
  185. #endif
  186. }
  187. } // namespace