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

Unified Diff: extensions/renderer/api/serial/serial_api_unittest.cc

Issue 423403002: Implement more of chrome.serial on the Mojo SerialConnection. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@js-serial
Patch Set: add missed GN change Created 6 years, 4 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 | « extensions/extensions.gyp ('k') | extensions/renderer/resources/serial_custom_bindings.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/renderer/api/serial/serial_api_unittest.cc
diff --git a/extensions/renderer/api/serial/serial_api_unittest.cc b/extensions/renderer/api/serial/serial_api_unittest.cc
index 3f551ca4b84d1b9637df90b540a8f0809098e414..530ce2e93b0ed0383d1b78dabfefe3656b3ab167 100644
--- a/extensions/renderer/api/serial/serial_api_unittest.cc
+++ b/extensions/renderer/api/serial/serial_api_unittest.cc
@@ -4,6 +4,7 @@
#include "device/serial/serial_device_enumerator.h"
#include "device/serial/serial_service_impl.h"
+#include "device/serial/test_serial_io_handler.h"
#include "extensions/renderer/api_test_base.h"
#include "grit/extensions_renderer_resources.h"
@@ -32,34 +33,415 @@ class FakeSerialDeviceEnumerator : public device::SerialDeviceEnumerator {
}
};
-} // namespace
+enum OptionalValue {
+ OPTIONAL_VALUE_UNSET,
+ OPTIONAL_VALUE_FALSE,
+ OPTIONAL_VALUE_TRUE,
+};
-void CreateSerialService(
- mojo::InterfaceRequest<device::serial::SerialService> request) {
- mojo::BindToRequest(
- new device::SerialServiceImpl(
- new device::SerialConnectionFactory(
- device::SerialConnectionFactory::IoHandlerFactory(),
- base::MessageLoopProxy::current()),
- scoped_ptr<device::SerialDeviceEnumerator>(
- new FakeSerialDeviceEnumerator)),
- &request);
+device::serial::HostControlSignals GenerateControlSignals(OptionalValue dtr,
+ OptionalValue rts) {
+ device::serial::HostControlSignals result;
+ switch (dtr) {
+ case OPTIONAL_VALUE_UNSET:
+ break;
+ case OPTIONAL_VALUE_FALSE:
+ result.dtr = false;
+ result.has_dtr = true;
+ break;
+ case OPTIONAL_VALUE_TRUE:
+ result.dtr = true;
+ result.has_dtr = true;
+ break;
+ }
+ switch (rts) {
+ case OPTIONAL_VALUE_UNSET:
+ break;
+ case OPTIONAL_VALUE_FALSE:
+ result.rts = false;
+ result.has_rts = true;
+ break;
+ case OPTIONAL_VALUE_TRUE:
+ result.rts = true;
+ result.has_rts = true;
+ break;
+ }
+ return result;
+}
+
+device::serial::ConnectionOptions GenerateConnectionOptions(
+ int bitrate,
+ device::serial::DataBits data_bits,
+ device::serial::ParityBit parity_bit,
+ device::serial::StopBits stop_bits,
+ OptionalValue cts_flow_control) {
+ device::serial::ConnectionOptions result;
+ result.bitrate = bitrate;
+ result.data_bits = data_bits;
+ result.parity_bit = parity_bit;
+ result.stop_bits = stop_bits;
+ switch (cts_flow_control) {
+ case OPTIONAL_VALUE_UNSET:
+ break;
+ case OPTIONAL_VALUE_FALSE:
+ result.cts_flow_control = false;
+ result.has_cts_flow_control = true;
+ break;
+ case OPTIONAL_VALUE_TRUE:
+ result.cts_flow_control = true;
+ result.has_cts_flow_control = true;
+ break;
+ }
+ return result;
}
+class TestIoHandlerBase : public device::TestSerialIoHandler {
+ public:
+ TestIoHandlerBase() : calls_(0) {}
+
+ size_t num_calls() const { return calls_; }
+
+ protected:
+ virtual ~TestIoHandlerBase() {}
+ void record_call() const { calls_++; }
+
+ private:
+ mutable size_t calls_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestIoHandlerBase);
+};
+
+class SetControlSignalsTestIoHandler : public TestIoHandlerBase {
+ public:
+ SetControlSignalsTestIoHandler() {}
+
+ virtual bool SetControlSignals(
+ const device::serial::HostControlSignals& signals) OVERRIDE {
+ static const device::serial::HostControlSignals expected_signals[] = {
+ GenerateControlSignals(OPTIONAL_VALUE_UNSET, OPTIONAL_VALUE_UNSET),
+ GenerateControlSignals(OPTIONAL_VALUE_FALSE, OPTIONAL_VALUE_UNSET),
+ GenerateControlSignals(OPTIONAL_VALUE_TRUE, OPTIONAL_VALUE_UNSET),
+ GenerateControlSignals(OPTIONAL_VALUE_UNSET, OPTIONAL_VALUE_FALSE),
+ GenerateControlSignals(OPTIONAL_VALUE_FALSE, OPTIONAL_VALUE_FALSE),
+ GenerateControlSignals(OPTIONAL_VALUE_TRUE, OPTIONAL_VALUE_FALSE),
+ GenerateControlSignals(OPTIONAL_VALUE_UNSET, OPTIONAL_VALUE_TRUE),
+ GenerateControlSignals(OPTIONAL_VALUE_FALSE, OPTIONAL_VALUE_TRUE),
+ GenerateControlSignals(OPTIONAL_VALUE_TRUE, OPTIONAL_VALUE_TRUE),
+ };
+ if (num_calls() >= arraysize(expected_signals))
+ return false;
+
+ EXPECT_EQ(expected_signals[num_calls()].has_dtr, signals.has_dtr);
+ EXPECT_EQ(expected_signals[num_calls()].dtr, signals.dtr);
+ EXPECT_EQ(expected_signals[num_calls()].has_rts, signals.has_rts);
+ EXPECT_EQ(expected_signals[num_calls()].rts, signals.rts);
+ record_call();
+ return true;
+ }
+
+ private:
+ virtual ~SetControlSignalsTestIoHandler() {}
+
+ DISALLOW_COPY_AND_ASSIGN(SetControlSignalsTestIoHandler);
+};
+
+class GetControlSignalsTestIoHandler : public TestIoHandlerBase {
+ public:
+ GetControlSignalsTestIoHandler() {}
+
+ virtual device::serial::DeviceControlSignalsPtr GetControlSignals()
+ const OVERRIDE {
+ device::serial::DeviceControlSignalsPtr signals(
+ device::serial::DeviceControlSignals::New());
+ signals->dcd = num_calls() & 1;
+ signals->cts = num_calls() & 2;
+ signals->ri = num_calls() & 4;
+ signals->dsr = num_calls() & 8;
+ record_call();
+ return signals.Pass();
+ }
+
+ private:
+ virtual ~GetControlSignalsTestIoHandler() {}
+
+ DISALLOW_COPY_AND_ASSIGN(GetControlSignalsTestIoHandler);
+};
+
+class ConfigurePortTestIoHandler : public TestIoHandlerBase {
+ public:
+ ConfigurePortTestIoHandler() {}
+ virtual bool ConfigurePort(
+ const device::serial::ConnectionOptions& options) OVERRIDE {
+ static const device::serial::ConnectionOptions expected_options[] = {
+ GenerateConnectionOptions(9600,
+ device::serial::DATA_BITS_EIGHT,
+ device::serial::PARITY_BIT_NO,
+ device::serial::STOP_BITS_ONE,
+ OPTIONAL_VALUE_FALSE),
+ GenerateConnectionOptions(57600,
+ device::serial::DATA_BITS_NONE,
+ device::serial::PARITY_BIT_NONE,
+ device::serial::STOP_BITS_NONE,
+ OPTIONAL_VALUE_UNSET),
+ GenerateConnectionOptions(0,
+ device::serial::DATA_BITS_SEVEN,
+ device::serial::PARITY_BIT_NONE,
+ device::serial::STOP_BITS_NONE,
+ OPTIONAL_VALUE_UNSET),
+ GenerateConnectionOptions(0,
+ device::serial::DATA_BITS_EIGHT,
+ device::serial::PARITY_BIT_NONE,
+ device::serial::STOP_BITS_NONE,
+ OPTIONAL_VALUE_UNSET),
+ GenerateConnectionOptions(0,
+ device::serial::DATA_BITS_NONE,
+ device::serial::PARITY_BIT_NO,
+ device::serial::STOP_BITS_NONE,
+ OPTIONAL_VALUE_UNSET),
+ GenerateConnectionOptions(0,
+ device::serial::DATA_BITS_NONE,
+ device::serial::PARITY_BIT_ODD,
+ device::serial::STOP_BITS_NONE,
+ OPTIONAL_VALUE_UNSET),
+ GenerateConnectionOptions(0,
+ device::serial::DATA_BITS_NONE,
+ device::serial::PARITY_BIT_EVEN,
+ device::serial::STOP_BITS_NONE,
+ OPTIONAL_VALUE_UNSET),
+ GenerateConnectionOptions(0,
+ device::serial::DATA_BITS_NONE,
+ device::serial::PARITY_BIT_NONE,
+ device::serial::STOP_BITS_ONE,
+ OPTIONAL_VALUE_UNSET),
+ GenerateConnectionOptions(0,
+ device::serial::DATA_BITS_NONE,
+ device::serial::PARITY_BIT_NONE,
+ device::serial::STOP_BITS_TWO,
+ OPTIONAL_VALUE_UNSET),
+ GenerateConnectionOptions(0,
+ device::serial::DATA_BITS_NONE,
+ device::serial::PARITY_BIT_NONE,
+ device::serial::STOP_BITS_NONE,
+ OPTIONAL_VALUE_FALSE),
+ GenerateConnectionOptions(0,
+ device::serial::DATA_BITS_NONE,
+ device::serial::PARITY_BIT_NONE,
+ device::serial::STOP_BITS_NONE,
+ OPTIONAL_VALUE_TRUE),
+ };
+ if (num_calls() >= arraysize(expected_options))
+ return false;
+
+ EXPECT_EQ(expected_options[num_calls()].bitrate, options.bitrate);
+ EXPECT_EQ(expected_options[num_calls()].data_bits, options.data_bits);
+ EXPECT_EQ(expected_options[num_calls()].parity_bit, options.parity_bit);
+ EXPECT_EQ(expected_options[num_calls()].stop_bits, options.stop_bits);
+ EXPECT_EQ(expected_options[num_calls()].has_cts_flow_control,
+ options.has_cts_flow_control);
+ EXPECT_EQ(expected_options[num_calls()].cts_flow_control,
+ options.cts_flow_control);
+ record_call();
+ return TestSerialIoHandler::ConfigurePort(options);
+ }
+
+ private:
+ virtual ~ConfigurePortTestIoHandler() {}
+
+ DISALLOW_COPY_AND_ASSIGN(ConfigurePortTestIoHandler);
+};
+
+class FlushTestIoHandler : public TestIoHandlerBase {
+ public:
+ FlushTestIoHandler() {}
+
+ virtual bool Flush() const OVERRIDE {
+ record_call();
+ return true;
+ }
+
+ private:
+ virtual ~FlushTestIoHandler() {}
+
+ DISALLOW_COPY_AND_ASSIGN(FlushTestIoHandler);
+};
+
+class FailToConnectTestIoHandler : public TestIoHandlerBase {
+ public:
+ FailToConnectTestIoHandler() {}
+ virtual void Open(const std::string& port,
+ const OpenCompleteCallback& callback) OVERRIDE {
+ callback.Run(false);
+ return;
+ }
+
+ private:
+ virtual ~FailToConnectTestIoHandler() {}
+
+ DISALLOW_COPY_AND_ASSIGN(FailToConnectTestIoHandler);
+};
+
+class FailToGetInfoTestIoHandler : public TestIoHandlerBase {
+ public:
+ explicit FailToGetInfoTestIoHandler(int times_to_succeed)
+ : times_to_succeed_(times_to_succeed) {}
+ virtual device::serial::ConnectionInfoPtr GetPortInfo() const OVERRIDE {
+ if (times_to_succeed_-- > 0)
+ return device::TestSerialIoHandler::GetPortInfo();
+ return device::serial::ConnectionInfoPtr();
+ }
+
+ private:
+ virtual ~FailToGetInfoTestIoHandler() {}
+
+ mutable int times_to_succeed_;
+
+ DISALLOW_COPY_AND_ASSIGN(FailToGetInfoTestIoHandler);
+};
+
+} // namespace
+
class SerialApiTest : public ApiTestBase {
public:
+ SerialApiTest() {}
+
virtual void SetUp() OVERRIDE {
ApiTestBase::SetUp();
env()->RegisterModule("serial", IDR_SERIAL_CUSTOM_BINDINGS_JS);
env()->RegisterModule("serial_service", IDR_SERIAL_SERVICE_JS);
env()->RegisterModule("device/serial/serial.mojom", IDR_SERIAL_MOJOM_JS);
- service_provider()->AddService<device::serial::SerialService>(
- base::Bind(CreateSerialService));
+ service_provider()->AddService<device::serial::SerialService>(base::Bind(
+ &SerialApiTest::CreateSerialService, base::Unretained(this)));
+ }
+
+ virtual void TearDown() OVERRIDE {
+ if (io_handler_)
+ EXPECT_TRUE(io_handler_->HasOneRef());
+ ApiTestBase::TearDown();
+ }
+
+ scoped_refptr<TestIoHandlerBase> io_handler_;
+
+ private:
+ scoped_refptr<device::SerialIoHandler> GetIoHandler() {
+ if (!io_handler_)
+ io_handler_ = new TestIoHandlerBase;
+ return io_handler_;
+ }
+
+ void CreateSerialService(
+ mojo::InterfaceRequest<device::serial::SerialService> request) {
+ mojo::BindToRequest(new device::SerialServiceImpl(
+ new device::SerialConnectionFactory(
+ base::Bind(&SerialApiTest::GetIoHandler,
+ base::Unretained(this)),
+ base::MessageLoopProxy::current()),
+ scoped_ptr<device::SerialDeviceEnumerator>(
+ new FakeSerialDeviceEnumerator)),
+ &request);
}
+
+ DISALLOW_COPY_AND_ASSIGN(SerialApiTest);
};
TEST_F(SerialApiTest, GetDevices) {
RunTest("serial_unittest.js", "testGetDevices");
}
+TEST_F(SerialApiTest, ConnectFail) {
+ io_handler_ = new FailToConnectTestIoHandler;
+ RunTest("serial_unittest.js", "testConnectFail");
+}
+
+TEST_F(SerialApiTest, GetInfoFailOnConnect) {
+ io_handler_ = new FailToGetInfoTestIoHandler(0);
+ RunTest("serial_unittest.js", "testGetInfoFailOnConnect");
+}
+
+TEST_F(SerialApiTest, Connect) {
+ RunTest("serial_unittest.js", "testConnect");
+}
+
+TEST_F(SerialApiTest, ConnectDefaultOptions) {
+ RunTest("serial_unittest.js", "testConnectDefaultOptions");
+}
+
+TEST_F(SerialApiTest, ConnectInvalidBitrate) {
+ RunTest("serial_unittest.js", "testConnectInvalidBitrate");
+}
+
+TEST_F(SerialApiTest, GetInfo) {
+ RunTest("serial_unittest.js", "testGetInfo");
+}
+
+TEST_F(SerialApiTest, GetInfoFailToGetPortInfo) {
+ io_handler_ = new FailToGetInfoTestIoHandler(1);
+ RunTest("serial_unittest.js", "testGetInfoFailToGetPortInfo");
+}
+
+TEST_F(SerialApiTest, GetConnections) {
+ RunTest("serial_unittest.js", "testGetConnections");
+}
+
+TEST_F(SerialApiTest, GetControlSignals) {
+ io_handler_ = new GetControlSignalsTestIoHandler;
+ RunTest("serial_unittest.js", "testGetControlSignals");
+ EXPECT_EQ(16u, io_handler_->num_calls());
+}
+
+TEST_F(SerialApiTest, SetControlSignals) {
+ io_handler_ = new SetControlSignalsTestIoHandler;
+ RunTest("serial_unittest.js", "testSetControlSignals");
+ EXPECT_EQ(9u, io_handler_->num_calls());
+}
+
+TEST_F(SerialApiTest, Update) {
+ io_handler_ = new ConfigurePortTestIoHandler;
+ RunTest("serial_unittest.js", "testUpdate");
+ EXPECT_EQ(11u, io_handler_->num_calls());
+}
+
+TEST_F(SerialApiTest, UpdateInvalidBitrate) {
+ io_handler_ = new ConfigurePortTestIoHandler;
+ RunTest("serial_unittest.js", "testUpdateInvalidBitrate");
+ EXPECT_EQ(1u, io_handler_->num_calls());
+}
+
+TEST_F(SerialApiTest, Flush) {
+ io_handler_ = new FlushTestIoHandler;
+ RunTest("serial_unittest.js", "testFlush");
+ EXPECT_EQ(1u, io_handler_->num_calls());
+}
+
+TEST_F(SerialApiTest, SetPaused) {
+ RunTest("serial_unittest.js", "testSetPaused");
+}
+
+TEST_F(SerialApiTest, DisconnectUnknownConnectionId) {
+ RunTest("serial_unittest.js", "testDisconnectUnknownConnectionId");
+}
+
+TEST_F(SerialApiTest, GetInfoUnknownConnectionId) {
+ RunTest("serial_unittest.js", "testGetInfoUnknownConnectionId");
+}
+
+TEST_F(SerialApiTest, UpdateUnknownConnectionId) {
+ RunTest("serial_unittest.js", "testUpdateUnknownConnectionId");
+}
+
+TEST_F(SerialApiTest, SetControlSignalsUnknownConnectionId) {
+ RunTest("serial_unittest.js", "testSetControlSignalsUnknownConnectionId");
+}
+
+TEST_F(SerialApiTest, GetControlSignalsUnknownConnectionId) {
+ RunTest("serial_unittest.js", "testGetControlSignalsUnknownConnectionId");
+}
+
+TEST_F(SerialApiTest, FlushUnknownConnectionId) {
+ RunTest("serial_unittest.js", "testFlushUnknownConnectionId");
+}
+
+TEST_F(SerialApiTest, SetPausedUnknownConnectionId) {
+ RunTest("serial_unittest.js", "testSetPausedUnknownConnectionId");
+}
+
} // namespace extensions
« no previous file with comments | « extensions/extensions.gyp ('k') | extensions/renderer/resources/serial_custom_bindings.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698