/*
* Copyright (c) 2011,2013 Big Switch Networks, Inc.
* Originally created by David Erickson, Stanford University
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html
*
* 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.sdnplatform.core.util;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.junit.Test;
import org.openflow.protocol.OFType;
import org.sdnplatform.core.IOFMessageListener;
import org.sdnplatform.core.util.ListenerDispatcher;
import org.sdnplatform.test.PlatformTestCase;
public class MessageDispatcherTest extends PlatformTestCase {
IOFMessageListener createLMock(String name) {
IOFMessageListener mock = createNiceMock(IOFMessageListener.class);
expect(mock.getName()).andReturn(name).anyTimes();
return mock;
}
void addPrereqs(IOFMessageListener mock, String... deps) {
for (String dep : deps) {
expect(mock.isCallbackOrderingPrereq(OFType.PACKET_IN, dep)).andReturn(true).anyTimes();
}
}
void testOrdering(ArrayList<IOFMessageListener> inputListeners) {
ListenerDispatcher<OFType, IOFMessageListener> ld =
new ListenerDispatcher<OFType, IOFMessageListener>();
for (IOFMessageListener l : inputListeners) {
ld.addListener(OFType.PACKET_IN, l);
}
for (IOFMessageListener l : inputListeners) {
verify(l);
}
List<IOFMessageListener> result = ld.getOrderedListeners();
System.out.print("Ordering: ");
for (IOFMessageListener l : result) {
System.out.print(l.getName());
System.out.print(",");
}
System.out.print("\n");
for (int ind_i = 0; ind_i < result.size(); ind_i++) {
IOFMessageListener i = result.get(ind_i);
for (int ind_j = ind_i+1; ind_j < result.size(); ind_j++) {
IOFMessageListener j = result.get(ind_j);
boolean orderwrong =
(i.isCallbackOrderingPrereq(OFType.PACKET_IN, j.getName()) ||
j.isCallbackOrderingPostreq(OFType.PACKET_IN, i.getName()));
assertFalse("Invalid order: " +
ind_i + " (" + i.getName() + ") " +
ind_j + " (" + j.getName() + ") ", orderwrong);
}
}
}
void randomTestOrdering(ArrayList<IOFMessageListener> mocks) {
Random rand = new Random(0);
ArrayList<IOFMessageListener> random =
new ArrayList<IOFMessageListener>();
random.addAll(mocks);
for (int i = 0; i < 20; i++) {
for (int j = 0; j < random.size(); j++) {
int ind = rand.nextInt(mocks.size()-1);
IOFMessageListener tmp = random.get(j);
random.set(j, random.get(ind));
random.set(ind, tmp);
}
testOrdering(random);
}
}
@Test
public void testCallbackOrderingSimple() throws Exception {
ArrayList<IOFMessageListener> mocks =
new ArrayList<IOFMessageListener>();
for (int i = 0; i < 10; i++) {
mocks.add(createLMock(""+i));
}
for (int i = 1; i < 10; i++) {
addPrereqs(mocks.get(i), ""+(i-1));
}
for (IOFMessageListener l : mocks) {
replay(l);
}
randomTestOrdering(mocks);
}
@Test
public void testCallbackOrderingPartial() throws Exception {
ArrayList<IOFMessageListener> mocks =
new ArrayList<IOFMessageListener>();
for (int i = 0; i < 10; i++) {
mocks.add(createLMock(""+i));
}
for (int i = 1; i < 5; i++) {
addPrereqs(mocks.get(i), ""+(i-1));
}
for (int i = 6; i < 10; i++) {
addPrereqs(mocks.get(i), ""+(i-1));
}
for (IOFMessageListener l : mocks) {
replay(l);
}
randomTestOrdering(mocks);
}
@Test
public void testCallbackOrderingPartial2() throws Exception {
ArrayList<IOFMessageListener> mocks =
new ArrayList<IOFMessageListener>();
for (int i = 0; i < 10; i++) {
mocks.add(createLMock(""+i));
}
for (int i = 2; i < 5; i++) {
addPrereqs(mocks.get(i), ""+(i-1));
}
for (int i = 6; i < 9; i++) {
addPrereqs(mocks.get(i), ""+(i-1));
}
for (IOFMessageListener l : mocks) {
replay(l);
}
randomTestOrdering(mocks);
}
}