table: StrategyInfoHost stores StrategyInfo as unique_ptr

refs #3205

Change-Id: Ia194ca94717347848d257096549cfec5df1ba6c9
diff --git a/tests/daemon/fw/ncc-strategy.t.cpp b/tests/daemon/fw/ncc-strategy.t.cpp
index f3b34b6..cc32201 100644
--- a/tests/daemon/fw/ncc-strategy.t.cpp
+++ b/tests/daemon/fw/ncc-strategy.t.cpp
@@ -341,7 +341,7 @@
   topo.addIntervalConsumer(consumer->getClientFace(), "ndn:/P",
                            time::milliseconds(100), 300);
 
-  auto getMeInfo = [&] () -> shared_ptr<NccStrategy::MeasurementsEntryInfo> {
+  auto getMeInfo = [&] () -> NccStrategy::MeasurementsEntryInfo* {
     Measurements& measurements = topo.getForwarder(nodeA).getMeasurements();
     measurements::Entry* me = measurements.findExactMatch("ndn:/P");
     return me == nullptr ? nullptr : me->getStrategyInfo<NccStrategy::MeasurementsEntryInfo>();
diff --git a/tests/daemon/table/strategy-info-host.t.cpp b/tests/daemon/table/strategy-info-host.t.cpp
index 4eaf9b0..0a3dc2a 100644
--- a/tests/daemon/table/strategy-info-host.t.cpp
+++ b/tests/daemon/table/strategy-info-host.t.cpp
@@ -34,7 +34,7 @@
 
 static int g_DummyStrategyInfo_count = 0;
 
-class DummyStrategyInfo : public StrategyInfo
+class DummyStrategyInfo : public StrategyInfo, noncopyable
 {
 public:
   static constexpr int
@@ -55,10 +55,11 @@
     --g_DummyStrategyInfo_count;
   }
 
+public:
   int m_id;
 };
 
-class DummyStrategyInfo2 : public StrategyInfo
+class DummyStrategyInfo2 : public StrategyInfo, noncopyable
 {
 public:
   static constexpr int
@@ -72,55 +73,44 @@
   {
   }
 
+public:
   int m_id;
 };
 
-BOOST_FIXTURE_TEST_SUITE(TableStrategyInfoHost, BaseFixture)
+BOOST_AUTO_TEST_SUITE(Table)
+BOOST_FIXTURE_TEST_SUITE(TestStrategyInfoHost, BaseFixture)
 
-BOOST_AUTO_TEST_CASE(SetGetClear)
+BOOST_AUTO_TEST_CASE(Basic)
 {
   StrategyInfoHost host;
-
-  BOOST_CHECK(host.getStrategyInfo<DummyStrategyInfo>() == nullptr);
-
   g_DummyStrategyInfo_count = 0;
+  bool isNew = false;
 
-  shared_ptr<DummyStrategyInfo> info = make_shared<DummyStrategyInfo>(7591);
-  host.setStrategyInfo(info);
-  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
-  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 7591);
+  DummyStrategyInfo* info = nullptr;
+  std::tie(info, isNew) = host.insertStrategyInfo<DummyStrategyInfo>(3503);
+  BOOST_CHECK_EQUAL(isNew, true);
+  BOOST_CHECK_EQUAL(g_DummyStrategyInfo_count, 1);
+  BOOST_REQUIRE(info != nullptr);
+  BOOST_CHECK_EQUAL(info->m_id, 3503);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>(), info);
 
-  info.reset(); // unlink local reference
-  // host should still have a reference to info
-  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
-  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 7591);
+  DummyStrategyInfo* info2 = nullptr;
+  std::tie(info2, isNew) = host.insertStrategyInfo<DummyStrategyInfo>(1032);
+  BOOST_CHECK_EQUAL(isNew, false);
+  BOOST_CHECK_EQUAL(g_DummyStrategyInfo_count, 1);
+  BOOST_CHECK_EQUAL(info2, info);
+  BOOST_CHECK_EQUAL(info->m_id, 3503);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>(), info);
 
   host.clearStrategyInfo();
   BOOST_CHECK(host.getStrategyInfo<DummyStrategyInfo>() == nullptr);
   BOOST_CHECK_EQUAL(g_DummyStrategyInfo_count, 0);
 }
 
-BOOST_AUTO_TEST_CASE(Create)
-{
-  StrategyInfoHost host;
-
-  host.insertStrategyInfo<DummyStrategyInfo>(3503);
-  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
-  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 3503);
-
-  host.insertStrategyInfo<DummyStrategyInfo>(1032);
-  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
-  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 3503);
-
-  host.setStrategyInfo<DummyStrategyInfo>(nullptr);
-  host.insertStrategyInfo<DummyStrategyInfo>(9956);
-  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
-  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 9956);
-}
-
 BOOST_AUTO_TEST_CASE(Types)
 {
   StrategyInfoHost host;
+  g_DummyStrategyInfo_count = 0;
 
   host.insertStrategyInfo<DummyStrategyInfo>(8063);
   BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
@@ -132,9 +122,17 @@
 
   BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
   BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 8063);
+
+  BOOST_CHECK_EQUAL(host.eraseStrategyInfo<DummyStrategyInfo>(), 1);
+  BOOST_CHECK(host.getStrategyInfo<DummyStrategyInfo>() == nullptr);
+  BOOST_CHECK_EQUAL(g_DummyStrategyInfo_count, 0);
+  BOOST_CHECK(host.getStrategyInfo<DummyStrategyInfo2>() != nullptr);
+
+  BOOST_CHECK_EQUAL(host.eraseStrategyInfo<DummyStrategyInfo>(), 0);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
+BOOST_AUTO_TEST_SUITE_END() // TestStrategyInfoHost
+BOOST_AUTO_TEST_SUITE_END() // Table
 
 } // namespace tests
 } // namespace nfd