|  | #include "blob_mock.hpp" | 
|  | #include "manager.hpp" | 
|  |  | 
|  | #include <gtest/gtest.h> | 
|  |  | 
|  | namespace blobs | 
|  | { | 
|  |  | 
|  | using ::testing::_; | 
|  | using ::testing::Return; | 
|  |  | 
|  | TEST(ManagerDeleteTest, FileIsOpenReturnsFailure) | 
|  | { | 
|  | // The blob manager maintains a naive list of open files and will | 
|  | // return failure if you try to delete an open file. | 
|  |  | 
|  | // Open the file. | 
|  | 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_TRUE(mgr.open(flags, path, &sess)); | 
|  |  | 
|  | // Try to delete the file. | 
|  | EXPECT_FALSE(mgr.deleteBlob(path)); | 
|  | } | 
|  |  | 
|  | TEST(ManagerDeleteTest, FileHasNoHandler) | 
|  | { | 
|  | // The blob manager cannot find any handler. | 
|  |  | 
|  | BlobManager mgr; | 
|  | std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>(); | 
|  | auto m1ptr = m1.get(); | 
|  | EXPECT_TRUE(mgr.registerHandler(std::move(m1))); | 
|  |  | 
|  | std::string path = "/asdf/asdf"; | 
|  |  | 
|  | EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(false)); | 
|  |  | 
|  | // Try to delete the file. | 
|  | EXPECT_FALSE(mgr.deleteBlob(path)); | 
|  | } | 
|  |  | 
|  | TEST(ManagerDeleteTest, FileIsNotOpenButHandlerDeleteFails) | 
|  | { | 
|  | // The Blob manager finds the handler but the handler returns failure | 
|  | // on delete. | 
|  |  | 
|  | BlobManager mgr; | 
|  | std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>(); | 
|  | auto m1ptr = m1.get(); | 
|  | EXPECT_TRUE(mgr.registerHandler(std::move(m1))); | 
|  |  | 
|  | std::string path = "/asdf/asdf"; | 
|  |  | 
|  | EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(true)); | 
|  | EXPECT_CALL(*m1ptr, deleteBlob(path)).WillOnce(Return(false)); | 
|  |  | 
|  | // Try to delete the file. | 
|  | EXPECT_FALSE(mgr.deleteBlob(path)); | 
|  | } | 
|  |  | 
|  | TEST(ManagerDeleteTest, FileIsNotOpenAndHandlerSucceeds) | 
|  | { | 
|  | // The Blob manager finds the handler and the handler returns success. | 
|  |  | 
|  | BlobManager mgr; | 
|  | std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>(); | 
|  | auto m1ptr = m1.get(); | 
|  | EXPECT_TRUE(mgr.registerHandler(std::move(m1))); | 
|  |  | 
|  | std::string path = "/asdf/asdf"; | 
|  |  | 
|  | EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(true)); | 
|  | EXPECT_CALL(*m1ptr, deleteBlob(path)).WillOnce(Return(true)); | 
|  |  | 
|  | // 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 |