OLD | NEW |
(Empty) | |
| 1 // Copyright 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 reposts_left_(10), |
| 44 invoked_(0) { |
| 45 } |
| 46 |
| 47 virtual void DeviceCountChanged(int count) OVERRIDE { |
| 48 ++invoked_; |
| 49 adb_bridge_->RemoveDeviceCountListener(this); |
| 50 Shutdown(); |
| 51 } |
| 52 |
| 53 void Shutdown() { |
| 54 ShutdownOnUIThread(); |
| 55 }; |
| 56 |
| 57 void ShutdownOnUIThread() { |
| 58 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 59 if (reposts_left_-- == 0) { |
| 60 base::MessageLoop::current()->Quit(); |
| 61 } else { |
| 62 BrowserThread::PostTask( |
| 63 BrowserThread::FILE, |
| 64 FROM_HERE, |
| 65 base::Bind(&MockCountListener::ShutdownOnFileThread, |
| 66 base::Unretained(this))); |
| 67 } |
| 68 } |
| 69 |
| 70 void ShutdownOnFileThread() { |
| 71 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 72 BrowserThread::PostTask(BrowserThread::UI, |
| 73 FROM_HERE, |
| 74 base::Bind(&MockCountListener::ShutdownOnUIThread, |
| 75 base::Unretained(this))); |
| 76 } |
| 77 |
| 78 scoped_refptr<DevToolsAndroidBridge> adb_bridge_; |
| 79 int reposts_left_; |
| 80 int invoked_; |
| 81 }; |
| 82 |
| 83 class MockCountListenerWithReAdd : public MockCountListener { |
| 84 public: |
| 85 explicit MockCountListenerWithReAdd( |
| 86 scoped_refptr<DevToolsAndroidBridge> adb_bridge) |
| 87 : MockCountListener(adb_bridge), |
| 88 readd_count_(2) { |
| 89 } |
| 90 |
| 91 virtual void DeviceCountChanged(int count) OVERRIDE { |
| 92 ++invoked_; |
| 93 adb_bridge_->RemoveDeviceCountListener(this); |
| 94 if (readd_count_ > 0) { |
| 95 readd_count_--; |
| 96 adb_bridge_->AddDeviceCountListener(this); |
| 97 adb_bridge_->RemoveDeviceCountListener(this); |
| 98 adb_bridge_->AddDeviceCountListener(this); |
| 99 } else { |
| 100 Shutdown(); |
| 101 } |
| 102 } |
| 103 |
| 104 int readd_count_; |
| 105 }; |
| 106 |
| 107 class MockCountListenerWithReAddWhileQueued : public MockCountListener { |
| 108 public: |
| 109 MockCountListenerWithReAddWhileQueued( |
| 110 scoped_refptr<DevToolsAndroidBridge> adb_bridge) |
| 111 : MockCountListener(adb_bridge), |
| 112 readded_(false) { |
| 113 } |
| 114 |
| 115 virtual void DeviceCountChanged(int count) OVERRIDE { |
| 116 ++invoked_; |
| 117 if (!readded_) { |
| 118 readded_ = true; |
| 119 base::MessageLoop::current()->PostTask( |
| 120 FROM_HERE, |
| 121 base::Bind(&MockCountListenerWithReAddWhileQueued::ReAdd, |
| 122 base::Unretained(this))); |
| 123 } else { |
| 124 adb_bridge_->RemoveDeviceCountListener(this); |
| 125 Shutdown(); |
| 126 } |
| 127 } |
| 128 |
| 129 void ReAdd() { |
| 130 adb_bridge_->RemoveDeviceCountListener(this); |
| 131 adb_bridge_->AddDeviceCountListener(this); |
| 132 } |
| 133 |
| 134 bool readded_; |
| 135 }; |
| 136 |
| 137 class MockUsbService : public UsbService { |
| 138 public: |
| 139 MOCK_METHOD1(GetDeviceById, scoped_refptr<UsbDevice>(uint32 unique_id)); |
| 140 virtual void GetDevices( |
| 141 std::vector<scoped_refptr<UsbDevice> >* devices) OVERRIDE {} |
| 142 }; |
| 143 |
| 144 class DevtoolsAndroidBridgeBrowserTest : public InProcessBrowserTest { |
| 145 protected: |
| 146 DevtoolsAndroidBridgeBrowserTest() |
| 147 : scheduler_invoked_(0) { |
| 148 } |
| 149 |
| 150 virtual void SetUpOnMainThread() OVERRIDE { |
| 151 scoped_refptr<content::MessageLoopRunner> runner = |
| 152 new content::MessageLoopRunner; |
| 153 |
| 154 BrowserThread::PostTaskAndReply( |
| 155 BrowserThread::FILE, |
| 156 FROM_HERE, |
| 157 base::Bind(&DevtoolsAndroidBridgeBrowserTest::SetUpService, this), |
| 158 runner->QuitClosure()); |
| 159 runner->Run(); |
| 160 |
| 161 adb_bridge_ = |
| 162 DevToolsAndroidBridge::Factory::GetForProfile(browser()->profile()); |
| 163 DCHECK(adb_bridge_); |
| 164 adb_bridge_->set_task_scheduler_for_test(base::Bind( |
| 165 &DevtoolsAndroidBridgeBrowserTest::ScheduleDeviceCountRequest, this)); |
| 166 |
| 167 runner = new content::MessageLoopRunner; |
| 168 |
| 169 DevToolsAndroidBridgeWarmUp warmup(runner->QuitClosure(), adb_bridge_); |
| 170 adb_bridge_->AddDeviceCountListener(&warmup); |
| 171 runner->Run(); |
| 172 |
| 173 runner_ = new content::MessageLoopRunner; |
| 174 } |
| 175 |
| 176 void ScheduleDeviceCountRequest(const base::Closure& request) { |
| 177 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 178 scheduler_invoked_++; |
| 179 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, request); |
| 180 } |
| 181 |
| 182 void SetUpService() { |
| 183 service_ = new MockUsbService(); |
| 184 UsbService::SetInstanceForTest(service_); |
| 185 } |
| 186 |
| 187 virtual void CleanUpOnMainThread() OVERRIDE { |
| 188 scoped_refptr<content::MessageLoopRunner> runner = |
| 189 new content::MessageLoopRunner; |
| 190 UsbService* service = NULL; |
| 191 BrowserThread::PostTaskAndReply( |
| 192 BrowserThread::FILE, |
| 193 FROM_HERE, |
| 194 base::Bind(&UsbService::SetInstanceForTest, service), |
| 195 runner->QuitClosure()); |
| 196 runner->Run(); |
| 197 } |
| 198 |
| 199 MockUsbService* service_; |
| 200 int scheduler_invoked_; |
| 201 scoped_refptr<content::MessageLoopRunner> runner_; |
| 202 scoped_refptr<DevToolsAndroidBridge> adb_bridge_; |
| 203 }; |
| 204 |
| 205 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
| 206 TestNoMultipleCallsRemoveInCallback) { |
| 207 scoped_ptr<MockCountListener> listener(new MockCountListener(adb_bridge_)); |
| 208 |
| 209 adb_bridge_->AddDeviceCountListener(listener.get()); |
| 210 |
| 211 runner_->Run(); |
| 212 EXPECT_EQ(1, listener->invoked_); |
| 213 EXPECT_EQ(listener->invoked_ - 1, scheduler_invoked_); |
| 214 } |
| 215 |
| 216 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
| 217 TestNoMultipleCallsRemoveAddInCallback) { |
| 218 scoped_ptr<MockCountListener> listener( |
| 219 new MockCountListenerWithReAdd(adb_bridge_)); |
| 220 |
| 221 adb_bridge_->AddDeviceCountListener(listener.get()); |
| 222 |
| 223 runner_->Run(); |
| 224 EXPECT_EQ(3, listener->invoked_); |
| 225 EXPECT_EQ(listener->invoked_ - 1, scheduler_invoked_); |
| 226 } |
| 227 |
| 228 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
| 229 TestNoMultipleCallsRemoveAddOnStart) { |
| 230 scoped_ptr<MockCountListener> listener(new MockCountListener(adb_bridge_)); |
| 231 |
| 232 adb_bridge_->AddDeviceCountListener(listener.get()); |
| 233 adb_bridge_->RemoveDeviceCountListener(listener.get()); |
| 234 adb_bridge_->AddDeviceCountListener(listener.get()); |
| 235 |
| 236 runner_->Run(); |
| 237 EXPECT_EQ(1, listener->invoked_); |
| 238 EXPECT_EQ(listener->invoked_ - 1, scheduler_invoked_); |
| 239 } |
| 240 |
| 241 IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
| 242 TestNoMultipleCallsRemoveAddWhileQueued) { |
| 243 scoped_ptr<MockCountListener> listener( |
| 244 new MockCountListenerWithReAddWhileQueued(adb_bridge_)); |
| 245 |
| 246 adb_bridge_->AddDeviceCountListener(listener.get()); |
| 247 |
| 248 runner_->Run(); |
| 249 EXPECT_EQ(2, listener->invoked_); |
| 250 EXPECT_EQ(listener->invoked_ - 1, scheduler_invoked_); |
| 251 } |
OLD | NEW |