Skip to content

Commit

Permalink
Merge pull request #420 from elbeno/cleaner-int-test
Browse files Browse the repository at this point in the history
🎨 Tweaks to interrupt test
  • Loading branch information
elbeno authored Nov 10, 2023
2 parents 315d07c + 865fc64 commit 7adba48
Showing 1 changed file with 39 additions and 49 deletions.
88 changes: 39 additions & 49 deletions test/interrupt/manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,47 +15,42 @@ using ::testing::InSequence;
using ::testing::Return;

namespace interrupt {
class MockCallback {
class mock_t {
public:
MOCK_METHOD(void, init, ());
MOCK_METHOD(void, init, (irq_num_t irq_number, std::size_t priorityLevel));
MOCK_METHOD(void, run, (irq_num_t irq_number));
MOCK_METHOD(void, status, (irq_num_t irq_number));
MOCK_METHOD(void, irq_init, (bool, irq_num_t, std::size_t));
MOCK_METHOD(void, run, (irq_num_t));
MOCK_METHOD(void, status, (irq_num_t));

MOCK_METHOD(void, write, (int fieldIndex, std::uint32_t value));
MOCK_METHOD(std::uint32_t, read, (int fieldIndex));
};

MockCallback *callbackPtr;
MOCK_METHOD(void, write, (int, std::uint32_t));
MOCK_METHOD(std::uint32_t, read, (int));
} *mock_ptr;

struct MockIrqImpl {
static auto init() -> void { callbackPtr->init(); }
struct test_hal {
static auto init() -> void { mock_ptr->init(); }

template <bool Enable, irq_num_t IrqNumber, std::size_t Priority>
static auto irq_init() -> void {
if constexpr (Enable) {
callbackPtr->init(IrqNumber, Priority);
}
mock_ptr->irq_init(Enable, IrqNumber, Priority);
}

template <status_policy P>
static auto run(irq_num_t irq_number, stdx::invocable auto const &isr)
-> void {
P::run([&] { callbackPtr->status(irq_number); },
P::run([&] { mock_ptr->status(irq_number); },
[&] {
callbackPtr->run(irq_number);
mock_ptr->run(irq_number);
isr();
});
}
};

template <> inline auto injected_hal<> = MockIrqImpl{};
template <> inline auto injected_hal<> = test_hal{};

class InterruptManagerTest : public ::testing::Test {
protected:
MockCallback callback;

void SetUp() override { callbackPtr = &callback; }
mock_t mock;
void SetUp() override { mock_ptr = &mock; }
};

constexpr static auto msg_handler = flow::action<"msg_handler">([] {});
Expand All @@ -71,17 +66,17 @@ using spi_handler_irq = irq_flow<"spi_handler">;
using can_handler_irq = irq_flow<"can_handler">;

template <typename Field> constexpr auto read(Field) {
return [] { return callbackPtr->read(Field::id); };
return [] { return mock_ptr->read(Field::id); };
}

template <typename... Values> constexpr auto write(Values... values) {
return [... values = values.value] {
(callbackPtr->write(Values::id, values), ...);
(mock_ptr->write(Values::id, values), ...);
};
}

template <typename... Fields> constexpr auto clear(Fields...) {
return [] { (callbackPtr->write(Fields::id, 0), ...); };
return [] { (mock_ptr->write(Fields::id, 0), ...); };
}

struct int_sts_reg_t : mock_register_t<0, int_sts_reg_t, "int_sts"> {};
Expand All @@ -97,8 +92,8 @@ using rsp_avail_en_field_t =
mock_field_t<5, int_en_reg_t, "rsp_avail_en", 0, 0>;

#define EXPECT_WRITE(FIELD_TYPE, VALUE) \
EXPECT_CALL(callback, write(FIELD_TYPE::id, VALUE))
#define EXPECT_READ(FIELD_TYPE) EXPECT_CALL(callback, read(FIELD_TYPE::id))
EXPECT_CALL(mock, write(FIELD_TYPE::id, VALUE))
#define EXPECT_READ(FIELD_TYPE) EXPECT_CALL(mock, read(FIELD_TYPE::id))

struct BasicBuilder {
using Config = root<
Expand All @@ -120,16 +115,15 @@ struct BasicBuilder {
};

using nexus_t = cib::nexus<test_project>;
CONSTINIT static inline nexus_t test_nexus{};
CONSTINIT static inline auto &manager = nexus_t::service<test_service>;
};

TEST_F(InterruptManagerTest, BasicManagerInit) {
constexpr auto &manager = BasicBuilder::manager;

EXPECT_CALL(callback, init()).Times(1);
EXPECT_CALL(callback, init(33_irq, 0)).Times(1);
EXPECT_CALL(callback, init(38_irq, 0)).Times(1);
EXPECT_CALL(mock, init()).Times(1);
EXPECT_CALL(mock, irq_init(true, 33_irq, 0)).Times(1);
EXPECT_CALL(mock, irq_init(true, 38_irq, 0)).Times(1);

EXPECT_WRITE(int_en_reg_t, 3);

Expand All @@ -141,7 +135,7 @@ TEST_F(InterruptManagerTest, BasicManagerInit) {
TEST_F(InterruptManagerTest, BasicManagerIrqRun) {
constexpr auto &manager = BasicBuilder::manager;

EXPECT_CALL(callback, run(38_irq)).Times(1);
EXPECT_CALL(mock, run(38_irq)).Times(1);

manager.run<38_irq>();
}
Expand All @@ -155,7 +149,7 @@ TEST_F(InterruptManagerTest, BasicManagerSharedIrqRun) {
EXPECT_READ(packet_avail_sts_field_t).WillOnce(Return(1));
EXPECT_WRITE(packet_avail_sts_field_t, 0);

EXPECT_CALL(callback, run(33_irq)).Times(1);
EXPECT_CALL(mock, run(33_irq)).Times(1);

manager.run<33_irq>();
}
Expand All @@ -172,7 +166,7 @@ TEST_F(InterruptManagerTest, BasicManagerSharedIrqRunAllEnabled) {
EXPECT_WRITE(packet_avail_sts_field_t, 0);
EXPECT_WRITE(rsp_avail_sts_field_t, 0);

EXPECT_CALL(callback, run(33_irq)).Times(1);
EXPECT_CALL(mock, run(33_irq)).Times(1);

manager.run<33_irq>();
}
Expand All @@ -183,7 +177,7 @@ TEST_F(InterruptManagerTest, BasicManagerSharedIrqRunAllDisabled) {
EXPECT_READ(packet_avail_en_field_t).WillRepeatedly(Return(0));
EXPECT_READ(rsp_avail_en_field_t).WillRepeatedly(Return(0));

EXPECT_CALL(callback, run(33_irq)).Times(1);
EXPECT_CALL(mock, run(33_irq)).Times(1);

manager.run<33_irq>();
}
Expand All @@ -205,7 +199,6 @@ struct NoIsrBuilder {
};

using nexus_t = cib::nexus<test_project>;
CONSTINIT static inline nexus_t test_nexus{};
CONSTINIT static inline auto &manager = nexus_t::service<test_service>;
};

Expand All @@ -219,10 +212,10 @@ TEST_F(InterruptManagerTest, NoIsrInit) {
EXPECT_WRITE(rsp_avail_sts_field_t, _).Times(0);

// MCU interrupts always get enabled for shared interrupts
EXPECT_CALL(callback, init(33_irq, 0)).Times(1);
EXPECT_CALL(mock, irq_init(true, 33_irq, 0)).Times(1);

// single MCU interrupts get disabled if unused
EXPECT_CALL(callback, init(38_irq, 0)).Times(0);
EXPECT_CALL(mock, irq_init(false, 38_irq, 0)).Times(1);

manager.init();
}
Expand All @@ -241,7 +234,6 @@ struct ClearStatusFirstBuilder {
};

using nexus_t = cib::nexus<test_project>;
CONSTINIT static inline nexus_t test_nexus{};
CONSTINIT static inline auto &manager = nexus_t::service<test_service>;
};

Expand All @@ -250,9 +242,9 @@ TEST_F(InterruptManagerTest, ClearStatusFirstTest) {

{
testing::InSequence s;
EXPECT_CALL(callback, init(38_irq, 0)).Times(1);
EXPECT_CALL(callback, status(38_irq)).Times(1);
EXPECT_CALL(callback, run(38_irq)).Times(1);
EXPECT_CALL(mock, irq_init(true, 38_irq, 0)).Times(1);
EXPECT_CALL(mock, status(38_irq)).Times(1);
EXPECT_CALL(mock, run(38_irq)).Times(1);
}

manager.init();
Expand All @@ -272,23 +264,22 @@ struct DontClearStatusBuilder {
};

using nexus_t = cib::nexus<test_project>;
CONSTINIT static inline nexus_t test_nexus{};
CONSTINIT static inline auto &manager = nexus_t::service<test_service>;
};

TEST_F(InterruptManagerTest, DontClearStatusTest) {
constexpr auto &manager = DontClearStatusBuilder::manager;

EXPECT_CALL(callback, init(38_irq, 0)).Times(1);
EXPECT_CALL(callback, status(38_irq)).Times(0);
EXPECT_CALL(callback, run(38_irq)).Times(1);
EXPECT_CALL(mock, irq_init(true, 38_irq, 0)).Times(1);
EXPECT_CALL(mock, status(38_irq)).Times(0);
EXPECT_CALL(mock, run(38_irq)).Times(1);

manager.init();
manager.run<38_irq>();
}

constexpr static auto bscan =
flow::action<"bscan">([] { callbackPtr->run(0xba5eba11_irq); });
flow::action<"bscan">([] { mock_ptr->run(0xba5eba11_irq); });

using hwio_int_sts_field_t =
mock_field_t<6, int_sts_reg_t, "hwio_int_sts_field_t", 2, 2>;
Expand Down Expand Up @@ -335,7 +326,6 @@ struct SharedSubIrqTest {
};

using nexus_t = cib::nexus<test_project>;
CONSTINIT static inline nexus_t test_nexus{};
CONSTINIT static inline auto &manager = nexus_t::service<test_service>;
};

Expand All @@ -351,9 +341,9 @@ TEST_F(InterruptManagerTest, BasicManagerSharedSubIrqRun) {
EXPECT_WRITE(hwio_int_sts_field_t, 0);
EXPECT_WRITE(i2c_int_sts_field_t, 0);

EXPECT_CALL(callback, status(33_irq)).Times(1);
EXPECT_CALL(callback, run(33_irq)).Times(1);
EXPECT_CALL(callback, run(0xba5eba11_irq)).Times(1);
EXPECT_CALL(mock, status(33_irq)).Times(1);
EXPECT_CALL(mock, run(33_irq)).Times(1);
EXPECT_CALL(mock, run(0xba5eba11_irq)).Times(1);

manager.run<33_irq>();
}
Expand Down

0 comments on commit 7adba48

Please sign in to comment.