bluetooth_discovery_filter_unittest.cc 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <stdint.h>
  5. #include <memory>
  6. #include "device/bluetooth/bluetooth_common.h"
  7. #include "device/bluetooth/bluetooth_discovery_session.h"
  8. #include "testing/gmock/include/gmock/gmock.h"
  9. #include "testing/gtest/include/gtest/gtest.h"
  10. namespace {
  11. const device::BluetoothUUID uuid1003("1003");
  12. const device::BluetoothUUID uuid1004("1004");
  13. const device::BluetoothUUID uuid1020("1020");
  14. const device::BluetoothUUID uuid1057("1027");
  15. const device::BluetoothUUID uuid1019("1019");
  16. } // namespace
  17. namespace device {
  18. TEST(BluetoothDiscoveryFilterTest, Equal) {
  19. BluetoothDiscoveryFilter df1(BLUETOOTH_TRANSPORT_CLASSIC);
  20. df1.SetRSSI(-65);
  21. {
  22. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  23. device_filter.uuids.insert(uuid1020);
  24. device_filter.uuids.insert(uuid1057);
  25. df1.AddDeviceFilter(device_filter);
  26. }
  27. {
  28. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  29. device_filter.uuids.insert(uuid1003);
  30. df1.AddDeviceFilter(device_filter);
  31. }
  32. BluetoothDiscoveryFilter df2(BLUETOOTH_TRANSPORT_CLASSIC);
  33. df2.SetRSSI(-65);
  34. {
  35. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  36. device_filter.uuids.insert(uuid1020);
  37. device_filter.uuids.insert(uuid1057);
  38. df2.AddDeviceFilter(device_filter);
  39. }
  40. {
  41. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  42. device_filter.uuids.insert(uuid1004);
  43. df2.AddDeviceFilter(device_filter);
  44. }
  45. // uuids are not same, so should fail
  46. ASSERT_FALSE(df1.Equals(df2));
  47. // make filters equal
  48. {
  49. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  50. device_filter.uuids.insert(uuid1004);
  51. df1.AddDeviceFilter(device_filter);
  52. }
  53. {
  54. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  55. device_filter.uuids.insert(uuid1003);
  56. df2.AddDeviceFilter(device_filter);
  57. }
  58. ASSERT_TRUE(df1.Equals(df2));
  59. // now transport don't match
  60. df1.SetTransport(BLUETOOTH_TRANSPORT_LE);
  61. ASSERT_FALSE(df1.Equals(df2));
  62. // now everything is back matching
  63. df1.SetTransport(BLUETOOTH_TRANSPORT_CLASSIC);
  64. ASSERT_TRUE(df1.Equals(df2));
  65. // now rssi don't match
  66. df1.SetRSSI(-30);
  67. ASSERT_FALSE(df1.Equals(df2));
  68. // set RSSIs to be the same and confirm that
  69. // the filters match to prepare for next test
  70. df2.SetRSSI(-30);
  71. ASSERT_TRUE(df1.Equals(df2));
  72. // add filters with the same uuid but different names
  73. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter_no_name;
  74. device_filter_no_name.uuids.insert(uuid1019);
  75. df1.AddDeviceFilter(device_filter_no_name);
  76. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter_name;
  77. device_filter_name.uuids.insert(uuid1019);
  78. device_filter_name.name = "device 1019";
  79. df2.AddDeviceFilter(device_filter_name);
  80. // with different names the filters should not be the same
  81. ASSERT_FALSE(df1.Equals(df2));
  82. BluetoothDiscoveryFilter df3(BLUETOOTH_TRANSPORT_CLASSIC);
  83. df3.SetPathloss(45);
  84. {
  85. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  86. device_filter.uuids.insert(uuid1020);
  87. device_filter.uuids.insert(uuid1057);
  88. df3.AddDeviceFilter(device_filter);
  89. }
  90. {
  91. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  92. device_filter.uuids.insert(uuid1003);
  93. df3.AddDeviceFilter(device_filter);
  94. }
  95. {
  96. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  97. device_filter.uuids.insert(uuid1004);
  98. df3.AddDeviceFilter(device_filter);
  99. }
  100. // Having Pathloss and RSSI set in two different filter makes them unequal.
  101. ASSERT_FALSE(df1.Equals(df3));
  102. }
  103. TEST(BluetoothDiscoveryFilterTest, CopyFrom) {
  104. BluetoothDiscoveryFilter df1(BLUETOOTH_TRANSPORT_CLASSIC);
  105. df1.SetRSSI(-65);
  106. {
  107. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  108. device_filter.uuids.insert(uuid1020);
  109. device_filter.uuids.insert(uuid1057);
  110. df1.AddDeviceFilter(device_filter);
  111. }
  112. {
  113. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  114. device_filter.uuids.insert(uuid1003);
  115. df1.AddDeviceFilter(device_filter);
  116. }
  117. BluetoothDiscoveryFilter df2(BLUETOOTH_TRANSPORT_CLASSIC);
  118. df2.CopyFrom(df1);
  119. int16_t out_rssi;
  120. std::set<device::BluetoothUUID> out_uuids;
  121. // make sure all properties were copied
  122. df2.GetRSSI(&out_rssi);
  123. EXPECT_EQ(-65, out_rssi);
  124. EXPECT_EQ(BLUETOOTH_TRANSPORT_CLASSIC, df2.GetTransport());
  125. df2.GetUUIDs(out_uuids);
  126. EXPECT_THAT(out_uuids, testing::Contains(uuid1020));
  127. EXPECT_THAT(out_uuids, testing::Contains(uuid1057));
  128. EXPECT_THAT(out_uuids, testing::Contains(uuid1003));
  129. }
  130. TEST(BluetoothDiscoveryFilterTest, MergeUUIDs) {
  131. BluetoothDiscoveryFilter df1(BLUETOOTH_TRANSPORT_LE);
  132. {
  133. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  134. device_filter.uuids.insert(uuid1020);
  135. device_filter.uuids.insert(uuid1057);
  136. df1.AddDeviceFilter(device_filter);
  137. }
  138. {
  139. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  140. device_filter.uuids.insert(uuid1003);
  141. df1.AddDeviceFilter(device_filter);
  142. }
  143. BluetoothDiscoveryFilter df2(BLUETOOTH_TRANSPORT_LE);
  144. {
  145. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  146. device_filter.uuids.insert(uuid1020);
  147. device_filter.uuids.insert(uuid1057);
  148. df2.AddDeviceFilter(device_filter);
  149. }
  150. {
  151. device::BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
  152. device_filter.uuids.insert(uuid1004);
  153. df2.AddDeviceFilter(device_filter);
  154. }
  155. std::unique_ptr<BluetoothDiscoveryFilter> df3 =
  156. BluetoothDiscoveryFilter::Merge(&df1, &df2);
  157. // df3 should contain all uuids from df1 and df2
  158. std::set<device::BluetoothUUID> out_uuids;
  159. df3->GetUUIDs(out_uuids);
  160. EXPECT_TRUE(out_uuids.find(uuid1020) != out_uuids.end());
  161. EXPECT_TRUE(out_uuids.find(uuid1003) != out_uuids.end());
  162. EXPECT_TRUE(out_uuids.find(uuid1004) != out_uuids.end());
  163. // Merging with empty filter would return empty filter
  164. df3 = BluetoothDiscoveryFilter::Merge(&df1, nullptr);
  165. df3->GetUUIDs(out_uuids);
  166. EXPECT_EQ(0UL, out_uuids.size());
  167. EXPECT_TRUE(df3->IsDefault());
  168. }
  169. TEST(BluetoothDiscoveryFilterTest, MergeProximity) {
  170. BluetoothDiscoveryFilter df1(BLUETOOTH_TRANSPORT_LE);
  171. df1.SetRSSI(-50);
  172. BluetoothDiscoveryFilter df2(BLUETOOTH_TRANSPORT_LE);
  173. df2.SetRSSI(-70);
  174. BluetoothDiscoveryFilter df3(BLUETOOTH_TRANSPORT_LE);
  175. df3.SetPathloss(70);
  176. BluetoothDiscoveryFilter df4(BLUETOOTH_TRANSPORT_LE);
  177. df4.SetPathloss(20);
  178. std::unique_ptr<BluetoothDiscoveryFilter> result =
  179. BluetoothDiscoveryFilter::Merge(&df1, &df2);
  180. int16_t out_rssi;
  181. // Merging RSSI should return smaller of both values
  182. EXPECT_TRUE(result->GetRSSI(&out_rssi));
  183. EXPECT_EQ(-70, out_rssi);
  184. uint16_t out_pathloss;
  185. // Merging RSSI with Pathloss should clear proximity
  186. result = BluetoothDiscoveryFilter::Merge(&df1, &df3);
  187. EXPECT_FALSE(result->GetRSSI(&out_rssi));
  188. EXPECT_FALSE(result->GetPathloss(&out_pathloss));
  189. // Merging Pathloss should return bigger of both values
  190. result = BluetoothDiscoveryFilter::Merge(&df3, &df4);
  191. EXPECT_TRUE(result->GetPathloss(&out_pathloss));
  192. EXPECT_EQ(70, out_pathloss);
  193. }
  194. TEST(BluetoothDiscoveryFilterTest, MergeTransport) {
  195. BluetoothDiscoveryFilter df1(BLUETOOTH_TRANSPORT_CLASSIC);
  196. BluetoothDiscoveryFilter df2(BLUETOOTH_TRANSPORT_LE);
  197. BluetoothDiscoveryFilter df3(BLUETOOTH_TRANSPORT_DUAL);
  198. std::unique_ptr<BluetoothDiscoveryFilter> result =
  199. BluetoothDiscoveryFilter::Merge(&df1, &df2);
  200. // Merging LE and CLASSIC should result in both being set
  201. EXPECT_EQ(BLUETOOTH_TRANSPORT_DUAL, result->GetTransport());
  202. result = BluetoothDiscoveryFilter::Merge(&df1, &df3);
  203. EXPECT_EQ(BLUETOOTH_TRANSPORT_DUAL, result->GetTransport());
  204. // Merging with null should alway result with empty filter.
  205. result = BluetoothDiscoveryFilter::Merge(&df1, nullptr);
  206. EXPECT_TRUE(result->IsDefault());
  207. }
  208. } // namespace device