/* * RefreshManager_test.cpp * * Created on: Mar 6, 2014 * Author: jonny */ #include #include #include "core/refresh/RefreshManager.h" #include "testUtils.h" using ::testing::_; using ::testing::Expectation; using namespace testing; namespace core { class MockInternalScheduler: public IBus { public: MOCK_METHOD1(scheduleCommand, void (const ScheduledCommand& command)); MOCK_METHOD2(scheduleTrigger, void (const Trigger command, sc_time time)); }; class RefreshManagerTest: public Test { public: RefreshManagerTest(){} Configuration config; MockInternalScheduler internalScheduler; std::shared_ptr transaction; CommandSchedule getCollidingWithFirstRefresh() { transaction = createDummyPayload(); CommandSchedule colliding(*transaction.get()); sc_time tREFI = config.Timings.refreshTimings.at(0).tREFI; sc_time clk = config.Timings.clk; colliding.add(Read, tREFI - 1 * clk, 2 * clk); return colliding; }; CommandSchedule getNonCollidingWithFirstRefresh() { transaction = createDummyPayload(); CommandSchedule non_colliding(*transaction.get()); sc_time tREFI = config.Timings.refreshTimings.at(0).tREFI; sc_time clk = config.Timings.clk; non_colliding.add(Read, tREFI - 3 * clk, 2 * clk); return non_colliding; }; }; TEST_F(RefreshManagerTest, RefreshIsScheduledAfterStartup) { EXPECT_CALL(internalScheduler, scheduleTrigger(Trigger::RefreshTrigger, _)).Times(2); EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(1); //first trigger is scheduled RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler); //first refresh is scheduled, second trigger is scheduled manager.scheduleRefresh(config.Timings.refreshTimings.at(0).tREFI);//call back from wrapper } TEST_F(RefreshManagerTest, FinishedRefreshTriggersNewRefresh) { EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(2); EXPECT_CALL(internalScheduler, scheduleTrigger(Trigger::RefreshTrigger, _)).Times(3); //first trigger is scheduled RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler); //first refresh is scheduled at tREFI (wrapper triggers), second trigger is scheduled manager.scheduleRefresh(config.Timings.refreshTimings.at(0).tREFI);//call back from wrapper //second trigger should schedule second refresh (wrapper triggers) manager.scheduleRefresh(config.Timings.refreshTimings.at(0).tREFI * 2); } TEST_F(RefreshManagerTest, hasCollisionExpectCollision) { EXPECT_CALL(internalScheduler, scheduleTrigger(Trigger::RefreshTrigger, _)).Times(1); EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(0); RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler); EXPECT_TRUE(manager.hasCollision(getCollidingWithFirstRefresh())); } TEST_F(RefreshManagerTest, hasCollisionExpectNoCollision) { EXPECT_CALL(internalScheduler, scheduleTrigger(Trigger::RefreshTrigger, _)).Times(1); EXPECT_CALL(internalScheduler, scheduleCommand(_)).Times(0); RefreshManager manager(config.Timings.refreshTimings.at(0), internalScheduler); EXPECT_FALSE(manager.hasCollision(getNonCollidingWithFirstRefresh())); } } /* namespace controller */