blob: 3a1501a40b061ea264c562635e9e8aa47a5e5f05 [file] [log] [blame]
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -08001/**
2* Copyright 2011, Big Switch Networks, Inc.
3* Originally created by David Erickson, Stanford University
4*
5* Licensed under the Apache License, Version 2.0 (the "License"); you may
6* not use this file except in compliance with the License. You may obtain
7* a copy of the License at
8*
9* http://www.apache.org/licenses/LICENSE-2.0
10*
11* Unless required by applicable law or agreed to in writing, software
12* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14* License for the specific language governing permissions and limitations
15* under the License.
16**/
17
18package net.floodlightcontroller.core.util;
19
20import static org.easymock.EasyMock.createNiceMock;
21import static org.easymock.EasyMock.expect;
22import static org.easymock.EasyMock.replay;
23import static org.easymock.EasyMock.verify;
24
25import java.util.ArrayList;
26import java.util.List;
27import java.util.Random;
28
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080029import net.floodlightcontroller.core.IOFMessageListener;
30import net.floodlightcontroller.test.FloodlightTestCase;
31
Jonathan Harta88fd242014-04-03 11:24:54 -070032import org.junit.Test;
33import org.openflow.protocol.OFType;
34
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080035public class MessageDispatcherTest extends FloodlightTestCase {
36
37 IOFMessageListener createLMock(String name) {
38 IOFMessageListener mock = createNiceMock(IOFMessageListener.class);
39 expect(mock.getName()).andReturn(name).anyTimes();
40 return mock;
41 }
42
43 void addPrereqs(IOFMessageListener mock, String... deps) {
44 for (String dep : deps) {
45 expect(mock.isCallbackOrderingPrereq(OFType.PACKET_IN, dep)).andReturn(true).anyTimes();
46 }
47 }
48
49 void testOrdering(ArrayList<IOFMessageListener> inputListeners) {
50 ListenerDispatcher<OFType, IOFMessageListener> ld =
51 new ListenerDispatcher<OFType, IOFMessageListener>();
52
53 for (IOFMessageListener l : inputListeners) {
54 ld.addListener(OFType.PACKET_IN, l);
55 }
56 for (IOFMessageListener l : inputListeners) {
57 verify(l);
58 }
59
60 List<IOFMessageListener> result = ld.getOrderedListeners();
61 System.out.print("Ordering: ");
62 for (IOFMessageListener l : result) {
63 System.out.print(l.getName());
64 System.out.print(",");
65 }
66 System.out.print("\n");
67
68 for (int ind_i = 0; ind_i < result.size(); ind_i++) {
69 IOFMessageListener i = result.get(ind_i);
70 for (int ind_j = ind_i+1; ind_j < result.size(); ind_j++) {
71 IOFMessageListener j = result.get(ind_j);
72
73 boolean orderwrong =
74 (i.isCallbackOrderingPrereq(OFType.PACKET_IN, j.getName()) ||
75 j.isCallbackOrderingPostreq(OFType.PACKET_IN, i.getName()));
76 assertFalse("Invalid order: " +
77 ind_i + " (" + i.getName() + ") " +
78 ind_j + " (" + j.getName() + ") ", orderwrong);
79 }
80 }
81 }
82
83 void randomTestOrdering(ArrayList<IOFMessageListener> mocks) {
84 Random rand = new Random(0);
85 ArrayList<IOFMessageListener> random =
86 new ArrayList<IOFMessageListener>();
87 random.addAll(mocks);
88 for (int i = 0; i < 20; i++) {
89 for (int j = 0; j < random.size(); j++) {
90 int ind = rand.nextInt(mocks.size()-1);
91 IOFMessageListener tmp = random.get(j);
92 random.set(j, random.get(ind));
93 random.set(ind, tmp);
94 }
95 testOrdering(random);
96 }
97 }
98
99 @Test
100 public void testCallbackOrderingSimple() throws Exception {
101 ArrayList<IOFMessageListener> mocks =
102 new ArrayList<IOFMessageListener>();
103 for (int i = 0; i < 10; i++) {
104 mocks.add(createLMock(""+i));
105 }
106 for (int i = 1; i < 10; i++) {
107 addPrereqs(mocks.get(i), ""+(i-1));
108 }
109 for (IOFMessageListener l : mocks) {
110 replay(l);
111 }
112 randomTestOrdering(mocks);
113 }
114
115 @Test
116 public void testCallbackOrderingPartial() throws Exception {
117 ArrayList<IOFMessageListener> mocks =
118 new ArrayList<IOFMessageListener>();
119 for (int i = 0; i < 10; i++) {
120 mocks.add(createLMock(""+i));
121 }
122 for (int i = 1; i < 5; i++) {
123 addPrereqs(mocks.get(i), ""+(i-1));
124 }
125 for (int i = 6; i < 10; i++) {
126 addPrereqs(mocks.get(i), ""+(i-1));
127 }
128 for (IOFMessageListener l : mocks) {
129 replay(l);
130 }
131 randomTestOrdering(mocks);
132 }
133
134
135 @Test
136 public void testCallbackOrderingPartial2() throws Exception {
137 ArrayList<IOFMessageListener> mocks =
138 new ArrayList<IOFMessageListener>();
139 for (int i = 0; i < 10; i++) {
140 mocks.add(createLMock(""+i));
141 }
142 for (int i = 2; i < 5; i++) {
143 addPrereqs(mocks.get(i), ""+(i-1));
144 }
145 for (int i = 6; i < 9; i++) {
146 addPrereqs(mocks.get(i), ""+(i-1));
147 }
148 for (IOFMessageListener l : mocks) {
149 replay(l);
150 }
151 randomTestOrdering(mocks);
152 }
153}