#include "blob_mock.hpp" #include "manager.hpp" #include 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 m1 = std::make_unique(); 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 m1 = std::make_unique(); 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 m1 = std::make_unique(); 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 m1 = std::make_unique(); 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 m1 = std::make_unique(); 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