blob: e668501163dc817521e005f8ef1064bfbf0216f7 [file] [log] [blame]
/*
* 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;
}
}
}