chunks: modularize pipeline implementation

Change-Id: Iaa5acbb02a583858db6204716947cceeae793a65
Refs: #3636
diff --git a/tests/chunks/discover-version-fixed.t.cpp b/tests/chunks/discover-version-fixed.t.cpp
index a57e5c8..8f76153 100644
--- a/tests/chunks/discover-version-fixed.t.cpp
+++ b/tests/chunks/discover-version-fixed.t.cpp
@@ -31,8 +31,6 @@
 namespace chunks {
 namespace tests {
 
-using namespace ndn::tests;
-
 class DiscoverVersionFixedFixture : public DiscoverVersionFixture
 {
 public:
diff --git a/tests/chunks/discover-version-fixture.hpp b/tests/chunks/discover-version-fixture.hpp
index 9009301..a7d8f0b 100644
--- a/tests/chunks/discover-version-fixture.hpp
+++ b/tests/chunks/discover-version-fixture.hpp
@@ -35,20 +35,28 @@
 namespace chunks {
 namespace tests {
 
-class DiscoverVersionFixture : public ndn::tests::UnitTestTimeFixture, virtual protected Options
+using namespace ndn::tests;
+
+class DiscoverVersionFixture : public UnitTestTimeFixture, virtual protected Options
 {
 public:
   DiscoverVersionFixture(const Options& options)
     : Options(options)
     , face(io)
     , name("/ndn/chunks/test")
-    , isDiscoveryFinished(false)
     , discoveredVersion(0)
+    , isDiscoveryFinished(false)
+  {
+  }
+
+  virtual
+  ~DiscoverVersionFixture()
   {
   }
 
 protected:
-  void setDiscover(unique_ptr<DiscoverVersion> disc)
+  void
+  setDiscover(unique_ptr<DiscoverVersion> disc)
   {
     discover = std::move(disc);
     discover->onDiscoverySuccess.connect(bind(&DiscoverVersionFixture::onSuccess, this, _1));
@@ -56,11 +64,11 @@
   }
 
   shared_ptr<Data>
-  makeDataWithVersion(uint64_t version)
+  makeDataWithVersion(uint64_t version) const
   {
     auto data = make_shared<Data>(Name(name).appendVersion(version).appendSegment(0));
     data->setFinalBlockId(name::Component::fromSegment(0));
-    return ndn::tests::signData(data);
+    return signData(data);
   }
 
   static Options
@@ -93,8 +101,8 @@
   util::DummyClientFace face;
   Name name;
   unique_ptr<DiscoverVersion> discover;
-  bool isDiscoveryFinished;
   uint64_t discoveredVersion;
+  bool isDiscoveryFinished;
 };
 
 } // namespace tests
diff --git a/tests/chunks/discover-version-iterative.t.cpp b/tests/chunks/discover-version-iterative.t.cpp
index 233f36c..79c6fb7 100644
--- a/tests/chunks/discover-version-iterative.t.cpp
+++ b/tests/chunks/discover-version-iterative.t.cpp
@@ -31,8 +31,6 @@
 namespace chunks {
 namespace tests {
 
-using namespace ndn::tests;
-
 class DiscoverVersionIterativeFixture : public DiscoverVersionFixture,
                                         protected DiscoverVersionIterativeOptions
 {
diff --git a/tests/chunks/pipeline-interests.t.cpp b/tests/chunks/pipeline-interests-fixed-window.t.cpp
similarity index 87%
rename from tests/chunks/pipeline-interests.t.cpp
rename to tests/chunks/pipeline-interests-fixed-window.t.cpp
index 98abfa4..c6291dd 100644
--- a/tests/chunks/pipeline-interests.t.cpp
+++ b/tests/chunks/pipeline-interests-fixed-window.t.cpp
@@ -23,66 +23,31 @@
  * @author Andrea Tosatto
  */
 
-#include "tools/chunks/catchunks/pipeline-interests.hpp"
+#include "tools/chunks/catchunks/pipeline-interests-fixed-window.hpp"
 #include "tools/chunks/catchunks/data-fetcher.hpp"
 
-#include "tests/test-common.hpp"
-#include <ndn-cxx/util/dummy-client-face.hpp>
+#include "pipeline-interests-fixture.hpp"
 
 namespace ndn {
 namespace chunks {
 namespace tests {
 
-using namespace ndn::tests;
-
-class PipelineInterestsFixture : public UnitTestTimeFixture
+class PipelineInterestFixedWindowFixture : public PipelineInterestsFixture
 {
 public:
-  typedef PipelineInterestsOptions Options;
+  typedef PipelineInterestsFixedWindowOptions Options;
 
 public:
-  PipelineInterestsFixture()
-    : face(io)
+  PipelineInterestFixedWindowFixture()
+    : PipelineInterestsFixture()
     , opt(makeOptions())
-    , name("/ndn/chunks/test")
-    , pipeline(face, opt)
-    , nDataSegments(0)
-    , nReceivedSegments(0)
-    , hasFailed(false)
   {
+    setPipeline(make_unique<PipelineInterestsFixedWindow>(face, PipelineInterestsFixedWindow::Options(opt)));
   }
-
 protected:
-  shared_ptr<Data>
-  makeDataWithSegment(uint64_t segmentNo, bool setFinalBlockId = true)
-  {
-    auto data = make_shared<Data>(Name(name).appendVersion(0).appendSegment(segmentNo));
-    if (setFinalBlockId)
-      data->setFinalBlockId(name::Component::fromSegment(nDataSegments - 1));
-    return signData(data);
-  }
-
-  void
-  runWithData(const Data& data)
-  {
-    pipeline.runWithExcludedSegment(data,
-                                    bind(&PipelineInterestsFixture::onData, this, _1, _2),
-                                    bind(&PipelineInterestsFixture::onFailure, this, _1));
-  }
+  Options opt;
 
 private:
-  void
-  onData(const Interest& interest, const Data& data)
-  {
-    nReceivedSegments++;
-  }
-
-  void
-  onFailure(const std::string& reason)
-  {
-    hasFailed = true;
-  }
-
   static Options
   makeOptions()
   {
@@ -93,22 +58,12 @@
     options.maxPipelineSize = 5;
     return options;
   }
-
-protected:
-  boost::asio::io_service io;
-  util::DummyClientFace face;
-  Options opt;
-  Name name;
-  PipelineInterests pipeline;
-  uint64_t nDataSegments;
-  uint64_t nReceivedSegments;
-  bool hasFailed;
 };
 
 BOOST_AUTO_TEST_SUITE(Chunks)
-BOOST_AUTO_TEST_SUITE(TestPipelineInterests)
+BOOST_AUTO_TEST_SUITE(TestPipelineInterestsFixedWindow)
 
-BOOST_FIXTURE_TEST_CASE(FewerSegmentsThanPipelineCapacity, PipelineInterestsFixture)
+BOOST_FIXTURE_TEST_CASE(FewerSegmentsThanPipelineCapacity, PipelineInterestFixedWindowFixture)
 {
   nDataSegments = 3;
   BOOST_ASSERT(nDataSegments <= opt.maxPipelineSize);
@@ -138,7 +93,7 @@
   BOOST_CHECK_EQUAL(hasFailed, true);
 }
 
-BOOST_FIXTURE_TEST_CASE(FullPipeline, PipelineInterestsFixture)
+BOOST_FIXTURE_TEST_CASE(FullPipeline, PipelineInterestFixedWindowFixture)
 {
   nDataSegments = 13;
   BOOST_ASSERT(nDataSegments > opt.maxPipelineSize);
@@ -171,7 +126,7 @@
   BOOST_CHECK_EQUAL(hasFailed, false);
 }
 
-BOOST_FIXTURE_TEST_CASE(TimeoutAllSegments, PipelineInterestsFixture)
+BOOST_FIXTURE_TEST_CASE(TimeoutAllSegments, PipelineInterestFixedWindowFixture)
 {
   nDataSegments = 13;
   BOOST_ASSERT(nDataSegments > opt.maxPipelineSize);
@@ -196,7 +151,7 @@
   BOOST_CHECK_EQUAL(hasFailed, true);
 }
 
-BOOST_FIXTURE_TEST_CASE(TimeoutAfterFinalBlockIdReceived, PipelineInterestsFixture)
+BOOST_FIXTURE_TEST_CASE(TimeoutAfterFinalBlockIdReceived, PipelineInterestFixedWindowFixture)
 {
   // the FinalBlockId is sent with the first segment, after the first segment failure the pipeline
   // should fail
@@ -241,7 +196,7 @@
   BOOST_CHECK_EQUAL(face.getNPendingInterests(), 0);
 }
 
-BOOST_FIXTURE_TEST_CASE(TimeoutBeforeFinalBlockIdReceived, PipelineInterestsFixture)
+BOOST_FIXTURE_TEST_CASE(TimeoutBeforeFinalBlockIdReceived, PipelineInterestFixedWindowFixture)
 {
   // the FinalBlockId is sent only with the last segment, all segments are sent except for the
   // second one (segment #1); all segments are received correctly until the FinalBlockId is received
@@ -294,7 +249,7 @@
   BOOST_CHECK_EQUAL(hasFailed, true);
 }
 
-BOOST_FIXTURE_TEST_CASE(SegmentReceivedAfterTimeout, PipelineInterestsFixture)
+BOOST_FIXTURE_TEST_CASE(SegmentReceivedAfterTimeout, PipelineInterestFixedWindowFixture)
 {
   // the FinalBlockId is never sent, all the pipeline elements with a segment number greater than
   // segment #0 will fail, after this failure also segment #0 fail and this should trigger an error
@@ -327,7 +282,7 @@
   BOOST_CHECK_EQUAL(hasFailed, true);
 }
 
-BOOST_FIXTURE_TEST_CASE(CongestionAllSegments, PipelineInterestsFixture)
+BOOST_FIXTURE_TEST_CASE(CongestionAllSegments, PipelineInterestFixedWindowFixture)
 {
   nDataSegments = 13;
   BOOST_ASSERT(nDataSegments > opt.maxPipelineSize);
diff --git a/tests/chunks/pipeline-interests-fixture.hpp b/tests/chunks/pipeline-interests-fixture.hpp
new file mode 100644
index 0000000..8da4dc1
--- /dev/null
+++ b/tests/chunks/pipeline-interests-fixture.hpp
@@ -0,0 +1,104 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2016,  Regents of the University of California,
+ *                      Colorado State University,
+ *                      University Pierre & Marie Curie, Sorbonne University.
+ *
+ * This file is part of ndn-tools (Named Data Networking Essential Tools).
+ * See AUTHORS.md for complete list of ndn-tools authors and contributors.
+ *
+ * ndn-tools is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * ndn-tools, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ *
+ * @author Andrea Tosatto
+ * @author Weiwei Liu
+ */
+
+#ifndef NDN_TOOLS_TESTS_CHUNKS_PIPELINE_INTERESTS_FIXTURE_HPP
+#define NDN_TOOLS_TESTS_CHUNKS_PIPELINE_INTERESTS_FIXTURE_HPP
+
+#include "tools/chunks/catchunks/pipeline-interests.hpp"
+
+#include "tests/test-common.hpp"
+#include <ndn-cxx/util/dummy-client-face.hpp>
+
+namespace ndn {
+namespace chunks {
+namespace tests {
+
+using namespace ndn::tests;
+
+class PipelineInterestsFixture : public UnitTestTimeFixture
+{
+public:
+  PipelineInterestsFixture()
+    : face(io)
+    , name("/ndn/chunks/test")
+    , nDataSegments(0)
+    , nReceivedSegments(0)
+    , hasFailed(false)
+  {
+  }
+
+protected:
+  void
+  setPipeline(unique_ptr<PipelineInterests> pline)
+  {
+    pipeline = std::move(pline);
+  }
+
+  shared_ptr<Data>
+  makeDataWithSegment(uint64_t segmentNo, bool setFinalBlockId = true) const
+  {
+    auto data = make_shared<Data>(Name(name).appendVersion(0).appendSegment(segmentNo));
+    if (setFinalBlockId)
+      data->setFinalBlockId(name::Component::fromSegment(nDataSegments - 1));
+    return signData(data);
+  }
+
+  void
+  runWithData(const Data& data)
+  {
+    pipeline->run(data,
+                  bind(&PipelineInterestsFixture::onData, this, _1, _2),
+                  bind(&PipelineInterestsFixture::onFailure, this, _1));
+  }
+
+private:
+  void
+  onData(const Interest& interest, const Data& data)
+  {
+    nReceivedSegments++;
+  }
+
+  void
+  onFailure(const std::string& reason)
+  {
+    hasFailed = true;
+  }
+
+protected:
+  boost::asio::io_service io;
+  util::DummyClientFace face;
+  Name name;
+  unique_ptr<PipelineInterests> pipeline;
+  uint64_t nDataSegments;
+  uint64_t nReceivedSegments;
+  bool hasFailed;
+};
+
+} // namespace tests
+} // namespace chunks
+} // namespace ndn
+
+#endif // NDN_TOOLS_TESTS_CHUNKS_PIPELINE_INTERESTS_FIXTURE_HPP