OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2014 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 |
| 5 #include <algorithm> |
| 6 |
| 7 #include "base/message_loop/message_loop.h" |
| 8 #include "chrome/browser/devtools/device/devtools_android_bridge.h" |
| 9 #include "chrome/browser/ui/browser.h" |
| 10 #include "chrome/test/base/in_process_browser_test.h" |
| 11 #include "components/usb_service/usb_device.h" |
| 12 #include "components/usb_service/usb_service.h" |
| 13 #include "content/public/browser/browser_thread.h" |
| 14 #include "content/public/test/test_utils.h" |
| 15 #include "testing/gmock/include/gmock/gmock.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 |
| 18 using testing::_; |
| 19 using content::BrowserThread; |
| 20 using usb_service::UsbService; |
| 21 using usb_service::UsbDevice; |
| 22 |
| 23 class DevToolsAndroidBridgeWarmUp |
| 24 : public DevToolsAndroidBridge::DeviceCountListener { |
| 25 public: |
| 26 DevToolsAndroidBridgeWarmUp(base::Closure closure, |
| 27 scoped_refptr<DevToolsAndroidBridge> adb_bridge) |
| 28 : closure_(closure), adb_bridge_(adb_bridge) {} |
| 29 |
| 30 virtual void DeviceCountChanged(int count) OVERRIDE { |
| 31 adb_bridge_->RemoveDeviceCountListener(this); |
| 32 closure_.Run(); |
| 33 } |
| 34 |
| 35 base::Closure closure_; |
| 36 scoped_refptr<DevToolsAndroidBridge> adb_bridge_; |
| 37 }; |
| 38 |
| 39 class MockCountListener : public DevToolsAndroidBridge::DeviceCountListener { |
| 40 public: |
| 41 explicit MockCountListener(scoped_refptr<DevToolsAndroidBridge> adb_bridge) |
| 42 : adb_bridge_(adb_bridge) {} |
| 43 |
| 44 virtual void DeviceCountChanged(int count) OVERRIDE { |
| 45 ++invoked; |
| 46 adb_bridge_->RemoveDeviceCountListener(this); |
| 47 Shutdown(); |
| 48 } |
| 49 |
| 50 void Shutdown() { |
| 51 ShutdownOnUIThread(); |
| 52 }; |
| 53 |
| 54 void ShutdownOnUIThread() { |
| 55 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 56 if (repostsLeft-- == 0) { |
| 57 base::MessageLoop::current()->Quit(); |
| 58 } else { |
| 59 BrowserThread::PostTask( |
| 60 BrowserThread::FILE, |
| 61 FROM_HERE, |
| 62 base::Bind(&MockCountListener::ShutdownOnFileThread, |
| 63 base::Unretained(this))); |
| 64 } |
| 65 } |
| 66 |
| 67 void ShutdownOnFileThread() { |
| 68 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 69 BrowserThread::PostTask(BrowserThread::UI, |
| 70 FROM_HERE, |
| 71 base::Bind(&MockCountListener::ShutdownOnUIThread, |
| 72 base::Unretained(this))); |
| 73 } |
| 74 |
| 75 int repostsLeft = 10; |
| 76 scoped_refptr<DevToolsAndroidBridge> adb_bridge_; |
| 77 int invoked = 0; |
| 78 }; |
| 79 |
| 80 class MockCountListenerWithReAdd : public MockCountListener { |
| 81 public: |
| 82 explicit MockCountListenerWithReAdd( |
| 83 scoped_refptr<DevToolsAndroidBridge> adb_bridge) |
| 84 : MockCountListener(adb_bridge) {} |
| 85 |
| 86 virtual void DeviceCountChanged(int count) OVERRIDE { |
| 87 ++invoked; |
| 88 adb_bridge_->RemoveDeviceCountListener(this); |
| 89 if (readd_count_ > 0) { |
| 90 readd_count_--; |
| 91 adb_bridge_->AddDeviceCountListener(this); |
| 92 adb_bridge_->RemoveDeviceCountListener(this); |
| 93 adb_bridge_->AddDeviceCountListener(this); |
| 94 } else { |
| 95 Shutdown(); |
| 96 } |
| 97 } |
| 98 |
| 99 int readd_count_ = 2; |
| 100 }; |
| 101 |
| 102 class MockCountListenerWithReAddWhileQueued : public MockCountListener { |
| 103 public: |
| 104 MockCountListenerWithReAddWhileQueued( |
| 105 scoped_refptr<DevToolsAndroidBridge> adb_bridge) |
| 106 : MockCountListener(adb_bridge) {} |
| 107 |
| 108 virtual void DeviceCountChanged(int count) OVERRIDE { |
| 109 ++invoked; |
| 110 if (!readded) { |
| 111 readded = true; |
| 112 base::MessageLoop::current()->PostTask( |
| 113 FROM_HERE, |
| 114 base::Bind(&MockCountListenerWithReAddWhileQueued::ReAdd, |
| 115 base::Unretained(this))); |
| 116 } else { |
| 117 adb_bridge_->RemoveDeviceCountListener(this); |
| 118 Shutdown(); |
| 119 } |
| 120 } |
| 121 |
| 122 void ReAdd() { |
| 123 adb_bridge_->RemoveDeviceCountListener(this); |
| 124 adb_bridge_->AddDeviceCountListener(this); |
| 125 } |
| 126 |
| 127 bool readded = false; |
| 128 }; |
| 129 |
| 130 class MockUsbService : public UsbService { |
| 131 public: |
| 132 MOCK_METHOD1(GetDeviceById, scoped_refptr<UsbDevice>(uint32 unique_id)); |
| 133 virtual void GetDevices( |
| 134 std::vector<scoped_refptr<UsbDevice> >* devices) OVERRIDE {} |
| 135 }; |
| 136 |
| 137 class DevtoolsAndroidBridgeBrowserTest : public InProcessBrowserTest { |
| 138 protected: |
| 139 DevtoolsAndroidBridgeBrowserTest() {} |
| 140 |
| 141 virtual void SetUpOnMainThread() OVERRIDE { |
| 142 scoped_refptr<content::MessageLoopRunner> runner = |
| 143 new content::MessageLoopRunner; |
| 144 |
| 145 BrowserThread::PostTaskAndReply( |
| 146 BrowserThread::FILE, |
| 147 FROM_HERE, |
| 148 base::Bind(&DevtoolsAndroidBridgeBrowserTest::SetUpService, this), |
| 149 runner->QuitClosure()); |
| 150 runner->Run(); |
| 151 |
| 152 adb_bridge_ = |
| 153 DevToolsAndroidBridge::Factory::GetForProfile(browser()->profile()); |
| 154 DCHECK(adb_bridge_); |
| 155 adb_bridge_->set_device_count_request_scheduler_for_test(base::Bind( |
| 156 &DevtoolsAndroidBridgeBrowserTest::ScheduleDeviceCountRequest, this)); |
| 157 |
| 158 runner = new content::MessageLoopRunner; |
| 159 |
| 160 DevToolsAndroidBridgeWarmUp warmup(runner->QuitClosure(), adb_bridge_); |
| 161 adb_bridge_->AddDeviceCountListener(&warmup); |
| 162 runner->Run(); |
| 163 |
| 164 runner_ = new content::MessageLoopRunner; |
| 165 } |
| 166 |
| 167 void ScheduleDeviceCountRequest(base::Closure request) { |
| 168 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 169 scheduler_invoked_++; |
| 170 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, request); |
| 171 } |
| 172 |
| 173 void SetUpService() { |
| 174 service_ = new MockUsbService(); |
| 175 UsbService::SetInstanceForTest(service_); |
| 176 } |
| 177 |
| 178 virtual void CleanUpOnMainThread() OVERRIDE { |
| 179 scoped_refptr<content::MessageLoopRunner> runner = |
| 180 new content::MessageLoopRunner; |
| 181 UsbService* service = NULL; |
| 182 BrowserThread::PostTaskAndReply( |
| 183 BrowserThread::FILE, |
| 184 FROM_HERE, |
| 185 base::Bind(&UsbService::SetInstanceForTest, service), |
| 186 runner->QuitClosure()); |
| 187 runner->Run(); |
| 188 } |
| 189 |
| 190 MockUsbService* service_; |
| 191 int scheduler_invoked_ = 0; |
| 192 scoped_refptr<content::MessageLoopRunner> runner_; |
| 193 scoped_refptr<DevToolsAndroidBridge> adb_bridge_; |
| 194 }; |
| 195 |
| 196 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
| 197 TestNoMultipleCallsRemoveInCallback) { |
| 198 scoped_ptr<MockCountListener> listener(new MockCountListener(adb_bridge_)); |
| 199 |
| 200 adb_bridge_->AddDeviceCountListener(listener.get()); |
| 201 |
| 202 runner_->Run(); |
| 203 EXPECT_EQ(1, listener->invoked); |
| 204 EXPECT_EQ(listener->invoked - 1, scheduler_invoked_); |
| 205 } |
| 206 |
| 207 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
| 208 TestNoMultipleCallsRemoveAddInCallback) { |
| 209 scoped_ptr<MockCountListener> listener( |
| 210 new MockCountListenerWithReAdd(adb_bridge_)); |
| 211 |
| 212 adb_bridge_->AddDeviceCountListener(listener.get()); |
| 213 |
| 214 runner_->Run(); |
| 215 EXPECT_EQ(3, listener->invoked); |
| 216 EXPECT_EQ(listener->invoked - 1, scheduler_invoked_); |
| 217 } |
| 218 |
| 219 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
| 220 TestNoMultipleCallsRemoveAddOnStart) { |
| 221 scoped_ptr<MockCountListener> listener(new MockCountListener(adb_bridge_)); |
| 222 |
| 223 adb_bridge_->AddDeviceCountListener(listener.get()); |
| 224 adb_bridge_->RemoveDeviceCountListener(listener.get()); |
| 225 adb_bridge_->AddDeviceCountListener(listener.get()); |
| 226 |
| 227 runner_->Run(); |
| 228 EXPECT_EQ(1, listener->invoked); |
| 229 EXPECT_EQ(listener->invoked - 1, scheduler_invoked_); |
| 230 } |
| 231 |
| 232 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
| 233 TestNoMultipleCallsRemoveAddWhileQueued) { |
| 234 scoped_ptr<MockCountListener> listener( |
| 235 new MockCountListenerWithReAddWhileQueued(adb_bridge_)); |
| 236 |
| 237 adb_bridge_->AddDeviceCountListener(listener.get()); |
| 238 |
| 239 runner_->Run(); |
| 240 EXPECT_EQ(2, listener->invoked); |
| 241 EXPECT_EQ(listener->invoked - 1, scheduler_invoked_); |
| 242 } |
OLD | NEW |