blob: 015da4bb22678031856903155bcda13a3e842c58 [file] [log] [blame]
Andrew Brown3831baf2015-01-19 13:38:52 -08001/*
andrewsbrown533c6ef2015-03-03 16:08:41 -08002 * jndn-mock
Andrew Brownfe6c21c2016-08-24 16:28:54 -07003 * Copyright (c) 2016, Intel Corporation.
andrewsbrown533c6ef2015-03-03 16:08:41 -08004 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU Lesser General Public License,
7 * version 3, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT ANY
10 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
12 * more details.
Andrew Brown3831baf2015-01-19 13:38:52 -080013 */
14package com.intel.jndn.mock;
15
Alexander Afanasyevcbc41012016-02-19 20:10:57 -080016import net.named_data.jndn.Data;
17import net.named_data.jndn.Face;
18import net.named_data.jndn.Interest;
19import net.named_data.jndn.InterestFilter;
20import net.named_data.jndn.Name;
21import net.named_data.jndn.OnData;
22import net.named_data.jndn.OnInterestCallback;
23import net.named_data.jndn.OnRegisterFailed;
24import net.named_data.jndn.OnRegisterSuccess;
25import net.named_data.jndn.OnTimeout;
Andrew Brown3831baf2015-01-19 13:38:52 -080026import net.named_data.jndn.encoding.EncodingException;
andrewsbrowna52bf7d2015-04-06 13:51:53 -070027import net.named_data.jndn.security.SecurityException;
Andrew Brown3831baf2015-01-19 13:38:52 -080028import net.named_data.jndn.util.Blob;
Alexander Afanasyev83a26d32016-01-26 01:04:32 -080029import org.junit.Before;
Andrew Brown3831baf2015-01-19 13:38:52 -080030import org.junit.Test;
Alexander Afanasyev83a26d32016-01-26 01:04:32 -080031
Alexander Afanasyevcbc41012016-02-19 20:10:57 -080032import java.io.IOException;
33import java.util.logging.Logger;
34
35import static org.junit.Assert.assertEquals;
36import static org.junit.Assert.assertFalse;
37import static org.junit.Assert.assertNotNull;
38import static org.junit.Assert.assertNull;
39import static org.junit.Assert.assertTrue;
Andrew Brown3831baf2015-01-19 13:38:52 -080040
41/**
Alexander Afanasyevcbc41012016-02-19 20:10:57 -080042 * Test MockFace functionality.
Andrew Brown3831baf2015-01-19 13:38:52 -080043 */
44public class MockFaceTest {
Alexander Afanasyevcbc41012016-02-19 20:10:57 -080045 private static final Logger LOG = Logger.getLogger(MockFaceTest.class.getName());
46 private MockFace face;
47 private int counter;
48 private Data recvData = null;
49 private boolean isTimeout = false;
50 private Exception exception = null;
51
52 /////////////////////////////////////////////////////////////////////////////
Andrew Brown58191872016-02-05 22:16:57 -080053
Alexander Afanasyev83a26d32016-01-26 01:04:32 -080054 @Before
55 public void setup() throws SecurityException {
56 face = new MockFace();
57 counter = 0;
58 recvData = null;
59 isTimeout = false;
60 exception = null;
61 }
Andrew Brown3831baf2015-01-19 13:38:52 -080062
Andrew Brown3831baf2015-01-19 13:38:52 -080063 @Test
Andrew Brown58191872016-02-05 22:16:57 -080064 public void testExpressingAnInterest() throws IOException, EncodingException, InterruptedException {
Alexander Afanasyev83a26d32016-01-26 01:04:32 -080065 // make request
66 expressInterest("/test/with/responses");
Andrew Brown3831baf2015-01-19 13:38:52 -080067
Alexander Afanasyev83a26d32016-01-26 01:04:32 -080068 run(2);
69
70 // add response (after face is connectd)
Andrew Brown3831baf2015-01-19 13:38:52 -080071 Data response = new Data(new Name("/test/with/responses"));
72 response.setContent(new Blob("..."));
Alexander Afanasyev83a26d32016-01-26 01:04:32 -080073 face.receive(response);
Andrew Brown3831baf2015-01-19 13:38:52 -080074
Alexander Afanasyev83a26d32016-01-26 01:04:32 -080075 run(20);
Andrew Brown3831baf2015-01-19 13:38:52 -080076
Andrew Brown58191872016-02-05 22:16:57 -080077 assertNotNull(recvData);
Alexander Afanasyev83a26d32016-01-26 01:04:32 -080078 assertEquals(isTimeout, false);
79 assertEquals(recvData.getName().toString(), "/test/with/responses");
80 assertEquals(recvData.getContent().buf(), new Blob("...").buf());
Andrew Brown3831baf2015-01-19 13:38:52 -080081 }
82
Andrew Brown3831baf2015-01-19 13:38:52 -080083 @Test
Andrew Brown58191872016-02-05 22:16:57 -080084 public void testExpressingAnInterestAfterConfiguration() throws IOException, EncodingException, InterruptedException {
Alexander Afanasyev83a26d32016-01-26 01:04:32 -080085 // add response (before face is connected)
86 Data response = new Data(new Name("/test/with/responses"));
87 response.setContent(new Blob("..."));
88 face.receive(response);
Andrew Brown3831baf2015-01-19 13:38:52 -080089
Alexander Afanasyev83a26d32016-01-26 01:04:32 -080090 // make request
91 expressInterest("/test/with/responses");
92
93 run(20);
94
Andrew Brown58191872016-02-05 22:16:57 -080095 assertNotNull(recvData);
Alexander Afanasyev83a26d32016-01-26 01:04:32 -080096 assertEquals(isTimeout, false);
97 assertEquals(recvData.getName().toString(), "/test/with/responses");
98 assertEquals(recvData.getContent().buf(), new Blob("...").buf());
99 }
100
101 @Test
Andrew Brown58191872016-02-05 22:16:57 -0800102 public void testInterestTimeouts() throws IOException, EncodingException, InterruptedException {
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800103 // make request
104 expressInterest("/some/name");
105
106 run(20);
107
108 assertEquals(recvData, null);
109 assertEquals(isTimeout, true);
110 }
111
112 @Test
Andrew Brown58191872016-02-05 22:16:57 -0800113 public void testPrefixRegistration() throws IOException, SecurityException, EncodingException, InterruptedException {
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800114 class State {
115 boolean regFailed = false;
116 boolean regSucceed = false;
117 }
118 final State state = new State();
119
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800120 LOG.info("Register prefix: /test/with/handlers");
Andrew Brown58191872016-02-05 22:16:57 -0800121 face.registerPrefix(new Name("/test/with/handlers"), new OnInterestCallback() {
122 @Override
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800123 public void onInterest(final Name prefix, final Interest interest, final Face face, final long interestFilterId,
124 final InterestFilter filter) {
125 LOG.info("Received interest, responding: " + interest.getName().toUri());
Andrew Brown58191872016-02-05 22:16:57 -0800126 Data response = new Data(new Name("/test/with/handlers"));
127 response.setContent(new Blob("..."));
128 try {
129 face.putData(response);
130 } catch (IOException e) {
131 exception = e;
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800132 }
Andrew Brown58191872016-02-05 22:16:57 -0800133 counter++;
Andrew Brown3831baf2015-01-19 13:38:52 -0800134 }
Andrew Brown58191872016-02-05 22:16:57 -0800135 }, new OnRegisterFailed() {
136 @Override
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800137 public void onRegisterFailed(final Name prefix) {
138 LOG.info("Prefix registration fails: " + prefix);
Andrew Brown58191872016-02-05 22:16:57 -0800139 state.regFailed = true;
140 counter++;
141 }
142 }, new OnRegisterSuccess() {
143 @Override
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800144 public void onRegisterSuccess(final Name prefix, final long registeredPrefixId) {
145 LOG.info("Prefix registration succeed: " + prefix);
Andrew Brown58191872016-02-05 22:16:57 -0800146 state.regSucceed = true;
147 counter++;
148 }
149 });
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800150
151 run(100, 1);
152 assertTrue(state.regSucceed);
153 assertFalse(state.regFailed);
Andrew Brown3831baf2015-01-19 13:38:52 -0800154
155 // make request
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800156 face.receive(new Interest(new Name("/test/with/handlers")));
Andrew Brown3831baf2015-01-19 13:38:52 -0800157
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800158 run(100, 2);
159
160 assertNull(exception);
161
162 assertEquals(face.sentData.size(), 1);
163 assertFalse(isTimeout);
164 assertEquals("/test/with/handlers", face.sentData.get(0).getName().toString());
165 assertEquals(new Blob("...").buf(), face.sentData.get(0).getContent().buf());
Andrew Brown3831baf2015-01-19 13:38:52 -0800166 }
Andrew Brown3831baf2015-01-19 13:38:52 -0800167
andrewsbrowna52bf7d2015-04-06 13:51:53 -0700168 @Test
Andrew Brown58191872016-02-05 22:16:57 -0800169 public void testThatTransportConnectsOnPrefixRegistration() throws IOException, SecurityException {
andrewsbrowna52bf7d2015-04-06 13:51:53 -0700170 assertFalse(face.getTransport().getIsConnected());
Andrew Brownc9ba5502016-08-25 09:40:53 -0700171 face.registerPrefix(new Name("/fake/prefix"), null, null, (OnRegisterSuccess) null);
andrewsbrowna52bf7d2015-04-06 13:51:53 -0700172 assertTrue(face.getTransport().getIsConnected());
173 }
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800174
andrewsbrown0f36eee2015-05-07 01:37:48 +0100175 @Test
Andrew Brown58191872016-02-05 22:16:57 -0800176 public void testInterestFilters() throws IOException, SecurityException, EncodingException, InterruptedException {
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800177 class State {
178 boolean regFailed = false;
179 boolean regSucceed = false;
180 }
181 final State state = new State();
182
andrewsbrown62c29122016-05-02 15:58:06 -0700183 // connect callback
Andrew Brownc9ba5502016-08-25 09:40:53 -0700184 face.registerPrefix(new Name("/fake/prefix"), null, new OnRegisterFailed() {
andrewsbrown0f36eee2015-05-07 01:37:48 +0100185 @Override
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800186 public void onRegisterFailed(final Name prefix) {
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800187 state.regFailed = true;
188 counter++;
189 }
190 }, new OnRegisterSuccess() {
191 @Override
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800192 public void onRegisterSuccess(final Name prefix, final long registeredPrefixId) {
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800193 state.regSucceed = true;
194 counter++;
andrewsbrown0f36eee2015-05-07 01:37:48 +0100195 }
196 });
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800197
198 // set filter
andrewsbrown0f36eee2015-05-07 01:37:48 +0100199 face.setInterestFilter(new InterestFilter("/a/b"), new OnInterestCallback() {
200 @Override
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800201 public void onInterest(final Name prefix, final Interest interest, final Face face, final long interestFilterId,
202 final InterestFilter filter) {
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800203 counter++;
204 }
205 });
206
207 face.receive(new Interest(new Name("/a/b")).setInterestLifetimeMilliseconds(100));
208
209 run(10, 2);
210
211 assertEquals(2, counter);
212 assertTrue(state.regSucceed);
213 assertFalse(state.regFailed);
214 }
215
Alexander Afanasyev4c3de792016-02-19 20:18:41 -0800216 @Test
217 public void testMockWithoutPacketLogging() throws Exception {
218 face = new MockFace(new MockFace.Options().setEnablePacketLogging(false));
219
220 // make request
221 expressInterest("/test/with/responses");
222 run(2);
223
224 assertEquals(0, face.sentInterests.size());
225 }
226
227 @Test
228 public void testMockWithoutMockRegistrationReply() throws Exception {
229 face = new MockFace(new MockFace.Options().setEnableRegistrationReply(false));
230
231 class State {
232 boolean regFailed = false;
233 boolean regSucceed = false;
234 }
235 final State state = new State();
236
237 LOG.info("Register prefix: /test/with/handlers");
238 face.registerPrefix(new Name("/test/with/handlers"), new OnInterestCallback() {
239 @Override
240 public void onInterest(final Name prefix, final Interest interest, final Face face, final long interestFilterId,
241 final InterestFilter filter) {
242 LOG.info("Received interest, responding: " + interest.getName().toUri());
243 Data response = new Data(new Name("/test/with/handlers"));
244 response.setContent(new Blob("..."));
245 try {
246 face.putData(response);
247 } catch (IOException e) {
248 exception = e;
249 }
250 counter++;
251 }
252 }, new OnRegisterFailed() {
253 @Override
254 public void onRegisterFailed(final Name prefix) {
255 LOG.info("Prefix registration fails: " + prefix);
256 state.regFailed = true;
257 counter++;
258 }
259 }, new OnRegisterSuccess() {
260 @Override
261 public void onRegisterSuccess(final Name prefix, final long registeredPrefixId) {
262 LOG.info("Prefix registration succeed: " + prefix);
263 state.regSucceed = true;
264 counter++;
265 }
266 });
267
268 run(100, 1);
269 assertFalse(state.regSucceed);
270 assertTrue(state.regFailed);
271 }
272
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800273 /////////////////////////////////////////////////////////////////////////////
274
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800275 private void run(final int limit, final int maxCounter) throws IOException, EncodingException, InterruptedException {
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800276 // process face until a response is received
277 int allowedLoops = limit;
278 while (counter < maxCounter && allowedLoops > 0) {
279 allowedLoops--;
280 face.processEvents();
281 Thread.sleep(100);
282 }
283 }
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800284
285 private void run(final int limit) throws IOException, EncodingException, InterruptedException {
Alexander Afanasyev83a26d32016-01-26 01:04:32 -0800286 run(limit, 1);
287 }
288
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800289 private void expressInterest(final String name) throws IOException {
290 LOG.info("Express interest: " + name);
Andrew Brown58191872016-02-05 22:16:57 -0800291 face.expressInterest(new Interest(new Name(name)).setInterestLifetimeMilliseconds(1000), new OnData() {
292 @Override
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800293 public void onData(final Interest interest, final Data data) {
Andrew Brown58191872016-02-05 22:16:57 -0800294 counter++;
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800295 LOG.fine("Received data");
Andrew Brown58191872016-02-05 22:16:57 -0800296 recvData = data;
297 }
298 }, new OnTimeout() {
299 @Override
Alexander Afanasyevcbc41012016-02-19 20:10:57 -0800300 public void onTimeout(final Interest interest) {
301 LOG.fine("Received timeout");
Andrew Brown58191872016-02-05 22:16:57 -0800302 counter++;
303 isTimeout = true;
304 }
305 });
andrewsbrown0f36eee2015-05-07 01:37:48 +0100306 }
Andrew Brown3831baf2015-01-19 13:38:52 -0800307}