| // Copyright 2023 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "libec/read_memmap_command.h" | |
| #include <cstdint> | |
| #include <gmock/gmock.h> | |
| #include <gtest/gtest.h> | |
| using testing::_; | |
| using testing::InvokeWithoutArgs; | |
| using testing::Return; | |
| namespace ec { | |
| namespace { | |
| template <typename Output> | |
| class MockReadMemmapCommand : public ReadMemmapCommand<Output> { | |
| public: | |
| using ReadMemmapCommand<Output>::ReadMemmapCommand; | |
| explicit MockReadMemmapCommand(uint8_t offset) | |
| : ReadMemmapCommand<Output>(offset) {} | |
| ~MockReadMemmapCommand() override = default; | |
| MOCK_METHOD(int, | |
| IoctlReadmem, | |
| (int fd, uint32_t request, cros_ec_readmem_v2* data), | |
| (override)); | |
| MOCK_METHOD(bool, EcCommandRun, (int fd), (override)); | |
| }; | |
| } // namespace | |
| TEST(EcCommand, RunWithIoctl) { | |
| // Choose a random type for testing the template command. | |
| using Type = uint32_t; | |
| constexpr uint8_t offset = 10; | |
| Type ret = 100; | |
| MockReadMemmapCommand<uint8_t> mock{offset}; | |
| EXPECT_CALL(mock, IoctlReadmem) | |
| .WillOnce([ret](int fd, uint32_t offset, cros_ec_readmem_v2* data) { | |
| data->offset = offset; | |
| data->bytes = sizeof(Type); | |
| std::memcpy(data->buffer, &ret, sizeof(Type)); | |
| return sizeof(Type); | |
| }); | |
| EXPECT_TRUE(mock.Run(offset)); | |
| EXPECT_EQ(*mock.Resp(), ret); | |
| } | |
| TEST(EcCommand, RunFallbackToEcCommand) { | |
| // Choose a random type for testing the template command. | |
| constexpr uint8_t offset = 10; | |
| MockReadMemmapCommand<uint8_t> mock{offset}; | |
| EXPECT_CALL(mock, IoctlReadmem) | |
| .WillOnce( | |
| [](int fd, uint32_t offset, cros_ec_readmem_v2* data) { return -1; }); | |
| EXPECT_CALL(mock, EcCommandRun).WillOnce([](int fd) { return true; }); | |
| EXPECT_TRUE(mock.Run(offset)); | |
| } | |
| TEST(EcCommand, FailedRun) { | |
| // Choose a random type for testing the template command. | |
| constexpr uint8_t offset = 10; | |
| MockReadMemmapCommand<uint8_t> mock{offset}; | |
| EXPECT_CALL(mock, IoctlReadmem) | |
| .WillOnce( | |
| [](int fd, uint32_t offset, cros_ec_readmem_v2* data) { return -1; }); | |
| EXPECT_CALL(mock, EcCommandRun).WillOnce([](int fd) { return false; }); | |
| EXPECT_FALSE(mock.Run(offset)); | |
| } | |
| } // namespace ec |