Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3941)

Unified Diff: chrome/browser/devtools/device/devtools_android_bridge_browser_test.cc

Issue 286993003: Fixed case when DevtoolsAdbBridge may start few polling loops. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed explicit timeouts. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/devtools/device/devtools_android_bridge.cc ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_);
+}
« no previous file with comments | « chrome/browser/devtools/device/devtools_android_bridge.cc ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698