summaryrefslogtreecommitdiffstats
path: root/device/hid/hid_connection_unittest.cc
diff options
context:
space:
mode:
authorreillyg@chromium.org <reillyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-04 18:08:13 +0000
committerreillyg@chromium.org <reillyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-04 18:08:13 +0000
commitac0b5b8ae61e90fc6758cfd4a6f2c5e6f95d0068 (patch)
tree3a0480ee7d68b40363e87083bdb18d3743bf9ccc /device/hid/hid_connection_unittest.cc
parentee5460655f5445a1e5e98221d7c4557a609b7130 (diff)
downloadchromium_src-ac0b5b8ae61e90fc6758cfd4a6f2c5e6f95d0068.zip
chromium_src-ac0b5b8ae61e90fc6758cfd4a6f2c5e6f95d0068.tar.gz
chromium_src-ac0b5b8ae61e90fc6758cfd4a6f2c5e6f95d0068.tar.bz2
[usb_gadget p13] Replace LUFA with UsbTestGadget in HidConnection tests.
The culmination of all this USB gadget nonsense... the HidConnection tests can now use the USB gadget framework I have built to validate device I/O works. This replaces the code based on a specially programmed Arduino running the LUFA library. BUG=396682 Review URL: https://codereview.chromium.org/423473008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@287364 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'device/hid/hid_connection_unittest.cc')
-rw-r--r--device/hid/hid_connection_unittest.cc151
1 files changed, 78 insertions, 73 deletions
diff --git a/device/hid/hid_connection_unittest.cc b/device/hid/hid_connection_unittest.cc
index 0b191fa..eb973f7 100644
--- a/device/hid/hid_connection_unittest.cc
+++ b/device/hid/hid_connection_unittest.cc
@@ -6,10 +6,12 @@
#include <vector>
#include "base/bind.h"
+#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
-#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
#include "device/hid/hid_connection.h"
#include "device/hid/hid_service.h"
+#include "device/test/usb_test_gadget.h"
#include "net/base/io_buffer.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -19,109 +21,112 @@ namespace {
using net::IOBufferWithSize;
-const int kUSBLUFADemoVID = 0x03eb;
-const int kUSBLUFADemoPID = 0x204f;
-const uint64_t kReport = 0x0903a65d030f8ec9ULL;
-
-int g_read_times = 0;
-void Read(scoped_refptr<HidConnection> conn);
-
-void OnRead(scoped_refptr<HidConnection> conn,
- scoped_refptr<IOBufferWithSize> buffer,
- bool success,
- size_t bytes) {
- EXPECT_TRUE(success);
- if (success) {
- g_read_times++;
- EXPECT_EQ(8U, bytes);
- if (bytes == 8) {
- uint64_t* data = reinterpret_cast<uint64_t*>(buffer->data());
- EXPECT_EQ(kReport, *data);
- } else {
- base::MessageLoop::current()->Quit();
- }
- } else {
- LOG(ERROR) << "~";
- g_read_times++;
- }
+class TestCompletionCallback {
+ public:
+ TestCompletionCallback()
+ : callback_(base::Bind(&TestCompletionCallback::SetResult,
+ base::Unretained(this))) {}
- if (g_read_times < 3){
- base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(Read, conn));
- } else {
- base::MessageLoop::current()->Quit();
+ void SetResult(bool success, size_t size) {
+ result_ = success;
+ transferred_ = size;
+ run_loop_.Quit();
}
-}
-void Read(scoped_refptr<HidConnection> conn) {
- scoped_refptr<IOBufferWithSize> buffer(new IOBufferWithSize(8));
- conn->Read(buffer, base::Bind(OnRead, conn, buffer));
-}
-
-void OnWriteNormal(bool success,
- size_t bytes) {
- ASSERT_TRUE(success);
- base::MessageLoop::current()->Quit();
-}
+ bool WaitForResult() {
+ run_loop_.Run();
+ return result_;
+ }
-void WriteNormal(scoped_refptr<HidConnection> conn) {
- scoped_refptr<IOBufferWithSize> buffer(new IOBufferWithSize(8));
- *(int64_t*)buffer->data() = kReport;
+ const HidConnection::IOCallback& callback() const { return callback_; }
+ size_t transferred() const { return transferred_; }
- conn->Write(0, buffer, base::Bind(OnWriteNormal));
-}
+ private:
+ const HidConnection::IOCallback callback_;
+ base::RunLoop run_loop_;
+ bool result_;
+ size_t transferred_;
+};
} // namespace
class HidConnectionTest : public testing::Test {
protected:
virtual void SetUp() OVERRIDE {
+ if (!UsbTestGadget::IsTestEnabled()) return;
+
message_loop_.reset(new base::MessageLoopForIO());
service_.reset(HidService::Create(message_loop_->message_loop_proxy()));
ASSERT_TRUE(service_);
+ test_gadget_ = UsbTestGadget::Claim();
+ ASSERT_TRUE(test_gadget_);
+ ASSERT_TRUE(test_gadget_->SetType(UsbTestGadget::HID_ECHO));
+
+ device_id_ = kInvalidHidDeviceId;
+
+ base::RunLoop run_loop;
+ message_loop_->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&HidConnectionTest::FindDevice,
+ base::Unretained(this), run_loop.QuitClosure(), 5),
+ base::TimeDelta::FromMilliseconds(250));
+ run_loop.Run();
+
+ ASSERT_NE(device_id_, kInvalidHidDeviceId);
+ }
+
+ void FindDevice(const base::Closure& done, int retries) {
std::vector<HidDeviceInfo> devices;
service_->GetDevices(&devices);
- device_id_ = kInvalidHidDeviceId;
+
for (std::vector<HidDeviceInfo>::iterator it = devices.begin();
- it != devices.end();
- ++it) {
- if (it->vendor_id == kUSBLUFADemoVID &&
- it->product_id == kUSBLUFADemoPID) {
+ it != devices.end();
+ ++it) {
+ if (it->serial_number == test_gadget_->GetSerial()) {
device_id_ = it->device_id;
- return;
+ break;
}
}
- }
- virtual void TearDown() OVERRIDE {
- service_.reset(NULL);
- message_loop_.reset(NULL);
+ if (device_id_ == kInvalidHidDeviceId && --retries > 0) {
+ message_loop_->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&HidConnectionTest::FindDevice, base::Unretained(this),
+ done, retries),
+ base::TimeDelta::FromMilliseconds(10));
+ } else {
+ message_loop_->PostTask(FROM_HERE, done);
+ }
}
- HidDeviceId device_id_;
scoped_ptr<base::MessageLoopForIO> message_loop_;
scoped_ptr<HidService> service_;
+ scoped_ptr<UsbTestGadget> test_gadget_;
+ HidDeviceId device_id_;
};
-TEST_F(HidConnectionTest, Create) {
- scoped_refptr<HidConnection> connection = service_->Connect(device_id_);
- ASSERT_TRUE(connection || device_id_ == kInvalidHidDeviceId);
-}
+TEST_F(HidConnectionTest, ReadWrite) {
+ if (!UsbTestGadget::IsTestEnabled()) return;
-TEST_F(HidConnectionTest, Read) {
- scoped_refptr<HidConnection> connection = service_->Connect(device_id_);
- if (connection) {
- message_loop_->PostTask(FROM_HERE, base::Bind(Read, connection));
- message_loop_->Run();
- }
-}
+ scoped_refptr<HidConnection> conn = service_->Connect(device_id_);
+ ASSERT_TRUE(conn);
+
+ for (int i = 0; i < 8; ++i) {
+ scoped_refptr<IOBufferWithSize> write_buffer(new IOBufferWithSize(8));
+ *(int64_t*)write_buffer->data() = i;
-TEST_F(HidConnectionTest, Write) {
- scoped_refptr<HidConnection> connection = service_->Connect(device_id_);
+ TestCompletionCallback write_callback;
+ conn->Write(0, write_buffer, write_callback.callback());
+ ASSERT_TRUE(write_callback.WaitForResult());
+ ASSERT_EQ(8UL, write_callback.transferred());
- if (connection) {
- message_loop_->PostTask(FROM_HERE, base::Bind(WriteNormal, connection));
- message_loop_->Run();
+ scoped_refptr<IOBufferWithSize> read_buffer(new IOBufferWithSize(8));
+ TestCompletionCallback read_callback;
+ conn->Read(read_buffer, read_callback.callback());
+ ASSERT_TRUE(read_callback.WaitForResult());
+ ASSERT_EQ(8UL, read_callback.transferred());
+ ASSERT_EQ(i, *(int64_t*)read_buffer->data());
}
}