endpoint_unittest.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 <gtest/gtest.h>
  18. #include "butil/errno.h"
  19. #include "butil/endpoint.h"
  20. #include "butil/logging.h"
  21. #include "butil/containers/flat_map.h"
  22. namespace {
  23. TEST(EndPointTest, comparisons) {
  24. butil::EndPoint p1(butil::int2ip(1234), 5678);
  25. butil::EndPoint p2 = p1;
  26. ASSERT_TRUE(p1 == p2 && !(p1 != p2));
  27. ASSERT_TRUE(p1 <= p2 && p1 >= p2 && !(p1 < p2 || p1 > p2));
  28. ++p2.port;
  29. ASSERT_TRUE(p1 != p2 && !(p1 == p2));
  30. ASSERT_TRUE(p1 < p2 && p2 > p1 && !(p2 <= p1 || p1 >= p2));
  31. --p2.port;
  32. p2.ip = butil::int2ip(butil::ip2int(p2.ip)-1);
  33. ASSERT_TRUE(p1 != p2 && !(p1 == p2));
  34. ASSERT_TRUE(p1 > p2 && p2 < p1 && !(p1 <= p2 || p2 >= p1));
  35. }
  36. TEST(EndPointTest, ip_t) {
  37. LOG(INFO) << "INET_ADDRSTRLEN = " << INET_ADDRSTRLEN;
  38. butil::ip_t ip0;
  39. ASSERT_EQ(0, butil::str2ip("1.1.1.1", &ip0));
  40. ASSERT_STREQ("1.1.1.1", butil::ip2str(ip0).c_str());
  41. ASSERT_EQ(-1, butil::str2ip("301.1.1.1", &ip0));
  42. ASSERT_EQ(-1, butil::str2ip("1.-1.1.1", &ip0));
  43. ASSERT_EQ(-1, butil::str2ip("1.1.-101.1", &ip0));
  44. ASSERT_STREQ("1.0.0.0", butil::ip2str(butil::int2ip(1)).c_str());
  45. butil::ip_t ip1, ip2, ip3;
  46. ASSERT_EQ(0, butil::str2ip("192.168.0.1", &ip1));
  47. ASSERT_EQ(0, butil::str2ip("192.168.0.2", &ip2));
  48. ip3 = ip1;
  49. ASSERT_LT(ip1, ip2);
  50. ASSERT_LE(ip1, ip2);
  51. ASSERT_GT(ip2, ip1);
  52. ASSERT_GE(ip2, ip1);
  53. ASSERT_TRUE(ip1 != ip2);
  54. ASSERT_FALSE(ip1 == ip2);
  55. ASSERT_TRUE(ip1 == ip3);
  56. ASSERT_FALSE(ip1 != ip3);
  57. }
  58. TEST(EndPointTest, show_local_info) {
  59. LOG(INFO) << "my_ip is " << butil::my_ip() << std::endl
  60. << "my_ip_cstr is " << butil::my_ip_cstr() << std::endl
  61. << "my_hostname is " << butil::my_hostname();
  62. }
  63. TEST(EndPointTest, endpoint) {
  64. butil::EndPoint p1;
  65. ASSERT_EQ(butil::IP_ANY, p1.ip);
  66. ASSERT_EQ(0, p1.port);
  67. butil::EndPoint p2(butil::IP_NONE, -1);
  68. ASSERT_EQ(butil::IP_NONE, p2.ip);
  69. ASSERT_EQ(-1, p2.port);
  70. butil::EndPoint p3;
  71. ASSERT_EQ(-1, butil::str2endpoint(" 127.0.0.1:-1", &p3));
  72. ASSERT_EQ(-1, butil::str2endpoint(" 127.0.0.1:65536", &p3));
  73. ASSERT_EQ(0, butil::str2endpoint(" 127.0.0.1:65535", &p3));
  74. ASSERT_EQ(0, butil::str2endpoint(" 127.0.0.1:0", &p3));
  75. butil::EndPoint p4;
  76. ASSERT_EQ(0, butil::str2endpoint(" 127.0.0.1: 289 ", &p4));
  77. ASSERT_STREQ("127.0.0.1", butil::ip2str(p4.ip).c_str());
  78. ASSERT_EQ(289, p4.port);
  79. butil::EndPoint p5;
  80. ASSERT_EQ(-1, hostname2endpoint("localhost:-1", &p5));
  81. ASSERT_EQ(-1, hostname2endpoint("localhost:65536", &p5));
  82. ASSERT_EQ(0, hostname2endpoint("localhost:65535", &p5)) << berror();
  83. ASSERT_EQ(0, hostname2endpoint("localhost:0", &p5));
  84. #ifdef BAIDU_INTERNAL
  85. butil::EndPoint p6;
  86. ASSERT_EQ(0, hostname2endpoint("tc-cm-et21.tc: 289 ", &p6));
  87. ASSERT_STREQ("10.23.249.73", butil::ip2str(p6.ip).c_str());
  88. ASSERT_EQ(289, p6.port);
  89. #endif
  90. }
  91. TEST(EndPointTest, hash_table) {
  92. butil::hash_map<butil::EndPoint, int> m;
  93. butil::EndPoint ep1(butil::IP_ANY, 123);
  94. butil::EndPoint ep2(butil::IP_ANY, 456);
  95. ++m[ep1];
  96. ASSERT_TRUE(m.find(ep1) != m.end());
  97. ASSERT_EQ(1, m.find(ep1)->second);
  98. ASSERT_EQ(1u, m.size());
  99. ++m[ep1];
  100. ASSERT_TRUE(m.find(ep1) != m.end());
  101. ASSERT_EQ(2, m.find(ep1)->second);
  102. ASSERT_EQ(1u, m.size());
  103. ++m[ep2];
  104. ASSERT_TRUE(m.find(ep2) != m.end());
  105. ASSERT_EQ(1, m.find(ep2)->second);
  106. ASSERT_EQ(2u, m.size());
  107. }
  108. TEST(EndPointTest, flat_map) {
  109. butil::FlatMap<butil::EndPoint, int> m;
  110. ASSERT_EQ(0, m.init(1024));
  111. uint32_t port = 8088;
  112. butil::EndPoint ep1(butil::IP_ANY, port);
  113. butil::EndPoint ep2(butil::IP_ANY, port);
  114. ++m[ep1];
  115. ++m[ep2];
  116. ASSERT_EQ(1u, m.size());
  117. butil::ip_t ip_addr;
  118. butil::str2ip("10.10.10.10", &ip_addr);
  119. int ip = butil::ip2int(ip_addr);
  120. for (int i = 0; i < 1023; ++i) {
  121. butil::EndPoint ep(butil::int2ip(++ip), port);
  122. ++m[ep];
  123. }
  124. butil::BucketInfo info = m.bucket_info();
  125. LOG(INFO) << "bucket info max long=" << info.longest_length
  126. << " avg=" << info.average_length << std::endl;
  127. ASSERT_LT(info.longest_length, 32ul) << "detect hash collision and it's too large.";
  128. }
  129. } // end of namespace