blob: 2ff77ed0e8eda044cee55bd3aa1111c442ce4b7d [file] [log] [blame]
// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "mist/usb_device_event_notifier.h"
#include <gtest/gtest.h>
#include "mist/event_dispatcher.h"
#include "mist/mock_udev.h"
#include "mist/mock_udev_device.h"
#include "mist/mock_udev_monitor.h"
#include "mist/mock_usb_device_event_observer.h"
using testing::Return;
using testing::_;
namespace mist {
namespace {
const int kFakeUdevMonitorFileDescriptor = 999;
const char kUdevActionAdd[] = "add";
const char kUdevActionChange[] = "change";
const char kUdevActionRemove[] = "remove";
const char kFakeUsbDevice1SysPath[] = "/sys/devices/fake/1";
const uint16 kFakeUsbDevice1VendorId = 0x0123;
const char kFakeUsbDevice1VendorIdString[] = "0123";
const uint16 kFakeUsbDevice1ProductId = 0x4567;
const char kFakeUsbDevice1ProductIdString[] = "4567";
const char kFakeUsbDevice2SysPath[] = "/sys/devices/fake/2";
const uint16 kFakeUsbDevice2VendorId = 0x89ab;
const char kFakeUsbDevice2VendorIdString[] = "89ab";
const uint16 kFakeUsbDevice2ProductId = 0xcdef;
const char kFakeUsbDevice2ProductIdString[] = "cdef";
} // namespace
class UsbDeviceEventNotifierTest : public testing::Test {
protected:
UsbDeviceEventNotifierTest() : notifier_(&dispatcher_) {}
EventDispatcher dispatcher_;
MockUsbDeviceEventObserver observer_;
UsbDeviceEventNotifier notifier_;
};
TEST_F(UsbDeviceEventNotifierTest, ConvertNullToEmptyString) {
EXPECT_EQ("", UsbDeviceEventNotifier::ConvertNullToEmptyString(NULL));
EXPECT_EQ("", UsbDeviceEventNotifier::ConvertNullToEmptyString(""));
EXPECT_EQ("a", UsbDeviceEventNotifier::ConvertNullToEmptyString("a"));
EXPECT_EQ("test string",
UsbDeviceEventNotifier::ConvertNullToEmptyString("test string"));
}
TEST_F(UsbDeviceEventNotifierTest, ConvertIdStringToValue) {
uint16 id = 0x0000;
EXPECT_FALSE(UsbDeviceEventNotifier::ConvertIdStringToValue("", &id));
EXPECT_FALSE(UsbDeviceEventNotifier::ConvertIdStringToValue("0", &id));
EXPECT_FALSE(UsbDeviceEventNotifier::ConvertIdStringToValue("00", &id));
EXPECT_FALSE(UsbDeviceEventNotifier::ConvertIdStringToValue("000", &id));
EXPECT_FALSE(UsbDeviceEventNotifier::ConvertIdStringToValue("00000", &id));
EXPECT_FALSE(UsbDeviceEventNotifier::ConvertIdStringToValue("000z", &id));
EXPECT_TRUE(UsbDeviceEventNotifier::ConvertIdStringToValue("abcd", &id));
EXPECT_EQ(0xabcd, id);
EXPECT_TRUE(UsbDeviceEventNotifier::ConvertIdStringToValue("0000", &id));
EXPECT_EQ(0x0000, id);
EXPECT_TRUE(UsbDeviceEventNotifier::ConvertIdStringToValue("ffff", &id));
EXPECT_EQ(0xffff, id);
}
TEST_F(UsbDeviceEventNotifierTest, OnUsbDeviceEvents) {
MockUdevMonitor* monitor = new MockUdevMonitor();
// Ownership of |monitor| is transferred.
notifier_.udev_monitor_.reset(monitor);
MockUdevDevice* device1 = new MockUdevDevice();
MockUdevDevice* device2 = new MockUdevDevice();
MockUdevDevice* device3 = new MockUdevDevice();
MockUdevDevice* device4 = new MockUdevDevice();
// Ownership of |device*| is transferred.
EXPECT_CALL(*monitor, ReceiveDevice())
.WillOnce(Return(device1))
.WillOnce(Return(device2))
.WillOnce(Return(device3))
.WillOnce(Return(device4));
EXPECT_CALL(*device1, GetSysPath()).WillOnce(Return(kFakeUsbDevice1SysPath));
EXPECT_CALL(*device1, GetAction()).WillOnce(Return(kUdevActionAdd));
EXPECT_CALL(*device2, GetSysPath()).WillOnce(Return(kFakeUsbDevice2SysPath));
EXPECT_CALL(*device2, GetAction()).WillOnce(Return(kUdevActionAdd));
EXPECT_CALL(*device2, GetSysAttributeValue(_))
.WillOnce(Return(kFakeUsbDevice2VendorIdString))
.WillOnce(Return(kFakeUsbDevice2ProductIdString));
EXPECT_CALL(*device3, GetSysPath()).WillOnce(Return(kFakeUsbDevice1SysPath));
EXPECT_CALL(*device3, GetAction()).WillOnce(Return(kUdevActionRemove));
EXPECT_CALL(*device4, GetSysPath()).WillOnce(Return(kFakeUsbDevice2SysPath));
EXPECT_CALL(*device4, GetAction()).WillOnce(Return(kUdevActionRemove));
EXPECT_CALL(observer_,
OnUsbDeviceAdded(kFakeUsbDevice2SysPath,
kFakeUsbDevice2VendorId,
kFakeUsbDevice2ProductId));
EXPECT_CALL(observer_, OnUsbDeviceRemoved(kFakeUsbDevice1SysPath));
notifier_.OnFileCanReadWithoutBlocking(kFakeUdevMonitorFileDescriptor);
notifier_.AddObserver(&observer_);
notifier_.OnFileCanReadWithoutBlocking(kFakeUdevMonitorFileDescriptor);
notifier_.OnFileCanReadWithoutBlocking(kFakeUdevMonitorFileDescriptor);
notifier_.RemoveObserver(&observer_);
notifier_.OnFileCanReadWithoutBlocking(kFakeUdevMonitorFileDescriptor);
}
TEST_F(UsbDeviceEventNotifierTest, OnUsbDeviceEventNotAddOrRemove) {
MockUdevMonitor* monitor = new MockUdevMonitor();
// Ownership of |monitor| is transferred.
notifier_.udev_monitor_.reset(monitor);
MockUdevDevice* device = new MockUdevDevice();
// Ownership of |device| is transferred.
EXPECT_CALL(*monitor, ReceiveDevice()).WillOnce(Return(device));
EXPECT_CALL(*device, GetSysPath()).WillOnce(Return(kFakeUsbDevice1SysPath));
EXPECT_CALL(*device, GetAction()).WillOnce(Return(kUdevActionChange));
EXPECT_CALL(observer_, OnUsbDeviceAdded(_, _, _)).Times(0);
EXPECT_CALL(observer_, OnUsbDeviceRemoved(_)).Times(0);
notifier_.AddObserver(&observer_);
notifier_.OnFileCanReadWithoutBlocking(kFakeUdevMonitorFileDescriptor);
}
TEST_F(UsbDeviceEventNotifierTest, OnUsbDeviceEventWithInvalidVendorId) {
MockUdevMonitor* monitor = new MockUdevMonitor();
// Ownership of |monitor| is transferred.
notifier_.udev_monitor_.reset(monitor);
MockUdevDevice* device = new MockUdevDevice();
// Ownership of |device| is transferred.
EXPECT_CALL(*monitor, ReceiveDevice()).WillOnce(Return(device));
EXPECT_CALL(*device, GetSysPath()).WillOnce(Return(kFakeUsbDevice1SysPath));
EXPECT_CALL(*device, GetAction()).WillOnce(Return(kUdevActionAdd));
EXPECT_CALL(*device, GetSysAttributeValue(_)).WillOnce(Return(""));
EXPECT_CALL(observer_, OnUsbDeviceAdded(_, _, _)).Times(0);
EXPECT_CALL(observer_, OnUsbDeviceRemoved(_)).Times(0);
notifier_.AddObserver(&observer_);
notifier_.OnFileCanReadWithoutBlocking(kFakeUdevMonitorFileDescriptor);
}
TEST_F(UsbDeviceEventNotifierTest, OnUsbDeviceEventWithInvalidProductId) {
MockUdevMonitor* monitor = new MockUdevMonitor();
// Ownership of |monitor| is transferred.
notifier_.udev_monitor_.reset(monitor);
MockUdevDevice* device = new MockUdevDevice();
// Ownership of |device| is transferred.
EXPECT_CALL(*monitor, ReceiveDevice()).WillOnce(Return(device));
EXPECT_CALL(*device, GetSysPath()).WillOnce(Return(kFakeUsbDevice1SysPath));
EXPECT_CALL(*device, GetAction()).WillOnce(Return(kUdevActionAdd));
EXPECT_CALL(*device, GetSysAttributeValue(_))
.WillOnce(Return(kFakeUsbDevice1VendorIdString))
.WillOnce(Return(""));
EXPECT_CALL(observer_, OnUsbDeviceAdded(_, _, _)).Times(0);
EXPECT_CALL(observer_, OnUsbDeviceRemoved(_)).Times(0);
notifier_.AddObserver(&observer_);
notifier_.OnFileCanReadWithoutBlocking(kFakeUdevMonitorFileDescriptor);
}
} // namespace mist