message_stream_lookup_impl_unittest.cc 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. // Copyright 2021 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 "ash/quick_pair/message_stream/message_stream_lookup_impl.h"
  5. #include <memory>
  6. #include "ash/quick_pair/common/logging.h"
  7. #include "ash/quick_pair/message_stream/fake_bluetooth_socket.h"
  8. #include "ash/quick_pair/message_stream/message_stream.h"
  9. #include "ash/quick_pair/message_stream/message_stream_lookup.h"
  10. #include "base/callback.h"
  11. #include "base/memory/scoped_refptr.h"
  12. #include "base/run_loop.h"
  13. #include "base/test/metrics/histogram_tester.h"
  14. #include "base/test/task_environment.h"
  15. #include "device/bluetooth/bluetooth_adapter_factory.h"
  16. #include "device/bluetooth/bluetooth_socket.h"
  17. #include "device/bluetooth/test/mock_bluetooth_adapter.h"
  18. #include "device/bluetooth/test/mock_bluetooth_device.h"
  19. #include "testing/gtest/include/gtest/gtest.h"
  20. namespace {
  21. const char kAcceptFailedString[] = "Failed to accept connection.";
  22. const char kInvalidUUIDString[] = "Invalid UUID";
  23. const char kSocketNotListeningString[] = "Socket is not listening.";
  24. constexpr char kTestDeviceAddress[] = "11:12:13:14:15:16";
  25. const device::BluetoothUUID kMessageStreamUuid(
  26. "df21fe2c-2515-4fdb-8886-f12c4d67927c");
  27. const char kMessageStreamConnectToServiceError[] =
  28. "Bluetooth.ChromeOS.FastPair.MessageStream.ConnectToService.ErrorReason";
  29. const char kMessageStreamConnectToServiceResult[] =
  30. "Bluetooth.ChromeOS.FastPair.MessageStream.ConnectToService.Result";
  31. const char kMessageStreamConnectToServiceTime[] =
  32. "Bluetooth.ChromeOS.FastPair.MessageStream.ConnectToService."
  33. "TotalConnectTime";
  34. } // namespace
  35. namespace ash {
  36. namespace quick_pair {
  37. class MessageStreamFakeBluetoothAdapter
  38. : public testing::NiceMock<device::MockBluetoothAdapter> {
  39. public:
  40. device::BluetoothDevice* GetDevice(const std::string& address) override {
  41. for (const auto& it : mock_devices_) {
  42. if (it->GetAddress() == address)
  43. return it.get();
  44. }
  45. return nullptr;
  46. }
  47. void NotifyDeviceConnectedStateChanged(device::BluetoothDevice* device,
  48. bool is_now_connected) {
  49. for (auto& observer : observers_)
  50. observer.DeviceConnectedStateChanged(this, device, is_now_connected);
  51. }
  52. void NotifyDeviceRemoved(device::BluetoothDevice* device) {
  53. for (auto& observer : observers_)
  54. observer.DeviceRemoved(this, device);
  55. }
  56. void NotifyDeviceAdded(device::BluetoothDevice* device) {
  57. for (auto& observer : observers_)
  58. observer.DeviceAdded(this, device);
  59. }
  60. void NotifyDevicePairedChanged(device::BluetoothDevice* device,
  61. bool new_paired_status) {
  62. for (auto& observer : observers_)
  63. observer.DevicePairedChanged(this, device, new_paired_status);
  64. }
  65. void NotifyDeviceChanged(device::BluetoothDevice* device) {
  66. for (auto& observer : observers_)
  67. observer.DeviceChanged(this, device);
  68. }
  69. private:
  70. ~MessageStreamFakeBluetoothAdapter() override = default;
  71. };
  72. class MessageStreamFakeBluetoothDevice
  73. : public testing::NiceMock<device::MockBluetoothDevice> {
  74. public:
  75. MessageStreamFakeBluetoothDevice(MessageStreamFakeBluetoothAdapter* adapter)
  76. : testing::NiceMock<device::MockBluetoothDevice>(adapter,
  77. /*bluetooth_class=*/0u,
  78. /*name=*/"Test Device",
  79. kTestDeviceAddress,
  80. /*paired=*/true,
  81. /*connected=*/true),
  82. fake_adapter_(adapter) {}
  83. void ConnectToService(const device::BluetoothUUID& uuid,
  84. ConnectToServiceCallback callback,
  85. ConnectToServiceErrorCallback error_callback) override {
  86. connect_to_service_count_++;
  87. if (dont_invoke_callback_) {
  88. return;
  89. }
  90. if (error_) {
  91. std::move(error_callback).Run(/*message=*/error_message_);
  92. return;
  93. }
  94. std::move(callback).Run(fake_socket_.get());
  95. }
  96. void SetConnectToServiceError(const std::string& error_message) {
  97. error_ = true;
  98. error_message_ = error_message;
  99. }
  100. int connect_to_service_count() { return connect_to_service_count_; }
  101. void DontInvokeCallback() { dont_invoke_callback_ = true; }
  102. // Move-only class
  103. MessageStreamFakeBluetoothDevice(const MessageStreamFakeBluetoothDevice&) =
  104. delete;
  105. MessageStreamFakeBluetoothDevice& operator=(
  106. const MessageStreamFakeBluetoothDevice&) = delete;
  107. protected:
  108. int connect_to_service_count_ = 0;
  109. bool dont_invoke_callback_ = false;
  110. bool error_ = false;
  111. std::string error_message_;
  112. MessageStreamFakeBluetoothAdapter* fake_adapter_;
  113. scoped_refptr<FakeBluetoothSocket> fake_socket_ =
  114. base::MakeRefCounted<FakeBluetoothSocket>();
  115. };
  116. class MessageStreamLookupImplTest : public testing::Test,
  117. public MessageStreamLookup::Observer {
  118. public:
  119. void SetUp() override {
  120. adapter_ = base::MakeRefCounted<MessageStreamFakeBluetoothAdapter>();
  121. std::unique_ptr<MessageStreamFakeBluetoothDevice> device =
  122. std::make_unique<MessageStreamFakeBluetoothDevice>(adapter_.get());
  123. device_ = device.get();
  124. adapter_->AddMockDevice(std::move(device));
  125. device::BluetoothAdapterFactory::SetAdapterForTesting(adapter_);
  126. message_stream_lookup_ = std::make_unique<MessageStreamLookupImpl>();
  127. message_stream_lookup_->AddObserver(this);
  128. }
  129. void DeviceConnectedStateChanged(bool is_now_connected) {
  130. adapter_->NotifyDeviceConnectedStateChanged(
  131. /*device=*/device_,
  132. /*is_now_connected=*/is_now_connected);
  133. }
  134. void DeviceChanged() { adapter_->NotifyDeviceChanged(/*device=*/device_); }
  135. void DeviceAdded() { adapter_->NotifyDeviceAdded(/*device=*/device_); }
  136. void DeviceRemoved() { adapter_->NotifyDeviceRemoved(/*device=*/device_); }
  137. void EmptyDeviceRemoved() {
  138. adapter_->NotifyDeviceRemoved(/*device=*/nullptr);
  139. }
  140. void EmptyDevicePairedChanged(bool new_paired_status) {
  141. adapter_->NotifyDeviceConnectedStateChanged(
  142. /*device=*/nullptr,
  143. /*new_paired_status=*/new_paired_status);
  144. }
  145. void DevicePairedChanged(bool new_paired_status) {
  146. adapter_->NotifyDevicePairedChanged(
  147. /*device=*/device_,
  148. /*new_paired_status=*/new_paired_status);
  149. }
  150. void SetConnectToServiceError(const std::string& error_message) {
  151. device_->SetConnectToServiceError(error_message);
  152. }
  153. MessageStream* GetMessageStream() {
  154. return message_stream_lookup_->GetMessageStream(kTestDeviceAddress);
  155. }
  156. void OnMessageStreamConnected(const std::string& device_address,
  157. MessageStream* message_stream) override {
  158. message_stream_ = message_stream;
  159. }
  160. base::HistogramTester& histogram_tester() { return histogram_tester_; }
  161. protected:
  162. base::test::SingleThreadTaskEnvironment task_enviornment_;
  163. base::HistogramTester histogram_tester_;
  164. MessageStream* message_stream_ = nullptr;
  165. scoped_refptr<MessageStreamFakeBluetoothAdapter> adapter_;
  166. MessageStreamFakeBluetoothDevice* device_;
  167. std::unique_ptr<MessageStreamLookup> message_stream_lookup_;
  168. };
  169. TEST_F(MessageStreamLookupImplTest, ConnectDevice_NoMessageStreamUUid) {
  170. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  171. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  172. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  173. SetConnectToServiceError(kAcceptFailedString);
  174. EXPECT_EQ(GetMessageStream(), nullptr);
  175. DeviceConnectedStateChanged(/*is_now_connected=*/true);
  176. base::RunLoop().RunUntilIdle();
  177. EXPECT_EQ(GetMessageStream(), nullptr);
  178. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  179. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  180. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  181. }
  182. TEST_F(MessageStreamLookupImplTest, DeviceAdded_NoMessageStreamUUid) {
  183. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  184. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  185. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  186. SetConnectToServiceError(kInvalidUUIDString);
  187. EXPECT_EQ(GetMessageStream(), nullptr);
  188. DeviceAdded();
  189. base::RunLoop().RunUntilIdle();
  190. EXPECT_EQ(GetMessageStream(), nullptr);
  191. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  192. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  193. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  194. }
  195. TEST_F(MessageStreamLookupImplTest, DeviceAdded_NotPaired) {
  196. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  197. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  198. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  199. SetConnectToServiceError(kSocketNotListeningString);
  200. device_->SetPaired(false);
  201. device_->AddUUID(kMessageStreamUuid);
  202. EXPECT_EQ(GetMessageStream(), nullptr);
  203. DeviceAdded();
  204. base::RunLoop().RunUntilIdle();
  205. EXPECT_EQ(GetMessageStream(), nullptr);
  206. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  207. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  208. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  209. }
  210. TEST_F(MessageStreamLookupImplTest, DeviceChanged_NoMessageStreamUUid) {
  211. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  212. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  213. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  214. SetConnectToServiceError(kSocketNotListeningString);
  215. EXPECT_EQ(GetMessageStream(), nullptr);
  216. DeviceChanged();
  217. base::RunLoop().RunUntilIdle();
  218. EXPECT_EQ(GetMessageStream(), nullptr);
  219. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  220. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  221. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  222. }
  223. TEST_F(MessageStreamLookupImplTest, DeviceChanged_NotPaired) {
  224. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  225. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  226. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  227. SetConnectToServiceError(kSocketNotListeningString);
  228. device_->SetPaired(false);
  229. device_->AddUUID(kMessageStreamUuid);
  230. EXPECT_EQ(GetMessageStream(), nullptr);
  231. DeviceChanged();
  232. base::RunLoop().RunUntilIdle();
  233. EXPECT_EQ(GetMessageStream(), nullptr);
  234. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  235. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  236. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  237. }
  238. TEST_F(MessageStreamLookupImplTest, DevicePaired_NoMessageStreamUUid) {
  239. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  240. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  241. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  242. SetConnectToServiceError(kInvalidUUIDString);
  243. EXPECT_EQ(GetMessageStream(), nullptr);
  244. DevicePairedChanged(/*new_paired_status=*/true);
  245. base::RunLoop().RunUntilIdle();
  246. EXPECT_EQ(GetMessageStream(), nullptr);
  247. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  248. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  249. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  250. }
  251. TEST_F(MessageStreamLookupImplTest, DevicePairedChanged_NoDevice) {
  252. EXPECT_EQ(GetMessageStream(), nullptr);
  253. EmptyDevicePairedChanged(/*new_paired_status=*/true);
  254. base::RunLoop().RunUntilIdle();
  255. EXPECT_EQ(GetMessageStream(), nullptr);
  256. }
  257. TEST_F(MessageStreamLookupImplTest, ConnectDevice_ConnectToServiceFailure) {
  258. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  259. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  260. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  261. device_->AddUUID(kMessageStreamUuid);
  262. SetConnectToServiceError(kAcceptFailedString);
  263. EXPECT_EQ(GetMessageStream(), nullptr);
  264. DeviceConnectedStateChanged(/*is_now_connected=*/true);
  265. base::RunLoop().RunUntilIdle();
  266. EXPECT_EQ(GetMessageStream(), nullptr);
  267. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 1);
  268. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  269. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 1);
  270. }
  271. TEST_F(MessageStreamLookupImplTest, DeviceAdded_ConnectToServiceFailure) {
  272. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  273. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  274. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  275. device_->AddUUID(kMessageStreamUuid);
  276. SetConnectToServiceError(kInvalidUUIDString);
  277. EXPECT_EQ(GetMessageStream(), nullptr);
  278. DeviceAdded();
  279. base::RunLoop().RunUntilIdle();
  280. EXPECT_EQ(GetMessageStream(), nullptr);
  281. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 1);
  282. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  283. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 1);
  284. }
  285. TEST_F(MessageStreamLookupImplTest,
  286. DevicePairedChanged_ConnectToServiceFailure) {
  287. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  288. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  289. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  290. device_->AddUUID(kMessageStreamUuid);
  291. SetConnectToServiceError(kSocketNotListeningString);
  292. EXPECT_EQ(GetMessageStream(), nullptr);
  293. DevicePairedChanged(/*new_paired_state=*/true);
  294. base::RunLoop().RunUntilIdle();
  295. EXPECT_EQ(GetMessageStream(), nullptr);
  296. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 1);
  297. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  298. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 1);
  299. }
  300. TEST_F(MessageStreamLookupImplTest, DeviceChanged_ConnectToServiceFailure) {
  301. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  302. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  303. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  304. device_->AddUUID(kMessageStreamUuid);
  305. SetConnectToServiceError(kAcceptFailedString);
  306. EXPECT_EQ(GetMessageStream(), nullptr);
  307. DeviceChanged();
  308. base::RunLoop().RunUntilIdle();
  309. EXPECT_EQ(GetMessageStream(), nullptr);
  310. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 1);
  311. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  312. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 1);
  313. }
  314. TEST_F(MessageStreamLookupImplTest, ConnectDevice_ConnectToServiceSuccess) {
  315. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  316. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  317. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  318. device_->AddUUID(kMessageStreamUuid);
  319. EXPECT_EQ(GetMessageStream(), nullptr);
  320. DeviceConnectedStateChanged(/*is_now_connected=*/true);
  321. base::RunLoop().RunUntilIdle();
  322. EXPECT_NE(GetMessageStream(), nullptr);
  323. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  324. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 1);
  325. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 1);
  326. }
  327. TEST_F(MessageStreamLookupImplTest,
  328. DevicePairedChanged_ConnectToServiceSuccess) {
  329. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  330. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  331. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  332. device_->AddUUID(kMessageStreamUuid);
  333. EXPECT_EQ(GetMessageStream(), nullptr);
  334. DevicePairedChanged(/*new_paired_state=*/true);
  335. base::RunLoop().RunUntilIdle();
  336. EXPECT_NE(GetMessageStream(), nullptr);
  337. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  338. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 1);
  339. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 1);
  340. }
  341. TEST_F(MessageStreamLookupImplTest, DeviceAdded_ConnectToServiceSuccess) {
  342. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  343. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  344. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  345. device_->AddUUID(kMessageStreamUuid);
  346. EXPECT_EQ(GetMessageStream(), nullptr);
  347. DeviceAdded();
  348. base::RunLoop().RunUntilIdle();
  349. EXPECT_NE(GetMessageStream(), nullptr);
  350. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  351. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 1);
  352. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 1);
  353. }
  354. TEST_F(MessageStreamLookupImplTest, DeviceChanged_ConnectToServiceSuccess) {
  355. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  356. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 0);
  357. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 0);
  358. device_->AddUUID(kMessageStreamUuid);
  359. EXPECT_EQ(GetMessageStream(), nullptr);
  360. DeviceChanged();
  361. base::RunLoop().RunUntilIdle();
  362. EXPECT_NE(GetMessageStream(), nullptr);
  363. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceError, 0);
  364. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceTime, 1);
  365. histogram_tester().ExpectTotalCount(kMessageStreamConnectToServiceResult, 1);
  366. }
  367. TEST_F(MessageStreamLookupImplTest,
  368. ConnectDevice_ConnectToServiceSuccess_Observer) {
  369. device_->AddUUID(kMessageStreamUuid);
  370. EXPECT_EQ(GetMessageStream(), nullptr);
  371. DeviceConnectedStateChanged(/*is_now_connected=*/true);
  372. base::RunLoop().RunUntilIdle();
  373. EXPECT_NE(message_stream_, nullptr);
  374. }
  375. TEST_F(MessageStreamLookupImplTest,
  376. DevicePairedChanged_ConnectToServiceSuccess_Observer) {
  377. device_->AddUUID(kMessageStreamUuid);
  378. EXPECT_EQ(GetMessageStream(), nullptr);
  379. DevicePairedChanged(/*new_paired_status=*/true);
  380. base::RunLoop().RunUntilIdle();
  381. EXPECT_NE(message_stream_, nullptr);
  382. }
  383. TEST_F(MessageStreamLookupImplTest,
  384. DeviceAdded_ConnectToServiceSuccess_Observer) {
  385. device_->AddUUID(kMessageStreamUuid);
  386. EXPECT_EQ(GetMessageStream(), nullptr);
  387. DeviceAdded();
  388. base::RunLoop().RunUntilIdle();
  389. EXPECT_NE(message_stream_, nullptr);
  390. }
  391. TEST_F(MessageStreamLookupImplTest,
  392. DeviceChanged_ConnectToServiceSuccess_Observer) {
  393. device_->AddUUID(kMessageStreamUuid);
  394. EXPECT_EQ(GetMessageStream(), nullptr);
  395. DeviceChanged();
  396. base::RunLoop().RunUntilIdle();
  397. EXPECT_NE(message_stream_, nullptr);
  398. }
  399. TEST_F(MessageStreamLookupImplTest, ConnectDevice_DisconnectDevice) {
  400. device_->AddUUID(kMessageStreamUuid);
  401. EXPECT_EQ(GetMessageStream(), nullptr);
  402. DeviceConnectedStateChanged(/*is_now_connected=*/true);
  403. base::RunLoop().RunUntilIdle();
  404. EXPECT_NE(GetMessageStream(), nullptr);
  405. DeviceConnectedStateChanged(/*is_now_connected=*/false);
  406. EXPECT_EQ(GetMessageStream(), nullptr);
  407. }
  408. TEST_F(MessageStreamLookupImplTest, PairDevice_UnpairDevice) {
  409. device_->AddUUID(kMessageStreamUuid);
  410. EXPECT_EQ(GetMessageStream(), nullptr);
  411. DevicePairedChanged(/*new_paired_status=*/true);
  412. base::RunLoop().RunUntilIdle();
  413. EXPECT_NE(GetMessageStream(), nullptr);
  414. DevicePairedChanged(/*new_paired_status=*/false);
  415. EXPECT_EQ(GetMessageStream(), nullptr);
  416. }
  417. TEST_F(MessageStreamLookupImplTest, AddDevice_RemoveDevice) {
  418. device_->AddUUID(kMessageStreamUuid);
  419. EXPECT_EQ(GetMessageStream(), nullptr);
  420. DeviceAdded();
  421. base::RunLoop().RunUntilIdle();
  422. EXPECT_NE(GetMessageStream(), nullptr);
  423. DeviceRemoved();
  424. EXPECT_EQ(GetMessageStream(), nullptr);
  425. }
  426. TEST_F(MessageStreamLookupImplTest, RemoveDevice_NoMessageStream) {
  427. device_->AddUUID(kMessageStreamUuid);
  428. EXPECT_EQ(GetMessageStream(), nullptr);
  429. DeviceRemoved();
  430. base::RunLoop().RunUntilIdle();
  431. EXPECT_EQ(GetMessageStream(), nullptr);
  432. }
  433. TEST_F(MessageStreamLookupImplTest, EmptyDeviceRemoved) {
  434. EXPECT_EQ(GetMessageStream(), nullptr);
  435. EmptyDeviceRemoved();
  436. base::RunLoop().RunUntilIdle();
  437. EXPECT_EQ(GetMessageStream(), nullptr);
  438. }
  439. TEST_F(MessageStreamLookupImplTest, InFlightConnections) {
  440. device_->AddUUID(kMessageStreamUuid);
  441. device_->SetPaired(true);
  442. device_->DontInvokeCallback();
  443. EXPECT_EQ(GetMessageStream(), nullptr);
  444. DeviceConnectedStateChanged(/*is_now_connected=*/true);
  445. DeviceChanged();
  446. base::RunLoop().RunUntilIdle();
  447. EXPECT_EQ(device_->connect_to_service_count(), 1);
  448. }
  449. } // namespace quick_pair
  450. } // namespace ash