Chromium Code Reviews| 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; |
|
Ken Rockot(use gerrit already)
2014/07/31 16:28:33
clever
|
| + 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 |