#include "ccnx-tunnel.h"
#include "ccnx-closure.h"
#include "ccnx-name.h"
#include "ccnx-pco.h"
#include <unistd.h>

#include <boost/test/unit_test.hpp>


using namespace Ccnx;
using namespace std;
using namespace boost;

BOOST_AUTO_TEST_SUITE(CcnxTunnelTests)

class DummyTunnel : public CcnxTunnel
{
public:
  DummyTunnel();
  virtual ~DummyTunnel() {}

  virtual Name
  queryRoutableName(const Name &name);

};

DummyTunnel::DummyTunnel() : CcnxTunnel() {m_localPrefix = Name("/");}

Name
DummyTunnel::queryRoutableName (const Name &name)
{
  return Name("/local") + name;
}

CcnxWrapperPtr t1(new DummyTunnel());
CcnxWrapperPtr t2(new DummyTunnel());
CcnxWrapperPtr c1(new CcnxWrapper());

// global data callback counter;
int g_dc_i = 0;
int g_dc_o = 0;

void innerCallback(const Name &name, const Bytes &content)
{
  g_dc_i ++;
  string str((const char *)&content[0], content.size());
  BOOST_CHECK_EQUAL(name, str);
}

void outerCallback(const Name &name, const Bytes &content)
{
  g_dc_o ++;
}



BOOST_AUTO_TEST_CASE (CcnxTunnelTest)
{
  // test publish
  string inner = "/hello";

  g_dc_o = 0;
  t1->publishData(Name(inner), (const unsigned char *)inner.c_str(), inner.size(), 5);
  usleep(100000);
  Closure *outerClosure = new Closure(1, bind(outerCallback, _1, _2));
  c1->sendInterest(Name("/local/hello"), outerClosure);
  usleep(100000);
  // it is indeed published as /local/hello
  BOOST_CHECK_EQUAL(g_dc_o, 1);

  g_dc_i = 0;
  Closure *innerClosure = new Closure(1, bind(innerCallback, _1, _2));
  t2->sendInterest(Name(inner), innerClosure);
  usleep(100000);
  BOOST_CHECK_EQUAL(g_dc_i, 1);

  delete outerClosure;
  delete innerClosure;

}


BOOST_AUTO_TEST_SUITE_END()
