1 package org.opendaylight.openflowplugin.impl.device;
3 import static org.mockito.Matchers.any;
5 import com.google.common.base.Optional;
6 import com.google.common.util.concurrent.CheckedFuture;
7 import com.google.common.util.concurrent.Futures;
8 import com.google.common.util.concurrent.SettableFuture;
9 import io.netty.util.HashedWheelTimer;
10 import java.util.concurrent.atomic.AtomicLong;
11 import org.junit.Assert;
12 import org.junit.Before;
13 import org.junit.Test;
14 import org.junit.runner.RunWith;
15 import org.mockito.Mock;
16 import org.mockito.Mockito;
17 import org.mockito.invocation.InvocationOnMock;
18 import org.mockito.runners.MockitoJUnitRunner;
19 import org.mockito.stubbing.Answer;
20 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
21 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
22 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
23 import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
24 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
25 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
26 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
27 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
28 import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
29 import org.opendaylight.openflowplugin.api.openflow.connection.OutboundQueueProvider;
30 import org.opendaylight.openflowplugin.api.openflow.device.DeviceState;
31 import org.opendaylight.openflowplugin.api.openflow.device.RequestContext;
32 import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary;
33 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
34 import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageIntelligenceAgency;
35 import org.opendaylight.openflowplugin.impl.util.DeviceStateUtil;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncReply;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
41 import org.opendaylight.yangtools.concepts.Registration;
42 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
43 import org.opendaylight.yangtools.yang.common.RpcResult;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
47 @RunWith(MockitoJUnitRunner.class)
48 public class DeviceContextImplTest {
49 private static final Logger LOG = LoggerFactory
50 .getLogger(DeviceContextImplTest.class);
53 DeviceContextImpl deviceContext;
54 TransactionChainManager txChainManager;
56 RequestContext<GetAsyncReply> requestContext;
58 RequestContext<MultipartReply> requestContextMultiReply;
61 ConnectionContext connectionContext;
63 DeviceState deviceState;
65 DataBroker dataBroker;
69 ReadOnlyTransaction rTx;
71 BindingTransactionChain txChainFactory;
73 HashedWheelTimer timer;
75 MessageIntelligenceAgency messageIntelligenceAgency;
77 OutboundQueueProvider outboundQueueProvider;
79 ConnectionAdapter connectionAdapter;
80 NodeId nodeId = new NodeId("h2g2:42");
81 KeyedInstanceIdentifier<Node, NodeKey> nodeKeyIdent = DeviceStateUtil.createNodeInstanceIdentifier(nodeId);
83 TranslatorLibrary translatorLibrary;
85 Registration registration;
87 private final AtomicLong atomicLong = new AtomicLong(0);
91 final CheckedFuture<Optional<Node>, ReadFailedException> noExistNodeFuture = Futures.immediateCheckedFuture(Optional.<Node>absent());
92 Mockito.when(rTx.read(LogicalDatastoreType.OPERATIONAL, nodeKeyIdent)).thenReturn(noExistNodeFuture);
93 Mockito.when(dataBroker.newReadOnlyTransaction()).thenReturn(rTx);
94 Mockito.when(dataBroker.createTransactionChain(Mockito.any(TransactionChainManager.class))).thenReturn(txChainFactory);
95 Mockito.when(deviceState.getNodeInstanceIdentifier()).thenReturn(nodeKeyIdent);
96 txChainManager = new TransactionChainManager(dataBroker, nodeKeyIdent, registration);
97 final SettableFuture<RpcResult<GetAsyncReply>> settableFuture = SettableFuture.create();
98 final SettableFuture<RpcResult<MultipartReply>> settableFutureMultiReply = SettableFuture.create();
99 Mockito.when(requestContext.getFuture()).thenReturn(settableFuture);
100 Mockito.doAnswer(new Answer<Object>() {
101 @SuppressWarnings("unchecked")
103 public Object answer(final InvocationOnMock invocation) {
104 settableFuture.set((RpcResult<GetAsyncReply>) invocation.getArguments()[0]);
107 }).when(requestContext).setResult(any(RpcResult.class));
109 Mockito.when(requestContextMultiReply.getFuture()).thenReturn(settableFutureMultiReply);
110 Mockito.doAnswer(new Answer<Object>() {
111 @SuppressWarnings("unchecked")
113 public Object answer(final InvocationOnMock invocation) {
114 settableFutureMultiReply.set((RpcResult<MultipartReply>) invocation.getArguments()[0]);
117 }).when(requestContextMultiReply).setResult(any(RpcResult.class));
118 Mockito.when(txChainFactory.newWriteOnlyTransaction()).thenReturn(wTx);
119 Mockito.when(dataBroker.newReadOnlyTransaction()).thenReturn(rTx);
120 Mockito.when(connectionContext.getOutboundQueueProvider()).thenReturn(outboundQueueProvider);
121 Mockito.when(connectionContext.getConnectionAdapter()).thenReturn(connectionAdapter);
122 deviceContext = new DeviceContextImpl(connectionContext, deviceState, dataBroker, timer, messageIntelligenceAgency, outboundQueueProvider, translatorLibrary, txChainManager);
124 xid = new Xid(atomicLong.incrementAndGet());
125 xidMulti = new Xid(atomicLong.incrementAndGet());
128 @Test(expected = NullPointerException.class)
129 public void testDeviceContextImplConstructorNullDataBroker() throws Exception {
130 new DeviceContextImpl(connectionContext, deviceState, null, timer, messageIntelligenceAgency, outboundQueueProvider, translatorLibrary, txChainManager).close();
133 @Test(expected = NullPointerException.class)
134 public void testDeviceContextImplConstructorNullDeviceState() throws Exception {
135 new DeviceContextImpl(connectionContext, null, dataBroker, timer, messageIntelligenceAgency, outboundQueueProvider, translatorLibrary, txChainManager).close();
138 @Test(expected = NullPointerException.class)
139 public void testDeviceContextImplConstructorNullTimer() throws Exception {
140 new DeviceContextImpl(null, deviceState, dataBroker, null, messageIntelligenceAgency, outboundQueueProvider, translatorLibrary, txChainManager).close();
144 public void testGetDeviceState() {
145 final DeviceState deviceSt = deviceContext.getDeviceState();
146 Assert.assertNotNull(deviceSt);
147 Assert.assertEquals(deviceState, deviceSt);
151 public void testGetReadTransaction() {
152 final ReadTransaction readTx = deviceContext.getReadTransaction();
153 Assert.assertNotNull(readTx);
154 Assert.assertEquals(rTx, readTx);