blob: 267751103b371311f90f25447a7cf3e05d253e81 [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
24import org.junit.After;
25import org.junit.Before;
26import org.junit.Test;
27import org.onlab.junit.TestUtils;
28import org.onlab.packet.Ethernet;
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000029import org.onlab.packet.Ip4Address;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000030import org.onosproject.core.CoreServiceAdapter;
31import org.onosproject.net.flow.FlowRuleServiceAdapter;
32import org.onosproject.net.flowobjective.FlowObjectiveServiceAdapter;
33
developere400c582020-03-24 19:42:08 +010034import org.opencord.igmpproxy.IgmpStatisticsEvent;
35
Shubham Sharma47f2caf2020-02-18 12:13:40 +000036import com.google.common.collect.Lists;
developere400c582020-03-24 19:42:08 +010037import org.opencord.igmpproxy.IgmpStatisticsEventListener;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000038
39/**
40 * Set of tests of the ONOS application component for IGMP Statistics.
41 */
42public class IgmpStatisticsTest extends IgmpManagerBase {
43
44 private static final int WAIT_TIMEOUT = 500;
45
46 private IgmpManager igmpManager;
47
48 private IgmpStatisticsManager igmpStatisticsManager;
49
50 private MockIgmpStatisticsEventListener mockListener = new MockIgmpStatisticsEventListener();
51
52 // Set up the IGMP application.
53 @Before
54 public void setUp() {
55 igmpManager = new IgmpManager();
56 igmpManager.coreService = new CoreServiceAdapter();
57 igmpManager.mastershipService = new MockMastershipService();
58 igmpManager.flowObjectiveService = new FlowObjectiveServiceAdapter();
59 igmpManager.deviceService = new MockDeviceService();
60 igmpManager.packetService = new MockPacketService();
61 igmpManager.flowRuleService = new FlowRuleServiceAdapter();
62 igmpManager.multicastService = new TestMulticastRouteService();
63 igmpManager.sadisService = new MockSadisService();
64 igmpStatisticsManager = new IgmpStatisticsManager();
65 igmpStatisticsManager.cfgService = new MockCfgService();
66 igmpStatisticsManager.addListener(mockListener);
67 TestUtils.setField(igmpStatisticsManager, "eventDispatcher", new TestEventDispatcher());
68 igmpStatisticsManager.activate(new MockComponentContext());
69 igmpManager.igmpStatisticsManager = this.igmpStatisticsManager;
70 // By default - we send query messages
71 SingleStateMachine.sendQuery = true;
72 }
73
74 // Tear Down the IGMP application.
75 @After
76 public void tearDown() {
77 igmpStatisticsManager.removeListener(mockListener);
78 igmpStatisticsManager.deactivate();
79 IgmpManager.groupMemberMap.clear();
80 StateMachine.clearMap();
81 }
82
83 //Test Igmp Statistics.
84 @Test
85 public void testIgmpStatistics() throws InterruptedException {
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000086 SingleStateMachine.sendQuery = false;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000087 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
88 igmpManager.activate();
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000089
Shubham Sharma47f2caf2020-02-18 12:13:40 +000090 //IGMPv3 Join
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000091 flagForPacket = false;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000092 Ethernet igmpv3MembershipReportPkt = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_A);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000093 sendPacket(igmpv3MembershipReportPkt);
Shubham Sharma47f2caf2020-02-18 12:13:40 +000094 synchronized (savedPackets) {
95 savedPackets.wait(WAIT_TIMEOUT);
96 }
97 //Leave
Sonal Kasliwalf11c0672020-03-18 11:11:50 +000098 flagForPacket = false;
Shubham Sharma47f2caf2020-02-18 12:13:40 +000099 Ethernet igmpv3LeavePkt = IgmpSender.getInstance().buildIgmpV3Leave(GROUP_IP, SOURCE_IP_OF_A);
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000100 sendPacket(igmpv3LeavePkt);
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000101 synchronized (savedPackets) {
102 savedPackets.wait(WAIT_TIMEOUT);
103 }
104
105 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
106 assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getTotalMsgReceived().longValue()));
107 assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpJoinReq().longValue());
108 assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getIgmpv3MembershipReport().longValue());
109 assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpSuccessJoinRejoinReq().longValue());
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000110 assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getUnconfiguredGroupCounter().longValue());
111 assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getValidIgmpPacketCounter().longValue());
112 assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpChannelJoinCounter().longValue());
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000113 assertEquals((long) 1, igmpStatisticsManager.getIgmpStats().getIgmpLeaveReq().longValue());
114 assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getIgmpMsgReceived().longValue());
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000115 assertEquals((long) 2, igmpStatisticsManager.getIgmpStats().getIgmpValidChecksumCounter().longValue());
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000116
117 }
118
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000119 //Test packet with Unknown Multicast IpAddress
120 @Test
121 public void testIgmpUnknownMulticastIpAddress() throws InterruptedException {
122 SingleStateMachine.sendQuery = false;
123
124 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
125 igmpManager.activate();
126
127 Ethernet firstPacket =
128 IgmpSender.getInstance().buildIgmpV3Join(UNKNOWN_GRP_IP, SOURCE_IP_OF_A);
129 // Sending first packet
130 sendPacket(firstPacket);
131 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
132 assertEquals((long) 1,
133 igmpStatisticsManager.getIgmpStats().getFailJoinReqUnknownMulticastIpCounter().longValue()));
134 }
135
136 //Test Igmp Query Statistics.
137 @Test
138 public void testIgmpQueryStatistics() throws InterruptedException {
139 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
140 igmpManager.activate();
141
142 flagForQueryPacket = true;
143 //IGMPV3 Group Specific Membership Query packet
144 Ethernet igmpv3MembershipQueryPkt = IgmpSender.getInstance().buildIgmpV3Query(GROUP_IP, SOURCE_IP_OF_A);
145 sendPacket(igmpv3MembershipQueryPkt);
146
147 //IGMPV3 General Membership Query packet
148 Ethernet igmpv3MembershipQueryPkt1 =
149 IgmpSender.getInstance().buildIgmpV3Query(Ip4Address.valueOf(0), SOURCE_IP_OF_A);
150 sendPacket(igmpv3MembershipQueryPkt1);
151 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
152 assertEquals(igmpStatisticsManager.getIgmpStats()
153 .getIgmpGrpAndSrcSpecificMembershipQuery().longValue(), 1));
154 assertEquals(igmpStatisticsManager.getIgmpStats()
155 .getIgmpGeneralMembershipQuery().longValue(), 1);
156 assertEquals(igmpStatisticsManager.getIgmpStats()
157 .getCurrentGrpNumCounter().longValue(), 1);
158 }
159
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000160 //Test Events
161 @Test
162 public void testIgmpStatisticsEvent() {
163 final int waitEventGeneration = igmpStatisticsManager.statisticsGenerationPeriodInSeconds * 1000;
164 //assert that event listened as the app activates
165 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
166 assertEquals(mockListener.events.size(), 1));
167
168 assertAfter(waitEventGeneration / 2, waitEventGeneration, () ->
169 assertEquals(mockListener.events.size(), 2));
170
171 for (IgmpStatisticsEvent event : mockListener.events) {
172 assertEquals(event.type(), IgmpStatisticsEvent.Type.STATS_UPDATE);
173 }
174 }
175
Sonal Kasliwalf11c0672020-03-18 11:11:50 +0000176 //Test packet with Unknown Wrong Membership mode
177 @Test
178 public void testWrongIgmpPacket() throws InterruptedException {
179 SingleStateMachine.sendQuery = false;
180
181 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
182 igmpManager.activate();
183
184 Ethernet firstPacket = buildWrongIgmpPacket(GROUP_IP, SOURCE_IP_OF_A);
185 // Sending first packet
186 sendPacket(firstPacket);
187 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
188 assertEquals((long) 1,
189 igmpStatisticsManager.getIgmpStats().getReportsRxWithWrongModeCounter().longValue()));
190 }
191
192 //Test packet with Unknown IGMP type.
193 @Test
194 public void testUnknownIgmpPacket() throws InterruptedException {
195 SingleStateMachine.sendQuery = false;
196
197 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
198 igmpManager.activate();
199
200 Ethernet firstPacket = buildUnknownIgmpPacket(GROUP_IP, SOURCE_IP_OF_A);
201 // Sending first packet
202 sendPacket(firstPacket);
203 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
204 assertEquals((long) 1,
205 igmpStatisticsManager.getIgmpStats().getUnknownIgmpTypePacketsRxCounter().longValue()));
206 }
207
208 //Test packet with Insufficient Permission.
209 @Test
210 public void testSufficientPermission() throws InterruptedException {
211 SingleStateMachine.sendQuery = false;
212
213 flagForPermission = true;
214 igmpManager.networkConfig = new TestNetworkConfigRegistry(false);
215 igmpManager.activate();
216
217 Ethernet firstPacket = IgmpSender.getInstance().buildIgmpV3Join(GROUP_IP, SOURCE_IP_OF_A);
218 // Sending first packet
219 sendPacket(firstPacket);
220 assertAfter(WAIT_TIMEOUT, WAIT_TIMEOUT * 2, () ->
221 assertEquals((long) 1,
222 igmpStatisticsManager.getIgmpStats().getFailJoinReqInsuffPermissionAccessCounter().longValue()));
223 }
224
Shubham Sharma47f2caf2020-02-18 12:13:40 +0000225 public class MockIgmpStatisticsEventListener implements IgmpStatisticsEventListener {
226 protected List<IgmpStatisticsEvent> events = Lists.newArrayList();
227
228 @Override
229 public void event(IgmpStatisticsEvent event) {
230 events.add(event);
231 }
232
233 }
234}