flash-ipmi: implement flashVerifyCheck

Change-Id: I21cf68524efc9a4b28662aac086d3b0a6b881599
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/flash-ipmi.cpp b/flash-ipmi.cpp
index 00fa027..e4fafc7 100644
--- a/flash-ipmi.cpp
+++ b/flash-ipmi.cpp
@@ -17,6 +17,7 @@
 #include "flash-ipmi.hpp"
 
 #include <cstdio>
+#include <fstream>
 #include <phosphor-logging/log.hpp>
 
 using namespace phosphor::logging;
@@ -199,6 +200,30 @@
 
 VerifyCheckResponse FlashUpdate::checkVerify()
 {
-    /* TODO: implement. */
-    return VerifyCheckResponse::other;
+    auto result = VerifyCheckResponse::other;
+    std::ifstream ifs;
+    ifs.open(verifyPath);
+    if (ifs.good())
+    {
+        std::string status;
+        /*
+         * Check for the contents of the file, excepting:
+         * running, success, or failed.
+         */
+        ifs >> status;
+        if (status == "running")
+        {
+            result = VerifyCheckResponse::running;
+        }
+        else if (status == "success")
+        {
+            result = VerifyCheckResponse::success;
+        }
+        else if (status == "failed")
+        {
+            result = VerifyCheckResponse::failed;
+        }
+    }
+
+    return result;
 }
diff --git a/test/Makefile.am b/test/Makefile.am
index 26f3439..6666d68 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -26,7 +26,8 @@
 	flash_flashfinish_unittest \
 	flash_hashstart_unittest \
 	flash_hashdata_unittest \
-	flash_hashfinish_unittest
+	flash_hashfinish_unittest \
+	flash_checkverify_unittest
 
 TESTS = $(check_PROGRAMS)
 
@@ -80,3 +81,6 @@
 
 flash_hashfinish_unittest_SOURCES = flash_hashfinish_unittest.cpp
 flash_hashfinish_unittest_LDADD = $(top_builddir)/flash-ipmi.o $(SDBUSPLUS_LIBS)
+
+flash_checkverify_unittest_SOURCES = flash_checkverify_unittest.cpp
+flash_checkverify_unittest_LDADD = $(top_builddir)/flash-ipmi.o $(SDBUSPLUS_LIBS)
diff --git a/test/flash_checkverify_unittest.cpp b/test/flash_checkverify_unittest.cpp
new file mode 100644
index 0000000..c64de82
--- /dev/null
+++ b/test/flash_checkverify_unittest.cpp
@@ -0,0 +1,59 @@
+#include "flash-ipmi.hpp"
+
+#include <cstdio>
+#include <fstream>
+#include <gtest/gtest.h>
+#include <string>
+#include <vector>
+
+class FlashIpmiCheckVerifyTest : public ::testing::Test
+{
+  protected:
+    FlashIpmiCheckVerifyTest() = default;
+
+    void SetUp() override
+    {
+        name = std::tmpnam(nullptr);
+    }
+    void TearDown() override
+    {
+        (void)std::remove(name.c_str());
+    }
+
+    std::string name;
+};
+
+TEST_F(FlashIpmiCheckVerifyTest, VerifyItReturnsFileContents)
+{
+    // If the file is present, the value can be a string and we convert it to
+    // an enum.
+
+    struct Expect
+    {
+        std::string value;
+        VerifyCheckResponse response;
+    };
+
+    std::vector<Expect> tests = {
+        {"running", VerifyCheckResponse::running},
+        {"success", VerifyCheckResponse::success},
+        {"failed", VerifyCheckResponse::failed},
+        {"asdf", VerifyCheckResponse::other},
+    };
+
+    std::string vname = std::tmpnam(nullptr);
+
+    FlashUpdate updater(name, vname);
+
+    for (const auto& test : tests)
+    {
+        std::ofstream out;
+        out.open(vname);
+        out << test.value << std::endl;
+        out.close();
+
+        EXPECT_EQ(test.response, updater.checkVerify());
+
+        (void)std::remove(vname.c_str());
+    }
+}