Index: chrome/browser/devtools/device/devtools_android_bridge_browser_test.cc |
diff --git a/chrome/browser/devtools/device/devtools_android_bridge_browser_test.cc b/chrome/browser/devtools/device/devtools_android_bridge_browser_test.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c9c2fde3bc99e53440da47128ec83963c3123bdd |
--- /dev/null |
+++ b/chrome/browser/devtools/device/devtools_android_bridge_browser_test.cc |
@@ -0,0 +1,242 @@ |
+// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <algorithm> |
+ |
+#include "base/message_loop/message_loop.h" |
+#include "chrome/browser/devtools/device/devtools_android_bridge.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/test/base/in_process_browser_test.h" |
+#include "components/usb_service/usb_device.h" |
+#include "components/usb_service/usb_service.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/test/test_utils.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+using testing::_; |
+using content::BrowserThread; |
+using usb_service::UsbService; |
+using usb_service::UsbDevice; |
+ |
+class DevToolsAndroidBridgeWarmUp |
+ : public DevToolsAndroidBridge::DeviceCountListener { |
+ public: |
+ DevToolsAndroidBridgeWarmUp(base::Closure closure, |
+ scoped_refptr<DevToolsAndroidBridge> adb_bridge) |
+ : closure_(closure), adb_bridge_(adb_bridge) {} |
+ |
+ virtual void DeviceCountChanged(int count) OVERRIDE { |
+ adb_bridge_->RemoveDeviceCountListener(this); |
+ closure_.Run(); |
+ } |
+ |
+ base::Closure closure_; |
+ scoped_refptr<DevToolsAndroidBridge> adb_bridge_; |
+}; |
+ |
+class MockCountListener : public DevToolsAndroidBridge::DeviceCountListener { |
+ public: |
+ explicit MockCountListener(scoped_refptr<DevToolsAndroidBridge> adb_bridge) |
+ : adb_bridge_(adb_bridge) {} |
+ |
+ virtual void DeviceCountChanged(int count) OVERRIDE { |
+ ++invoked; |
+ adb_bridge_->RemoveDeviceCountListener(this); |
+ Shutdown(); |
+ } |
+ |
+ void Shutdown() { |
+ ShutdownOnUIThread(); |
+ }; |
+ |
+ void ShutdownOnUIThread() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (repostsLeft-- == 0) { |
+ base::MessageLoop::current()->Quit(); |
+ } else { |
+ BrowserThread::PostTask( |
+ BrowserThread::FILE, |
+ FROM_HERE, |
+ base::Bind(&MockCountListener::ShutdownOnFileThread, |
+ base::Unretained(this))); |
+ } |
+ } |
+ |
+ void ShutdownOnFileThread() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ BrowserThread::PostTask(BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&MockCountListener::ShutdownOnUIThread, |
+ base::Unretained(this))); |
+ } |
+ |
+ int repostsLeft = 10; |
+ scoped_refptr<DevToolsAndroidBridge> adb_bridge_; |
+ int invoked = 0; |
+}; |
+ |
+class MockCountListenerWithReAdd : public MockCountListener { |
+ public: |
+ explicit MockCountListenerWithReAdd( |
+ scoped_refptr<DevToolsAndroidBridge> adb_bridge) |
+ : MockCountListener(adb_bridge) {} |
+ |
+ virtual void DeviceCountChanged(int count) OVERRIDE { |
+ ++invoked; |
+ adb_bridge_->RemoveDeviceCountListener(this); |
+ if (readd_count_ > 0) { |
+ readd_count_--; |
+ adb_bridge_->AddDeviceCountListener(this); |
+ adb_bridge_->RemoveDeviceCountListener(this); |
+ adb_bridge_->AddDeviceCountListener(this); |
+ } else { |
+ Shutdown(); |
+ } |
+ } |
+ |
+ int readd_count_ = 2; |
+}; |
+ |
+class MockCountListenerWithReAddWhileQueued : public MockCountListener { |
+ public: |
+ MockCountListenerWithReAddWhileQueued( |
+ scoped_refptr<DevToolsAndroidBridge> adb_bridge) |
+ : MockCountListener(adb_bridge) {} |
+ |
+ virtual void DeviceCountChanged(int count) OVERRIDE { |
+ ++invoked; |
+ if (!readded) { |
+ readded = true; |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&MockCountListenerWithReAddWhileQueued::ReAdd, |
+ base::Unretained(this))); |
+ } else { |
+ adb_bridge_->RemoveDeviceCountListener(this); |
+ Shutdown(); |
+ } |
+ } |
+ |
+ void ReAdd() { |
+ adb_bridge_->RemoveDeviceCountListener(this); |
+ adb_bridge_->AddDeviceCountListener(this); |
+ } |
+ |
+ bool readded = false; |
+}; |
+ |
+class MockUsbService : public UsbService { |
+ public: |
+ MOCK_METHOD1(GetDeviceById, scoped_refptr<UsbDevice>(uint32 unique_id)); |
+ virtual void GetDevices( |
+ std::vector<scoped_refptr<UsbDevice> >* devices) OVERRIDE {} |
+}; |
+ |
+class DevtoolsAndroidBridgeBrowserTest : public InProcessBrowserTest { |
+ protected: |
+ DevtoolsAndroidBridgeBrowserTest() {} |
+ |
+ virtual void SetUpOnMainThread() OVERRIDE { |
+ scoped_refptr<content::MessageLoopRunner> runner = |
+ new content::MessageLoopRunner; |
+ |
+ BrowserThread::PostTaskAndReply( |
+ BrowserThread::FILE, |
+ FROM_HERE, |
+ base::Bind(&DevtoolsAndroidBridgeBrowserTest::SetUpService, this), |
+ runner->QuitClosure()); |
+ runner->Run(); |
+ |
+ adb_bridge_ = |
+ DevToolsAndroidBridge::Factory::GetForProfile(browser()->profile()); |
+ DCHECK(adb_bridge_); |
+ adb_bridge_->set_device_count_request_scheduler_for_test(base::Bind( |
+ &DevtoolsAndroidBridgeBrowserTest::ScheduleDeviceCountRequest, this)); |
+ |
+ runner = new content::MessageLoopRunner; |
+ |
+ DevToolsAndroidBridgeWarmUp warmup(runner->QuitClosure(), adb_bridge_); |
+ adb_bridge_->AddDeviceCountListener(&warmup); |
+ runner->Run(); |
+ |
+ runner_ = new content::MessageLoopRunner; |
+ } |
+ |
+ void ScheduleDeviceCountRequest(base::Closure request) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ scheduler_invoked_++; |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, request); |
+ } |
+ |
+ void SetUpService() { |
+ service_ = new MockUsbService(); |
+ UsbService::SetInstanceForTest(service_); |
+ } |
+ |
+ virtual void CleanUpOnMainThread() OVERRIDE { |
+ scoped_refptr<content::MessageLoopRunner> runner = |
+ new content::MessageLoopRunner; |
+ UsbService* service = NULL; |
+ BrowserThread::PostTaskAndReply( |
+ BrowserThread::FILE, |
+ FROM_HERE, |
+ base::Bind(&UsbService::SetInstanceForTest, service), |
+ runner->QuitClosure()); |
+ runner->Run(); |
+ } |
+ |
+ MockUsbService* service_; |
+ int scheduler_invoked_ = 0; |
+ scoped_refptr<content::MessageLoopRunner> runner_; |
+ scoped_refptr<DevToolsAndroidBridge> adb_bridge_; |
+}; |
+ |
+IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
+ TestNoMultipleCallsRemoveInCallback) { |
+ scoped_ptr<MockCountListener> listener(new MockCountListener(adb_bridge_)); |
+ |
+ adb_bridge_->AddDeviceCountListener(listener.get()); |
+ |
+ runner_->Run(); |
+ EXPECT_EQ(1, listener->invoked); |
+ EXPECT_EQ(listener->invoked - 1, scheduler_invoked_); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
+ TestNoMultipleCallsRemoveAddInCallback) { |
+ scoped_ptr<MockCountListener> listener( |
+ new MockCountListenerWithReAdd(adb_bridge_)); |
+ |
+ adb_bridge_->AddDeviceCountListener(listener.get()); |
+ |
+ runner_->Run(); |
+ EXPECT_EQ(3, listener->invoked); |
+ EXPECT_EQ(listener->invoked - 1, scheduler_invoked_); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
+ TestNoMultipleCallsRemoveAddOnStart) { |
+ scoped_ptr<MockCountListener> listener(new MockCountListener(adb_bridge_)); |
+ |
+ adb_bridge_->AddDeviceCountListener(listener.get()); |
+ adb_bridge_->RemoveDeviceCountListener(listener.get()); |
+ adb_bridge_->AddDeviceCountListener(listener.get()); |
+ |
+ runner_->Run(); |
+ EXPECT_EQ(1, listener->invoked); |
+ EXPECT_EQ(listener->invoked - 1, scheduler_invoked_); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(DevtoolsAndroidBridgeBrowserTest, |
+ TestNoMultipleCallsRemoveAddWhileQueued) { |
+ scoped_ptr<MockCountListener> listener( |
+ new MockCountListenerWithReAddWhileQueued(adb_bridge_)); |
+ |
+ adb_bridge_->AddDeviceCountListener(listener.get()); |
+ |
+ runner_->Run(); |
+ EXPECT_EQ(2, listener->invoked); |
+ EXPECT_EQ(listener->invoked - 1, scheduler_invoked_); |
+} |