2 * Copyright (c) 2014 NEC Corporation and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.sal.implementation;
11 import java.util.HashMap;
12 import java.util.HashSet;
14 import java.util.concurrent.ConcurrentHashMap;
15 import java.util.concurrent.ConcurrentMap;
17 import org.junit.Test;
18 import static org.junit.Assert.assertEquals;
19 import static org.junit.Assert.assertFalse;
20 import static org.junit.Assert.assertNotNull;
21 import static org.junit.Assert.assertTrue;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
26 import org.opendaylight.controller.sal.implementation.internal.ProtocolService;
27 import org.opendaylight.controller.sal.utils.GlobalConstants;
30 * Unit test for {@link ProtocolService}.
32 public class ProtocolServiceTest {
33 private static final Logger LOG =
34 LoggerFactory.getLogger(ProtocolServiceTest.class);
37 public void testInstance() {
38 HashSet<ProtocolService<ITestService>> set = new HashSet<>();
39 TestService sv1 = new TestService();
40 HashMap<String, Object> prop1 = new HashMap<>();
42 ProtocolService<ITestService> ps1 =
43 new ProtocolService<ITestService>(prop1, sv1);
44 assertEquals(sv1, ps1.getService());
45 // Default priority is 0.
46 assertEquals(0, ps1.getPriority());
47 assertTrue(set.add(ps1));
48 assertFalse(set.add(ps1));
50 // Specify the same service and priority.
51 String priKey = GlobalConstants.PROTOCOLPLUGINPRIORITY.toString();
52 prop1.put(priKey, Integer.valueOf(0));
53 ProtocolService<ITestService> ps2 =
54 new ProtocolService<ITestService>(prop1, sv1);
55 assertEquals(sv1, ps2.getService());
56 assertEquals(0, ps2.getPriority());
57 assertEquals(ps1, ps2);
58 assertFalse(set.add(ps1));
60 // Specify different priority.
61 prop1.put(priKey, Integer.valueOf(Integer.MAX_VALUE));
62 ps2 = new ProtocolService<ITestService>(prop1, sv1);
63 assertEquals(sv1, ps2.getService());
64 assertEquals(Integer.MAX_VALUE, ps2.getPriority());
65 assertFalse(ps1.equals(ps2));
66 assertTrue(set.add(ps2));
67 assertFalse(set.add(ps2));
69 // Specify another service.
70 TestService sv2 = new TestService();
71 prop1.put(priKey, Integer.valueOf(0));
72 ps2 = new ProtocolService<ITestService>(prop1, sv2);
73 assertEquals(sv2, ps2.getService());
74 assertEquals(0, ps2.getPriority());
75 assertFalse(ps1.equals(ps2));
76 assertTrue(set.add(ps2));
77 assertFalse(set.add(ps2));
81 public void testSetUnsetError() {
82 ConcurrentMap<String, ProtocolService<ITestService>> services =
83 new ConcurrentHashMap<>();
84 TestService sv = new TestService();
85 Map<String, Object> props = new HashMap<>();
88 ProtocolService.set(services, props, null, LOG);
89 assertTrue(services.isEmpty());
91 ProtocolService.unset(services, props, null, LOG);
92 assertTrue(services.isEmpty());
94 // null service property.
95 ProtocolService.set(services, null, sv, LOG);
96 assertTrue(services.isEmpty());
98 ProtocolService.unset(services, null, sv, LOG);
99 assertTrue(services.isEmpty());
101 // Type is not specified.
102 ProtocolService.set(services, props, sv, LOG);
103 assertTrue(services.isEmpty());
105 ProtocolService.unset(services, props, sv, LOG);
106 assertTrue(services.isEmpty());
109 final String typeKey = GlobalConstants.PROTOCOLPLUGINTYPE.toString();
110 assertEquals(null, props.put(typeKey, "OF"));
111 ProtocolService.set(null, props, sv, LOG);
112 assertTrue(services.isEmpty());
114 ProtocolService.unset(null, props, sv, LOG);
115 assertTrue(services.isEmpty());
119 public void testSetUnset() {
120 ConcurrentMap<String, ProtocolService<ITestService>> serviceMap =
121 new ConcurrentHashMap<>();
122 ConcurrentMap<String, ProtocolService<ITestService>> expected =
123 new ConcurrentHashMap<>();
125 final String typeKey = GlobalConstants.PROTOCOLPLUGINTYPE.toString();
126 final String priKey = GlobalConstants.PROTOCOLPLUGINPRIORITY.toString();
127 final String[] protocols = {"OF", "PE", "PK"};
128 final int basePri = 0;
131 // Should override the service if higher priority is specified.
132 for (String proto: protocols) {
133 for (int pri = basePri - loop + 1; pri <= basePri; pri++) {
134 TestService sv = new TestService();
135 Map<String, Object> props = new HashMap<>();
136 assertEquals(null, props.put(typeKey, proto));
137 assertEquals(null, props.put(priKey, Integer.valueOf(pri)));
138 ProtocolService.set(serviceMap, props, sv, LOG);
140 ProtocolService<ITestService> service = serviceMap.get(proto);
141 assertNotNull(service);
142 assertEquals(sv, service.getService());
143 assertEquals(pri, service.getPriority());
145 ProtocolService<ITestService> service1 =
146 new ProtocolService<ITestService>(props, sv);
147 expected.put(proto, service1);
148 assertEquals(expected, serviceMap);
150 // Unset service request should be ignored if different
151 // parameters are specified.
152 TestService another = new TestService();
153 ProtocolService.unset(serviceMap, props, another, LOG);
154 assertEquals(expected, serviceMap);
156 props.put(priKey, Integer.valueOf(Integer.MAX_VALUE));
157 ProtocolService.unset(serviceMap, props, sv, LOG);
158 assertEquals(expected, serviceMap);
162 // Should reject the set service request if lower priority is specified.
163 for (String proto: protocols) {
164 for (int pri = basePri - loop; pri < basePri; pri++) {
165 TestService sv = new TestService();
166 Map<String, Object> props = new HashMap<>();
167 assertEquals(null, props.put(typeKey, proto));
168 assertEquals(null, props.put(priKey, Integer.valueOf(pri)));
169 ProtocolService.set(serviceMap, props, sv, LOG);
170 assertEquals(expected, serviceMap);
174 // Unset protocol services.
175 for (String proto: protocols) {
176 ProtocolService<ITestService> service = expected.remove(proto);
177 assertNotNull(service);
179 ITestService sv = service.getService();
180 Map<String, Object> props = new HashMap<>();
181 assertEquals(null, props.put(typeKey, proto));
182 assertEquals(null, props.put(priKey, Integer.valueOf(basePri)));
183 ProtocolService.unset(serviceMap, props, sv, LOG);
184 assertEquals(expected, serviceMap);
186 // Should be ignored if the specified service does not exist.
187 ProtocolService.unset(serviceMap, props, sv, LOG);
188 assertEquals(expected, serviceMap);
191 assertTrue(serviceMap.isEmpty());
195 interface ITestService {
198 class TestService implements ITestService {