Chromium Code Reviews| Index: device/usb/usb_device_handle_unittest.cc |
| diff --git a/device/usb/usb_device_handle_unittest.cc b/device/usb/usb_device_handle_unittest.cc |
| index 4cb4dff3e778a5a148f32007f20952aca58416c0..695a7f84fea0b6d6281d2673d6708d80ed486e0a 100644 |
| --- a/device/usb/usb_device_handle_unittest.cc |
| +++ b/device/usb/usb_device_handle_unittest.cc |
| @@ -6,6 +6,7 @@ |
| #include "base/message_loop/message_loop.h" |
| #include "base/run_loop.h" |
| #include "base/strings/utf_string_conversions.h" |
| +#include "base/test/test_io_thread.h" |
| #include "device/test/usb_test_gadget.h" |
| #include "device/usb/usb_device.h" |
| #include "device/usb/usb_device_handle.h" |
| @@ -18,35 +19,63 @@ namespace { |
| class UsbDeviceHandleTest : public ::testing::Test { |
| public: |
| void SetUp() override { |
| - if (!UsbTestGadget::IsTestEnabled()) { |
| - return; |
| - } |
| + message_loop_.reset(new base::MessageLoopForUI); |
| + io_thread_.reset(new base::TestIOThread(base::TestIOThread::kAutoStart)); |
| + } |
| - message_loop_.reset(new base::MessageLoopForIO); |
| + protected: |
| + scoped_ptr<base::TestIOThread> io_thread_; |
| - gadget_ = UsbTestGadget::Claim(); |
| - ASSERT_TRUE(gadget_.get()); |
| + private: |
| + scoped_ptr<base::MessageLoop> message_loop_; |
| +}; |
| - ASSERT_TRUE(gadget_->SetType(UsbTestGadget::ECHO)); |
| +class TestOpenCallback { |
| + public: |
| + TestOpenCallback() |
| + : callback_( |
| + base::Bind(&TestOpenCallback::SetResult, base::Unretained(this))) {} |
| - handle_ = gadget_->GetDevice()->Open(); |
| - ASSERT_TRUE(handle_.get()); |
| + scoped_refptr<UsbDeviceHandle> WaitForResult() { |
| + run_loop_.Run(); |
| + return device_handle_; |
| } |
| - void TearDown() override { |
| - if (handle_.get()) { |
| - handle_->Close(); |
| - } |
| - gadget_.reset(NULL); |
| - message_loop_.reset(NULL); |
| + const UsbDevice::OpenCallback& callback() const { return callback_; } |
| + |
| + private: |
| + void SetResult(scoped_refptr<UsbDeviceHandle> device_handle) { |
| + device_handle_ = device_handle; |
| + run_loop_.Quit(); |
| } |
| - protected: |
| - scoped_refptr<UsbDeviceHandle> handle_; |
| + const UsbDevice::OpenCallback callback_; |
| + base::RunLoop run_loop_; |
| + scoped_refptr<UsbDeviceHandle> device_handle_; |
| +}; |
| + |
| +class TestSuccessCallback { |
| + public: |
| + TestSuccessCallback() |
| + : callback_(base::Bind(&TestSuccessCallback::SetResult, |
| + base::Unretained(this))) {} |
| + |
| + bool WaitForResult() { |
| + run_loop_.Run(); |
| + return success_; |
| + } |
| + |
| + const UsbSuccessCallback& callback() const { return callback_; } |
| private: |
| - scoped_ptr<UsbTestGadget> gadget_; |
| - scoped_ptr<base::MessageLoop> message_loop_; |
| + void SetResult(bool success) { |
| + success_ = success; |
| + run_loop_.Quit(); |
| + } |
| + |
| + const UsbSuccessCallback callback_; |
| + base::RunLoop run_loop_; |
| + bool success_; |
| }; |
| class TestCompletionCallback { |
| @@ -55,6 +84,13 @@ class TestCompletionCallback { |
| : callback_(base::Bind(&TestCompletionCallback::SetResult, |
| base::Unretained(this))) {} |
| + void WaitForResult() { run_loop_.Run(); } |
| + |
| + const UsbTransferCallback& callback() const { return callback_; } |
| + UsbTransferStatus status() const { return status_; } |
| + size_t transferred() const { return transferred_; } |
| + |
| + private: |
| void SetResult(UsbTransferStatus status, |
| scoped_refptr<net::IOBuffer> buffer, |
| size_t transferred) { |
| @@ -63,13 +99,6 @@ class TestCompletionCallback { |
| run_loop_.Quit(); |
| } |
| - void WaitForResult() { run_loop_.Run(); } |
| - |
| - const UsbTransferCallback& callback() const { return callback_; } |
| - UsbTransferStatus status() const { return status_; } |
| - size_t transferred() const { return transferred_; } |
| - |
| - private: |
| const UsbTransferCallback callback_; |
| base::RunLoop run_loop_; |
| UsbTransferStatus status_; |
| @@ -77,20 +106,30 @@ class TestCompletionCallback { |
| }; |
| TEST_F(UsbDeviceHandleTest, InterruptTransfer) { |
| - if (!handle_.get()) { |
| + if (!UsbTestGadget::IsTestEnabled()) { |
| return; |
| } |
| - ASSERT_TRUE(handle_->ClaimInterface(0)); |
| + scoped_ptr<UsbTestGadget> gadget = |
| + UsbTestGadget::Claim(io_thread_->task_runner()); |
| + ASSERT_TRUE(gadget.get()); |
| + ASSERT_TRUE(gadget->SetType(UsbTestGadget::ECHO)); |
| + |
| + TestOpenCallback open_device; |
| + gadget->GetDevice()->Open(open_device.callback()); |
| + scoped_refptr<UsbDeviceHandle> handle = open_device.WaitForResult(); |
| + ASSERT_TRUE(handle.get()); |
| + |
| + TestSuccessCallback claim_interface; |
| + handle->ClaimInterface(0, claim_interface.callback()); |
| + ASSERT_TRUE(claim_interface.WaitForResult()); |
| scoped_refptr<net::IOBufferWithSize> in_buffer(new net::IOBufferWithSize(64)); |
| TestCompletionCallback in_completion; |
| - handle_->InterruptTransfer(USB_DIRECTION_INBOUND, |
| - 0x81, |
| - in_buffer.get(), |
| - in_buffer->size(), |
| - 5000, // 5 second timeout |
| - in_completion.callback()); |
| + handle->InterruptTransfer(USB_DIRECTION_INBOUND, 0x81, in_buffer.get(), |
| + in_buffer->size(), |
| + 5000, // 5 second timeout |
| + in_completion.callback()); |
| scoped_refptr<net::IOBufferWithSize> out_buffer( |
| new net::IOBufferWithSize(in_buffer->size())); |
| @@ -99,12 +138,10 @@ TEST_F(UsbDeviceHandleTest, InterruptTransfer) { |
| out_buffer->data()[i] = i; |
| } |
| - handle_->InterruptTransfer(USB_DIRECTION_OUTBOUND, |
| - 0x01, |
| - out_buffer.get(), |
| - out_buffer->size(), |
| - 5000, // 5 second timeout |
| - out_completion.callback()); |
| + handle->InterruptTransfer(USB_DIRECTION_OUTBOUND, 0x01, out_buffer.get(), |
| + out_buffer->size(), |
| + 5000, // 5 second timeout |
| + out_completion.callback()); |
| out_completion.WaitForResult(); |
| ASSERT_EQ(USB_TRANSFER_COMPLETED, out_completion.status()); |
| EXPECT_EQ(static_cast<size_t>(out_buffer->size()), |
| @@ -117,22 +154,36 @@ TEST_F(UsbDeviceHandleTest, InterruptTransfer) { |
| for (size_t i = 0; i < in_completion.transferred(); ++i) { |
| EXPECT_EQ(out_buffer->data()[i], in_buffer->data()[i]); |
| } |
| + |
| + handle->Close(); |
| } |
| TEST_F(UsbDeviceHandleTest, BulkTransfer) { |
| - if (!handle_.get()) { |
| + if (!UsbTestGadget::IsTestEnabled()) { |
| return; |
| } |
| - ASSERT_TRUE(handle_->ClaimInterface(1)); |
| + scoped_ptr<UsbTestGadget> gadget = |
| + UsbTestGadget::Claim(io_thread_->task_runner()); |
| + ASSERT_TRUE(gadget.get()); |
| + ASSERT_TRUE(gadget->SetType(UsbTestGadget::ECHO)); |
| + |
| + TestOpenCallback open_device; |
| + gadget->GetDevice()->Open(open_device.callback()); |
| + scoped_refptr<UsbDeviceHandle> handle = open_device.WaitForResult(); |
| + ASSERT_TRUE(handle.get()); |
| + |
| + TestSuccessCallback claim_interface; |
| + handle->ClaimInterface(1, claim_interface.callback()); |
| + ASSERT_TRUE(claim_interface.WaitForResult()); |
| scoped_refptr<net::IOBufferWithSize> in_buffer( |
| new net::IOBufferWithSize(512)); |
| TestCompletionCallback in_completion; |
| - handle_->BulkTransfer(USB_DIRECTION_INBOUND, 0x82, in_buffer.get(), |
| - in_buffer->size(), |
| - 5000, // 5 second timeout |
| - in_completion.callback()); |
| + handle->BulkTransfer(USB_DIRECTION_INBOUND, 0x82, in_buffer.get(), |
| + in_buffer->size(), |
| + 5000, // 5 second timeout |
| + in_completion.callback()); |
| scoped_refptr<net::IOBufferWithSize> out_buffer( |
| new net::IOBufferWithSize(in_buffer->size())); |
| @@ -141,10 +192,10 @@ TEST_F(UsbDeviceHandleTest, BulkTransfer) { |
| out_buffer->data()[i] = i; |
| } |
| - handle_->BulkTransfer(USB_DIRECTION_OUTBOUND, 0x02, out_buffer.get(), |
| - out_buffer->size(), |
| - 5000, // 5 second timeout |
| - out_completion.callback()); |
| + handle->BulkTransfer(USB_DIRECTION_OUTBOUND, 0x02, out_buffer.get(), |
| + out_buffer->size(), |
| + 5000, // 5 second timeout |
| + out_completion.callback()); |
| out_completion.WaitForResult(); |
| ASSERT_EQ(USB_TRANSFER_COMPLETED, out_completion.status()); |
| EXPECT_EQ(static_cast<size_t>(out_buffer->size()), |
| @@ -157,6 +208,8 @@ TEST_F(UsbDeviceHandleTest, BulkTransfer) { |
| for (size_t i = 0; i < in_completion.transferred(); ++i) { |
| EXPECT_EQ(out_buffer->data()[i], in_buffer->data()[i]); |
| } |
| + |
| + handle->Close(); |
|
Ken Rockot(use gerrit already)
2015/04/07 22:09:44
Is there some reason why this has to be called now
Reilly Grant (use Gerrit)
2015/04/08 21:39:03
This was a bug. Since these objects are reference
|
| } |
| } // namespace |