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