2 * Copyright (c) 2014 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.l2switch.arphandler.inventory;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertNull;
13 import static org.mockito.Matchers.any;
14 import static org.mockito.Mockito.times;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.when;
18 import com.google.common.base.Optional;
19 import com.google.common.util.concurrent.CheckedFuture;
20 import java.util.ArrayList;
21 import java.util.List;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.mockito.Mock;
25 import org.mockito.Mockito;
26 import org.mockito.MockitoAnnotations;
27 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
28 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
29 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.address.tracker.rev140617.AddressCapableNodeConnector;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.address.tracker.rev140617.AddressCapableNodeConnectorBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.address.tracker.rev140617.address.node.connector.Addresses;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.address.tracker.rev140617.address.node.connector.AddressesBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2switch.loopremover.rev140714.StpStatus;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2switch.loopremover.rev140714.StpStatusAwareNodeConnector;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2switch.loopremover.rev140714.StpStatusAwareNodeConnectorBuilder;
48 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
50 public class InventoryReaderTest {
53 private DataBroker dataBroker;
54 private InventoryReader inventoryReader;
57 public void initMocks() {
58 MockitoAnnotations.initMocks(this);
59 inventoryReader = new InventoryReader(dataBroker);
63 public void testGetControllerSwitchConnectors() throws Exception {
64 assertEquals(0, inventoryReader.getControllerSwitchConnectors().size());
68 public void testGetSwitchNodeConnectors() throws Exception {
69 assertEquals(0, inventoryReader.getSwitchNodeConnectors().size());
73 public void testGetNodeConnector() throws Exception {
74 List<Addresses> addressesList = new ArrayList<Addresses>();
75 addressesList.add(new AddressesBuilder().setLastSeen(0L).setMac(new MacAddress("aa:bb:cc:dd:ee:ff")).build());
76 AddressCapableNodeConnector addressCapableNodeConnector = new AddressCapableNodeConnectorBuilder()
77 .setAddresses(addressesList).build();
78 StpStatusAwareNodeConnector stpStatusAwareNodeConnector = new StpStatusAwareNodeConnectorBuilder()
79 .setStatus(StpStatus.Forwarding).build();
80 NodeConnector nodeConnector = new NodeConnectorBuilder()
81 .addAugmentation(StpStatusAwareNodeConnector.class, stpStatusAwareNodeConnector)
82 .addAugmentation(AddressCapableNodeConnector.class, addressCapableNodeConnector).build();
84 List<NodeConnector> nodeConnectors = new ArrayList<NodeConnector>();
85 nodeConnectors.add(nodeConnector);
86 Node node = new NodeBuilder().setNodeConnector(nodeConnectors).build();
87 Optional<Node> optionalNode = Optional.of(node);
89 ReadOnlyTransaction readOnlyTransaction = Mockito.mock(ReadOnlyTransaction.class);
90 CheckedFuture checkedFuture = Mockito.mock(CheckedFuture.class);
91 when(checkedFuture.get()).thenReturn(optionalNode);
92 when(readOnlyTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
93 .thenReturn(checkedFuture);
94 when(dataBroker.newReadOnlyTransaction()).thenReturn(readOnlyTransaction);
99 InstanceIdentifier.builder(Nodes.class)
100 .child(Node.class, new NodeKey(new NodeId("openflow:1"))).build(),
101 new MacAddress("aa:bb:cc:dd:ee:ff")));
102 verify(readOnlyTransaction, times(1)).close();
106 public void testGetNodeConnector_NullNodeInsId() throws Exception {
107 assertNull(inventoryReader.getNodeConnector(null, Mockito.mock(MacAddress.class)));
108 verify(dataBroker, times(0)).newReadOnlyTransaction();
112 public void testGetNodeConnector_NullMacAddress() throws Exception {
113 assertNull(inventoryReader.getNodeConnector(Mockito.mock(InstanceIdentifier.class), null));
114 verify(dataBroker, times(0)).newReadOnlyTransaction();
118 public void testReadInventory_NoRefresh() throws Exception {
119 inventoryReader.setRefreshData(false);
120 inventoryReader.readInventory();
121 verify(dataBroker, times(0)).newReadOnlyTransaction();
125 public void testReadInventory_Refresh() throws Exception {
126 StpStatusAwareNodeConnector stpStatusAwareNodeConnector = new StpStatusAwareNodeConnectorBuilder()
127 .setStatus(StpStatus.Discarding).build();
128 NodeConnector nc1 = new NodeConnectorBuilder().withKey(new NodeConnectorKey(new NodeConnectorId("1"))).build();
129 NodeConnector nc2 = new NodeConnectorBuilder().withKey(new NodeConnectorKey(new NodeConnectorId("2"))).build();
130 NodeConnector nc3 = new NodeConnectorBuilder().withKey(new NodeConnectorKey(new NodeConnectorId("3")))
131 .addAugmentation(StpStatusAwareNodeConnector.class, stpStatusAwareNodeConnector).build();
132 NodeConnector ncLocal = new NodeConnectorBuilder().withKey(new NodeConnectorKey(new NodeConnectorId("LOCAL")))
133 .addAugmentation(StpStatusAwareNodeConnector.class, stpStatusAwareNodeConnector).build();
135 List<NodeConnector> nodeConnectors = new ArrayList<NodeConnector>();
136 nodeConnectors.add(nc1);
137 nodeConnectors.add(nc2);
138 nodeConnectors.add(nc3);
139 nodeConnectors.add(ncLocal);
140 Node node = new NodeBuilder().setId(new NodeId("1")).setNodeConnector(nodeConnectors).build();
142 List<Node> nodeList = new ArrayList<Node>();
144 Nodes nodes = new NodesBuilder().setNode(nodeList).build();
145 Optional<Nodes> optionalNodes = Optional.of(nodes);
147 ReadOnlyTransaction readOnlyTransaction = Mockito.mock(ReadOnlyTransaction.class);
148 CheckedFuture checkedFuture = Mockito.mock(CheckedFuture.class);
149 when(checkedFuture.get()).thenReturn(optionalNodes);
150 when(readOnlyTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class)))
151 .thenReturn(checkedFuture);
152 when(dataBroker.newReadOnlyTransaction()).thenReturn(readOnlyTransaction);
154 inventoryReader.setRefreshData(true);
155 inventoryReader.readInventory();
156 verify(dataBroker, times(1)).newReadOnlyTransaction();
157 assertEquals(1, inventoryReader.getControllerSwitchConnectors().size());
158 assertEquals(1, inventoryReader.getSwitchNodeConnectors().size());
159 assertEquals(2, inventoryReader.getSwitchNodeConnectors().get("1").size());
160 // Ensure that refreshData is set to false
161 inventoryReader.readInventory();
162 verify(dataBroker, times(1)).newReadOnlyTransaction();