blob: e70393af9654d83096219e1301578e87fdd558d4 [file] [log] [blame]
Shubham Sharmacf5e5032019-11-26 11:09:21 +00001/*
2 * Copyright 2015-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.opencord.aaa.impl;
17
Shubham Sharmacf5e5032019-11-26 11:09:21 +000018import org.junit.After;
19import org.junit.Before;
20import org.junit.Test;
Matteo Scandolobbc1ffb2020-10-16 15:56:20 -070021import org.junit.runner.RunWith;
22import org.junit.runners.Parameterized;
Shubham Sharmacf5e5032019-11-26 11:09:21 +000023import org.onlab.junit.TestUtils;
24import org.onlab.packet.BasePacket;
25import org.onlab.packet.DeserializationException;
26import org.onlab.packet.EAP;
27import org.onlab.packet.Ethernet;
28import org.onlab.packet.IpAddress;
29import org.onlab.packet.RADIUS;
30import org.onlab.packet.RADIUSAttribute;
Jonathan Hartc41227c2020-01-28 16:56:49 -080031import org.onosproject.cluster.ClusterServiceAdapter;
Shubham Sharmacf5e5032019-11-26 11:09:21 +000032import org.onosproject.core.ApplicationId;
33import org.onosproject.core.CoreServiceAdapter;
34import org.onosproject.event.DefaultEventSinkRegistry;
35import org.onosproject.event.Event;
36import org.onosproject.event.EventDeliveryService;
37import org.onosproject.event.EventSink;
38import org.onosproject.net.config.Config;
39import org.onosproject.net.config.NetworkConfigRegistryAdapter;
40import org.onosproject.net.packet.DefaultInboundPacket;
41import org.onosproject.net.packet.InboundPacket;
42import org.onosproject.net.packet.PacketContext;
43import org.onosproject.net.packet.PacketService;
Jonathan Hartc41227c2020-01-28 16:56:49 -080044import org.onosproject.store.cluster.messaging.ClusterCommunicationServiceAdapter;
Jonathan Hart9d1ce802020-01-28 10:45:08 -080045import org.onosproject.store.service.TestStorageService;
Shubham Sharmacf5e5032019-11-26 11:09:21 +000046import org.opencord.aaa.AaaConfig;
47import org.slf4j.Logger;
48
Shubham Sharmacf5e5032019-11-26 11:09:21 +000049import java.net.InetAddress;
50import java.net.UnknownHostException;
51import java.nio.ByteBuffer;
52
53import static com.google.common.base.Preconditions.checkState;
Matteo Scandolo9510e5d2020-09-24 17:31:52 -070054import static junit.framework.TestCase.fail;
Shubham Sharmacf5e5032019-11-26 11:09:21 +000055import static org.hamcrest.Matchers.is;
56import static org.hamcrest.Matchers.notNullValue;
Shubham Sharma2b3fb692019-12-12 10:19:10 +000057import static org.junit.Assert.assertNotEquals;
Shubham Sharma8d7a9822020-01-28 10:04:01 +000058import static org.junit.Assert.assertEquals;
Shubham Sharmacf5e5032019-11-26 11:09:21 +000059import static org.junit.Assert.assertThat;
60import static org.onosproject.net.NetTestTools.connectPoint;
Matteo Scandolo9510e5d2020-09-24 17:31:52 -070061import static org.onosproject.net.intent.TestTools.assertAfter;
Shubham Sharmacf5e5032019-11-26 11:09:21 +000062import static org.slf4j.LoggerFactory.getLogger;
63
64/**
65 * Set of tests of the ONOS application component for AAA Statistics.
66 */
Matteo Scandolobbc1ffb2020-10-16 15:56:20 -070067@RunWith(Parameterized.class)
Shubham Sharmacf5e5032019-11-26 11:09:21 +000068public class AaaStatisticsTest extends AaaTestBase {
69
Matteo Scandolobbc1ffb2020-10-16 15:56:20 -070070 // Change this to have more run with mvn
71 @Parameterized.Parameters
72 public static Object[][] data() {
73 return new Object[1][0];
74 }
75
Shubham Sharmacf5e5032019-11-26 11:09:21 +000076 static final String BAD_IP_ADDRESS = "198.51.100.0";
Shubham Sharma2b3fb692019-12-12 10:19:10 +000077 static final Long ZERO = (long) 0;
Shubham Sharmacf5e5032019-11-26 11:09:21 +000078
Matteo Scandolo9510e5d2020-09-24 17:31:52 -070079
Shubham Sharmacf5e5032019-11-26 11:09:21 +000080 private final Logger log = getLogger(getClass());
81 private AaaManager aaaManager;
82 private AaaStatisticsManager aaaStatisticsManager;
Kartikey Dubeyadeb26e2019-10-01 12:18:35 +000083 private AaaSupplicantMachineStatsManager aaaSupplicantStatsManager;
Shubham Sharmacf5e5032019-11-26 11:09:21 +000084
85 class AaaManagerWithoutRadiusServer extends AaaManager {
Jonathan Hart612651f2019-11-25 09:21:43 -080086 protected void sendRadiusPacket(RADIUS radiusPacket, InboundPacket inPkt) {
87 super.sendRadiusPacket(radiusPacket, inPkt);
88 aaaManager.aaaStatisticsManager.putOutgoingIdentifierToMap(radiusPacket.getIdentifier());
89 savePacket(radiusPacket);
90 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +000091
Jonathan Hart612651f2019-11-25 09:21:43 -080092 // changed the configuration of parent method to protected
Ilayda Ozdemir9fdeee72021-02-26 12:24:27 +000093 protected void configureRadiusCommunication(boolean isUpdate) {
Jonathan Hart612651f2019-11-25 09:21:43 -080094 PacketService pktService = new MockPacketService();
95 ApplicationId appId = new CoreServiceAdapter().registerApplication("org.opencord.aaa");
96 aaaManager.impl = new TestSocketBasedRadiusCommunicator(appId, pktService, aaaManager);
97 }
98 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +000099
100 /**
101 * Mocks the AAAConfig class to force usage of an unroutable address for the
102 * RADIUS server.
103 */
104 static class MockAaaConfig extends AaaConfig {
105 @Override
106 public InetAddress radiusIp() {
Jonathan Hart612651f2019-11-25 09:21:43 -0800107 try {
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000108 return InetAddress.getByName(BAD_IP_ADDRESS);
Jonathan Hart612651f2019-11-25 09:21:43 -0800109 } catch (UnknownHostException ex) {
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000110 throw new IllegalStateException(ex);
Jonathan Hart612651f2019-11-25 09:21:43 -0800111 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000112 }
Jonathan Hart612651f2019-11-25 09:21:43 -0800113 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000114
115 /**
116 * Mocks the network config registry.
117 */
Matteo Scandolo120d40b2020-11-25 15:49:22 -0800118 @SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"})
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000119 private static final class TestNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
120 @Override
121 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
122 AaaConfig aaaConfig = new MockAaaConfig();
123 return (C) aaaConfig;
Jonathan Hart612651f2019-11-25 09:21:43 -0800124 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000125 }
126
127 public static class TestEventDispatcher extends DefaultEventSinkRegistry implements EventDeliveryService {
128
Jonathan Hart612651f2019-11-25 09:21:43 -0800129 @Override
130 @SuppressWarnings("unchecked")
131 public synchronized void post(Event event) {
132 EventSink sink = getSink(event.getClass());
133 checkState(sink != null, "No sink for event %s", event);
134 sink.process(event);
135 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000136
Jonathan Hart612651f2019-11-25 09:21:43 -0800137 @Override
138 public void setDispatchTimeLimit(long millis) {
139 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000140
Jonathan Hart612651f2019-11-25 09:21:43 -0800141 @Override
142 public long getDispatchTimeLimit() {
143 return 0;
144 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000145 }
146
Jonathan Hart612651f2019-11-25 09:21:43 -0800147 /**
148 * Set up the services required by the AAA application.
149 */
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000150 @Before
151 public void setUp() {
152 aaaManager = new AaaManagerWithoutRadiusServer();
Shubham Sharma4900ce62019-06-19 14:18:50 +0000153 aaaManager.radiusOperationalStatusService = new RadiusOperationalStatusManager();
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000154 aaaManager.netCfgService = new TestNetworkConfigRegistry();
155 aaaManager.coreService = new CoreServiceAdapter();
156 aaaManager.packetService = new MockPacketService();
157 aaaManager.deviceService = new TestDeviceService();
158 aaaManager.sadisService = new MockSadisService();
159 aaaManager.cfgService = new MockCfgService();
Jonathan Hart9d1ce802020-01-28 10:45:08 -0800160 aaaManager.storageService = new TestStorageService();
Andrea Campanellac4781e62020-10-08 12:58:45 +0200161 aaaManager.mastershipService = new MockMastershipService();
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000162 aaaStatisticsManager = new AaaStatisticsManager();
Jonathan Hartc41227c2020-01-28 16:56:49 -0800163 aaaStatisticsManager.storageService = new TestStorageService();
164 aaaStatisticsManager.clusterService = new ClusterServiceAdapter();
165 aaaStatisticsManager.leadershipService = new AaaManagerTest.TestLeadershipService();
166 aaaStatisticsManager.clusterCommunicationService = new ClusterCommunicationServiceAdapter();
Kartikey Dubeyadeb26e2019-10-01 12:18:35 +0000167 aaaSupplicantStatsManager = new AaaSupplicantMachineStatsManager();
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000168 TestUtils.setField(aaaStatisticsManager, "eventDispatcher", new TestEventDispatcher());
Jonathan Hartc41227c2020-01-28 16:56:49 -0800169 aaaStatisticsManager.activate(new MockComponentContext());
Kartikey Dubeyadeb26e2019-10-01 12:18:35 +0000170 TestUtils.setField(aaaSupplicantStatsManager, "eventDispatcher", new TestEventDispatcher());
171 aaaSupplicantStatsManager.activate();
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000172 aaaManager.aaaStatisticsManager = this.aaaStatisticsManager;
Kartikey Dubeyadeb26e2019-10-01 12:18:35 +0000173 aaaManager.aaaSupplicantStatsManager = this.aaaSupplicantStatsManager;
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000174 TestUtils.setField(aaaManager, "eventDispatcher", new TestEventDispatcher());
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700175
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000176 aaaManager.activate(new AaaTestBase.MockComponentContext());
177 }
178
Jonathan Hart612651f2019-11-25 09:21:43 -0800179 /**
180 * Tear down the AAA application.
181 */
182 @After
183 public void tearDown() {
184 aaaManager.deactivate(new AaaTestBase.MockComponentContext());
185 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000186
Jonathan Hart612651f2019-11-25 09:21:43 -0800187 /**
188 * Extracts the RADIUS packet from a packet sent by the supplicant.
189 *
190 * @param radius RADIUS packet sent by the supplicant
191 * @throws DeserializationException if deserialization of the packet contents fails.
192 */
193 private void checkRadiusPacketFromSupplicant(RADIUS radius) throws DeserializationException {
194 assertThat(radius, notNullValue());
195 EAP eap = radius.decapsulateMessage();
196 assertThat(eap, notNullValue());
197 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000198
Jonathan Hart612651f2019-11-25 09:21:43 -0800199 /**
200 * Fetches the sent packet at the given index. The requested packet must be the
201 * last packet on the list.
202 *
203 * @param index index into sent packets array
204 * @return packet
205 */
206 private BasePacket fetchPacket(int index) {
207 BasePacket packet = savedPackets.get(index);
208 assertThat(packet, notNullValue());
209 return packet;
210 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000211
Jonathan Hart612651f2019-11-25 09:21:43 -0800212 /**
213 * Tests the authentication path through the AAA application.
214 * And counts the aaa Stats for successful transmission.
215 *
216 * @throws DeserializationException if packed deserialization fails.
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000217 */
218 @Test
219 public void testAaaStatisticsForAcceptedPackets() throws Exception {
220
221 // (1) Supplicant start up
222 Ethernet startPacket = constructSupplicantStartPacket();
223 sendPacket(startPacket);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700224 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
Andrea Campanellac4781e62020-10-08 12:58:45 +0200225 Ethernet responsePacket = (Ethernet) fetchPacket(0);
226 checkRadiusPacket(aaaManager, responsePacket, EAP.ATTR_IDENTITY);
227
228 // (2) Supplicant identify
229
230 Ethernet identifyPacket = null;
231 try {
232 identifyPacket = constructSupplicantIdentifyPacket(null,
233 EAP.ATTR_IDENTITY, (byte) 1, null);
234 sendPacket(identifyPacket);
235 } catch (Exception e) {
236 log.error(e.getMessage());
237 fail();
238 }
239 });
240 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
241 try {
242 RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
243 checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
244
245 assertThat(radiusIdentifyPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
246 assertThat(new String(radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME)
247 .getValue()),
248 is("testuser"));
249 IpAddress nasIp = IpAddress.valueOf(IpAddress.Version.INET,
250 radiusIdentifyPacket
251 .getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP)
252 .getValue());
253 assertThat(nasIp.toString(), is(aaaManager.nasIpAddress.getHostAddress()));
254
255 // State machine should have been created by now
256
257 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
258 assertThat(stateMachine, notNullValue());
259 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
260
261 // (3) RADIUS MD5 challenge
262
263 RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
264 RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5, radiusIdentifyPacket.getIdentifier(),
265 aaaManager.radiusSecret.getBytes());
266 aaaManager.handleRadiusPacket(radiusCodeAccessChallengePacket);
267 } catch (Exception e) {
268 log.error(e.getMessage());
269 fail();
270 }
271 });
272 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
273 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700274 Ethernet radiusChallengeMD5Packet = (Ethernet) fetchPacket(2);
275 checkRadiusPacket(aaaManager, radiusChallengeMD5Packet, EAP.ATTR_MD5);
276 // (4) Supplicant MD5 response
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000277
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700278 Ethernet md5RadiusPacket = null;
279 try {
280 md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
281 stateMachine.challengeIdentifier(), radiusChallengeMD5Packet);
282 } catch (Exception e) {
283 log.error(e.getMessage());
284 fail();
285 }
286 sendPacket(md5RadiusPacket);
287 });
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000288
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000289
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700290 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
Andrea Campanellac4781e62020-10-08 12:58:45 +0200291 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700292 RADIUS responseMd5RadiusPacket = (RADIUS) fetchPacket(3);
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000293
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700294 try {
295 checkRadiusPacketFromSupplicant(responseMd5RadiusPacket);
296 } catch (DeserializationException e) {
297 log.error(e.getMessage());
298 fail();
299 }
300 //assertThat(responseMd5RadiusPacket.getIdentifier(), is((byte) 9));
301 assertThat(responseMd5RadiusPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000302
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700303 // State machine should be in pending state
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000304
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700305 assertThat(stateMachine, notNullValue());
306 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000307
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700308 // (5) RADIUS Success
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000309
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700310 RADIUS successPacket =
311 constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_ACCEPT, EAP.SUCCESS,
312 responseMd5RadiusPacket.getIdentifier(),
313 aaaManager.radiusSecret.getBytes());
314 aaaManager.handleRadiusPacket((successPacket));
315 });
316 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
Andrea Campanellac4781e62020-10-08 12:58:45 +0200317 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700318 Ethernet supplicantSuccessPacket = (Ethernet) fetchPacket(4);
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000319
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700320 checkRadiusPacket(aaaManager, supplicantSuccessPacket, EAP.SUCCESS);
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000321
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700322 // State machine should be in authorized state
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000323
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700324 assertThat(stateMachine, notNullValue());
325 assertThat(stateMachine.state(), is(StateMachine.STATE_AUTHORIZED));
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000326
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700327 //Check for increase of Stats
328 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolResIdentityMsgTrans(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200329 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolAuthSuccessTx(), ZERO);
330 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolStartReqRx(), ZERO);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700331 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolTransRespNotNak(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200332 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolChallengeReqTx(), ZERO);
333 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolValidFramesRx(), ZERO);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700334 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolFramesTx(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200335 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolReqFramesTx(), ZERO);
336 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolIdRequestFramesTx(), ZERO);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700337 assertEquals(aaaStatisticsManager.getAaaStats().getInvalidBodyLength(), ZERO);
338 assertEquals(aaaStatisticsManager.getAaaStats().getInvalidPktType(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200339 assertEquals(aaaStatisticsManager.getAaaStats().getEapolPendingReq(), ZERO);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700340 // Counts the aaa Statistics count and displays in the log
341 countAaaStatistics();
342 });
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000343
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000344 }
345
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000346 /** Tests invalid packets reaching AAA.
347 * And counts the aaa Stats for successful transmission.
348 * @throws DeserializationException
349 * if packed deserialization fails.
350 */
351 @Test
352 public void testStatisticsForInvalidPackets() throws Exception {
353
354 //Test Authenticator State Machine Status. Should be Pending
355 // (1) Supplicant start up
356 Ethernet startPacket = constructSupplicantStartPacket();
357 sendPacket(startPacket);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700358 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
359 Ethernet responsePacket = (Ethernet) fetchPacket(0);
360 checkRadiusPacket(aaaManager, responsePacket, EAP.ATTR_IDENTITY);
361 });
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000362
363 // (2) Supplicant identify
364
365 Ethernet identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
366 sendPacket(identifyPacket);
367
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700368 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
369 RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
370 try {
371 checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
372 } catch (DeserializationException e) {
373 log.error(e.getMessage());
374 fail();
375 }
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000376
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700377 assertThat(radiusIdentifyPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
378 assertThat(new String(radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME).getValue()),
379 is("testuser"));
380 IpAddress nasIp = IpAddress.valueOf(IpAddress.Version.INET,
381 radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP)
382 .getValue());
383 assertThat(nasIp.toString(), is(aaaManager.nasIpAddress.getHostAddress()));
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000384
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700385 // State machine should have been created by now
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000386
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700387 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
388 assertThat(stateMachine, notNullValue());
389 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000390
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700391 // (3) RADIUS NAK challenge
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000392
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700393 RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
394 RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_NAK, radiusIdentifyPacket.getIdentifier(),
395 aaaManager.radiusSecret.getBytes());
396 aaaManager.handleRadiusPacket(radiusCodeAccessChallengePacket);
397 });
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000398
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700399 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
400 Ethernet radiusChallengeNakPacket = (Ethernet) fetchPacket(2);
401 checkRadiusPacket(aaaManager, radiusChallengeNakPacket, EAP.ATTR_NAK);
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000402
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700403 // (4) Supplicant NAK response
404 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
405 assertThat(stateMachine, notNullValue());
406 Ethernet nakRadiusPacket = null;
407 try {
408 nakRadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_NAK,
409 stateMachine.challengeIdentifier(),
410 radiusChallengeNakPacket);
411 } catch (Exception e) {
412 log.error(e.getMessage());
413 fail();
414 }
415 sendPacket(nakRadiusPacket);
416 });
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000417
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700418 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
419 //Statistic Should be increased.
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200420 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolPendingReq(), ZERO);
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000421
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700422 //Test if packet with invalid eapol type recieved.
423 // Supplicant ASF Packet
424 Ethernet invalidPacket = constructSupplicantAsfPacket();
425 sendPacket(invalidPacket);
426 });
427 //Statistic Should be increased.
428 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
429 assertNotEquals(aaaStatisticsManager.getAaaStats().getInvalidPktType(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200430 assertNotEquals(aaaStatisticsManager.getAaaStats().getRadiusAccessRequestsTx(), ZERO);
431 assertNotEquals(aaaStatisticsManager.getAaaStats().getRadiusChallengeResponsesRx(), ZERO);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700432 assertNotEquals(aaaStatisticsManager.getAaaStats().getDroppedResponsesRx(), ZERO);
433 assertNotEquals(aaaStatisticsManager.getAaaStats().getInvalidValidatorsRx(), ZERO);
434 // Counts the aaa Statistics count and displays in the log
435 countAaaStatistics();
436 });
Shubham Sharma8d7a9822020-01-28 10:04:01 +0000437 }
438
439
440 /** Tests the count for defected packets.
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000441 *
Jonathan Hart612651f2019-11-25 09:21:43 -0800442 * @throws DeserializationException if packed deserialization fails.
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000443 */
444 @Test
445 public void testAaaStatisticsForDefectivePackets() throws Exception {
446 // (1) Supplicant start up
447 Ethernet startPacket = constructSupplicantStartPacket();
448 sendPacket(startPacket);
449
450 // (2) Supplicant identify
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700451 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
Andrea Campanellac4781e62020-10-08 12:58:45 +0200452 Ethernet identifyPacket = null;
453 try {
454 identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
455 sendPacket(identifyPacket);
456 } catch (Exception e) {
457 log.error(e.getMessage());
458 fail();
459 }
460 });
461 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
462 try {
463 RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
464
465 checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
466
467 // State machine should have been created by now
468
469 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
470
471 // (3) RADIUS MD5 challenge
472
473 RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
474 RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5, radiusIdentifyPacket.getIdentifier(),
475 aaaManager.radiusSecret.getBytes());
476 aaaManager.handleRadiusPacket(radiusCodeAccessChallengePacket);
477 } catch (Exception e) {
478 log.error(e.getMessage());
479 fail();
480 }
481 });
482 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
483 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700484 Ethernet radiusChallengeMD5Packet = (Ethernet) fetchPacket(2);
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000485
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700486 // (4) Supplicant MD5 response
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000487
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700488 Ethernet md5RadiusPacket = null;
489 try {
490 md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
491 stateMachine.challengeIdentifier(),
492 radiusChallengeMD5Packet);
493 } catch (Exception e) {
494 log.error(e.getMessage());
495 fail();
496 }
497 sendPacket(md5RadiusPacket);
498 });
Jonathan Hart612651f2019-11-25 09:21:43 -0800499
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700500 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
501 aaaManager.aaaStatisticsManager.calculatePacketRoundtripTime();
Jonathan Hart612651f2019-11-25 09:21:43 -0800502
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700503 RADIUS responseMd5RadiusPacket = (RADIUS) fetchPacket(3);
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000504
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700505 // (5) RADIUS Rejected
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000506
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700507 RADIUS rejectedPacket =
508 constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_REJECT, EAP.FAILURE,
509 responseMd5RadiusPacket.getIdentifier(),
510 aaaManager.radiusSecret.getBytes());
511 aaaManager.handleRadiusPacket((rejectedPacket));
512 });
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000513
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700514 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
Andrea Campanellac4781e62020-10-08 12:58:45 +0200515 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700516 Ethernet supplicantRejectedPacket = (Ethernet) fetchPacket(4);
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000517
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700518 checkRadiusPacket(aaaManager, supplicantRejectedPacket, EAP.FAILURE);
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000519
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700520 // State machine should be in unauthorized state
521 assertThat(stateMachine, notNullValue());
522 assertThat(stateMachine.state(), is(StateMachine.STATE_UNAUTHORIZED));
523 // Calculated the total round trip time
524 aaaManager.aaaStatisticsManager.calculatePacketRoundtripTime();
Shubham Sharma80214c62019-12-18 07:09:59 +0000525
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700526 //Check for increase of Stats
527 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolResIdentityMsgTrans(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200528 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolAuthFailureTx(), ZERO);
529 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolStartReqRx(), ZERO);
530 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolChallengeReqTx(), ZERO);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700531 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolTransRespNotNak(), ZERO);
532
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200533 assertNotEquals(aaaStatisticsManager.getAaaStats().getRadiusAccessRequestsTx(), ZERO);
534 assertNotEquals(aaaStatisticsManager.getAaaStats().getRadiusChallengeResponsesRx(), ZERO);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700535 assertNotEquals(aaaStatisticsManager.getAaaStats().getDroppedResponsesRx(), ZERO);
536 assertNotEquals(aaaStatisticsManager.getAaaStats().getInvalidValidatorsRx(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200537 assertNotEquals(aaaStatisticsManager.getAaaStats().getRadiusRejectResponsesRx(), ZERO);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700538
539 // Counts the aaa Statistics count
540 countAaaStatistics();
541 });
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000542
Jonathan Hart612651f2019-11-25 09:21:43 -0800543 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000544
545 /*
546 * Tests the retransmitted packet and malformed packet count
547 *
548 * @throws DeserializationException
549 * if packed deserialization fails.
550 */
551 @Test
552 public void testRequestRetransmittedCount() throws Exception {
553
554 // (1) Supplicant start up
555 Ethernet startPacket = constructSupplicantStartPacket();
556 sendPacket(startPacket);
Andrea Campanellac4781e62020-10-08 12:58:45 +0200557 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
558 // (2) Supplicant identify
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000559
Andrea Campanellac4781e62020-10-08 12:58:45 +0200560 Ethernet identifyPacket = null;
561 try {
562 identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
563 sendPacket(identifyPacket);
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000564
Andrea Campanellac4781e62020-10-08 12:58:45 +0200565 RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
566 checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000567
Andrea Campanellac4781e62020-10-08 12:58:45 +0200568 // again creating pending state for same packet
569 constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
570 sendPacket(identifyPacket);
571 } catch (Exception e) {
572 log.error(e.getMessage());
573 fail();
574 }
575 });
576 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
577 aaaManager.impl.handlePacketFromServer(null);
578 aaaManager.aaaStatisticsManager.calculatePacketRoundtripTime();
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000579
Andrea Campanellac4781e62020-10-08 12:58:45 +0200580 // creating malformed packet
581 final ByteBuffer byteBuffer = ByteBuffer.wrap(startPacket.serialize());
582 InboundPacket inPacket = new DefaultInboundPacket(connectPoint("1", 1),
583 startPacket, byteBuffer);
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000584
Andrea Campanellac4781e62020-10-08 12:58:45 +0200585 PacketContext context = new TestPacketContext(127L, inPacket, null, false);
586 aaaManager.impl.handlePacketFromServer(context);
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000587
Andrea Campanellac4781e62020-10-08 12:58:45 +0200588 // Check for increase of Stats
589 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolResIdentityMsgTrans(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200590 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolStartReqRx(), ZERO);
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000591
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200592 assertNotEquals(aaaStatisticsManager.getAaaStats().getRadiusAccessRequestsTx(), ZERO);
Andrea Campanellac4781e62020-10-08 12:58:45 +0200593 assertNotEquals(aaaStatisticsManager.getAaaStats().getDroppedResponsesRx(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200594 assertNotEquals(aaaStatisticsManager.getAaaStats().getRadiusPendingRequests(), ZERO);
Andrea Campanellac4781e62020-10-08 12:58:45 +0200595 assertNotEquals(aaaStatisticsManager.getAaaStats().getMalformedResponsesRx(), ZERO);
596 assertNotEquals(aaaStatisticsManager.getAaaStats().getRequestReTx(), ZERO);
597 assertNotEquals(aaaStatisticsManager.getAaaStats().getUnknownTypeRx(), ZERO);
598 assertNotEquals(aaaStatisticsManager.getAaaStats().getUnknownServerRx(), ZERO);
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000599
Andrea Campanellac4781e62020-10-08 12:58:45 +0200600 countAaaStatistics();
601 });
Shubham Sharma80214c62019-12-18 07:09:59 +0000602 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000603
Jonathan Hart612651f2019-11-25 09:21:43 -0800604 /**
605 * Tests the authentication path through the AAA application.
606 * And counts the aaa Stats for logoff transactionXZ.
607 *
608 * @throws DeserializationException if packed deserialization fails.
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000609 */
610 @Test
611 public void testAaaStatisticsForLogoffPackets() throws Exception {
612
613 // (1) Supplicant start up
614 Ethernet startPacket = constructSupplicantStartPacket();
615 sendPacket(startPacket);
Andrea Campanellac4781e62020-10-08 12:58:45 +0200616 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
617 Ethernet responsePacket = (Ethernet) fetchPacket(0);
618 checkRadiusPacket(aaaManager, responsePacket, EAP.ATTR_IDENTITY);
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000619
Andrea Campanellac4781e62020-10-08 12:58:45 +0200620 // (2) Supplicant identify
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000621
Andrea Campanellac4781e62020-10-08 12:58:45 +0200622 Ethernet identifyPacket = null;
623 try {
624 identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
625 } catch (Exception e) {
626 log.error(e.getMessage());
627 fail();
628 }
629 sendPacket(identifyPacket);
630 });
631 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
632 RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
633 try {
634 checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
635 } catch (Exception e) {
636 log.error(e.getMessage());
637 fail();
638 }
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000639
Andrea Campanellac4781e62020-10-08 12:58:45 +0200640 assertThat(radiusIdentifyPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
641 assertThat(new String(radiusIdentifyPacket
642 .getAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME)
643 .getValue()),
644 is("testuser"));
645 IpAddress nasIp = IpAddress.valueOf(IpAddress.Version.INET,
646 radiusIdentifyPacket
647 .getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP)
648 .getValue());
649 assertThat(nasIp.toString(), is(aaaManager.nasIpAddress.getHostAddress()));
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000650
Andrea Campanellac4781e62020-10-08 12:58:45 +0200651 // State machine should have been created by now
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000652
Andrea Campanellac4781e62020-10-08 12:58:45 +0200653 //StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(SESSION_ID);
654 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
655 assertThat(stateMachine, notNullValue());
656 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000657
Andrea Campanellac4781e62020-10-08 12:58:45 +0200658 // (3) RADIUS MD5 challenge
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000659
Andrea Campanellac4781e62020-10-08 12:58:45 +0200660 RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
661 RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5,
662 radiusIdentifyPacket.getIdentifier(), aaaManager.radiusSecret.getBytes());
663 aaaManager.handleRadiusPacket(radiusCodeAccessChallengePacket);
664 });
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700665 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
666 Ethernet radiusChallengeMD5Packet = (Ethernet) fetchPacket(2);
667 checkRadiusPacket(aaaManager, radiusChallengeMD5Packet, EAP.ATTR_MD5);
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000668
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700669 // (4) Supplicant MD5 response
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000670
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700671 Ethernet md5RadiusPacket = null;
Andrea Campanellac4781e62020-10-08 12:58:45 +0200672 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
673
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700674 try {
675 md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
676 stateMachine.challengeIdentifier(),
677 radiusChallengeMD5Packet);
678 } catch (Exception e) {
679 log.error(e.getMessage());
680 fail();
681 }
682 sendPacket(md5RadiusPacket);
683 });
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000684
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700685 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
686 RADIUS responseMd5RadiusPacket = (RADIUS) fetchPacket(3);
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000687
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700688 try {
689 checkRadiusPacketFromSupplicant(responseMd5RadiusPacket);
690 } catch (DeserializationException e) {
691 log.error(e.getMessage());
692 fail();
693 }
694 assertThat(responseMd5RadiusPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000695
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700696 // State machine should be in pending state
Andrea Campanellac4781e62020-10-08 12:58:45 +0200697 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700698 assertThat(stateMachine, notNullValue());
699 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000700
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700701 // (5) RADIUS Success
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000702
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700703 RADIUS successPacket =
704 constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_ACCEPT, EAP.SUCCESS,
705 responseMd5RadiusPacket.getIdentifier(),
706 aaaManager.radiusSecret.getBytes());
707 aaaManager.handleRadiusPacket((successPacket));
708 });
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000709
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700710 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
711 Ethernet supplicantSuccessPacket = (Ethernet) fetchPacket(4);
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000712
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700713 checkRadiusPacket(aaaManager, supplicantSuccessPacket, EAP.SUCCESS);
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000714
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700715 // State machine should be in authorized state
Andrea Campanellac4781e62020-10-08 12:58:45 +0200716 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000717
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700718 assertThat(stateMachine, notNullValue());
719 assertThat(stateMachine.state(), is(StateMachine.STATE_AUTHORIZED));
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000720
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700721 // Supplicant trigger EAP Logoff
722 Ethernet logoffPacket = constructSupplicantLogoffPacket();
723 sendPacket(logoffPacket);
724 });
725 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
726 // State machine should be in logoff state
Andrea Campanellac4781e62020-10-08 12:58:45 +0200727 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
728
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700729 assertThat(stateMachine, notNullValue());
730 assertThat(stateMachine.state(), is(StateMachine.STATE_IDLE));
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000731
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700732 //Check for increase in stats
733 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolLogoffRx(), ZERO);
734 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolResIdentityMsgTrans(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200735 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolAuthSuccessTx(), ZERO);
736 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolStartReqRx(), ZERO);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700737 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolTransRespNotNak(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200738 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolChallengeReqTx(), ZERO);
Matteo Scandolo9510e5d2020-09-24 17:31:52 -0700739 assertNotEquals(aaaStatisticsManager.getAaaStats().getAuthStateIdle(), ZERO);
740 // Counts the aaa Statistics count
741 countAaaStatistics();
742 });
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000743
744 }
745
Andrea Campanellae66466a2020-02-03 14:05:45 +0000746
747 /** Tests the authentication path through the AAA application.
748 * And counts the aaa Stats for timeout.
749 * @throws DeserializationException
750 * if packed deserialization fails.
751 */
752 @Test
753 public void testAaaStatisticsForTimeoutPackets() throws Exception {
754
755 // (1) Supplicant start up
756 Ethernet startPacket = constructSupplicantStartPacket();
757 sendPacket(startPacket);
Andrea Campanellac4781e62020-10-08 12:58:45 +0200758 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
759 Ethernet responsePacket = (Ethernet) fetchPacket(0);
760 checkRadiusPacket(aaaManager, responsePacket, EAP.ATTR_IDENTITY);
Andrea Campanellae66466a2020-02-03 14:05:45 +0000761
Andrea Campanellac4781e62020-10-08 12:58:45 +0200762 // (2) Supplicant identify
Andrea Campanellae66466a2020-02-03 14:05:45 +0000763
Andrea Campanellac4781e62020-10-08 12:58:45 +0200764 Ethernet identifyPacket = null;
765 try {
766 identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
767 } catch (Exception e) {
768 log.error(e.getMessage());
769 fail();
770 }
771 sendPacket(identifyPacket);
772 });
773 assertAfter(ASSERTION_DELAY, ASSERTION_LENGTH, () -> {
774 RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
775 try {
776 checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
Andrea Campanellae66466a2020-02-03 14:05:45 +0000777
Andrea Campanellae66466a2020-02-03 14:05:45 +0000778
Andrea Campanellac4781e62020-10-08 12:58:45 +0200779 assertThat(radiusIdentifyPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
780 assertThat(new String(radiusIdentifyPacket
781 .getAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME)
782 .getValue()),
783 is("testuser"));
784 IpAddress nasIp = IpAddress.valueOf(IpAddress.Version.INET,
785 radiusIdentifyPacket
786 .getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP)
787 .getValue());
788 assertThat(nasIp.toString(), is(aaaManager.nasIpAddress.getHostAddress()));
Andrea Campanellae66466a2020-02-03 14:05:45 +0000789
Andrea Campanellac4781e62020-10-08 12:58:45 +0200790 // State machine should have been created by now
Andrea Campanellae66466a2020-02-03 14:05:45 +0000791
Andrea Campanellac4781e62020-10-08 12:58:45 +0200792 StateMachine stateMachine = aaaManager.getStateMachine(SESSION_ID);
793 assertThat(stateMachine, notNullValue());
794 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
795 Thread.sleep((aaaManager.cleanupTimerTimeOutInMins / 2) + 1);
Andrea Campanellae66466a2020-02-03 14:05:45 +0000796
Andrea Campanellac4781e62020-10-08 12:58:45 +0200797 // State machine should be in timeout state
798 assertThat(stateMachine, notNullValue());
799 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
Andrea Campanellae66466a2020-02-03 14:05:45 +0000800
Andrea Campanellac4781e62020-10-08 12:58:45 +0200801 //Check for increase in stats
802 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolResIdentityMsgTrans(), ZERO);
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200803 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolStartReqRx(), ZERO);
Andrea Campanellac4781e62020-10-08 12:58:45 +0200804 countAaaStatistics();
805 } catch (Exception e) {
806 log.error(e.getMessage());
807 fail();
808 }
809 });
Andrea Campanellae66466a2020-02-03 14:05:45 +0000810
811 }
812
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000813 // Calculates the AAA statistics count.
814 public void countAaaStatistics() {
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200815 assertThat(aaaStatisticsManager.getAaaStats().getRadiusAcceptResponsesRx(), notNullValue());
816 assertThat(aaaStatisticsManager.getAaaStats().getRadiusAccessRequestsTx(), notNullValue());
817 assertThat(aaaStatisticsManager.getAaaStats().getRadiusChallengeResponsesRx(), notNullValue());
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000818 assertThat(aaaStatisticsManager.getAaaStats().getDroppedResponsesRx(), notNullValue());
819 assertThat(aaaStatisticsManager.getAaaStats().getInvalidValidatorsRx(), notNullValue());
820 assertThat(aaaStatisticsManager.getAaaStats().getMalformedResponsesRx(), notNullValue());
Andrea Campanella76ae68d2020-10-14 11:16:37 +0200821 assertThat(aaaStatisticsManager.getAaaStats().getRadiusPendingRequests(), notNullValue());
822 assertThat(aaaStatisticsManager.getAaaStats().getRadiusRejectResponsesRx(), notNullValue());
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000823 assertThat(aaaStatisticsManager.getAaaStats().getRequestReTx(), notNullValue());
824 assertThat(aaaStatisticsManager.getAaaStats().getRequestRttMilis(), notNullValue());
825 assertThat(aaaStatisticsManager.getAaaStats().getUnknownServerRx(), notNullValue());
826 assertThat(aaaStatisticsManager.getAaaStats().getUnknownTypeRx(), notNullValue());
Shubham Sharma2b3fb692019-12-12 10:19:10 +0000827
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000828 }
829
830 /*
Andrea Campanella7e0e7e32020-02-13 14:39:55 +0100831 * Mock implementation of SocketBasedRadiusCommunicator class.
832 *
833 */
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000834 class TestSocketBasedRadiusCommunicator extends SocketBasedRadiusCommunicator {
835
Jonathan Hart612651f2019-11-25 09:21:43 -0800836 TestSocketBasedRadiusCommunicator(ApplicationId appId, PacketService pktService, AaaManager aaaManager) {
837 super(appId, pktService, aaaManager);
838 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000839
Andrea Campanella7e0e7e32020-02-13 14:39:55 +0100840 /**
841 * Wait 10 millis to simulate a non 0 rtt.
842 *
843 * @throws InterruptedException
844 */
845 private void waitPacket() throws InterruptedException {
846 synchronized (this) {
847 this.wait(10);
848 }
849 }
850
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000851 // Implementation of socketBasedRadiusCommunicator--> run() method
852 public void handlePacketFromServer(PacketContext context) {
Jonathan Hart612651f2019-11-25 09:21:43 -0800853 RADIUS incomingPkt = (RADIUS) fetchPacket(savedPackets.size() - 1);
854 try {
Andrea Campanella7e0e7e32020-02-13 14:39:55 +0100855 // wait a couple of millis to avoid rtt being 0
856 waitPacket();
Jonathan Hart612651f2019-11-25 09:21:43 -0800857 if (context == null) {
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000858 aaaStatisticsManager.handleRoundtripTime(incomingPkt.getIdentifier());
859 aaaManager.handleRadiusPacket(incomingPkt);
860 } else if (null != context) {
861 aaaManager.checkForPacketFromUnknownServer("100.100.100.0");
862 aaaStatisticsManager.handleRoundtripTime(incomingPkt.getIdentifier());
863 aaaManager.handleRadiusPacket(incomingPkt);
864 incomingPkt =
865 RADIUS.deserializer().deserialize(incomingPkt.generateAuthCode(), 0, 1);
866 }
Jonathan Hart612651f2019-11-25 09:21:43 -0800867 } catch (DeserializationException dex) {
868 aaaManager.aaaStatisticsManager.getAaaStats().increaseMalformedResponsesRx();
869 aaaStatisticsManager.getAaaStats().countDroppedResponsesRx();
870 log.error("Cannot deserialize packet", dex);
Andrea Campanella7e0e7e32020-02-13 14:39:55 +0100871 } catch (InterruptedException inte) {
872 Thread.currentThread().interrupt();
Jonathan Hart612651f2019-11-25 09:21:43 -0800873 }
Shubham Sharmacf5e5032019-11-26 11:09:21 +0000874 }
875
876 }
877
Kartikey Dubeyadeb26e2019-10-01 12:18:35 +0000878}