blob: 9989cdb9f37705ac5c5f1b5c53b90405bcfc2cb8 [file] [log] [blame]
Alexander Afanasyev47cf2ef2013-01-28 15:13:47 -08001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2012 University of California, Los Angeles
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
19 * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
20 */
21
Zhenkai Zhu3b82d432013-01-03 22:48:40 -080022#include "ccnx-wrapper.h"
23#include "ccnx-closure.h"
24#include "ccnx-name.h"
Zhenkai Zhua6472e02013-01-06 14:33:37 -080025#include "ccnx-selectors.h"
Zhenkai Zhu3b82d432013-01-03 22:48:40 -080026#include "ccnx-pco.h"
27#include <unistd.h>
28
Zhenkai Zhu6fe6d882013-01-23 21:33:53 -080029#include <boost/date_time/posix_time/posix_time.hpp>
Zhenkai Zhu3b82d432013-01-03 22:48:40 -080030#include <boost/test/unit_test.hpp>
Alexander Afanasyev47cf2ef2013-01-28 15:13:47 -080031#include <boost/make_shared.hpp>
Zhenkai Zhu3b82d432013-01-03 22:48:40 -080032
33using namespace Ccnx;
34using namespace std;
35using namespace boost;
36
Alexander Afanasyev816251e2013-01-28 16:16:49 -080037BOOST_AUTO_TEST_SUITE(TestCcnxWrapper)
Zhenkai Zhu3b82d432013-01-03 22:48:40 -080038
Alexander Afanasyev47cf2ef2013-01-28 15:13:47 -080039CcnxWrapperPtr c1;
40CcnxWrapperPtr c2;
Zhenkai Zhu3722d432013-01-04 16:23:36 -080041int g_timeout_counter = 0;
42int g_dataCallback_counter = 0;
Zhenkai Zhu3b82d432013-01-03 22:48:40 -080043
44void publish1(const Name &name)
45{
46 string content = name.toString();
47 c1->publishData(name, (const unsigned char*)content.c_str(), content.size(), 5);
48}
49
50void publish2(const Name &name)
51{
52 string content = name.toString();
53 c2->publishData(name, (const unsigned char*)content.c_str(), content.size(), 5);
54}
55
Alexander Afanasyevf278db32013-01-21 14:41:01 -080056void dataCallback(const Name &name, Ccnx::PcoPtr pco)
Zhenkai Zhu3b82d432013-01-03 22:48:40 -080057{
Zhenkai Zhu5acebd72013-02-07 19:59:25 -080058 cout << " in data callback" << endl;
Alexander Afanasyevf278db32013-01-21 14:41:01 -080059 BytesPtr content = pco->contentPtr ();
60 string msg(reinterpret_cast<const char *> (head (*content)), content->size());
Zhenkai Zhu3722d432013-01-04 16:23:36 -080061 g_dataCallback_counter ++;
Zhenkai Zhu3b82d432013-01-03 22:48:40 -080062 BOOST_CHECK_EQUAL(name, msg);
63}
64
Zhenkai Zhu5957c0d2013-02-08 13:47:52 -080065void encapCallback(const Name &name, Ccnx::PcoPtr pco)
66{
67 cout << " in encap data callback" << endl;
Zhenkai Zhu203dfd22013-03-13 21:35:48 -070068 BOOST_CHECK(!c1->verify(pco));
69 cout << "++++++++++++++++++ Outer content couldn't be verified, which is expected." << endl;
Zhenkai Zhu5957c0d2013-02-08 13:47:52 -080070 PcoPtr npco = make_shared<ParsedContentObject> (*(pco->contentPtr()));
71 g_dataCallback_counter ++;
72 BOOST_CHECK(npco);
Zhenkai Zhu203dfd22013-03-13 21:35:48 -070073 BOOST_CHECK(c1->verify(npco));
Zhenkai Zhu5957c0d2013-02-08 13:47:52 -080074}
75
Zhenkai Zhuff4fa8a2013-01-28 22:02:40 -080076void
77timeout(const Name &name, const Closure &closure, Selectors selectors)
Zhenkai Zhu3b82d432013-01-03 22:48:40 -080078{
Zhenkai Zhu3722d432013-01-04 16:23:36 -080079 g_timeout_counter ++;
Zhenkai Zhu3b82d432013-01-03 22:48:40 -080080}
81
Zhenkai Zhu5acebd72013-02-07 19:59:25 -080082void
83setup()
84{
85 if (!c1)
86 {
87 c1 = make_shared<CcnxWrapper> ();
88 }
89 if (!c2)
90 {
91 c2 = make_shared<CcnxWrapper> ();
92 }
93}
94
95void
96teardown()
97{
98 if (c1)
99 {
100 c1.reset();
101 }
102 if (c2)
103 {
104 c2.reset();
105 }
106}
107
108
Alexander Afanasyev816251e2013-01-28 16:16:49 -0800109BOOST_AUTO_TEST_CASE (BlaCcnxWrapperTest)
Zhenkai Zhu3b82d432013-01-03 22:48:40 -0800110{
Alexander Afanasyevd012a0d2013-03-14 14:53:09 -0700111 INIT_LOGGERS ();
112
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800113 setup();
Zhenkai Zhu3b82d432013-01-03 22:48:40 -0800114 Name prefix1("/c1");
115 Name prefix2("/c2");
116
117 c1->setInterestFilter(prefix1, bind(publish1, _1));
Zhenkai Zhu03a511d2013-01-04 17:13:28 -0800118 usleep(100000);
Zhenkai Zhu3b82d432013-01-03 22:48:40 -0800119 c2->setInterestFilter(prefix2, bind(publish2, _1));
120
Zhenkai Zhuff4fa8a2013-01-28 22:02:40 -0800121 Closure closure (bind(dataCallback, _1, _2), bind(timeout, _1, _2, _3));
Zhenkai Zhu3b82d432013-01-03 22:48:40 -0800122
123 c1->sendInterest(Name("/c2/hi"), closure);
124 usleep(100000);
125 c2->sendInterest(Name("/c1/hi"), closure);
Zhenkai Zhud34106a2013-01-04 15:51:55 -0800126 sleep(1);
Zhenkai Zhu3722d432013-01-04 16:23:36 -0800127 BOOST_CHECK_EQUAL(g_dataCallback_counter, 2);
128 // reset
129 g_dataCallback_counter = 0;
130 g_timeout_counter = 0;
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800131
132 teardown();
Zhenkai Zhu3722d432013-01-04 16:23:36 -0800133}
134
135BOOST_AUTO_TEST_CASE (CcnxWrapperSelector)
136{
137
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800138 setup();
Zhenkai Zhuff4fa8a2013-01-28 22:02:40 -0800139 Closure closure (bind(dataCallback, _1, _2), bind(timeout, _1, _2, _3));
Zhenkai Zhu3722d432013-01-04 16:23:36 -0800140
141 Selectors selectors;
Alexander Afanasyevd012a0d2013-03-14 14:53:09 -0700142 selectors
143 .interestLifetime(1)
144 .childSelector(Selectors::RIGHT);
Zhenkai Zhu3722d432013-01-04 16:23:36 -0800145
146 string n1 = "/random/01";
147 c1->sendInterest(Name(n1), closure, selectors);
148 sleep(2);
Alexander Afanasyev46092452013-01-28 16:23:06 -0800149 c2->publishData(Name(n1), (const unsigned char *)n1.c_str(), n1.size(), 1);
Zhenkai Zhu3722d432013-01-04 16:23:36 -0800150 usleep(100000);
151 BOOST_CHECK_EQUAL(g_timeout_counter, 1);
152 BOOST_CHECK_EQUAL(g_dataCallback_counter, 0);
153
154 string n2 = "/random/02";
155 selectors.interestLifetime(2);
156 c1->sendInterest(Name(n2), closure, selectors);
157 sleep(1);
Alexander Afanasyev46092452013-01-28 16:23:06 -0800158 c2->publishData(Name(n2), (const unsigned char *)n2.c_str(), n2.size(), 1);
Zhenkai Zhu3722d432013-01-04 16:23:36 -0800159 usleep(100000);
160 BOOST_CHECK_EQUAL(g_timeout_counter, 1);
161 BOOST_CHECK_EQUAL(g_dataCallback_counter, 1);
162
163 // reset
164 g_dataCallback_counter = 0;
165 g_timeout_counter = 0;
Alexander Afanasyev7065b2d2013-01-28 22:33:38 -0800166
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800167 teardown();
Alexander Afanasyev7065b2d2013-01-28 22:33:38 -0800168
Zhenkai Zhu3b82d432013-01-03 22:48:40 -0800169}
170
Zhenkai Zhue8c8c8a2013-01-28 22:38:32 -0800171void
172reexpress(const Name &name, const Closure &closure, Selectors selectors)
173{
174 g_timeout_counter ++;
175 c1->sendInterest(name, closure, selectors);
176}
177
178BOOST_AUTO_TEST_CASE (TestTimeout)
179{
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800180 setup();
Zhenkai Zhue8c8c8a2013-01-28 22:38:32 -0800181 g_dataCallback_counter = 0;
182 g_timeout_counter = 0;
183 Closure closure (bind(dataCallback, _1, _2), bind(reexpress, _1, _2, _3));
184
185 Selectors selectors;
186 selectors.interestLifetime(1);
187
188 string n1 = "/random/04";
189 c1->sendInterest(Name(n1), closure, selectors);
190 usleep(3500000);
191 c2->publishData(Name(n1), (const unsigned char *)n1.c_str(), n1.size(), 1);
Zhenkai Zhud5d99be2013-03-13 19:15:56 -0700192 usleep(100000);
Zhenkai Zhue8c8c8a2013-01-28 22:38:32 -0800193 BOOST_CHECK_EQUAL(g_dataCallback_counter, 1);
194 BOOST_CHECK_EQUAL(g_timeout_counter, 3);
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800195 teardown();
Zhenkai Zhue8c8c8a2013-01-28 22:38:32 -0800196}
Zhenkai Zhufbf08d32013-01-28 22:42:29 -0800197
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800198BOOST_AUTO_TEST_CASE (TestUnsigned)
Zhenkai Zhufbf08d32013-01-28 22:42:29 -0800199{
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800200 setup();
201 string n1 = "/xxxxxx/unsigned/01";
202 Closure closure (bind(dataCallback, _1, _2), bind(timeout, _1, _2, _3));
203
204 g_dataCallback_counter = 0;
205 c1->sendInterest(Name(n1), closure);
Zhenkai Zhud5d99be2013-03-13 19:15:56 -0700206 usleep(100000);
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800207 c2->publishUnsignedData(Name(n1), (const unsigned char *)n1.c_str(), n1.size(), 1);
Zhenkai Zhud5d99be2013-03-13 19:15:56 -0700208 usleep(100000);
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800209 BOOST_CHECK_EQUAL(g_dataCallback_counter, 1);
Zhenkai Zhu5957c0d2013-02-08 13:47:52 -0800210
211 string n2 = "/xxxxxx/signed/01";
212 Bytes content = c1->createContentObject(Name(n1), (const unsigned char *)n2.c_str(), n2.size(), 1);
213 c1->publishUnsignedData(Name(n2), head(content), content.size(), 1);
214 Closure encapClosure(bind(encapCallback, _1, _2), bind(timeout, _1, _2, _3));
215 c2->sendInterest(Name(n2), encapClosure);
Zhenkai Zhu203dfd22013-03-13 21:35:48 -0700216 usleep(4000000);
Zhenkai Zhu5957c0d2013-02-08 13:47:52 -0800217 BOOST_CHECK_EQUAL(g_dataCallback_counter, 2);
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800218 teardown();
Zhenkai Zhufbf08d32013-01-28 22:42:29 -0800219}
Zhenkai Zhu6fe6d882013-01-23 21:33:53 -0800220
Zhenkai Zhu203dfd22013-03-13 21:35:48 -0700221
Zhenkai Zhud5d99be2013-03-13 19:15:56 -0700222 /*
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800223 BOOST_AUTO_TEST_CASE (CcnxWrapperUnsigningTest)
224 {
225 setup();
226 Bytes data;
227 data.resize(1024);
228 for (int i = 0; i < 1024; i++)
229 {
230 data[i] = 'm';
231 }
Zhenkai Zhu6fe6d882013-01-23 21:33:53 -0800232
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800233 Name name("/unsigningtest");
Zhenkai Zhu6fe6d882013-01-23 21:33:53 -0800234
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800235 posix_time::ptime start = posix_time::second_clock::local_time();
236 for (uint64_t i = 0; i < 100000; i++)
237 {
238 Name n = name;
239 n.appendComp(i);
240 c1->publishUnsignedData(n, data, 10);
241 }
242 posix_time::ptime end = posix_time::second_clock::local_time();
Zhenkai Zhu6fe6d882013-01-23 21:33:53 -0800243
Zhenkai Zhu5acebd72013-02-07 19:59:25 -0800244 posix_time::time_duration duration = end - start;
245
246 cout << "Publishing 100000 1K size content objects costs " <<duration.total_milliseconds() << " milliseconds" << endl;
247 cout << "Average time to publish one content object is " << (double) duration.total_milliseconds() / 100000.0 << " milliseconds" << endl;
248 teardown();
249 }
Zhenkai Zhud5d99be2013-03-13 19:15:56 -0700250 */
Zhenkai Zhu6fe6d882013-01-23 21:33:53 -0800251
Zhenkai Zhu5957c0d2013-02-08 13:47:52 -0800252
Zhenkai Zhu3b82d432013-01-03 22:48:40 -0800253BOOST_AUTO_TEST_SUITE_END()