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