| // Copyright (c) 2012 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. |
| |
| #ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_GPIO_MOCK_UDEV_INTERFACE_H__ |
| #define CHROMEOS_PLATFORM_UPDATE_ENGINE_GPIO_MOCK_UDEV_INTERFACE_H__ |
| |
| #include "update_engine/gpio_handler.h" |
| #include "update_engine/udev_interface.h" |
| |
| // A set of mock udev interfaces for unit testing of GPIO handler. |
| |
| // Constant defining number of allowable mock udev objects. |
| #define MAX_UDEV_OBJECTS 1 |
| #define MAX_UDEV_ENUM_OBJECTS 3 |
| |
| namespace chromeos_update_engine { |
| |
| // An abstract class providing some diagnostic methods for testing. |
| class GpioMockUdevInterface : public UdevInterface { |
| public: |
| // Asserts that all resources have been properly deallocated. |
| virtual void ExpectAllResourcesDeallocated() const = 0; |
| // Asserts the the udev client has successfully discovered the syspath of the |
| // GPIO signals. |
| virtual void ExpectDiscoverySuccess() const = 0; |
| // Asserts the opposite. |
| virtual void ExpectDiscoveryFail() const = 0; |
| }; |
| |
| class StandardGpioMockUdevInterface : public GpioMockUdevInterface { |
| public: |
| // Default constructor. |
| StandardGpioMockUdevInterface(); |
| |
| // Inherited interface methods. |
| virtual const char* ListEntryGetName(struct udev_list_entry* list_entry); |
| virtual udev_list_entry* ListEntryGetNext(struct udev_list_entry* list_entry); |
| |
| virtual struct udev_device* DeviceNewFromSyspath(struct udev* udev, |
| const char* syspath); |
| virtual const char* DeviceGetPropertyValue(struct udev_device* udev_device, |
| const char* key); |
| virtual const char* DeviceGetSyspath(struct udev_device* udev_device); |
| virtual void DeviceUnref(struct udev_device* udev_device); |
| |
| virtual struct udev_enumerate* EnumerateNew(struct udev* udev); |
| virtual int EnumerateAddMatchSubsystem(struct udev_enumerate* udev_enum, |
| const char* subsystem); |
| virtual int EnumerateAddMatchSysname(struct udev_enumerate* udev_enum, |
| const char* sysname); |
| virtual int EnumerateScanDevices(struct udev_enumerate* udev_enum); |
| virtual struct udev_list_entry* EnumerateGetListEntry( |
| struct udev_enumerate* udev_enum); |
| virtual void EnumerateUnref(struct udev_enumerate* udev_enum); |
| |
| virtual struct udev* New(); |
| virtual void Unref(struct udev* udev); |
| |
| virtual void ExpectAllResourcesDeallocated() const; |
| virtual void ExpectDiscoverySuccess() const; |
| virtual void ExpectDiscoveryFail() const; |
| |
| protected: |
| // Some constants. |
| static const char* kUdevGpioSubsystem; |
| static const char* kUdevGpioChipSysname; |
| static const char* kMockGpioSysfsRoot; |
| |
| // GPIO descriptor lookup. |
| struct GpioDescriptor { |
| const char* property; |
| const char* value; |
| }; |
| static const GpioDescriptor gpio_descriptors_[]; |
| |
| // Numeric identifiers for new udev and enumerate objects. |
| size_t udev_id_; |
| size_t udev_enum_id_; |
| |
| // Null-terminated lists of devices returned by various enumerations. |
| static const char* enum_gpio_chip_dev_list_[]; |
| static const char* enum_dutflaga_gpio_dev_list_[]; |
| static const char* enum_dutflagb_gpio_dev_list_[]; |
| |
| // Mock devices to be used during GPIO discovery. These contain the syspath |
| // and a set of properties that the device may contain. |
| struct MockDevice { |
| const char* syspath; |
| const GpioDescriptor* properties; |
| size_t num_properties; |
| bool is_gpio; |
| bool is_used; |
| }; |
| MockDevice gpio_chip_dev_; |
| MockDevice dutflaga_gpio_dev_; |
| MockDevice dutflagb_gpio_dev_; |
| |
| // Tracking active mock object handles. |
| bool used_udev_ids_[MAX_UDEV_OBJECTS]; |
| bool used_udev_enum_ids_[MAX_UDEV_ENUM_OBJECTS]; |
| |
| // Track discovery progress of GPIO signals. |
| unsigned num_discovered_; |
| |
| // Convert mock udev handles into internal handles, with sanity checks. |
| MockDevice* UdevDeviceToMock(struct udev_device* udev_dev) const; |
| size_t UdevEnumToId(struct udev_enumerate* udev_enum) const; |
| size_t UdevToId(struct udev* udev) const; |
| }; |
| |
| class MultiChipGpioMockUdevInterface : public StandardGpioMockUdevInterface { |
| public: |
| // Default constructor. |
| MultiChipGpioMockUdevInterface(); |
| |
| protected: |
| virtual struct udev_device* DeviceNewFromSyspath(struct udev* udev, |
| const char* syspath); |
| virtual struct udev_list_entry* EnumerateGetListEntry( |
| struct udev_enumerate* udev_enum); |
| |
| // Null-terminated lists of devices returned by various enumerations. |
| static const char* enum_gpio_chip_dev_list_[]; |
| |
| // Mock devices to be used during GPIO discovery. These contain the syspath |
| // and a set of properties that the device may contain. |
| MockDevice gpio_chip1_dev_; |
| MockDevice gpio_chip2_dev_; |
| }; |
| |
| // A udev mock that fails to provide constructs for proper GPIO initialization. |
| class FailInitGpioMockUdevInterface : public StandardGpioMockUdevInterface { |
| public: |
| // Default constructor. |
| FailInitGpioMockUdevInterface() : num_init_attempts_(0) {} |
| |
| virtual void ExpectNumInitAttempts(unsigned count) const; |
| |
| protected: |
| virtual struct udev* New(); |
| |
| private: |
| unsigned num_init_attempts_; |
| }; |
| |
| } // namespace chromeos_update_engine |
| |
| #endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_GPIO_MOCK_UDEV_INTERFACE_H__ |