const std::string root_name;
};
+void
+notificationCallback(std::vector<std::string>* called,
+ const std::string& id, const std::string& notification,
+ const ConstElementPtr& params)
+{
+ called->push_back(id);
+ EXPECT_EQ("event", notification);
+ EXPECT_TRUE(el("{\"param\": true}")->equals(*params));
+}
+
+TEST_F(CCSessionTest, receiveNotification) {
+ // Not subscribed to the group yet
+ ModuleCCSession mccs(ccspecfile("spec1.spec"), session, NULL, NULL,
+ false, false);
+ EXPECT_FALSE(session.haveSubscription("notifications/group", "*"));
+ std::vector<std::string> called;
+ // Subscribe to the notification. Twice.
+ const ModuleCCSession::NotificationID& first =
+ mccs.subscribeNotification("group", boost::bind(¬ificationCallback,
+ &called, "first",
+ _1, _2));
+ const ModuleCCSession::NotificationID& second =
+ mccs.subscribeNotification("group", boost::bind(¬ificationCallback,
+ &called, "second",
+ _1, _2));
+ EXPECT_TRUE(session.haveSubscription("notifications/group", "*"));
+ EXPECT_TRUE(called.empty());
+ // Send the notification
+ session.getMessages()->add(el("{"
+ " \"notification\": ["
+ " \"event\", {"
+ " \"param\": true"
+ " }"
+ " ]"
+ " }"));
+ mccs.checkCommand();
+ ASSERT_EQ(2, called.size());
+ EXPECT_EQ("first", called[0]);
+ EXPECT_EQ("second", called[1]);
+ called.clear();
+ // Unsubscribe one of them
+ mccs.unsubscribeNotification(first);
+ // We are still subscribed to the group and handle the requests
+ EXPECT_TRUE(session.haveSubscription("notifications/group", "*"));
+ // Send the notification
+ session.getMessages()->add(el("{"
+ " \"notification\": ["
+ " \"event\", {"
+ " \"param\": true"
+ " }"
+ " ]"
+ " }"));
+ mccs.checkCommand();
+ ASSERT_EQ(1, called.size());
+ EXPECT_EQ("second", called[0]);
+ // Try to unsubscribe again. That should fail.
+ EXPECT_THROW(mccs.unsubscribeNotification(first), isc::InvalidParameter);
+ EXPECT_TRUE(session.haveSubscription("notifications/group", "*"));
+ // Unsubscribe the other one too. That should cancel the upstream
+ // subscription
+ mccs.unsubscribeNotification(second);
+ EXPECT_FALSE(session.haveSubscription("notifications/group", "*"));
+}
+
// Test we can send an RPC (command) and get an answer. The answer is success
// in this case.
TEST_F(CCSessionTest, rpcCallSuccess) {