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

Side by Side Diff: device/usb/usb_device_handle_unittest.cc

Issue 980023002: Move device/usb classes from the FILE thread to UI thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/message_loop/message_loop.h" 6 #include "base/message_loop/message_loop.h"
7 #include "base/run_loop.h" 7 #include "base/run_loop.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "base/test/test_io_thread.h"
9 #include "device/test/usb_test_gadget.h" 10 #include "device/test/usb_test_gadget.h"
10 #include "device/usb/usb_device.h" 11 #include "device/usb/usb_device.h"
11 #include "device/usb/usb_device_handle.h" 12 #include "device/usb/usb_device_handle.h"
12 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
13 14
14 namespace device { 15 namespace device {
15 16
16 namespace { 17 namespace {
17 18
18 class UsbDeviceHandleTest : public ::testing::Test { 19 class UsbDeviceHandleTest : public ::testing::Test {
19 public: 20 public:
20 void SetUp() override { 21 void SetUp() override {
21 if (!UsbTestGadget::IsTestEnabled()) { 22 message_loop_.reset(new base::MessageLoopForUI);
22 return; 23 io_thread_.reset(new base::TestIOThread(base::TestIOThread::kAutoStart));
23 }
24
25 message_loop_.reset(new base::MessageLoopForIO);
26
27 gadget_ = UsbTestGadget::Claim();
28 ASSERT_TRUE(gadget_.get());
29
30 ASSERT_TRUE(gadget_->SetType(UsbTestGadget::ECHO));
31
32 handle_ = gadget_->GetDevice()->Open();
33 ASSERT_TRUE(handle_.get());
34 }
35
36 void TearDown() override {
37 if (handle_.get()) {
38 handle_->Close();
39 }
40 gadget_.reset(NULL);
41 message_loop_.reset(NULL);
42 } 24 }
43 25
44 protected: 26 protected:
45 scoped_refptr<UsbDeviceHandle> handle_; 27 scoped_ptr<base::TestIOThread> io_thread_;
46 28
47 private: 29 private:
48 scoped_ptr<UsbTestGadget> gadget_;
49 scoped_ptr<base::MessageLoop> message_loop_; 30 scoped_ptr<base::MessageLoop> message_loop_;
50 }; 31 };
51 32
33 class TestOpenCallback {
34 public:
35 TestOpenCallback()
36 : callback_(
37 base::Bind(&TestOpenCallback::SetResult, base::Unretained(this))) {}
38
39 scoped_refptr<UsbDeviceHandle> WaitForResult() {
40 run_loop_.Run();
41 return device_handle_;
42 }
43
44 const UsbDevice::OpenCallback& callback() const { return callback_; }
45
46 private:
47 void SetResult(scoped_refptr<UsbDeviceHandle> device_handle) {
48 device_handle_ = device_handle;
49 run_loop_.Quit();
50 }
51
52 const UsbDevice::OpenCallback callback_;
53 base::RunLoop run_loop_;
54 scoped_refptr<UsbDeviceHandle> device_handle_;
55 };
56
57 class TestSuccessCallback {
58 public:
59 TestSuccessCallback()
60 : callback_(base::Bind(&TestSuccessCallback::SetResult,
61 base::Unretained(this))) {}
62
63 bool WaitForResult() {
64 run_loop_.Run();
65 return success_;
66 }
67
68 const UsbSuccessCallback& callback() const { return callback_; }
69
70 private:
71 void SetResult(bool success) {
72 success_ = success;
73 run_loop_.Quit();
74 }
75
76 const UsbSuccessCallback callback_;
77 base::RunLoop run_loop_;
78 bool success_;
79 };
80
52 class TestCompletionCallback { 81 class TestCompletionCallback {
53 public: 82 public:
54 TestCompletionCallback() 83 TestCompletionCallback()
55 : callback_(base::Bind(&TestCompletionCallback::SetResult, 84 : callback_(base::Bind(&TestCompletionCallback::SetResult,
56 base::Unretained(this))) {} 85 base::Unretained(this))) {}
57 86
87 void WaitForResult() { run_loop_.Run(); }
88
89 const UsbTransferCallback& callback() const { return callback_; }
90 UsbTransferStatus status() const { return status_; }
91 size_t transferred() const { return transferred_; }
92
93 private:
58 void SetResult(UsbTransferStatus status, 94 void SetResult(UsbTransferStatus status,
59 scoped_refptr<net::IOBuffer> buffer, 95 scoped_refptr<net::IOBuffer> buffer,
60 size_t transferred) { 96 size_t transferred) {
61 status_ = status; 97 status_ = status;
62 transferred_ = transferred; 98 transferred_ = transferred;
63 run_loop_.Quit(); 99 run_loop_.Quit();
64 } 100 }
65 101
66 void WaitForResult() { run_loop_.Run(); }
67
68 const UsbTransferCallback& callback() const { return callback_; }
69 UsbTransferStatus status() const { return status_; }
70 size_t transferred() const { return transferred_; }
71
72 private:
73 const UsbTransferCallback callback_; 102 const UsbTransferCallback callback_;
74 base::RunLoop run_loop_; 103 base::RunLoop run_loop_;
75 UsbTransferStatus status_; 104 UsbTransferStatus status_;
76 size_t transferred_; 105 size_t transferred_;
77 }; 106 };
78 107
79 TEST_F(UsbDeviceHandleTest, InterruptTransfer) { 108 TEST_F(UsbDeviceHandleTest, InterruptTransfer) {
80 if (!handle_.get()) { 109 if (!UsbTestGadget::IsTestEnabled()) {
81 return; 110 return;
82 } 111 }
83 112
84 ASSERT_TRUE(handle_->ClaimInterface(0)); 113 scoped_ptr<UsbTestGadget> gadget =
114 UsbTestGadget::Claim(io_thread_->task_runner());
115 ASSERT_TRUE(gadget.get());
116 ASSERT_TRUE(gadget->SetType(UsbTestGadget::ECHO));
117
118 TestOpenCallback open_device;
119 gadget->GetDevice()->Open(open_device.callback());
120 scoped_refptr<UsbDeviceHandle> handle = open_device.WaitForResult();
121 ASSERT_TRUE(handle.get());
122
123 TestSuccessCallback claim_interface;
124 handle->ClaimInterface(0, claim_interface.callback());
125 ASSERT_TRUE(claim_interface.WaitForResult());
85 126
86 scoped_refptr<net::IOBufferWithSize> in_buffer(new net::IOBufferWithSize(64)); 127 scoped_refptr<net::IOBufferWithSize> in_buffer(new net::IOBufferWithSize(64));
87 TestCompletionCallback in_completion; 128 TestCompletionCallback in_completion;
88 handle_->InterruptTransfer(USB_DIRECTION_INBOUND, 129 handle->InterruptTransfer(USB_DIRECTION_INBOUND, 0x81, in_buffer.get(),
89 0x81, 130 in_buffer->size(),
90 in_buffer.get(), 131 5000, // 5 second timeout
91 in_buffer->size(), 132 in_completion.callback());
92 5000, // 5 second timeout
93 in_completion.callback());
94 133
95 scoped_refptr<net::IOBufferWithSize> out_buffer( 134 scoped_refptr<net::IOBufferWithSize> out_buffer(
96 new net::IOBufferWithSize(in_buffer->size())); 135 new net::IOBufferWithSize(in_buffer->size()));
97 TestCompletionCallback out_completion; 136 TestCompletionCallback out_completion;
98 for (int i = 0; i < out_buffer->size(); ++i) { 137 for (int i = 0; i < out_buffer->size(); ++i) {
99 out_buffer->data()[i] = i; 138 out_buffer->data()[i] = i;
100 } 139 }
101 140
102 handle_->InterruptTransfer(USB_DIRECTION_OUTBOUND, 141 handle->InterruptTransfer(USB_DIRECTION_OUTBOUND, 0x01, out_buffer.get(),
103 0x01, 142 out_buffer->size(),
104 out_buffer.get(), 143 5000, // 5 second timeout
105 out_buffer->size(), 144 out_completion.callback());
106 5000, // 5 second timeout
107 out_completion.callback());
108 out_completion.WaitForResult(); 145 out_completion.WaitForResult();
109 ASSERT_EQ(USB_TRANSFER_COMPLETED, out_completion.status()); 146 ASSERT_EQ(USB_TRANSFER_COMPLETED, out_completion.status());
110 EXPECT_EQ(static_cast<size_t>(out_buffer->size()), 147 EXPECT_EQ(static_cast<size_t>(out_buffer->size()),
111 out_completion.transferred()); 148 out_completion.transferred());
112 149
113 in_completion.WaitForResult(); 150 in_completion.WaitForResult();
114 ASSERT_EQ(USB_TRANSFER_COMPLETED, in_completion.status()); 151 ASSERT_EQ(USB_TRANSFER_COMPLETED, in_completion.status());
115 EXPECT_EQ(static_cast<size_t>(in_buffer->size()), 152 EXPECT_EQ(static_cast<size_t>(in_buffer->size()),
116 in_completion.transferred()); 153 in_completion.transferred());
117 for (size_t i = 0; i < in_completion.transferred(); ++i) { 154 for (size_t i = 0; i < in_completion.transferred(); ++i) {
118 EXPECT_EQ(out_buffer->data()[i], in_buffer->data()[i]); 155 EXPECT_EQ(out_buffer->data()[i], in_buffer->data()[i]);
119 } 156 }
157
158 handle->Close();
120 } 159 }
121 160
122 TEST_F(UsbDeviceHandleTest, BulkTransfer) { 161 TEST_F(UsbDeviceHandleTest, BulkTransfer) {
123 if (!handle_.get()) { 162 if (!UsbTestGadget::IsTestEnabled()) {
124 return; 163 return;
125 } 164 }
126 165
127 ASSERT_TRUE(handle_->ClaimInterface(1)); 166 scoped_ptr<UsbTestGadget> gadget =
167 UsbTestGadget::Claim(io_thread_->task_runner());
168 ASSERT_TRUE(gadget.get());
169 ASSERT_TRUE(gadget->SetType(UsbTestGadget::ECHO));
170
171 TestOpenCallback open_device;
172 gadget->GetDevice()->Open(open_device.callback());
173 scoped_refptr<UsbDeviceHandle> handle = open_device.WaitForResult();
174 ASSERT_TRUE(handle.get());
175
176 TestSuccessCallback claim_interface;
177 handle->ClaimInterface(1, claim_interface.callback());
178 ASSERT_TRUE(claim_interface.WaitForResult());
128 179
129 scoped_refptr<net::IOBufferWithSize> in_buffer( 180 scoped_refptr<net::IOBufferWithSize> in_buffer(
130 new net::IOBufferWithSize(512)); 181 new net::IOBufferWithSize(512));
131 TestCompletionCallback in_completion; 182 TestCompletionCallback in_completion;
132 handle_->BulkTransfer(USB_DIRECTION_INBOUND, 0x82, in_buffer.get(), 183 handle->BulkTransfer(USB_DIRECTION_INBOUND, 0x82, in_buffer.get(),
133 in_buffer->size(), 184 in_buffer->size(),
134 5000, // 5 second timeout 185 5000, // 5 second timeout
135 in_completion.callback()); 186 in_completion.callback());
136 187
137 scoped_refptr<net::IOBufferWithSize> out_buffer( 188 scoped_refptr<net::IOBufferWithSize> out_buffer(
138 new net::IOBufferWithSize(in_buffer->size())); 189 new net::IOBufferWithSize(in_buffer->size()));
139 TestCompletionCallback out_completion; 190 TestCompletionCallback out_completion;
140 for (int i = 0; i < out_buffer->size(); ++i) { 191 for (int i = 0; i < out_buffer->size(); ++i) {
141 out_buffer->data()[i] = i; 192 out_buffer->data()[i] = i;
142 } 193 }
143 194
144 handle_->BulkTransfer(USB_DIRECTION_OUTBOUND, 0x02, out_buffer.get(), 195 handle->BulkTransfer(USB_DIRECTION_OUTBOUND, 0x02, out_buffer.get(),
145 out_buffer->size(), 196 out_buffer->size(),
146 5000, // 5 second timeout 197 5000, // 5 second timeout
147 out_completion.callback()); 198 out_completion.callback());
148 out_completion.WaitForResult(); 199 out_completion.WaitForResult();
149 ASSERT_EQ(USB_TRANSFER_COMPLETED, out_completion.status()); 200 ASSERT_EQ(USB_TRANSFER_COMPLETED, out_completion.status());
150 EXPECT_EQ(static_cast<size_t>(out_buffer->size()), 201 EXPECT_EQ(static_cast<size_t>(out_buffer->size()),
151 out_completion.transferred()); 202 out_completion.transferred());
152 203
153 in_completion.WaitForResult(); 204 in_completion.WaitForResult();
154 ASSERT_EQ(USB_TRANSFER_COMPLETED, in_completion.status()); 205 ASSERT_EQ(USB_TRANSFER_COMPLETED, in_completion.status());
155 EXPECT_EQ(static_cast<size_t>(in_buffer->size()), 206 EXPECT_EQ(static_cast<size_t>(in_buffer->size()),
156 in_completion.transferred()); 207 in_completion.transferred());
157 for (size_t i = 0; i < in_completion.transferred(); ++i) { 208 for (size_t i = 0; i < in_completion.transferred(); ++i) {
158 EXPECT_EQ(out_buffer->data()[i], in_buffer->data()[i]); 209 EXPECT_EQ(out_buffer->data()[i], in_buffer->data()[i]);
159 } 210 }
211
212 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
160 } 213 }
161 214
162 } // namespace 215 } // namespace
163 216
164 } // namespace device 217 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698