tests[fetch]: Fix test cases
Change-Id: I57afb3386cce700251bdfd6b53f00b22eafdf0a6
diff --git a/tests/unit-tests/fetch-manager.t.cpp b/tests/unit-tests/fetch-manager.t.cpp
index 9ce544f..32304fb 100644
--- a/tests/unit-tests/fetch-manager.t.cpp
+++ b/tests/unit-tests/fetch-manager.t.cpp
@@ -17,61 +17,54 @@
*
* See AUTHORS.md for complete list of ChronoShare authors and contributors.
*/
-
-#include "ccnx-wrapper.hpp"
#include "fetch-manager.hpp"
-#include "fetcher.hpp"
-#include "logging.hpp"
-#include <boost/make_shared.hpp>
-#include <boost/test/unit_test.hpp>
+
+#include "test-common.hpp"
+
+#include <ndn-cxx/util/dummy-client-face.hpp>
+
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string/join.hpp>
+#include <boost/range/adaptor/transformed.hpp>
+
+namespace ndn {
+namespace chronoshare {
+namespace tests {
_LOG_INIT(Test.FetchManager);
-using namespace Ndnx;
-using namespace std;
-using namespace boost;
-
BOOST_AUTO_TEST_SUITE(TestFetchManager)
-struct FetcherTestData
+class FetcherTestData : public IdentityManagementTimeFixture
{
- set<uint64_t> recvData;
- set<uint64_t> recvContent;
-
- set<Name> differentNames;
- set<Name> segmentNames;
-
- bool m_done;
- bool m_failed;
-
+public:
FetcherTestData()
- : m_done(false)
+ : face(m_io, m_keyChain, {true, true})
+ , m_done(false)
, m_failed(false)
+ , m_hasMissing(true)
{
}
void
- onData(const Ccnx::Name& deviceName, const Ccnx::Name& basename, uint64_t seqno, Ccnx::PcoPtr pco)
+ onData(const ndn::Name& deviceName, const ndn::Name& basename, uint64_t seqno,
+ ndn::shared_ptr<ndn::Data> data)
{
- _LOG_TRACE("onData: " << seqno);
+ _LOG_TRACE("onData: " << seqno << data->getName());
recvData.insert(seqno);
differentNames.insert(basename);
Name name = basename;
- name.appendComp(seqno);
+ name.appendNumber(seqno);
segmentNames.insert(name);
- BytesPtr data = pco->contentPtr();
-
- if (data->size() == sizeof(int)) {
- recvContent.insert(*reinterpret_cast<const int*>(head(*data)));
- }
-
- // cout << "<<< " << basename << ", " << name << ", " << seqno << endl;
+ Block block = data->getContent();
+ std::string recvNo(reinterpret_cast<const char*>(block.value()), block.value_size());
+ recvContent.insert(boost::lexical_cast<uint32_t>(recvNo));
}
void
- finish(const Ccnx::Name& deviceName, const Ccnx::Name& baseName)
+ finish(const ndn::Name& deviceName, const ndn::Name& baseName)
{
}
@@ -79,191 +72,109 @@
onComplete(Fetcher& fetcher)
{
m_done = true;
- // cout << "Done" << endl;
}
void
onFail(Fetcher& fetcher)
{
m_failed = true;
- // cout << "Failed" << endl;
}
+
+public:
+ util::DummyClientFace face;
+ std::set<uint32_t> recvData;
+ std::set<uint32_t> recvContent;
+
+ std::set<Name> differentNames;
+ std::set<Name> segmentNames;
+
+ bool m_done;
+ bool m_failed;
+
+ bool m_hasMissing;
};
-void run()
+BOOST_FIXTURE_TEST_CASE(TestFetcher, FetcherTestData)
{
- NdnxWrapperPtr ndnx = make_shared<NdnxWrapper> ();
-
- Name baseName ("/base");
- Name deviceName ("/device");
-
- for (int i = 0; i < 10; i++)
- {
- usleep(100000);
- ndnx->publishData (Name (baseName)(i), reinterpret_cast<const unsigned char*> (&i), sizeof(int), 30);
- }
-
- for (int i = 11; i < 50; i++)
- {
- usleep(100000);
- ndnx->publishData (Name (baseName)(i), reinterpret_cast<const unsigned char*> (&i), sizeof(int), 30);
- }
-
-}
-
-BOOST_AUTO_TEST_CASE(TestFetcher)
-{
- CcnxWrapperPtr ccnx = make_shared<CcnxWrapper>();
-
- Name baseName("/base");
+ Name baseName("/fetchtest");
Name deviceName("/device");
- /* publish seqnos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, <gap 5>, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, <gap 1>, 26 */
+
+ // publish seqnos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, <gap 5>, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, <gap 1>, 26
// this will allow us to test our pipeline of 6
- for (int i = 0; i < 10; i++) {
- ccnx->publishData(Name(baseName)(i), reinterpret_cast<const unsigned char*>(&i), sizeof(int), 30);
- }
+ std::set<uint32_t> seqs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /*<gap 10-14>,*/
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /*<gap 25>,*/ 26};
- for (int i = 15; i < 25; i++) {
- ccnx->publishData(Name(baseName)(i), reinterpret_cast<const unsigned char*>(&i), sizeof(int), 30);
- }
+ face.onSendInterest.connect([&, this] (const Interest& interest) {
- int oneMore = 26;
- ccnx->publishData(Name(baseName)(oneMore), reinterpret_cast<const unsigned char*>(&oneMore),
- sizeof(int), 30);
+ uint32_t requestedSeqNo = interest.getName().at(-1).toNumber();
+ if (seqs.count(requestedSeqNo) > 0) {
- FetcherTestData data;
- ExecutorPtr executor = make_shared<Executor>(1);
- executor->start();
+ auto data = make_shared<Data>();
+ Name name(baseName);
+ name.appendNumber(requestedSeqNo);
- Fetcher fetcher(ccnx, executor, bind(&FetcherTestData::onData, &data, _1, _2, _3, _4),
- bind(&FetcherTestData::finish, &data, _1, _2),
- bind(&FetcherTestData::onComplete, &data, _1),
- bind(&FetcherTestData::onFail, &data, _1), deviceName, Name("/base"), 0, 26,
- boost::posix_time::seconds(5)); // this time is not precise
+ data->setName(name);
+ data->setFreshnessPeriod(time::seconds(300));
+ std::string content = to_string(requestedSeqNo);
+ data->setContent(reinterpret_cast<const uint8_t*>(content.data()), content.size());
+ m_keyChain.sign(*data);
+ m_io.post([data, this] { face.receive(*data); });
+ }
+ });
+
+ Fetcher fetcher(face, bind(&FetcherTestData::onData, this, _1, _2, _3, _4),
+ bind(&FetcherTestData::finish, this, _1, _2),
+ bind(&FetcherTestData::onComplete, this, _1),
+ bind(&FetcherTestData::onFail, this, _1), deviceName, Name("/fetchtest"), 0, 26,
+ time::seconds(5), Name());
BOOST_CHECK_EQUAL(fetcher.IsActive(), false);
fetcher.RestartPipeline();
BOOST_CHECK_EQUAL(fetcher.IsActive(), true);
- usleep(7000000);
- BOOST_CHECK_EQUAL(data.m_failed, true);
- BOOST_CHECK_EQUAL(data.differentNames.size(), 1);
- BOOST_CHECK_EQUAL(data.segmentNames.size(), 20);
- BOOST_CHECK_EQUAL(data.recvData.size(), 20);
- BOOST_CHECK_EQUAL(data.recvContent.size(), 20);
+ this->advanceClocks(time::milliseconds(50), 1000);
+ BOOST_CHECK_EQUAL(m_failed, true);
+ BOOST_CHECK_EQUAL(differentNames.size(), 1);
+ BOOST_CHECK_EQUAL(segmentNames.size(), 20);
+ BOOST_CHECK_EQUAL(recvData.size(), 20);
+ BOOST_CHECK_EQUAL(recvContent.size(), 20);
- {
- ostringstream recvData;
- for (set<uint64_t>::iterator i = data.recvData.begin(); i != data.recvData.end(); i++)
- recvData << *i << ", ";
-
- ostringstream recvContent;
- for (set<uint64_t>::iterator i = data.recvContent.begin(); i != data.recvContent.end(); i++)
- recvContent << *i << ", ";
-
- BOOST_CHECK_EQUAL(recvData.str(),
- "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, ");
- BOOST_CHECK_EQUAL(recvData.str(), recvContent.str());
- }
+ BOOST_CHECK_EQUAL("0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24",
+ join(recvData | boost::adaptors::transformed([] (int i) { return std::to_string(i); }), ", "));
+ BOOST_CHECK_EQUAL_COLLECTIONS(recvData.begin(), recvData.end(), recvContent.begin(), recvContent.end());
BOOST_CHECK_EQUAL(fetcher.IsActive(), false);
fetcher.RestartPipeline();
BOOST_CHECK_EQUAL(fetcher.IsActive(), true);
- usleep(7000000);
- BOOST_CHECK_EQUAL(data.m_failed, true);
-
- // publishing missing pieces
- for (int i = 0; i < 27; i++) {
- ccnx->publishData(Name(baseName)(i), reinterpret_cast<const unsigned char*>(&i), sizeof(int), 1);
- }
+ this->advanceClocks(time::milliseconds(100), 100);
+ BOOST_CHECK_EQUAL(m_done, false);
+ BOOST_CHECK_EQUAL(m_failed, true);
BOOST_CHECK_EQUAL(fetcher.IsActive(), false);
+
+ std::set<uint32_t> missing = {10, 11, 12, 13, 14, 25};
+ seqs.insert(missing.begin(), missing.end());
+
+ m_failed = false;
fetcher.RestartPipeline();
BOOST_CHECK_EQUAL(fetcher.IsActive(), true);
- usleep(1000000);
- BOOST_CHECK_EQUAL(data.m_done, true);
+ this->advanceClocks(time::milliseconds(100), 100);
+ BOOST_CHECK_EQUAL(m_done, true);
+ BOOST_CHECK_EQUAL(m_failed, false);
+ BOOST_CHECK_EQUAL(segmentNames.size(), 27);
+ BOOST_CHECK_EQUAL(recvData.size(), 27);
+ BOOST_CHECK_EQUAL(recvContent.size(), 27);
- {
- ostringstream recvData;
- for (set<uint64_t>::iterator i = data.recvData.begin(); i != data.recvData.end(); i++)
- recvData << *i << ", ";
+ BOOST_CHECK_EQUAL("0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26",
+ join(recvData | boost::adaptors::transformed([] (int i) { return std::to_string(i); }), ", "));
+ BOOST_CHECK_EQUAL_COLLECTIONS(recvData.begin(), recvData.end(), recvContent.begin(), recvContent.end());
- ostringstream recvContent;
- for (set<uint64_t>::iterator i = data.recvContent.begin(); i != data.recvContent.end(); i++)
- recvContent << *i << ", ";
-
- BOOST_CHECK_EQUAL(recvData.str(),
- "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, ");
- BOOST_CHECK_EQUAL(recvData.str(), recvContent.str());
- }
-
- executor->shutdown();
+ // TODO add tests that other callbacks got called
}
-
-BOOST_AUTO_TEST_CASE (TestFetcher2)
-{
- NdnxWrapperPtr ndnx = make_shared<NdnxWrapper> ();
-
- Name baseName ("/base");
- Name deviceName ("/device");
-
- thread publishThread(run);
-
- FetcherTestData data;
- ExecutorPtr executor = make_shared<Executor>(1);
- executor->start ();
-
- Fetcher fetcher (ndnx,
- executor,
- bind (&FetcherTestData::onData, &data, _1, _2, _3, _4),
- bind (&FetcherTestData::finish, &data, _1, _2),
- bind (&FetcherTestData::onComplete, &data, _1),
- bind (&FetcherTestData::onFail, &data, _1),
- deviceName, baseName, 0, 49,
- boost::posix_time::seconds (5)); // this time is not precise
-
- BOOST_CHECK_EQUAL (fetcher.IsActive (), false);
- fetcher.RestartPipeline ();
- BOOST_CHECK_EQUAL (fetcher.IsActive (), true);
-
- usleep(20000000);
- BOOST_CHECK_EQUAL (data.m_failed, true);
-
- executor->shutdown ();
-}
-
-
-
-// BOOST_AUTO_TEST_CASE (NdnxWrapperSelector)
-// {
-
-// Closure closure (bind(dataCallback, _1, _2), bind(timeout, _1));
-
-// Selectors selectors;
-// selectors.interestLifetime(1);
-
-// string n1 = "/random/01";
-// c1->sendInterest(Name(n1), closure, selectors);
-// sleep(2);
-// c2->publishData(Name(n1), (const unsigned char *)n1.c_str(), n1.size(), 4);
-// usleep(100000);
-// BOOST_CHECK_EQUAL(g_timeout_counter, 1);
-// BOOST_CHECK_EQUAL(g_dataCallback_counter, 0);
-
-// string n2 = "/random/02";
-// selectors.interestLifetime(2);
-// c1->sendInterest(Name(n2), closure, selectors);
-// sleep(1);
-// c2->publishData(Name(n2), (const unsigned char *)n2.c_str(), n2.size(), 4);
-// usleep(100000);
-// BOOST_CHECK_EQUAL(g_timeout_counter, 1);
-// BOOST_CHECK_EQUAL(g_dataCallback_counter, 1);
-
-// // reset
-// g_dataCallback_counter = 0;
-// g_timeout_counter = 0;
-// }
-
BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace tests
+} // namespace chronoshare
+} // namespace ndn