Fix openFiles refcount

The old code deletes session from the session map before doing a lookup
of the path. Fix the order and add a unit test to catch the error case.
(The unit test would fail without this fix).

Signed-off-by: Kun Yi <kunyi731@gmail.com>
Change-Id: If043d6aad7bbaafa19ae3b63a6d9cc7a836d25b5
diff --git a/manager.cpp b/manager.cpp
index 0eec6f2..870bf60 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -27,7 +27,6 @@
 
 void BlobManager::eraseSession(GenericBlobInterface* handler, uint16_t session)
 {
-    sessions.erase(session);
     /* Ok for openSessions[handler] to be an empty set */
     openSessions[handler].erase(session);
 
@@ -37,6 +36,8 @@
     {
         openFiles.erase(path);
     }
+    /* Cannot erase before getPath() is called */
+    sessions.erase(session);
 }
 
 void BlobManager::cleanUpStaleSessions(GenericBlobInterface* handler)
diff --git a/test/manager_delete_unittest.cpp b/test/manager_delete_unittest.cpp
index 9ad3afd..0a59aa7 100644
--- a/test/manager_delete_unittest.cpp
+++ b/test/manager_delete_unittest.cpp
@@ -84,4 +84,28 @@
     // Try to delete the file.
     EXPECT_TRUE(mgr.deleteBlob(path));
 }
+
+TEST(ManagerDeleteTest, DeleteWorksAfterOpenClose)
+{
+    // The Blob manager is able to decrement the ref count and delete.
+
+    BlobManager mgr;
+    std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>();
+    auto m1ptr = m1.get();
+    EXPECT_TRUE(mgr.registerHandler(std::move(m1)));
+
+    uint16_t flags = OpenFlags::read, sess;
+    std::string path = "/asdf/asdf";
+
+    EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillRepeatedly(Return(true));
+    EXPECT_CALL(*m1ptr, open(_, flags, path)).WillOnce(Return(true));
+    EXPECT_CALL(*m1ptr, close(_)).WillOnce(Return(true));
+    EXPECT_CALL(*m1ptr, deleteBlob(path)).WillOnce(Return(true));
+
+    EXPECT_TRUE(mgr.open(flags, path, &sess));
+    EXPECT_TRUE(mgr.close(sess));
+
+    // Try to delete the file.
+    EXPECT_TRUE(mgr.deleteBlob(path));
+}
 } // namespace blobs