diff --git a/test/Makefile.am b/test/Makefile.am
new file mode 100644
index 0000000..bbb71b5
--- /dev/null
+++ b/test/Makefile.am
@@ -0,0 +1,16 @@
+AM_CPPFLAGS = -I$(top_srcdir)
+
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test_policy
+test_policy_CPPFLAGS = -Igtest $(GTEST_CPPFLAGS) $(AM_CPPFLAGS)
+
+test_policy_CXXFLAGS = $(PTHREAD_CFLAGS) $(SDBUSPLUS_CFLAGS)
+test_policy_LDFLAGS = -lgtest_main -lgtest \
+	$(PTHREAD_LIBS) $(OESDK_TESTCASE_FLAGS)
+
+test_policy_SOURCES = test_policy.cpp
+test_policy_LDADD = \
+	$(top_builddir)/policy_table.o \
+	-lstdc++fs \
+	$(SDBUSPLUS_LIBS)
diff --git a/test/test_policy.cpp b/test/test_policy.cpp
new file mode 100644
index 0000000..9e28d08
--- /dev/null
+++ b/test/test_policy.cpp
@@ -0,0 +1,188 @@
+/**
+ * Copyright © 2018 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <fstream>
+#include <gtest/gtest.h>
+#include <experimental/filesystem>
+#include "policy_table.hpp"
+
+using namespace ibm::logging;
+namespace fs = std::experimental::filesystem;
+
+static constexpr auto json = R"(
+[
+    {
+    "dtls":[
+      {
+        "CEID":"ABCD1234",
+        "mod":"",
+        "msg":"Error ABCD1234"
+      }
+    ],
+    "err":"xyz.openbmc_project.Error.Test1"
+    },
+
+    {
+    "dtls":[
+      {
+        "CEID":"XYZ222",
+        "mod":"",
+        "msg":"Error XYZ222"
+      }
+    ],
+    "err":"xyz.openbmc_project.Error.Test2"
+    },
+
+    {
+    "dtls":[
+      {
+        "CEID":"AAAAAA",
+        "mod":"mod1",
+        "msg":"Error AAAAAA"
+      },
+      {
+        "CEID":"BBBBBB",
+        "mod":"mod2",
+        "msg":"Error BBBBBB"
+      },
+      {
+        "CEID":"CCCCCC",
+        "mod":"mod3",
+        "msg":"Error CCCCCC"
+      }
+    ],
+    "err":"xyz.openbmc_project.Error.Test3"
+    },
+
+    {
+    "dtls":[
+      {
+        "CEID":"DDDDDDDD",
+        "mod":"I2C",
+        "msg":"Error DDDDDDDD"
+      },
+      {
+        "CEID":"EEEEEEEE",
+        "mod":"FSI",
+        "msg":"Error EEEEEEEE"
+      }
+    ],
+    "err":"xyz.openbmc_project.Error.Test4"
+    },
+
+    {
+    "dtls":[
+      {
+        "CEID":"FFFFFFFF",
+        "mod":"6D",
+        "msg":"Error FFFFFFFF"
+      }
+    ],
+
+    "err":"xyz.openbmc_project.Error.Test5"
+    },
+    {
+    "dtls":[
+      {
+        "CEID":"GGGGGGGG",
+        "mod":"RAIL_5",
+        "msg":"Error GGGGGGGG"
+      }
+    ],
+
+    "err":"xyz.openbmc_project.Error.Test6"
+    },
+    {
+    "dtls":[
+      {
+        "CEID":"HHHHHHHH",
+        "mod":"INPUT_42",
+        "msg":"Error HHHHHHHH"
+      }
+    ],
+    "err":"xyz.openbmc_project.Error.Test7"
+    }
+])";
+
+
+/**
+ * Helper class to write the above json to a file and then
+ * remove it when the tests are over.
+ */
+class PolicyTableTest : public ::testing::Test
+{
+    protected:
+
+        virtual void SetUp()
+        {
+            char dir[] = {"./jsonTestXXXXXX"};
+
+            jsonDir = mkdtemp(dir);
+            jsonFile = jsonDir / "policy.json";
+
+            std::ofstream f{jsonFile};
+            f << json;
+        }
+
+        virtual void TearDown()
+        {
+            fs::remove_all(jsonDir);
+        }
+
+        fs::path jsonDir;
+        fs::path jsonFile;
+};
+
+
+/**
+ * Test finding entries in the policy table
+ */
+TEST_F(PolicyTableTest, TestTable)
+{
+    policy::Table policy{jsonFile};
+    ASSERT_EQ(policy.isLoaded(), true);
+
+    ////////////////////////////////////
+    //Basic search, no modifier
+    std::string err{"xyz.openbmc_project.Error.Test2"};
+    std::string mod;
+
+    auto details = policy.find(err, mod);
+    ASSERT_EQ(static_cast<bool>(details), true);
+    if (details)
+    {
+        ASSERT_EQ((*details).get().ceid, "XYZ222");
+        ASSERT_EQ((*details).get().msg, "Error XYZ222");
+    }
+
+    /////////////////////////////////////
+    //Not found
+    err = "foo";
+    details = policy.find(err, mod);
+    ASSERT_EQ(static_cast<bool>(details), false);
+
+    /////////////////////////////////////
+    //Test with a modifier
+    err = "xyz.openbmc_project.Error.Test3";
+    mod = "mod3";
+
+    details = policy.find(err, mod);
+    ASSERT_EQ(static_cast<bool>(details), true);
+    if (details)
+    {
+        ASSERT_EQ((*details).get().ceid, "CCCCCC");
+        ASSERT_EQ((*details).get().msg, "Error CCCCCC");
+    }
+}
