table: StrategyInfoHost stores multiple StrategyInfo of distinct types

refs #2240

Change-Id: I25062260e3bb4f2f36989305431d4b718d320505
diff --git a/tests/daemon/table/strategy-choice.cpp b/tests/daemon/table/strategy-choice.cpp
index 7817d51..494c76b 100644
--- a/tests/daemon/table/strategy-choice.cpp
+++ b/tests/daemon/table/strategy-choice.cpp
@@ -164,6 +164,12 @@
 
 class PStrategyInfo : public fw::StrategyInfo
 {
+public:
+  static constexpr int
+  getTypeId()
+  {
+    return 10;
+  }
 };
 
 BOOST_AUTO_TEST_CASE(ClearStrategyInfo)
diff --git a/tests/daemon/table/strategy-info-host.cpp b/tests/daemon/table/strategy-info-host.cpp
index 82d4fcc..5c0c14f 100644
--- a/tests/daemon/table/strategy-info-host.cpp
+++ b/tests/daemon/table/strategy-info-host.cpp
@@ -1,11 +1,12 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014  Regents of the University of California,
- *                     Arizona Board of Regents,
- *                     Colorado State University,
- *                     University Pierre & Marie Curie, Sorbonne University,
- *                     Washington University in St. Louis,
- *                     Beijing Institute of Technology
+ * Copyright (c) 2014,  Regents of the University of California,
+ *                      Arizona Board of Regents,
+ *                      Colorado State University,
+ *                      University Pierre & Marie Curie, Sorbonne University,
+ *                      Washington University in St. Louis,
+ *                      Beijing Institute of Technology,
+ *                      The University of Memphis
  *
  * This file is part of NFD (Named Data Networking Forwarding Daemon).
  * See AUTHORS.md for complete list of NFD authors and contributors.
@@ -20,7 +21,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "table/strategy-info-host.hpp"
 
@@ -29,18 +30,27 @@
 namespace nfd {
 namespace tests {
 
+using fw::StrategyInfo;
+
 static int g_DummyStrategyInfo_count = 0;
 
-class DummyStrategyInfo : public fw::StrategyInfo
+class DummyStrategyInfo : public StrategyInfo
 {
 public:
+  static constexpr int
+  getTypeId()
+  {
+    return 1;
+  }
+
   DummyStrategyInfo(int id)
     : m_id(id)
   {
     ++g_DummyStrategyInfo_count;
   }
 
-  virtual ~DummyStrategyInfo()
+  virtual
+  ~DummyStrategyInfo()
   {
     --g_DummyStrategyInfo_count;
   }
@@ -48,31 +58,82 @@
   int m_id;
 };
 
+class DummyStrategyInfo2 : public StrategyInfo
+{
+public:
+  static constexpr int
+  getTypeId()
+  {
+    return 2;
+  }
+
+  DummyStrategyInfo2(int id)
+    : m_id(id)
+  {
+  }
+
+  int m_id;
+};
+
 BOOST_FIXTURE_TEST_SUITE(TableStrategyInfoHost, BaseFixture)
 
 BOOST_AUTO_TEST_CASE(SetGetClear)
 {
   StrategyInfoHost host;
 
-  BOOST_CHECK(!static_cast<bool>(host.getStrategyInfo<DummyStrategyInfo>()));
+  BOOST_CHECK(host.getStrategyInfo<DummyStrategyInfo>() == nullptr);
 
   g_DummyStrategyInfo_count = 0;
 
   shared_ptr<DummyStrategyInfo> info = make_shared<DummyStrategyInfo>(7591);
   host.setStrategyInfo(info);
-  BOOST_REQUIRE(static_cast<bool>(host.getStrategyInfo<DummyStrategyInfo>()));
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
   BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 7591);
 
   info.reset(); // unlink local reference
   // host should still have a reference to info
-  BOOST_REQUIRE(static_cast<bool>(host.getStrategyInfo<DummyStrategyInfo>()));
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
   BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 7591);
 
   host.clearStrategyInfo();
-  BOOST_CHECK(!static_cast<bool>(host.getStrategyInfo<DummyStrategyInfo>()));
+  BOOST_CHECK(host.getStrategyInfo<DummyStrategyInfo>() == nullptr);
   BOOST_CHECK_EQUAL(g_DummyStrategyInfo_count, 0);
 }
 
+BOOST_AUTO_TEST_CASE(Create)
+{
+  StrategyInfoHost host;
+
+  host.getOrCreateStrategyInfo<DummyStrategyInfo>(3503);
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 3503);
+
+  host.getOrCreateStrategyInfo<DummyStrategyInfo>(1032);
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 3503);
+
+  host.setStrategyInfo<DummyStrategyInfo>(nullptr);
+  host.getOrCreateStrategyInfo<DummyStrategyInfo>(9956);
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 9956);
+}
+
+BOOST_AUTO_TEST_CASE(Types)
+{
+  StrategyInfoHost host;
+
+  host.getOrCreateStrategyInfo<DummyStrategyInfo>(8063);
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 8063);
+
+  host.getOrCreateStrategyInfo<DummyStrategyInfo2>(2871);
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo2>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo2>()->m_id, 2871);
+
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 8063);
+}
+
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests