/* * Copyright 2016-present Open Networking Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onosproject.cpman.impl.message; import com.google.common.collect.Sets; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.onosproject.cpman.ControlMessage; import org.onosproject.cpman.DefaultControlMessage; import org.onosproject.cpman.message.ControlMessageEvent; import org.onosproject.cpman.message.ControlMessageListener; import org.onosproject.cpman.message.ControlMessageProvider; import org.onosproject.cpman.message.ControlMessageProviderRegistry; import org.onosproject.cpman.message.ControlMessageProviderService; import org.onosproject.cpman.message.ControlMessageService; import org.onosproject.event.DefaultEventSinkRegistry; import org.onosproject.event.Event; import org.onosproject.event.EventDeliveryService; import org.onosproject.event.EventSink; import org.onosproject.net.DeviceId; import org.onosproject.net.provider.AbstractProvider; import org.onosproject.net.provider.ProviderId; import java.util.ArrayList; import java.util.List; import java.util.Set; import static com.google.common.base.Preconditions.checkState; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.onosproject.net.DeviceId.deviceId; import static org.onosproject.net.NetTestTools.injectEventDispatcher; /** * Unit test for control message manager. */ public class ControlMessageManagerTest { private static final ProviderId PID = new ProviderId("of", "foo"); private static final DeviceId DID = deviceId("of:foo"); private ControlMessageManager manager; private ControlMessageService service; private ControlMessageProviderRegistry registry; private ControlMessageProviderService providerService; protected TestProvider provider; protected TestListener listener = new TestListener(); /** * Initializes all variables for unit test. */ @Before public void setUp() { manager = new ControlMessageManager(); service = manager; registry = manager; manager.store = new DefaultControlMessageStore(); injectEventDispatcher(manager, new TestEventDispatcher()); manager.activate(); service.addListener(listener); provider = new TestProvider(); providerService = registry.register(provider); assertTrue("provider should be registered", registry.getProviders().contains(provider.id())); } /** * Tear down the control message manager. */ @After public void tearDown() { registry.unregister(provider); assertFalse("provider should not be registered", registry.getProviders().contains(provider.id())); service.removeListener(listener); manager.deactivate(); } /** * Tests the updateStatsInfo method. */ @Test public void updateStatsInfo() { Set<ControlMessage> cms = Sets.newHashSet(); ControlMessage.Type in = ControlMessage.Type.INBOUND_PACKET; ControlMessage.Type out = ControlMessage.Type.OUTBOUND_PACKET; ControlMessage.Type mod = ControlMessage.Type.FLOW_MOD_PACKET; ControlMessage.Type rmv = ControlMessage.Type.FLOW_REMOVED_PACKET; ControlMessage.Type req = ControlMessage.Type.REQUEST_PACKET; ControlMessage.Type rep = ControlMessage.Type.REPLY_PACKET; cms.add(new DefaultControlMessage(in, DID, 0, 0, 0, 0)); cms.add(new DefaultControlMessage(out, DID, 0, 0, 0, 0)); cms.add(new DefaultControlMessage(mod, DID, 0, 0, 0, 0)); cms.add(new DefaultControlMessage(rmv, DID, 0, 0, 0, 0)); cms.add(new DefaultControlMessage(req, DID, 0, 0, 0, 0)); cms.add(new DefaultControlMessage(rep, DID, 0, 0, 0, 0)); providerService.updateStatsInfo(DID, cms); validateEvents(ControlMessageEvent.Type.STATS_UPDATE); cms.clear(); } /** * Validates whether the manager receives the right events. * * @param types a set of types of control message event */ protected void validateEvents(Enum... types) { int i = 0; assertEquals("wrong events received", types.length, listener.events.size()); for (Event event : listener.events) { assertEquals("incorrect event type", types[i], event.type()); i++; } listener.events.clear(); } /** * A mock of control message provider. */ private class TestProvider extends AbstractProvider implements ControlMessageProvider { public TestProvider() { super(PID); } } /** * A mock of control message listener. */ private static class TestListener implements ControlMessageListener { final List<ControlMessageEvent> events = new ArrayList<>(); @Override public void event(ControlMessageEvent event) { events.add(event); } } /** * A mock of event dispatcher. */ private class TestEventDispatcher extends DefaultEventSinkRegistry implements EventDeliveryService { @Override @SuppressWarnings("unchecked") public synchronized void post(Event event) { EventSink sink = getSink(event.getClass()); checkState(sink != null, "No sink for event %s", event); sink.process(event); } @Override public void setDispatchTimeLimit(long millis) { } @Override public long getDispatchTimeLimit() { return 0; } } }