OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/bind.h" |
| 6 #include "base/message_loop/message_loop.h" |
| 7 #include "base/run_loop.h" |
| 8 #include "device/serial/serial.mojom.h" |
| 9 #include "device/serial/serial_service_impl.h" |
| 10 #include "device/serial/test_serial_io_handler.h" |
| 11 #include "mojo/public/cpp/bindings/error_handler.h" |
| 12 #include "mojo/public/cpp/bindings/interface_ptr.h" |
| 13 #include "mojo/public/cpp/bindings/interface_request.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 |
| 16 namespace device { |
| 17 namespace { |
| 18 |
| 19 class FakeSerialDeviceEnumerator : public SerialDeviceEnumerator { |
| 20 virtual mojo::Array<serial::DeviceInfoPtr> GetDevices() OVERRIDE { |
| 21 mojo::Array<serial::DeviceInfoPtr> devices(1); |
| 22 devices[0] = serial::DeviceInfo::New(); |
| 23 devices[0]->path = "device"; |
| 24 return devices.Pass(); |
| 25 } |
| 26 }; |
| 27 |
| 28 } // namespace |
| 29 |
| 30 class SerialConnectionTest : public testing::Test, public mojo::ErrorHandler { |
| 31 public: |
| 32 SerialConnectionTest() : connected_(false), success_(false) {} |
| 33 |
| 34 virtual void SetUp() OVERRIDE { |
| 35 message_loop_.reset(new base::MessageLoop); |
| 36 mojo::InterfacePtr<serial::SerialService> service; |
| 37 mojo::BindToProxy( |
| 38 new SerialServiceImpl( |
| 39 new SerialConnectionFactory( |
| 40 base::Bind(&SerialConnectionTest::CreateIoHandler, |
| 41 base::Unretained(this)), |
| 42 base::MessageLoopProxy::current()), |
| 43 scoped_ptr<SerialDeviceEnumerator>(new FakeSerialDeviceEnumerator)), |
| 44 &service); |
| 45 service.set_error_handler(this); |
| 46 service->Connect( |
| 47 "device", serial::ConnectionOptions::New(), mojo::Get(&connection_)); |
| 48 connection_.set_error_handler(this); |
| 49 connection_->GetInfo( |
| 50 base::Bind(&SerialConnectionTest::StoreInfo, base::Unretained(this))); |
| 51 RunMessageLoop(); |
| 52 ASSERT_TRUE(io_handler_); |
| 53 } |
| 54 |
| 55 void StoreInfo(serial::ConnectionInfoPtr options) { |
| 56 info_ = options.Pass(); |
| 57 StopMessageLoop(); |
| 58 } |
| 59 |
| 60 void StoreControlSignals(serial::DeviceControlSignalsPtr signals) { |
| 61 signals_ = signals.Pass(); |
| 62 StopMessageLoop(); |
| 63 } |
| 64 |
| 65 void StoreSuccess(bool success) { |
| 66 success_ = success; |
| 67 StopMessageLoop(); |
| 68 } |
| 69 |
| 70 void RunMessageLoop() { |
| 71 run_loop_.reset(new base::RunLoop); |
| 72 run_loop_->Run(); |
| 73 } |
| 74 |
| 75 void StopMessageLoop() { |
| 76 ASSERT_TRUE(message_loop_); |
| 77 ASSERT_TRUE(run_loop_); |
| 78 message_loop_->PostTask(FROM_HERE, run_loop_->QuitClosure()); |
| 79 } |
| 80 |
| 81 scoped_refptr<SerialIoHandler> CreateIoHandler() { |
| 82 io_handler_ = new TestSerialIoHandler; |
| 83 return io_handler_; |
| 84 } |
| 85 |
| 86 virtual void OnConnectionError() OVERRIDE { |
| 87 StopMessageLoop(); |
| 88 FAIL() << "Connection error"; |
| 89 } |
| 90 |
| 91 mojo::Array<serial::DeviceInfoPtr> devices_; |
| 92 serial::ConnectionInfoPtr info_; |
| 93 serial::DeviceControlSignalsPtr signals_; |
| 94 bool connected_; |
| 95 bool success_; |
| 96 |
| 97 scoped_ptr<base::MessageLoop> message_loop_; |
| 98 scoped_ptr<base::RunLoop> run_loop_; |
| 99 mojo::InterfacePtr<serial::Connection> connection_; |
| 100 scoped_refptr<TestSerialIoHandler> io_handler_; |
| 101 |
| 102 private: |
| 103 DISALLOW_COPY_AND_ASSIGN(SerialConnectionTest); |
| 104 }; |
| 105 |
| 106 TEST_F(SerialConnectionTest, GetInfo) { |
| 107 // |info_| is filled in during SetUp(). |
| 108 ASSERT_TRUE(info_); |
| 109 EXPECT_EQ(9600u, info_->bitrate); |
| 110 EXPECT_EQ(serial::DATA_BITS_EIGHT, info_->data_bits); |
| 111 EXPECT_EQ(serial::PARITY_BIT_NO, info_->parity_bit); |
| 112 EXPECT_EQ(serial::STOP_BITS_ONE, info_->stop_bits); |
| 113 EXPECT_FALSE(info_->cts_flow_control); |
| 114 } |
| 115 |
| 116 TEST_F(SerialConnectionTest, SetOptions) { |
| 117 serial::ConnectionOptionsPtr options(serial::ConnectionOptions::New()); |
| 118 options->bitrate = 12345; |
| 119 options->data_bits = serial::DATA_BITS_SEVEN; |
| 120 options->has_cts_flow_control = true; |
| 121 options->cts_flow_control = true; |
| 122 connection_->SetOptions( |
| 123 options.Pass(), |
| 124 base::Bind(&SerialConnectionTest::StoreSuccess, base::Unretained(this))); |
| 125 RunMessageLoop(); |
| 126 ASSERT_TRUE(success_); |
| 127 serial::ConnectionInfo* info = io_handler_->connection_info(); |
| 128 EXPECT_EQ(12345u, info->bitrate); |
| 129 EXPECT_EQ(serial::DATA_BITS_SEVEN, info->data_bits); |
| 130 EXPECT_EQ(serial::PARITY_BIT_NO, info->parity_bit); |
| 131 EXPECT_EQ(serial::STOP_BITS_ONE, info->stop_bits); |
| 132 EXPECT_TRUE(info->cts_flow_control); |
| 133 } |
| 134 |
| 135 TEST_F(SerialConnectionTest, GetControlSignals) { |
| 136 connection_->GetControlSignals(base::Bind( |
| 137 &SerialConnectionTest::StoreControlSignals, base::Unretained(this))); |
| 138 serial::DeviceControlSignals* signals = io_handler_->device_control_signals(); |
| 139 signals->dcd = true; |
| 140 signals->dsr = true; |
| 141 |
| 142 RunMessageLoop(); |
| 143 ASSERT_TRUE(signals_); |
| 144 EXPECT_TRUE(signals_->dcd); |
| 145 EXPECT_FALSE(signals_->cts); |
| 146 EXPECT_FALSE(signals_->ri); |
| 147 EXPECT_TRUE(signals_->dsr); |
| 148 } |
| 149 |
| 150 TEST_F(SerialConnectionTest, SetControlSignals) { |
| 151 serial::HostControlSignalsPtr signals(serial::HostControlSignals::New()); |
| 152 signals->has_dtr = true; |
| 153 signals->dtr = true; |
| 154 signals->has_rts = true; |
| 155 signals->rts = true; |
| 156 |
| 157 connection_->SetControlSignals( |
| 158 signals.Pass(), |
| 159 base::Bind(&SerialConnectionTest::StoreSuccess, base::Unretained(this))); |
| 160 RunMessageLoop(); |
| 161 ASSERT_TRUE(success_); |
| 162 EXPECT_TRUE(io_handler_->dtr()); |
| 163 EXPECT_TRUE(io_handler_->rts()); |
| 164 } |
| 165 |
| 166 TEST_F(SerialConnectionTest, Flush) { |
| 167 ASSERT_EQ(0, io_handler_->flushes()); |
| 168 connection_->Flush( |
| 169 base::Bind(&SerialConnectionTest::StoreSuccess, base::Unretained(this))); |
| 170 RunMessageLoop(); |
| 171 ASSERT_TRUE(success_); |
| 172 EXPECT_EQ(1, io_handler_->flushes()); |
| 173 } |
| 174 |
| 175 TEST_F(SerialConnectionTest, Disconnect) { |
| 176 connection_.reset(); |
| 177 message_loop_.reset(); |
| 178 EXPECT_TRUE(io_handler_->HasOneRef()); |
| 179 } |
| 180 |
| 181 } // namespace device |
OLD | NEW |