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());
     }
 };