PEL: Add subscriptions for new and deleted PELs

Add functionality to the Repository class to be able to call functions
provided by others when PELs are added or removed from the repository.

This will be used in the future for things like knowing when a new PEL
is added so it can be sent to the host.

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I2effc9d5fa9a38890311a88bcfb07eed1292a453
diff --git a/test/openpower-pels/repository_test.cpp b/test/openpower-pels/repository_test.cpp
index 0c927f6..34de855 100644
--- a/test/openpower-pels/repository_test.cpp
+++ b/test/openpower-pels/repository_test.cpp
@@ -212,3 +212,46 @@
     repo.for_each(f2);
     EXPECT_EQ(ids.size(), 1);
 }
+
+TEST_F(RepositoryTest, TestSubscriptions)
+{
+    std::vector<uint32_t> added;
+    std::vector<uint32_t> removed;
+
+    Repository::AddCallback ac = [&added](const PEL& pel) {
+        added.push_back(pel.id());
+    };
+
+    Repository::DeleteCallback dc = [&removed](uint32_t id) {
+        removed.push_back(id);
+    };
+
+    Repository repo{repoPath};
+    repo.subscribeToAdds("test", ac);
+    repo.subscribeToDeletes("test", dc);
+
+    auto data = pelDataFactory(TestPELType::pelSimple);
+    auto pel = std::make_unique<PEL>(data);
+    auto pelID = pel->id();
+    repo.add(pel);
+
+    EXPECT_EQ(added.size(), 1);
+
+    using ID = Repository::LogID;
+    ID id{ID::Pel(pelID)};
+    repo.remove(id);
+
+    EXPECT_EQ(removed.size(), 1);
+
+    repo.unsubscribeFromAdds("test");
+    repo.unsubscribeFromDeletes("test");
+
+    added.clear();
+    removed.clear();
+
+    repo.add(pel);
+    EXPECT_EQ(added.size(), 0);
+
+    repo.remove(id);
+    EXPECT_EQ(removed.size(), 0);
+}