bmc: add preparation step before data is received
Add a preparation systemd trigger event before data is received. On
systems under memory pressure, this'll trigger a service that can do
things like flush caches.
Signed-off-by: Patrick Venture <venture@google.com>
Change-Id: I175177f4a91b58d9f163098572a9d2614002b718
diff --git a/test/firmware_canhandle_unittest.cpp b/test/firmware_canhandle_unittest.cpp
index 7fb4c7f..dabf8ef 100644
--- a/test/firmware_canhandle_unittest.cpp
+++ b/test/firmware_canhandle_unittest.cpp
@@ -33,7 +33,8 @@
};
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, data, CreateTriggerMock(), CreateTriggerMock());
+ blobs, data, CreateTriggerMock(), CreateTriggerMock(),
+ CreateTriggerMock());
for (const auto& item : items)
{
diff --git a/test/firmware_commit_unittest.cpp b/test/firmware_commit_unittest.cpp
index 11ce3fc..b8c651e 100644
--- a/test/firmware_commit_unittest.cpp
+++ b/test/firmware_commit_unittest.cpp
@@ -49,7 +49,8 @@
std::make_unique<StrictMock<TriggerMock>>();
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, data, std::move(verifyMock), CreateTriggerMock());
+ blobs, data, CreateTriggerMock(), std::move(verifyMock),
+ CreateTriggerMock());
EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
@@ -71,7 +72,8 @@
std::make_unique<StrictMock<TriggerMock>>();
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, data, std::move(verifyMock), CreateTriggerMock());
+ blobs, data, CreateTriggerMock(), std::move(verifyMock),
+ CreateTriggerMock());
EXPECT_CALL(imageMock1, open(StrEq(hashBlobId))).WillOnce(Return(true));
diff --git a/test/firmware_createhandler_unittest.cpp b/test/firmware_createhandler_unittest.cpp
index dc6d968..dd09cbe 100644
--- a/test/firmware_createhandler_unittest.cpp
+++ b/test/firmware_createhandler_unittest.cpp
@@ -31,7 +31,8 @@
};
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, data, CreateTriggerMock(), CreateTriggerMock());
+ blobs, data, CreateTriggerMock(), CreateTriggerMock(),
+ CreateTriggerMock());
// EXPECT_EQ(handler, nullptr);
EXPECT_FALSE(handler == nullptr);
diff --git a/test/firmware_handler_unittest.cpp b/test/firmware_handler_unittest.cpp
index a5d60f5..27bd517 100644
--- a/test/firmware_handler_unittest.cpp
+++ b/test/firmware_handler_unittest.cpp
@@ -22,7 +22,8 @@
};
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- {}, data, CreateTriggerMock(), CreateTriggerMock());
+ {}, data, CreateTriggerMock(), CreateTriggerMock(),
+ CreateTriggerMock());
EXPECT_EQ(handler, nullptr);
}
TEST(FirmwareHandlerTest, CreateEmptyDataHandlerListFails)
@@ -35,7 +36,8 @@
};
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, {}, CreateTriggerMock(), CreateTriggerMock());
+ blobs, {}, CreateTriggerMock(), CreateTriggerMock(),
+ CreateTriggerMock());
EXPECT_EQ(handler, nullptr);
}
TEST(FirmwareHandlerTest, VerifyHashRequiredForHappiness)
@@ -51,13 +53,15 @@
};
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, data, CreateTriggerMock(), CreateTriggerMock());
+ blobs, data, CreateTriggerMock(), CreateTriggerMock(),
+ CreateTriggerMock());
EXPECT_EQ(handler, nullptr);
blobs.push_back({hashBlobId, &imageMock});
handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, data, CreateTriggerMock(), CreateTriggerMock());
+ blobs, data, CreateTriggerMock(), CreateTriggerMock(),
+ CreateTriggerMock());
auto result = handler->getBlobIds();
std::vector<std::string> expectedBlobs = {"asdf", hashBlobId};
EXPECT_THAT(result, UnorderedElementsAreArray(expectedBlobs));
diff --git a/test/firmware_stat_unittest.cpp b/test/firmware_stat_unittest.cpp
index 4efae94..99ae770 100644
--- a/test/firmware_stat_unittest.cpp
+++ b/test/firmware_stat_unittest.cpp
@@ -29,7 +29,8 @@
};
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, data, CreateTriggerMock(), CreateTriggerMock());
+ blobs, data, CreateTriggerMock(), CreateTriggerMock(),
+ CreateTriggerMock());
blobs::BlobMeta meta;
EXPECT_TRUE(handler->stat("asdf", &meta));
diff --git a/test/firmware_state_notyetstarted_tarball_unittest.cpp b/test/firmware_state_notyetstarted_tarball_unittest.cpp
index 5aa2baa..275763c 100644
--- a/test/firmware_state_notyetstarted_tarball_unittest.cpp
+++ b/test/firmware_state_notyetstarted_tarball_unittest.cpp
@@ -36,7 +36,8 @@
updateMockPtr = reinterpret_cast<TriggerMock*>(updateMock.get());
handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, data, std::move(verifyMock), std::move(updateMock));
+ blobs, data, CreateTriggerMock(), std::move(verifyMock),
+ std::move(updateMock));
}
void expectedState(FirmwareBlobHandler::UpdateState state)
diff --git a/test/firmware_state_notyetstarted_unittest.cpp b/test/firmware_state_notyetstarted_unittest.cpp
index 528e47f..54ab7f8 100644
--- a/test/firmware_state_notyetstarted_unittest.cpp
+++ b/test/firmware_state_notyetstarted_unittest.cpp
@@ -93,6 +93,7 @@
TEST_F(FirmwareHandlerNotYetStartedTest, OpenStaticImageFileVerifyStateChange)
{
EXPECT_CALL(imageMock, open(staticLayoutBlobId)).WillOnce(Return(true));
+ EXPECT_CALL(*prepareMockPtr, trigger()).WillOnce(Return(true));
EXPECT_TRUE(handler->open(session, flags, staticLayoutBlobId));
@@ -104,6 +105,7 @@
TEST_F(FirmwareHandlerNotYetStartedTest, OpenHashFileVerifyStateChange)
{
EXPECT_CALL(imageMock, open(hashBlobId)).WillOnce(Return(true));
+ EXPECT_CALL(*prepareMockPtr, trigger()).WillOnce(Return(true));
EXPECT_TRUE(handler->open(session, flags, hashBlobId));
diff --git a/test/firmware_state_verificationpending_unittest.cpp b/test/firmware_state_verificationpending_unittest.cpp
index 92ba15b..dd2df27 100644
--- a/test/firmware_state_verificationpending_unittest.cpp
+++ b/test/firmware_state_verificationpending_unittest.cpp
@@ -214,6 +214,9 @@
EXPECT_THAT(handler->getBlobIds(),
UnorderedElementsAreArray(expectedBlobs));
+ /* Verifies it isn't triggered again. */
+ EXPECT_CALL(*prepareMockPtr, trigger()).Times(0);
+
EXPECT_CALL(imageMock, open(staticLayoutBlobId)).WillOnce(Return(true));
EXPECT_TRUE(handler->open(session, flags, staticLayoutBlobId));
expectedState(FirmwareBlobHandler::UpdateState::uploadInProgress);
diff --git a/test/firmware_unittest.hpp b/test/firmware_unittest.hpp
index e36081d..8d92fe8 100644
--- a/test/firmware_unittest.hpp
+++ b/test/firmware_unittest.hpp
@@ -29,6 +29,10 @@
{staticLayoutBlobId, &imageMock},
};
+ std::unique_ptr<TriggerableActionInterface> prepareMock =
+ std::make_unique<TriggerMock>();
+ prepareMockPtr = reinterpret_cast<TriggerMock*>(prepareMock.get());
+
std::unique_ptr<TriggerableActionInterface> verifyMock =
std::make_unique<TriggerMock>();
verifyMockPtr = reinterpret_cast<TriggerMock*>(verifyMock.get());
@@ -38,7 +42,8 @@
updateMockPtr = reinterpret_cast<TriggerMock*>(updateMock.get());
handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, data, std::move(verifyMock), std::move(updateMock));
+ blobs, data, std::move(prepareMock), std::move(verifyMock),
+ std::move(updateMock));
}
void expectedState(FirmwareBlobHandler::UpdateState state)
@@ -50,6 +55,7 @@
void openToInProgress(const std::string& blobId)
{
EXPECT_CALL(imageMock, open(blobId)).WillOnce(Return(true));
+ EXPECT_CALL(*prepareMockPtr, trigger()).WillOnce(Return(true));
EXPECT_TRUE(handler->open(session, flags, blobId));
expectedState(FirmwareBlobHandler::UpdateState::uploadInProgress);
}
@@ -117,6 +123,7 @@
std::vector<DataHandlerPack> data = {
{FirmwareBlobHandler::UpdateFlags::ipmi, nullptr}};
std::unique_ptr<blobs::GenericBlobInterface> handler;
+ TriggerMock* prepareMockPtr;
TriggerMock* verifyMockPtr;
TriggerMock* updateMockPtr;
@@ -143,7 +150,8 @@
{"asdf", &imageMock},
};
handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, data, CreateTriggerMock(), CreateTriggerMock());
+ blobs, data, CreateTriggerMock(), CreateTriggerMock(),
+ CreateTriggerMock());
}
};
@@ -167,7 +175,8 @@
{FirmwareBlobHandler::UpdateFlags::lpc, &dataMock},
};
handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- blobs, data, CreateTriggerMock(), CreateTriggerMock());
+ blobs, data, CreateTriggerMock(), CreateTriggerMock(),
+ CreateTriggerMock());
}
};