bmc: firmware updateCompleted: close(session)

Signed-off-by: Patrick Venture <venture@google.com>
Change-Id: Ief314aeab74101cf57ad49abc4676037de1b312f
diff --git a/firmware_handler.cpp b/firmware_handler.cpp
index 56ad3a2..12147a3 100644
--- a/firmware_handler.cpp
+++ b/firmware_handler.cpp
@@ -637,6 +637,10 @@
     {
         switch (state)
         {
+            case UpdateState::verificationPending:
+                /* They haven't triggered, therefore closing is uninteresting.
+                 */
+                break;
             case UpdateState::verificationStarted:
                 /* TODO: If they close this blob before verification finishes,
                  * that's an abort.
@@ -652,7 +656,6 @@
                 else
                 {
                     /* TODO: Verification failed, what now? */
-                    state = UpdateState::notYetStarted;
                 }
                 break;
             default:
@@ -664,7 +667,29 @@
     }
     else if (item->second->activePath == updateBlobId)
     {
-        /* nothing interesting. */
+        switch (state)
+        {
+            case UpdateState::updatePending:
+                /* They haven't triggered the update, therefore this is
+                 * uninteresting. */
+                break;
+            case UpdateState::updateStarted:
+                /* TODO: handle closing while update is running!. */
+                break;
+            case UpdateState::updateCompleted:
+                if (lastUpdateStatus == ActionStatus::failed)
+                {
+                    /* TODO: lOG something? */
+                }
+
+                state = UpdateState::notYetStarted;
+                removeBlobId(updateBlobId);
+                removeBlobId(activeImageBlobId);
+                removeBlobId(activeHashBlobId);
+                break;
+            default:
+                break;
+        }
     }
     else
     {
diff --git a/test/firmware_state_updatecompleted_unittest.cpp b/test/firmware_state_updatecompleted_unittest.cpp
index b86320b..3424e89 100644
--- a/test/firmware_state_updatecompleted_unittest.cpp
+++ b/test/firmware_state_updatecompleted_unittest.cpp
@@ -202,9 +202,38 @@
 }
 
 /*
+ * close(session) - closes everything out and returns to state not-yet-started.
+ * It doesn't go and clean out any update artifacts that may be present on the
+ * system.  It's up to the update implementation to deal with this before
+ * marking complete.
+ */
+TEST_F(FirmwareHandlerUpdateCompletedTest,
+       ClosingOnUpdateBlobIdAfterSuccessReturnsToNotYetStartedAndCleansBlobList)
+{
+    getToUpdateCompleted(ActionStatus::success);
+
+    handler->close(session);
+    expectedState(FirmwareBlobHandler::UpdateState::notYetStarted);
+
+    std::vector<std::string> expected = {hashBlobId, staticLayoutBlobId};
+    EXPECT_THAT(handler->getBlobIds(), UnorderedElementsAreArray(expected));
+}
+
+TEST_F(FirmwareHandlerUpdateCompletedTest,
+       ClosingOnUpdateBlobIdAfterFailureReturnsToNotYetStartedAndCleansBlobList)
+{
+    getToUpdateCompleted(ActionStatus::failed);
+
+    handler->close(session);
+    expectedState(FirmwareBlobHandler::UpdateState::notYetStarted);
+
+    std::vector<std::string> expected = {hashBlobId, staticLayoutBlobId};
+    EXPECT_THAT(handler->getBlobIds(), UnorderedElementsAreArray(expected));
+}
+
+/*
  * There are the following calls (parameters may vary):
- * deleteBlob(blob)
- * close(session)
+ * TODO: deleteBlob(blob)
  */
 
 } // namespace