2 * Copyright (c) 2016 Cisco Systems, Inc. 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
8 package org.opendaylight.unimgr.impl;
10 import org.junit.Before;
11 import org.junit.Test;
12 import org.mockito.Mockito;
13 import org.opendaylight.unimgr.mef.nrp.api.ActivationDriver;
14 import org.opendaylight.unimgr.mef.nrp.api.ActivationDriverBuilder;
15 import org.opendaylight.unimgr.mef.nrp.impl.ActivationDriverRepoServiceImpl;
16 import org.opendaylight.unimgr.utils.ActivationDriverMocks;
17 import org.opendaylight.yang.gen.v1.urn.onf.core.network.module.rev160630.forwarding.constructs.ForwardingConstruct;
18 import org.opendaylight.yang.gen.v1.urn.onf.core.network.module.rev160630.g_forwardingconstruct.FcPort;
19 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
21 import java.util.Arrays;
22 import java.util.Collections;
23 import java.util.List;
24 import java.util.function.Consumer;
26 import static org.mockito.Mockito.*;
27 import static org.opendaylight.unimgr.impl.ForwardingConstructTestUtils.fcSingleNode;
28 import static org.opendaylight.unimgr.impl.ForwardingConstructTestUtils.fcTwoNodes;
30 class TestBusinessEx extends RuntimeException {
31 public TestBusinessEx() {
32 super("expected exception");
37 * @author bartosz.michalik@amartus.com
38 * @author krzysztof.bijakowski@amartus.com [modifications]
40 public class FcRouteActivatorServiceTest {
42 private static final TopologyId topoA = new TopologyId("a");
44 private static final TopologyId topoZ = new TopologyId("z");
46 private ForwardingConstructActivationStateTracker stateTracker;
48 public ForwardingConstructActivatorService createService(List<ActivationDriverBuilder> builders) {
49 return new ForwardingConstructActivatorService(new ActivationDriverRepoServiceImpl(builders));
54 stateTracker = Mockito.mock(ForwardingConstructActivationStateTracker.class);
55 when(stateTracker.isActivatable()).thenReturn(true);
56 when(stateTracker.isDeactivatable()).thenReturn(true);
60 public void testActivateSingleNode() throws Exception {
62 final ActivationDriver d1 = mock(ActivationDriver.class);
64 ForwardingConstructActivatorService service = createService(Arrays.asList(
65 ActivationDriverMocks.prepareDriver((port1, port2) -> topoA.equals(port1.getTopology()) ? d1 : null),
66 ActivationDriverMocks.prepareDriver((port1, port2) -> null)
70 service.activate(fcSingleNode(), stateTracker);
73 verify(d1).activate();
75 verify(stateTracker).isActivatable();
76 verify(stateTracker).activated(Mockito.any());
80 public void testActivateTwoNodesSingleVendor() throws Exception {
82 final ActivationDriver d1 = mock(ActivationDriver.class);
84 ForwardingConstructActivatorService service = createService(Collections.singletonList(
85 ActivationDriverMocks.prepareDriver(port -> d1)
89 service.activate(fcTwoNodes(), stateTracker);
92 verify(d1, times(2)).activate();
93 verify(d1, times(2)).commit();
94 verify(stateTracker).isActivatable();
95 verify(stateTracker).activated(Mockito.any());
99 public void testActivateTwoNodesMultiVendor() throws Exception {
101 final ActivationDriver d1 = mock(ActivationDriver.class);
102 final ActivationDriver d2 = mock(ActivationDriver.class);
104 ForwardingConstructActivatorService service = createService(Arrays.asList(
105 ActivationDriverMocks.prepareDriver(port -> topoA.equals(port.getTopology()) ? d1 : null),
106 ActivationDriverMocks.prepareDriver(port -> topoZ.equals(port.getTopology()) ? d2 : null)
110 service.activate(fcTwoNodes(), stateTracker);
112 verify(d1).activate();
114 verify(d2).activate();
116 verify(stateTracker).isActivatable();
117 verify(stateTracker).activated(Mockito.any());
121 public void testActivateSingleNodeFailure() throws Exception {
123 final ActivationDriver d1 = spy(new FailingActivationDriver(p -> { if(p.getTopology().equals(topoA)) throw new TestBusinessEx();}));
125 ForwardingConstructActivatorService service = createService(Collections.singletonList(
126 ActivationDriverMocks.prepareDriver((p1,p2) -> d1)
130 service.activate(fcSingleNode(), stateTracker);
133 verify(d1, times(1)).rollback();
134 verify(stateTracker).isActivatable();
135 verify(stateTracker).activationFailed(Mockito.any());
139 public void testActivateFcExists() throws Exception {
141 ForwardingConstructActivationStateTracker stateTrackerFcExists = Mockito.mock(ForwardingConstructActivationStateTracker.class);
142 when(stateTrackerFcExists.isActivatable()).thenReturn(false);
144 final ActivationDriver d1 = mock(ActivationDriver.class);
146 ForwardingConstructActivatorService service = createService(Arrays.asList(
147 ActivationDriverMocks.prepareDriver((port1, port2) -> topoA.equals(port1.getTopology()) ? d1 : null),
148 ActivationDriverMocks.prepareDriver((port1, port2) -> null)
152 service.activate(fcSingleNode(), stateTrackerFcExists);
155 verify(d1, never()).activate();
156 verify(d1, never()).commit();
157 verify(stateTrackerFcExists).isActivatable();
158 verify(stateTrackerFcExists, never()).activated(Mockito.any());
159 verify(stateTrackerFcExists, never()).activationFailed(Mockito.any());
163 public void testActivateMultiNodeFailure() throws Exception {
165 final ActivationDriver d1 = spy(new FailingActivationDriver(p -> { if(p.getTopology().equals(topoA)) throw new TestBusinessEx();}));
167 ForwardingConstructActivatorService service = createService(Collections.singletonList(
168 ActivationDriverMocks.prepareDriver(p1 -> d1)
172 service.activate(fcTwoNodes(), stateTracker);
175 verify(d1, times(1)).activate();
176 verify(d1, times(2)).rollback();
177 verify(stateTracker).isActivatable();
178 verify(stateTracker).activationFailed(Mockito.any());
182 public void testDeactivateSingleNodeFailure() throws Exception {
184 final ActivationDriver d1 = spy(new FailingActivationDriver(p -> { if(p.getTopology().equals(topoA)) throw new TestBusinessEx();}));
186 ForwardingConstructActivatorService service = createService(Arrays.asList(
187 ActivationDriverMocks.prepareDriver((p1,p2) -> null),
188 ActivationDriverMocks.prepareDriver((p1,p2) -> d1)
192 service.deactivate(fcSingleNode(), stateTracker);
195 verify(d1, times(1)).deactivate();
196 verify(d1, times(1)).rollback();
197 verify(stateTracker).isDeactivatable();
198 verify(stateTracker).deactivationFailed();
202 public void testDeactivateTwoNodesSingleVendor() throws Exception {
204 final ActivationDriver d1 = mock(ActivationDriver.class);
206 ForwardingConstructActivatorService service = createService(Collections.singletonList(
207 ActivationDriverMocks.prepareDriver(port -> d1)
211 service.deactivate(fcTwoNodes(), stateTracker);
214 verify(d1, times(2)).deactivate();
215 verify(d1, times(2)).commit();
216 verify(stateTracker).isDeactivatable();
217 verify(stateTracker).deactivated();
221 public void testDeactivateFcNotExists() throws Exception {
223 ForwardingConstructActivationStateTracker stateTrackerFcNotExists = Mockito.mock(ForwardingConstructActivationStateTracker.class);
224 when(stateTrackerFcNotExists.isDeactivatable()).thenReturn(false);
226 final ActivationDriver d1 = mock(ActivationDriver.class);
228 ForwardingConstructActivatorService service = createService(Collections.singletonList(
229 ActivationDriverMocks.prepareDriver(port -> d1)
233 service.deactivate(fcTwoNodes(), stateTrackerFcNotExists);
236 verify(d1, never()).deactivate();
237 verify(d1, never()).commit();
238 verify(stateTrackerFcNotExists).isDeactivatable();
239 verify(stateTrackerFcNotExists, never()).deactivated();
240 verify(stateTrackerFcNotExists, never()).deactivationFailed();
243 private static class FailingActivationDriver implements ActivationDriver {
245 private final Consumer<FcPort> consumer;
249 FailingActivationDriver(Consumer<FcPort> portConsumer) {
250 this.consumer = portConsumer;
254 public void commit() {
259 public void rollback() {
264 public void initialize(FcPort from, FcPort to, ForwardingConstruct context) {
265 if(this.from == null)
270 public void activate() {
271 consumer.accept(from);
275 public void deactivate() {
276 consumer.accept(from);
280 public int priority() {