blob: 7baaf2297c54b9ef23a4bcdce9efd8882c72be17 [file] [log] [blame]
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -08001/*
2 * jndn-management
3 * Copyright (c) 2015, Intel Corporation.
4 *
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.
13 */
14package com.intel.jndn.management;
15
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080016import com.intel.jndn.management.enums.Strategies;
17import com.intel.jndn.management.types.RibEntry;
18import com.intel.jndn.management.types.StrategyChoice;
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -080019import com.intel.jndn.mock.MockFace;
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080020import com.intel.jndn.mock.MockKeyChain;
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -080021import net.named_data.jndn.ControlResponse;
22import net.named_data.jndn.Data;
23import net.named_data.jndn.DigestSha256Signature;
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080024import net.named_data.jndn.Face;
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -080025import net.named_data.jndn.Interest;
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080026import net.named_data.jndn.KeyLocator;
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -080027import net.named_data.jndn.MetaInfo;
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080028import net.named_data.jndn.Name;
29import net.named_data.jndn.encoding.EncodingException;
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -050030import net.named_data.jndn.encoding.Tlv0_3WireFormat;
31import net.named_data.jndn.encoding.WireFormat;
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080032import net.named_data.jndn.security.KeyChain;
33import net.named_data.jndn.security.SecurityException;
34import org.junit.Before;
35import org.junit.Test;
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080036
Alexander Afanasyeve36e1af2016-02-19 18:06:05 -080037import java.io.IOException;
38import java.util.List;
39import java.util.Random;
40import java.util.logging.Logger;
41
42import static org.junit.Assert.assertEquals;
43import static org.junit.Assert.assertFalse;
44import static org.junit.Assert.assertNotNull;
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -050045import static org.junit.Assert.assertThrows;
Alexander Afanasyeve36e1af2016-02-19 18:06:05 -080046import static org.junit.Assert.assertTrue;
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080047
48/**
Alexander Afanasyeve36e1af2016-02-19 18:06:05 -080049 * Testing Nfdc with real NFD instance (NFD must be run locally while executing the test).
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080050 *
51 * @author Andrew Brown <andrew.brown@intel.com>
52 */
53public class NfdcIT {
54 private static final Logger LOG = Logger.getLogger(NfdcIT.class.getName());
55 private Face face;
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -080056 private MockFace mockFace;
57 private Face noKeyChainFace;
58
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080059 @Before
60 public void setUp() throws SecurityException {
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -050061 WireFormat.setDefaultWireFormat(Tlv0_3WireFormat.get());
62
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080063 face = new Face("localhost");
Alexander Afanasyev60f8f8e2018-07-25 13:24:19 -040064 mockFace = new MockFace(new MockFace.Options().setEnablePacketLogging(false).setEnableRegistrationReply(false));
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -080065 noKeyChainFace = new Face("localhost"); // don't set command signing info
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080066 KeyChain keyChain = MockKeyChain.configure(new Name("/tmp/identity"));
67 face.setCommandSigningInfo(keyChain, keyChain.getDefaultCertificateName());
68 }
69
70 @Test
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -080071 public void testGetKeyLocator() throws Exception {
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080072 KeyLocator keyLocator = Nfdc.getKeyLocator(face);
73 assertNotNull(keyLocator);
74 LOG.info("Connected to NFD with key locator: " + keyLocator.getKeyName().toUri());
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -080075
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -050076 assertThrows(ManagementException.class, () -> Nfdc.getKeyLocator(mockFace));
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -080077 }
78
79 @Test
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -080080 public void testFailOfGetKeyLocator() throws Exception {
81 mockFace.onSendInterest.add(new MockFace.SignalOnSendInterest() {
82 @Override
andrewsbrown6df23ad2016-04-22 14:24:12 -070083 public void emit(final Interest interest) {
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -080084 Data data = new Data();
85 data.setName(new Name(interest.getName()).appendVersion(0).appendSegment(0));
86
87 MetaInfo meta = new MetaInfo();
88 meta.setFinalBlockId(data.getName().get(-1));
89 data.setMetaInfo(meta);
90
91 data.setSignature(new DigestSha256Signature());
92
93 LOG.info(data.getSignature().toString());
94
95 // don't set anything else
andrewsbrown6df23ad2016-04-22 14:24:12 -070096 try {
97 mockFace.receive(data);
98 } catch (EncodingException e) {
99 LOG.severe("Failed to set receive data: " + e);
100 }
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800101 }
102 });
103
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500104 Exception exception = assertThrows(ManagementException.class, () -> Nfdc.getKeyLocator(mockFace));
105 assertEquals("No key locator available.", exception.getMessage());
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800106 }
107
108 @Test
109 public void testGetForwarderStatus() throws Exception {
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -0800110 assertTrue(Nfdc.getForwarderStatus(face).getStartTimestamp() > 0);
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500111 assertThrows(ManagementException.class, () -> Nfdc.getForwarderStatus(mockFace));
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800112 }
113
114 @Test
115 public void testGetFaceList() throws Exception {
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -0800116 assertFalse(Nfdc.getFaceList(face).isEmpty());
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500117 assertThrows(ManagementException.class, () -> Nfdc.getFaceList(mockFace));
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800118 }
119
120 @Test
121 public void testGetFibList() throws Exception {
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -0800122 assertFalse(Nfdc.getFibList(face).isEmpty());
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500123 assertThrows(ManagementException.class, () -> Nfdc.getFibList(mockFace));
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800124 }
125
126 @Test
127 public void testGetRouteList() throws Exception {
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -0800128 assertFalse(Nfdc.getRouteList(face).isEmpty());
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500129 assertThrows(ManagementException.class, () -> Nfdc.getRouteList(mockFace));
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -0800130 }
131
132 @Test
133 public void testRoutes() throws EncodingException, IOException, ManagementException, InterruptedException {
134 Nfdc.register(face, new Name("/my/route/to/app/face"), 333);
135 int faceId = Nfdc.createFace(face, "udp4://127.0.0.1:56363");
136 Nfdc.register(face, "udp4://127.0.0.1:56363", new Name("/my/test/route"), 999);
137 Nfdc.register(face, faceId, new Name("/"), 555);
138
139 // check that route is created
140 Thread.sleep(1000); // NFD registers the route asynchronously
141
142 boolean found = false;
143 for (RibEntry route : Nfdc.getRouteList(face)) {
144 LOG.info("Found route: " + route.getName().toUri());
145 if (route.getName().equals(new Name("/my/test/route"))) {
146 found = true;
147 }
148 }
149 assertTrue(found);
150
151 Nfdc.unregister(face, new Name("/my/route/to/app/face"));
152
153 // remove the route
154 Nfdc.unregister(face, new Name("/my/test/route"), "udp4://127.0.0.1:56363");
155
156 // remove face
157 Nfdc.destroyFace(face, faceId);
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800158
159 Thread.sleep(1000); // wait for face to be destroyed
160
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500161 Exception exception = assertThrows(ManagementException.class, () -> {
162 Nfdc.unregister(face, new Name("/my/test/route"), "udp4://127.0.0.1:56363");
163 });
164 assertEquals("Face not found: udp4://127.0.0.1:56363", exception.getMessage());
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800165 }
166
Davide Pesavento63463132020-11-03 20:37:23 -0500167 @Test
168 public void testFailOfRegister() throws Exception {
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500169 assertThrows(ManagementException.class, () -> Nfdc.register(mockFace, new Name("/my/route/to/app/face"), 333));
Davide Pesavento63463132020-11-03 20:37:23 -0500170 }
171
172 @Test
173 public void testFailOfUnregister() throws Exception {
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500174 assertThrows(ManagementException.class, () -> Nfdc.unregister(mockFace, new Name("/my/route/to/app/face")));
Davide Pesavento63463132020-11-03 20:37:23 -0500175 }
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800176
177 @Test
178 public void testFailOfCreateFace() throws Exception {
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500179 assertThrows(ManagementException.class, () -> Nfdc.createFace(mockFace, "udp4://127.0.0.1:56363"));
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800180 }
181
182 @Test
183 public void testFailOfDestroyFace() throws Exception {
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500184 assertThrows(ManagementException.class, () -> Nfdc.destroyFace(mockFace, 1));
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -0800185 }
186
187 @Test
188 public void testStrategies() throws Exception {
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500189 Name prefix = new Name("/test/strategy").append("random" + new Random().nextInt());
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -0800190 List<StrategyChoice> choices = Nfdc.getStrategyList(face);
191 int oldSize = choices.size();
192
Davide Pesavento63463132020-11-03 20:37:23 -0500193 Nfdc.setStrategy(face, prefix, Strategies.RANDOM);
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -0800194 Thread.sleep(1000); // strategy takes a while to register
195
196 choices = Nfdc.getStrategyList(face);
197 assertEquals(oldSize + 1, choices.size());
198
199 Nfdc.unsetStrategy(face, prefix);
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500200 Thread.sleep(1000);
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800201
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500202 choices = Nfdc.getStrategyList(face);
203 assertEquals(oldSize, choices.size());
204
205 assertThrows(ManagementException.class, () -> Nfdc.getStrategyList(mockFace));
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800206 }
207
208 @Test
209 public void testFailOfUnsetStrategy() throws Exception {
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500210 assertThrows(ManagementException.class, () -> Nfdc.unsetStrategy(mockFace, new Name("/")));
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800211 }
212
213 @Test
214 public void testFailOfSetStrategyWithoutKeychain() throws Exception {
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500215 assertThrows(NullPointerException.class, () -> {
216 Nfdc.setStrategy(noKeyChainFace, new Name("/test"), Strategies.BEST_ROUTE);
217 });
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800218 }
219
220 @Test
221 public void testFailOfSetStrategyWithNon200Code() throws Exception {
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800222 mockFace.onSendInterest.add(new MockFace.SignalOnSendInterest() {
223 @Override
andrewsbrown6df23ad2016-04-22 14:24:12 -0700224 public void emit(final Interest interest) {
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800225 ControlResponse response = new ControlResponse();
226 response.setStatusCode(300);
227 response.setStatusText("Test FAIL");
228
229 Data data = new Data();
230 data.setName(interest.getName());
231 data.setContent(response.wireEncode());
232
andrewsbrown6df23ad2016-04-22 14:24:12 -0700233 try {
234 mockFace.receive(data);
235 } catch (EncodingException e) {
236 LOG.severe("Failed to set receive data: " + e);
237 }
Alexander Afanasyev3c5ae7c2016-02-19 19:33:21 -0800238 }
239 });
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500240
241 Exception exception = assertThrows(ManagementException.class, () -> {
242 Nfdc.setStrategy(mockFace, new Name("/"), Strategies.MULTICAST);
243 });
244 assertEquals("Action failed, forwarder returned: 300 Test FAIL", exception.getMessage());
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -0800245 }
246
Alexander Afanasyev7ac3e392016-02-19 23:21:01 -0800247 @Test
248 public void testGetChannelStatus() throws Exception {
249 assertFalse(Nfdc.getChannelStatusList(face).isEmpty());
Davide Pesaventodd1fe9f2020-11-03 20:48:24 -0500250 assertThrows(ManagementException.class, () -> Nfdc.getChannelStatusList(mockFace));
Alexander Afanasyev7ac3e392016-02-19 23:21:01 -0800251 }
Alexander Afanasyeva8bc0d82016-01-25 17:25:30 -0800252}