bvar_status_unittest.cpp 5.7 KB

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