blob: b2e827143770e09c73dd0cbdb71c89b58b71779c [file] [log] [blame]
Shubham Sharma47f2caf2020-02-18 12:13:40 +00001/*
2 * Copyright 2017-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 */
16
developere400c582020-03-24 19:42:08 +010017package org.opencord.igmpproxy.impl;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000018
19import static org.junit.Assert.assertEquals;
20import static org.onlab.junit.TestTools.assertAfter;
21
22import java.util.List;
23
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +000024import com.google.common.collect.Maps;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000025import org.junit.After;
26import org.junit.Before;
27import org.junit.Test;
28import org.onlab.junit.TestUtils;
29import org.onlab.packet.Ethernet;
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000030import org.onlab.packet.Ip4Address;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000031import org.onosproject.core.CoreServiceAdapter;
32import org.onosproject.net.flow.FlowRuleServiceAdapter;
33import org.onosproject.net.flowobjective.FlowObjectiveServiceAdapter;
34
developere400c582020-03-24 19:42:08 +010035import org.opencord.igmpproxy.IgmpStatisticsEvent;
36
Shubham Sharma47f2caf2020-02-18 12:13:40 +000037import com.google.common.collect.Lists;
developere400c582020-03-24 19:42:08 +010038import org.opencord.igmpproxy.IgmpStatisticsEventListener;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000039
40/**
41 * Set of tests of the ONOS application component for IGMP Statistics.
42 */
43public class IgmpStatisticsTest extends IgmpManagerBase {
44
45 private static final int WAIT_TIMEOUT = 500;
46
47 private IgmpManager igmpManager;
48
49 private IgmpStatisticsManager igmpStatisticsManager;
50
51 private MockIgmpStatisticsEventListener mockListener = new MockIgmpStatisticsEventListener();
52
53 // Set up the IGMP application.
54 @Before
55 public void setUp() {
56 igmpManager = new IgmpManager();
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +000057 igmpManager.igmpLeadershipService = new TestIgmpLeaderShipService();
Shubham Sharma47f2caf2020-02-18 12:13:40 +000058 igmpManager.coreService = new CoreServiceAdapter();
59 igmpManager.mastershipService = new MockMastershipService();
60 igmpManager.flowObjectiveService = new FlowObjectiveServiceAdapter();
61 igmpManager.deviceService = new MockDeviceService();
62 igmpManager.packetService = new MockPacketService();
63 igmpManager.flowRuleService = new FlowRuleServiceAdapter();
64 igmpManager.multicastService = new TestMulticastRouteService();
65 igmpManager.sadisService = new MockSadisService();
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +000066 igmpManager.groupMemberStore = new TestGroupMemberStoreService();
67 StateMachineManager stateMachineService = new StateMachineManager();
68 stateMachineService.stateMachineStore = new TestStateMachineStoreService(Maps.newConcurrentMap());
69 stateMachineService.activate(new MockComponentContext());
70 igmpManager.stateMachineService = stateMachineService;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000071 igmpStatisticsManager = new IgmpStatisticsManager();
72 igmpStatisticsManager.cfgService = new MockCfgService();
73 igmpStatisticsManager.addListener(mockListener);
74 TestUtils.setField(igmpStatisticsManager, "eventDispatcher", new TestEventDispatcher());
75 igmpStatisticsManager.activate(new MockComponentContext());
76 igmpManager.igmpStatisticsManager = this.igmpStatisticsManager;
77 // By default - we send query messages
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +000078 StateMachineManager.sendQuery = true;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000079 }
80
81 // Tear Down the IGMP application.
82 @After
83 public void tearDown() {
84 igmpStatisticsManager.removeListener(mockListener);
85 igmpStatisticsManager.deactivate();
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +000086 igmpManager.stateMachineService.clearAllMaps();
Shubham Sharma47f2caf2020-02-18 12:13:40 +000087 }
88
89 //Test Igmp Statistics.
90 @Test
91 public void testIgmpStatistics() throws InterruptedException {
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +000092 StateMachineManager.sendQuery = false;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000093 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
94 igmpManager.activate();
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000095
Shubham Sharma47f2caf2020-02-18 12:13:40 +000096 //IGMPv3 Join
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000097 flagForPacket = false;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000098 Ethernet igmpv3MembershipReportPkt = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_A);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000099 sendPacket(igmpv3MembershipReportPkt);
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000100 synchronized (savedPackets) {
101 savedPackets.wait(WAIT_TIMEOUT);
102 }
103 //Leave
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000104 flagForPacket = false;
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000105 Ethernet igmpv3LeavePkt = IgmpSender.getInstance().buildIgmpV3Leave(GROUP_IP, SOURCE_IP_OF_A);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000106 sendPacket(igmpv3LeavePkt);
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000107 synchronized (savedPackets) {
108 savedPackets.wait(WAIT_TIMEOUT);
109 }
110
111 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000112 assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getTotalMsgReceived().longValue()));
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000113 assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpJoinReq().longValue());
114 assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getIgmpv3MembershipReport().longValue());
115 assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpSuccessJoinRejoinReq().longValue());
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000116 assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getUnconfiguredGroupCounter().longValue());
117 assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getValidIgmpPacketCounter().longValue());
118 assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpChannelJoinCounter().longValue());
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000119 assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpLeaveReq().longValue());
120 assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getIgmpMsgReceived().longValue());
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000121 assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getIgmpValidChecksumCounter().longValue());
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000122
123 }
124
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000125 //Test packet with Unknown Multicast IpAddress
126 @Test
127 public void testIgmpUnknownMulticastIpAddress() throws InterruptedException {
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000128 StateMachineManager.sendQuery = false;
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000129
130 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
131 igmpManager.activate();
132
133 Ethernet firstPacket =
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000134 IgmpSender.getInstance().buildIgmpV3Join(UNKNOWN_GRP_IP, SOURCE_IP_OF_A);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000135 // Sending first packet
136 sendPacket(firstPacket);
137 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000138 assertEquals((long) 1,
139 igmpStatisticsManager.getIgmpStats().getFailJoinReqUnknownMulticastIpCounter().longValue()));
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000140 }
141
142 //Test Igmp Query Statistics.
143 @Test
144 public void testIgmpQueryStatistics() throws InterruptedException {
145 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
146 igmpManager.activate();
147
148 flagForQueryPacket = true;
149 //IGMPV3 Group Specific Membership Query packet
150 Ethernet igmpv3MembershipQueryPkt = IgmpSender.getInstance().buildIgmpV3Query(GROUP_IP, SOURCE_IP_OF_A);
151 sendPacket(igmpv3MembershipQueryPkt);
152
153 //IGMPV3 General Membership Query packet
154 Ethernet igmpv3MembershipQueryPkt1 =
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000155 IgmpSender.getInstance().buildIgmpV3Query(Ip4Address.valueOf(0), SOURCE_IP_OF_A);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000156 sendPacket(igmpv3MembershipQueryPkt1);
157 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000158 assertEquals(igmpStatisticsManager.getIgmpStats()
159 .getIgmpGrpAndSrcSpecificMembershipQuery().longValue(), 1));
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000160 assertEquals(igmpStatisticsManager.getIgmpStats()
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000161 .getIgmpGeneralMembershipQuery().longValue(), 1);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000162 assertEquals(igmpStatisticsManager.getIgmpStats()
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000163 .getCurrentGrpNumCounter().longValue(), 1);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000164 }
165
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000166 //Test Events
167 @Test
168 public void testIgmpStatisticsEvent() {
169 final int waitEventGeneration = igmpStatisticsManager.statisticsGenerationPeriodInSeconds * 1000;
170 //assert that event listened as the app activates
171 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000172 assertEquals(mockListener.events.size(), 1));
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000173
174 assertAfter(waitEventGeneration / 2, waitEventGeneration, () ->
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000175 assertEquals(mockListener.events.size(), 2));
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000176
177 for (IgmpStatisticsEvent event : mockListener.events) {
178 assertEquals(event.type(), IgmpStatisticsEvent.Type.STATS_UPDATE);
179 }
180 }
181
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000182 //Test packet with Unknown Wrong Membership mode
183 @Test
184 public void testWrongIgmpPacket() throws InterruptedException {
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000185 StateMachineManager.sendQuery = false;
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000186
187 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
188 igmpManager.activate();
189
190 Ethernet firstPacket = buildWrongIgmpPacket(GROUP_IP, SOURCE_IP_OF_A);
191 // Sending first packet
192 sendPacket(firstPacket);
193 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000194 assertEquals((long) 1,
195 igmpStatisticsManager.getIgmpStats().getReportsRxWithWrongModeCounter().longValue()));
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000196 }
197
198 //Test packet with Unknown IGMP type.
199 @Test
200 public void testUnknownIgmpPacket() throws InterruptedException {
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000201 StateMachineManager.sendQuery = false;
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000202
203 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
204 igmpManager.activate();
205
206 Ethernet firstPacket = buildUnknownIgmpPacket(GROUP_IP, SOURCE_IP_OF_A);
207 // Sending first packet
208 sendPacket(firstPacket);
209 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000210 assertEquals((long) 1,
211 igmpStatisticsManager.getIgmpStats().getUnknownIgmpTypePacketsRxCounter().longValue()));
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000212 }
213
214 //Test packet with Insufficient Permission.
215 @Test
216 public void testSufficientPermission() throws InterruptedException {
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000217 StateMachineManager.sendQuery = false;
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000218
219 flagForPermission = true;
220 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
221 igmpManager.activate();
222
223 Ethernet firstPacket = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_A);
224 // Sending first packet
225 sendPacket(firstPacket);
226 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
Ilayda Ozdemir4c5947c2020-05-05 13:14:32 +0000227 assertEquals((long) 1,
228 igmpStatisticsManager.getIgmpStats()
229 .getFailJoinReqInsuffPermissionAccessCounter().longValue()));
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000230 }
231
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000232 public class MockIgmpStatisticsEventListener implements IgmpStatisticsEventListener {
233 protected List<IgmpStatisticsEvent> events = Lists.newArrayList();
234
235 @Override
236 public void event(IgmpStatisticsEvent event) {
237 events.add(event);
238 }
239
240 }
241}