5 #ifndef OPENTITAN_SW_DEVICE_LIB_BASE_MOCK_MMIO_H_
6 #define OPENTITAN_SW_DEVICE_LIB_BASE_MOCK_MMIO_H_
8 #include <initializer_list>
15 #include "gmock/gmock.h"
16 #include "gtest/gtest.h"
18 #include "sw/device/lib/base/mock_mmio_test_utils.h"
63 MOCK_METHOD(uint8_t, Read8, (ptrdiff_t offset));
64 MOCK_METHOD(uint32_t, Read32, (ptrdiff_t offset));
66 MOCK_METHOD(
void, Write8, (ptrdiff_t offset, uint8_t value));
67 MOCK_METHOD(
void, Write32, (ptrdiff_t offset, uint32_t value));
73 template <
typename Int>
75 return std::uniform_int_distribution<Int>()(gen_);
79 static std::random_device rd;
80 std::mt19937 gen_ = std::mt19937(rd());
99 std::unique_ptr<MockDevice> dev_ =
100 std::make_unique<testing::StrictMock<MockDevice>>();
101 testing::InSequence seq_;
115 #define EXPECT_READ8_AT(dev, offset, ...) \
116 EXPECT_CALL(dev, Read8(offset)) \
117 .WillOnce(testing::Return(mock_mmio::ToInt<uint8_t>(__VA_ARGS__)))
129 #define EXPECT_READ32_AT(dev, offset, ...) \
130 EXPECT_CALL(dev, Read32(offset)) \
131 .WillOnce(testing::Return(mock_mmio::ToInt<uint32_t>(__VA_ARGS__)))
143 #define EXPECT_WRITE8_AT(dev, offset, ...) \
144 EXPECT_CALL(dev, Write8(offset, mock_mmio::ToInt<uint8_t>(__VA_ARGS__)))
156 #define EXPECT_WRITE32_AT(dev, offset, ...) \
157 EXPECT_CALL(dev, Write32(offset, mock_mmio::ToInt<uint32_t>(__VA_ARGS__)))
171 #define EXPECT_READ8(offset, ...) \
172 EXPECT_READ8_AT(this->dev(), offset, __VA_ARGS__)
186 #define EXPECT_READ32(offset, ...) \
187 EXPECT_READ32_AT(this->dev(), offset, __VA_ARGS__)
201 #define EXPECT_WRITE8(offset, ...) \
202 EXPECT_WRITE8_AT(this->dev(), offset, __VA_ARGS__);
216 #define EXPECT_WRITE8_SHADOWED(offset, ...) \
217 EXPECT_WRITE8(offset, __VA_ARGS__); \
218 EXPECT_WRITE8(offset, __VA_ARGS__);
232 #define EXPECT_WRITE32(offset, ...) \
233 EXPECT_WRITE32_AT(this->dev(), offset, __VA_ARGS__);
247 #define EXPECT_WRITE32_SHADOWED(offset, ...) \
248 EXPECT_WRITE32(offset, __VA_ARGS__); \
249 EXPECT_WRITE32(offset, __VA_ARGS__);
251 #define EXPECT_MASK_INTERNAL_(width, dev, off, ...) \
253 auto &device = dev; \
254 std::initializer_list<mock_mmio::MaskedBitField> fields = __VA_ARGS__; \
256 using Int = uint##width##_t; \
257 auto val = device.GarbageMemory<Int>(); \
258 EXPECT_READ##width##_AT(device, off, val); \
260 for (auto field : fields) { \
261 ASSERT_LT(field.offset, sizeof(Int) * 8); \
262 ASSERT_LE(field.mask, std::numeric_limits<Int>::max()); \
263 ASSERT_LE(field.value, field.mask); \
265 val &= ~static_cast<Int>(field.mask << field.offset); \
266 val |= static_cast<Int>(field.value << field.offset); \
268 EXPECT_WRITE##width##_AT(device, off, val); \
284 #define EXPECT_MASK8(offset, ...) \
285 EXPECT_MASK_INTERNAL_(8, this->dev(), offset, __VA_ARGS__)
300 #define EXPECT_MASK32(offset, ...) \
301 EXPECT_MASK_INTERNAL_(32, this->dev(), offset, __VA_ARGS__)