Bug 3292: Invalid Range exception in setDpnId
[vpnservice.git] / fibmanager / fibmanager-impl / src / test / java / org / opendaylight / vpnservice / fibmanager / test / FibManagerTest.java
1 /*
2  * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
3  * 
4  * This program and the accompanying materials are made available under the terms of the Eclipse
5  * Public License v1.0 which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.vpnservice.fibmanager.test;
9
10 import java.math.BigInteger;
11
12 import org.junit.After;
13 import org.junit.Before;
14 import org.junit.BeforeClass;
15 import org.junit.Test;
16 import static org.junit.Assert.*;
17 import static org.mockito.Matchers.any;
18 import static org.mockito.Mockito.doReturn;
19 import static org.mockito.Mockito.when;
20 import com.google.common.base.Optional;
21 import com.google.common.util.concurrent.FutureCallback;
22 import com.google.common.util.concurrent.Futures;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.HashSet;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.Set;
29 import org.junit.Assert;
30 import org.junit.Before;
31 import org.junit.Test;
32 import org.junit.runner.RunWith;
33 import org.mockito.Mock;
34 import org.mockito.Mockito;
35 import org.mockito.runners.MockitoJUnitRunner;
36 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
37 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
38 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
39 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
40 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
41 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
42 import org.opendaylight.vpnmanager.api.IVpnManager;
43 import org.opendaylight.vpnservice.fibmanager.FibManager;
44 import org.opendaylight.vpnservice.fibmanager.test.MockDataChangedEvent;
45 import org.opendaylight.vpnservice.mdsalutil.FlowEntity;
46 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.FibEntries;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTables;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesKey;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntry;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntryBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntryKey;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.GetEgressPointerOutput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.L3nexthopService;
56 import org.opendaylight.yangtools.concepts.ListenerRegistration;
57 import org.opendaylight.yangtools.yang.binding.DataObject;
58 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
59 import org.opendaylight.yangtools.yang.binding.RpcService;
60 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
61
62 @RunWith(MockitoJUnitRunner.class)
63 public class FibManagerTest {
64
65   @Mock
66   DataBroker dataBroker;
67   @Mock
68   ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
69   @Mock
70   ReadOnlyTransaction mockReadTx;
71   @Mock
72   WriteTransaction mockWriteTx;
73   @Mock
74   L3nexthopService l3nexthopService;
75   @Mock
76   IMdsalApiManager mdsalManager;
77   @Mock
78   IVpnManager vpnmanager;
79   @Mock
80   GetEgressPointerOutput adjacency;
81   @Mock
82   VrfTablesKey vrfTableKey;
83
84   MockDataChangedEvent dataChangeEvent;
85   FibManager fibmgr;
86   private static final Long EgressPointer = 11L;
87   VrfEntry vrfEntry;
88   InstanceIdentifier<VrfEntry> identifier;
89   VrfEntryBuilder vrfbuilder;
90   private static final String rd = "routeDis";
91   private static final String prefix = "0.1.2.3";
92   private static final String nexthop = "1.1.1.1";
93   private static final int label = 10;
94   List<BigInteger> Dpns;
95   private static final long vpnId = 101L;
96
97   private void SetupMocks() {
98     Dpns = new ArrayList<BigInteger>();
99     Dpns.add(BigInteger.valueOf(100000L));
100     identifier = buildVrfEntryId(rd, prefix);
101     vrfEntry = buildVrfEntry(rd, prefix, nexthop, label);
102     fibmgr.setMdsalManager(mdsalManager);
103     fibmgr.setVpnmanager(vpnmanager);
104     when(adjacency.getEgressPointer()).thenReturn(EgressPointer);
105     when(adjacency.isLocalDestination()).thenReturn(true);
106     when(vrfTableKey.getRouteDistinguisher()).thenReturn(rd);
107     when(vpnmanager.getDpnsForVpn(any(Long.class))).thenReturn(Dpns);
108   }
109
110   @Before
111   public void setUp() throws Exception {
112     when(
113         dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class),
114             any(InstanceIdentifier.class), any(DataChangeListener.class),
115             any(DataChangeScope.class))).thenReturn(dataChangeListenerRegistration);
116     dataChangeEvent = new MockDataChangedEvent();
117     vrfbuilder = new VrfEntryBuilder();
118     fibmgr = new FibManager(dataBroker, l3nexthopService) {
119       protected GetEgressPointerOutput resolveAdjacency(final BigInteger dpId, final long vpnId,
120           final VrfEntry vrfEntry) {
121         return adjacency;
122       }
123
124       protected Long getVpnId(String rd) {
125         return vpnId;
126       }
127     };
128     SetupMocks();
129   }
130
131   @Test
132   public void testAdd() {
133     dataChangeEvent.created.put(identifier, vrfEntry);
134     fibmgr.onDataChanged(dataChangeEvent);
135     Mockito.verify(mdsalManager, Mockito.times(2)).installFlow(any(FlowEntity.class));
136   }
137
138   private VrfEntry buildVrfEntry(String rd, String prefix, String nexthop, int label) {
139     return new VrfEntryBuilder().setDestPrefix(prefix).setNextHopAddress(nexthop)
140         .setLabel((long) label).build();
141   }
142
143   public static InstanceIdentifier<VrfTables> buildVrfTableId(String rd) {
144     InstanceIdentifierBuilder<VrfTables> idBuilder =
145         InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd));
146     InstanceIdentifier<VrfTables> vrfTableId = idBuilder.build();
147     return vrfTableId;
148   }
149
150   public static InstanceIdentifier<VrfEntry> buildVrfEntryId(String rd, String prefix) {
151     InstanceIdentifierBuilder<VrfEntry> idBuilder =
152         InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd))
153             .child(VrfEntry.class, new VrfEntryKey(prefix));
154     InstanceIdentifier<VrfEntry> vrfEntryId = idBuilder.build();
155     return vrfEntryId;
156   }
157 }