Merge "snoop.h/main.cpp: Add first tests for PostReporter class"
diff --git a/lpcsnoop/snoop.hpp b/lpcsnoop/snoop.hpp
index d1dd847..90729be 100644
--- a/lpcsnoop/snoop.hpp
+++ b/lpcsnoop/snoop.hpp
@@ -1,6 +1,25 @@
 #pragma once
 
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server.hpp>
+
+#include "xyz/openbmc_project/State/Boot/Raw/server.hpp"
+
 /* The LPC snoop on port 80h is mapped to this dbus path. */
 #define SNOOP_OBJECTPATH "/xyz/openbmc_project/state/boot/raw"
 /* The LPC snoop on port 80h is mapped to this dbus service. */
 #define SNOOP_BUSNAME "xyz.openbmc_project.State.Boot.Raw"
+
+template <typename... T>
+using ServerObject = typename sdbusplus::server::object::object<T...>;
+using PostInterface = sdbusplus::xyz::openbmc_project::State::Boot::server::Raw;
+using PostObject = ServerObject<PostInterface>;
+
+class PostReporter : public PostObject
+{
+  public:
+    PostReporter(sdbusplus::bus::bus& bus, const char* objPath, bool defer) :
+        PostObject(bus, objPath, defer)
+    {
+    }
+};
diff --git a/main.cpp b/main.cpp
index d070923..a780335 100644
--- a/main.cpp
+++ b/main.cpp
@@ -25,26 +25,8 @@
 #include <memory>
 #include <thread>
 
-#include <sdbusplus/bus.hpp>
-#include <sdbusplus/server.hpp>
-#include "xyz/openbmc_project/State/Boot/Raw/server.hpp"
-
 #include "lpcsnoop/snoop.hpp"
 
-template <typename... T>
-using ServerObject = typename sdbusplus::server::object::object<T...>;
-using PostInterface = sdbusplus::xyz::openbmc_project::State::Boot::server::Raw;
-using PostObject = ServerObject<PostInterface>;
-
-class PostReporter : public PostObject
-{
-  public:
-    PostReporter(sdbusplus::bus::bus& bus, const char* objPath, bool defer) :
-        PostObject(bus, objPath, defer)
-    {
-    }
-};
-
 static const char* snoopFilename = "/dev/aspeed-lpc-snoop0";
 static size_t codeSize = 1; /* Size of each POST code in bytes */
 
diff --git a/test/Makefile.am b/test/Makefile.am
index e28604d..cd2665a 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1,9 +1,21 @@
 # Common flags for all binaries in this subdirectory.
 # Per-program specific flags can be specified using
 # prg_CPPFLAGS = ....
-AM_CPPFLAGS = -I${top_srcdir} $(GTEST_CFLAGS)
-AM_CXXFLAGS = $(PTHREAD_CFLAGS) $(GTEST_CFLAGS)
-AM_LDFLAGS = $(GTEST_LIBS) $(PTHREAD_LIBS) $(OESDK_TESTCASE_FLAGS)
+AM_CPPFLAGS = -I${top_srcdir} \
+              $(GTEST_CFLAGS) \
+              $(GMOCK_CFLAGS) \
+              $(SDBUSPLUS_CFLAGS) \
+              $(PHOSPHOR_DBUS_INTERFACES_CFLAGS)
+
+AM_CXXFLAGS = $(PTHREAD_CFLAGS) \
+              $(GTEST_CFLAGS)
+
+AM_LDFLAGS = $(GTEST_LIBS) \
+             $(PTHREAD_LIBS) \
+             $(GMOCK_LIBS) \
+             $(OESDK_TESTCASE_FLAGS) \
+             $(SDBUSPLUS_LIBS) \
+             $(PHOSPHOR_DBUS_INTERFACES_LIBS)
 
 # The list of unit test programs we are building and running.
 check_PROGRAMS = post_reporter_test
diff --git a/test/post_reporter_test.cpp b/test/post_reporter_test.cpp
index 738982d..d1a158e 100644
--- a/test/post_reporter_test.cpp
+++ b/test/post_reporter_test.cpp
@@ -1,10 +1,82 @@
+#include <gmock/gmock.h>
 #include <gtest/gtest.h>
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/test/sdbus_mock.hpp>
 
+#include "lpcsnoop/snoop.hpp"
+
+using ::testing::IsNull;
+using ::testing::NiceMock;
+using ::testing::Return;
+using ::testing::StrEq;
+using ::testing::_;
+
+namespace
+{
+
+// Fixture for testing class PostReporter
 class PostReporterTest : public ::testing::Test
 {
+  protected:
+    PostReporterTest() : bus_mock(), bus(sdbusplus::get_mocked_new(&bus_mock))
+    {
+    }
+
+    ~PostReporterTest()
+    {
+    }
+
+    NiceMock<sdbusplus::SdBusMock> bus_mock;
+    sdbusplus::bus::bus bus;
 };
 
-TEST(PostReporterTest, DummyTest)
+TEST_F(PostReporterTest, EmitsObjectsOnExpectedDbusPath)
 {
-    EXPECT_EQ(1, 1);
+
+    EXPECT_CALL(bus_mock,
+                sd_bus_emit_object_added(IsNull(), StrEq(SNOOP_OBJECTPATH)))
+        .WillOnce(Return(0));
+
+    PostReporter testReporter(bus, SNOOP_OBJECTPATH, true);
+    testReporter.emit_object_added();
 }
+
+TEST_F(PostReporterTest, AddsObjectWithExpectedName)
+{
+    EXPECT_CALL(bus_mock,
+                sd_bus_add_object_vtable(IsNull(), _, StrEq(SNOOP_OBJECTPATH),
+                                         StrEq(SNOOP_BUSNAME), _, _))
+        .WillOnce(Return(0));
+
+    PostReporter testReporter(bus, SNOOP_OBJECTPATH, true);
+}
+
+TEST_F(PostReporterTest, ValueReadsDefaultToZero)
+{
+    PostReporter testReporter(bus, SNOOP_OBJECTPATH, true);
+    EXPECT_EQ(0, testReporter.value());
+}
+
+TEST_F(PostReporterTest, SetValueToPositiveValueWorks)
+{
+    PostReporter testReporter(bus, SNOOP_OBJECTPATH, true);
+    testReporter.value(65537);
+    EXPECT_EQ(65537, testReporter.value());
+}
+
+TEST_F(PostReporterTest, SetValueMultipleTimesWorks)
+{
+    PostReporter testReporter(bus, SNOOP_OBJECTPATH, true);
+    testReporter.value(123);
+    EXPECT_EQ(123, testReporter.value());
+    testReporter.value(456);
+    EXPECT_EQ(456, testReporter.value());
+    testReporter.value(0);
+    EXPECT_EQ(0, testReporter.value());
+    testReporter.value(456);
+    EXPECT_EQ(456, testReporter.value());
+    testReporter.value(456);
+    EXPECT_EQ(456, testReporter.value());
+}
+
+} // namespace