binarystore: Implement open/close

Opening a blob will either have read flag for read only access, or
read|write flag for read/write access. When opening a supported path if
the blob doesn't exist yet, the handler will create an empty blob.

Signed-off-by: Kun Yi <kunyi@google.com>
Change-Id: I3d2c5b761227b77cda8bbc6fa66515e9921c066c
diff --git a/test/handler_open_unittest.cpp b/test/handler_open_unittest.cpp
index c3d10aa..5706041 100644
--- a/test/handler_open_unittest.cpp
+++ b/test/handler_open_unittest.cpp
@@ -3,6 +3,7 @@
 using ::testing::_;
 using ::testing::Return;
 using ::testing::StartsWith;
+using ::testing::UnorderedElementsAreArray;
 
 using namespace std::string_literals;
 using namespace binstore;
@@ -21,13 +22,13 @@
     static inline uint16_t openTestSessionId = 0;
 };
 
-TEST_F(BinaryStoreBlobHandlerOpenTest, FailWhenCannotHandleId)
+TEST_F(BinaryStoreBlobHandlerOpenTest, OpenFailWhenNoBlob)
 {
-    EXPECT_FALSE(handler.open(openTestSessionId, openTestROFlags,
-                              openTestInvalidBlobId));
+    EXPECT_FALSE(
+        handler.open(openTestSessionId, openTestROFlags, openTestBlobId));
 }
 
-TEST_F(BinaryStoreBlobHandlerOpenTest, FailWhenStoreOpenReturnsFailure)
+TEST_F(BinaryStoreBlobHandlerOpenTest, OpenFailWhenStoreOpenReturnsFailure)
 {
     auto store = defaultMockStore(openTestBaseId);
 
@@ -40,7 +41,7 @@
         handler.open(openTestSessionId, openTestROFlags, openTestBlobId));
 }
 
-TEST_F(BinaryStoreBlobHandlerOpenTest, SucceedWhenStoreOpenReturnsTrue)
+TEST_F(BinaryStoreBlobHandlerOpenTest, OpenSucceedWhenStoreOpenReturnsTrue)
 {
     auto store = defaultMockStore(openTestBaseId);
 
@@ -53,9 +54,41 @@
         handler.open(openTestSessionId, openTestROFlags, openTestBlobId));
 }
 
+TEST_F(BinaryStoreBlobHandlerOpenTest, OpenFailForNonMatchingBasePath)
+{
+    addDefaultStore(openTestBaseId);
+    EXPECT_FALSE(handler.open(openTestSessionId, openTestROFlags,
+                              openTestInvalidBlobId));
+}
+
+TEST_F(BinaryStoreBlobHandlerOpenTest, OpenCloseSucceedForValidBlobId)
+{
+    addDefaultStore(openTestBaseId);
+
+    EXPECT_FALSE(handler.close(openTestSessionId)); // Haven't open
+    EXPECT_TRUE(
+        handler.open(openTestSessionId, openTestROFlags, openTestBlobId));
+    EXPECT_TRUE(handler.close(openTestSessionId));
+    EXPECT_FALSE(handler.close(openTestSessionId)); // Already closed
+}
+
+TEST_F(BinaryStoreBlobHandlerOpenTest, OpenSuccessShowsBlobId)
+{
+    addDefaultStore(openTestBaseId);
+
+    EXPECT_TRUE(
+        handler.open(openTestSessionId, openTestROFlags, openTestBlobId));
+    EXPECT_THAT(handler.getBlobIds(),
+                UnorderedElementsAreArray({openTestBaseId, openTestBlobId}));
+}
+
 TEST_F(BinaryStoreBlobHandlerOpenTest, CloseFailForInvalidSession)
 {
     uint16_t invalidSessionId = 1;
+
+    addDefaultStore(openTestBaseId);
+    EXPECT_TRUE(
+        handler.open(openTestSessionId, openTestROFlags, openTestBlobId));
     EXPECT_FALSE(handler.close(invalidSessionId));
 }