tools: blob: implement open blob

Implement the host-side tool's open blob command.

Change-Id: Iee432eae0539015e87969159a3d03761df9f8fb5
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/test/blob_interface_mock.hpp b/test/blob_interface_mock.hpp
index 8218ed5..fc1b284 100644
--- a/test/blob_interface_mock.hpp
+++ b/test/blob_interface_mock.hpp
@@ -1,9 +1,14 @@
 #include "blob_interface.hpp"
 
+#include <gmock/gmock.h>
+
 class BlobInterfaceMock : public BlobInterface
 {
   public:
     virtual ~BlobInterfaceMock() = default;
     MOCK_METHOD0(getBlobList, std::vector<std::string>());
     MOCK_METHOD1(getStat, StatResponse(const std::string&));
+    MOCK_METHOD2(openBlob,
+                 std::uint16_t(const std::string&,
+                               blobs::FirmwareBlobHandler::UpdateFlags));
 };
diff --git a/test/tools_blob_unittest.cpp b/test/tools_blob_unittest.cpp
index 0d5787e..e7e0ed6 100644
--- a/test/tools_blob_unittest.cpp
+++ b/test/tools_blob_unittest.cpp
@@ -140,3 +140,23 @@
     std::vector<std::uint8_t> metadata = {};
     EXPECT_EQ(metadata, meta.metadata);
 }
+
+TEST(BlobHandler, openBlobSucceeds)
+{
+    /* The open blob succeeds. */
+    IpmiInterfaceMock ipmiMock;
+    BlobHandler blob(&ipmiMock);
+
+    std::vector<std::uint8_t> request = {
+        0xcf, 0xc2, 0x00, BlobHandler::BlobOEMCommands::bmcBlobOpen,
+        0x00, 0x00, 0x02, 0x04,
+        'a',  'b',  'c',  'd'};
+
+    std::vector<std::uint8_t> resp = {0xcf, 0xc2, 0x00, 0x00, 0x00, 0xfe, 0xed};
+
+    EXPECT_CALL(ipmiMock, sendPacket(Eq(request))).WillOnce(Return(resp));
+
+    auto session =
+        blob.openBlob("abcd", blobs::FirmwareBlobHandler::UpdateFlags::lpc);
+    EXPECT_EQ(0xedfe, session);
+}