bugfix: Clean stale data on blob creation

It is possible that previous actions has stored stale data that are
valid protobufs, with different parameters. Detect stale data and
overwrite them.

Signed-off-by: Kun Yi <kunyi731@gmail.com>
Change-Id: I25b54885cdab928d1ad0b740d1c9b96335d2c60e
diff --git a/test/handler_unittest.cpp b/test/handler_unittest.cpp
index ef42ea6..31ccdc6 100644
--- a/test/handler_unittest.cpp
+++ b/test/handler_unittest.cpp
@@ -1,10 +1,18 @@
 #include "handler_unittest.hpp"
 
+#include "fake_sys_file.hpp"
+
+#include <google/protobuf/message_lite.h>
+#include <google/protobuf/text_format.h>
+
 #include <algorithm>
+#include <boost/endian/arithmetic.hpp>
 #include <memory>
 #include <string>
 #include <vector>
 
+#include "binaryblob.pb.h"
+
 using ::testing::_;
 using ::testing::AtLeast;
 using ::testing::ElementsAreArray;
@@ -140,4 +148,34 @@
     EXPECT_TRUE(handler.deleteBlob(basicTestBlobId));
 }
 
+TEST_F(BinaryStoreBlobHandlerBasicTest, StaleDataIsClearedDuringCreation)
+{
+    using namespace google::protobuf;
+
+    auto basicTestStaleBlobStr =
+        R"(blob_base_id: "/stale/"
+          blobs {
+            blob_id: "/stale/blob"
+          })";
+
+    // Create sysfile containing a valid but stale blob
+    const std::string staleBaseId = "/stale/"s;
+    const std::string staleBlobId = "/stale/blob"s;
+    binaryblobproto::BinaryBlobBase staleBlob;
+    EXPECT_TRUE(TextFormat::ParseFromString(basicTestStaleBlobStr, &staleBlob));
+
+    // Serialize to string stored in the fakeSysFile
+    auto staleBlobData = staleBlob.SerializeAsString();
+    boost::endian::little_uint64_t sizeLE = staleBlobData.size();
+    std::string commitData(sizeLE.data(), sizeof(sizeLE));
+    commitData += staleBlobData;
+
+    std::vector<std::string> expectedIdList = {basicTestBaseId};
+
+    handler.addNewBinaryStore(BinaryStore::createFromConfig(
+        basicTestBaseId, std::make_unique<FakeSysFile>(commitData), 0));
+    EXPECT_FALSE(handler.canHandleBlob(staleBlobId));
+    EXPECT_EQ(handler.getBlobIds(), expectedIdList);
+}
+
 } // namespace blobs