Commit 9a1be236 authored by sammc@chromium.org's avatar sammc@chromium.org

Add a basic Mojo SerialService that implements GetDevices().

BUG=389016

Review URL: https://codereview.chromium.org/363853003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282012 0039d316-1c4b-4281-b951-d872f2087c98
parent 86be42a5
...@@ -11,8 +11,9 @@ ...@@ -11,8 +11,9 @@
'target_name': 'device_unittests', 'target_name': 'device_unittests',
'type': '<(gtest_target_type)', 'type': '<(gtest_target_type)',
'dependencies': [ 'dependencies': [
'../base/base.gyp:run_all_unittests',
'../base/base.gyp:test_support_base', '../base/base.gyp:test_support_base',
'../mojo/mojo.gyp:mojo_environment_chromium',
'../mojo/mojo.gyp:mojo_system_impl',
'../testing/gmock.gyp:gmock', '../testing/gmock.gyp:gmock',
'../testing/gtest.gyp:gtest', '../testing/gtest.gyp:gtest',
'bluetooth/bluetooth.gyp:device_bluetooth', 'bluetooth/bluetooth.gyp:device_bluetooth',
...@@ -20,6 +21,7 @@ ...@@ -20,6 +21,7 @@
'nfc/nfc.gyp:device_nfc', 'nfc/nfc.gyp:device_nfc',
'usb/usb.gyp:device_usb', 'usb/usb.gyp:device_usb',
'hid/hid.gyp:device_hid', 'hid/hid.gyp:device_hid',
'serial/serial.gyp:device_serial',
], ],
'sources': [ 'sources': [
'bluetooth/bluetooth_adapter_mac_unittest.mm', 'bluetooth/bluetooth_adapter_mac_unittest.mm',
...@@ -41,6 +43,8 @@ ...@@ -41,6 +43,8 @@
'hid/hid_report_descriptor_unittest.cc', 'hid/hid_report_descriptor_unittest.cc',
'hid/hid_service_unittest.cc', 'hid/hid_service_unittest.cc',
'hid/input_service_linux_unittest.cc', 'hid/input_service_linux_unittest.cc',
'serial/serial_service_unittest.cc',
'test/run_all_unittests.cc',
], ],
'conditions': [ 'conditions': [
['chromeos==1', { ['chromeos==1', {
......
...@@ -28,8 +28,12 @@ ...@@ -28,8 +28,12 @@
'../../mojo/public/tools/bindings/mojom_bindings_generator.gypi', '../../mojo/public/tools/bindings/mojom_bindings_generator.gypi',
], ],
'dependencies': [ 'dependencies': [
'../../mojo/mojo.gyp:mojo_cpp_bindings',
'../../net/net.gyp:net', '../../net/net.gyp:net',
], ],
'export_dependent_settings': [
'../../mojo/mojo.gyp:mojo_cpp_bindings',
],
'sources': [ 'sources': [
'serial.mojom', 'serial.mojom',
'serial_device_enumerator.cc', 'serial_device_enumerator.cc',
...@@ -46,6 +50,8 @@ ...@@ -46,6 +50,8 @@
'serial_io_handler_posix.h', 'serial_io_handler_posix.h',
'serial_io_handler_win.cc', 'serial_io_handler_win.cc',
'serial_io_handler_win.h', 'serial_io_handler_win.h',
'serial_service_impl.cc',
'serial_service_impl.h',
], ],
}, },
], ],
......
...@@ -79,4 +79,8 @@ struct DeviceControlSignals { ...@@ -79,4 +79,8 @@ struct DeviceControlSignals {
bool dsr; bool dsr;
}; };
interface SerialService {
GetDevices() => (DeviceInfo[] devices);
};
} }
...@@ -45,7 +45,7 @@ SerialDeviceEnumeratorLinux::SerialDeviceEnumeratorLinux() { ...@@ -45,7 +45,7 @@ SerialDeviceEnumeratorLinux::SerialDeviceEnumeratorLinux() {
SerialDeviceEnumeratorLinux::~SerialDeviceEnumeratorLinux() {} SerialDeviceEnumeratorLinux::~SerialDeviceEnumeratorLinux() {}
mojo::Array<serial::DeviceInfoPtr> SerialDeviceEnumeratorLinux::GetDevices() { mojo::Array<serial::DeviceInfoPtr> SerialDeviceEnumeratorLinux::GetDevices() {
mojo::Array<serial::DeviceInfoPtr> devices; mojo::Array<serial::DeviceInfoPtr> devices(0);
ScopedUdevEnumeratePtr enumerate(udev_enumerate_new(udev_.get())); ScopedUdevEnumeratePtr enumerate(udev_enumerate_new(udev_.get()));
if (!enumerate) { if (!enumerate) {
LOG(ERROR) << "Serial device enumeration failed."; LOG(ERROR) << "Serial device enumeration failed.";
......
...@@ -36,7 +36,7 @@ mojo::Array<serial::DeviceInfoPtr> SerialDeviceEnumeratorMac::GetDevices() { ...@@ -36,7 +36,7 @@ mojo::Array<serial::DeviceInfoPtr> SerialDeviceEnumeratorMac::GetDevices() {
valid_patterns.insert("/dev/tty.*"); valid_patterns.insert("/dev/tty.*");
valid_patterns.insert("/dev/cu.*"); valid_patterns.insert("/dev/cu.*");
mojo::Array<serial::DeviceInfoPtr> devices; mojo::Array<serial::DeviceInfoPtr> devices(0);
base::FileEnumerator enumerator(kDevRoot, false, kFilesAndSymLinks); base::FileEnumerator enumerator(kDevRoot, false, kFilesAndSymLinks);
do { do {
const base::FilePath next_device_path(enumerator.Next()); const base::FilePath next_device_path(enumerator.Next());
......
...@@ -29,7 +29,7 @@ SerialDeviceEnumeratorWin::~SerialDeviceEnumeratorWin() {} ...@@ -29,7 +29,7 @@ SerialDeviceEnumeratorWin::~SerialDeviceEnumeratorWin() {}
mojo::Array<serial::DeviceInfoPtr> SerialDeviceEnumeratorWin::GetDevices() { mojo::Array<serial::DeviceInfoPtr> SerialDeviceEnumeratorWin::GetDevices() {
base::win::RegistryValueIterator iter_key( base::win::RegistryValueIterator iter_key(
HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM\\"); HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM\\");
mojo::Array<serial::DeviceInfoPtr> devices; mojo::Array<serial::DeviceInfoPtr> devices(0);
for (; iter_key.Valid(); ++iter_key) { for (; iter_key.Valid(); ++iter_key) {
serial::DeviceInfoPtr info(serial::DeviceInfo::New()); serial::DeviceInfoPtr info(serial::DeviceInfo::New());
info->path = base::UTF16ToASCII(iter_key.Value()); info->path = base::UTF16ToASCII(iter_key.Value());
......
// Copyright 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 "device/serial/serial_service_impl.h"
#include "base/bind.h"
#include "base/location.h"
namespace device {
SerialServiceImpl::SerialServiceImpl() {
}
SerialServiceImpl::~SerialServiceImpl() {
}
// static
void SerialServiceImpl::Create(
mojo::InterfaceRequest<serial::SerialService> request) {
mojo::BindToRequest(new SerialServiceImpl(), &request);
}
// static
void SerialServiceImpl::CreateOnMessageLoop(
scoped_refptr<base::MessageLoopProxy> message_loop,
mojo::InterfaceRequest<serial::SerialService> request) {
message_loop->PostTask(
FROM_HERE,
base::Bind(&SerialServiceImpl::Create, base::Passed(&request)));
}
void SerialServiceImpl::GetDevices(
const mojo::Callback<void(mojo::Array<serial::DeviceInfoPtr>)>& callback) {
if (!device_enumerator_)
device_enumerator_ = SerialDeviceEnumerator::Create();
callback.Run(device_enumerator_->GetDevices());
}
void SerialServiceImpl::OnConnectionError() {
delete this;
}
} // namespace device
// Copyright 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.
#ifndef DEVICE_SERIAL_SERIAL_SERVICE_IMPL_H_
#define DEVICE_SERIAL_SERIAL_SERVICE_IMPL_H_
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop_proxy.h"
#include "device/serial/serial.mojom.h"
#include "device/serial/serial_device_enumerator.h"
#include "mojo/public/cpp/bindings/interface_impl.h"
namespace device {
class SerialServiceImpl : public mojo::InterfaceImpl<serial::SerialService> {
public:
SerialServiceImpl();
virtual ~SerialServiceImpl();
static void Create(mojo::InterfaceRequest<serial::SerialService> request);
static void CreateOnMessageLoop(
scoped_refptr<base::MessageLoopProxy> message_loop,
mojo::InterfaceRequest<serial::SerialService> request);
// mojo::InterfaceImpl<SerialService> overrides.
virtual void GetDevices(const mojo::Callback<
void(mojo::Array<serial::DeviceInfoPtr>)>& callback) OVERRIDE;
virtual void OnConnectionError() OVERRIDE;
private:
scoped_ptr<SerialDeviceEnumerator> device_enumerator_;
};
} // namespace device
#endif // DEVICE_SERIAL_SERIAL_SERVICE_IMPL_H_
// Copyright 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 "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "device/serial/serial.mojom.h"
#include "device/serial/serial_service_impl.h"
#include "mojo/public/cpp/bindings/error_handler.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace device {
class SerialServiceTest : public testing::Test, public mojo::ErrorHandler {
public:
SerialServiceTest() {}
void StoreDevices(mojo::Array<serial::DeviceInfoPtr> devices) {
devices_ = devices.Pass();
message_loop_.PostTask(FROM_HERE, run_loop_.QuitClosure());
}
virtual void OnConnectionError() OVERRIDE {
message_loop_.PostTask(FROM_HERE, run_loop_.QuitClosure());
FAIL() << "Connection error";
}
base::MessageLoop message_loop_;
base::RunLoop run_loop_;
mojo::Array<serial::DeviceInfoPtr> devices_;
private:
DISALLOW_COPY_AND_ASSIGN(SerialServiceTest);
};
TEST_F(SerialServiceTest, GetDevices) {
mojo::InterfacePtr<serial::SerialService> service;
SerialServiceImpl::Create(mojo::Get(&service));
service.set_error_handler(this);
mojo::Array<serial::DeviceInfoPtr> result;
service->GetDevices(
base::Bind(&SerialServiceTest::StoreDevices, base::Unretained(this)));
run_loop_.Run();
// Because we're running on unknown hardware, only check that we received a
// non-null result.
EXPECT_TRUE(devices_);
}
} // namespace device
include_rules = [
"+mojo/embedder",
]
// Copyright 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 "base/bind.h"
#include "base/test/launcher/unit_test_launcher.h"
#include "base/test/test_suite.h"
#include "mojo/embedder/embedder.h"
int main(int argc, char** argv) {
base::TestSuite test_suite(argc, argv);
mojo::embedder::Init();
return base::LaunchUnitTests(
argc,
argv,
base::Bind(&base::TestSuite::Run, base::Unretained(&test_suite)));
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment