Decompose RPC implementation classes
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / statistics / services / direct / singlelayer / FlowDirectStatisticsServiceTest.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.openflowplugin.impl.statistics.services.direct.singlelayer;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12 import static org.mockito.ArgumentMatchers.any;
13 import static org.mockito.ArgumentMatchers.eq;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.when;
17
18 import java.util.ArrayList;
19 import java.util.List;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
22 import org.opendaylight.openflowplugin.api.openflow.registry.flow.DeviceFlowRegistry;
23 import org.opendaylight.openflowplugin.impl.registry.flow.FlowDescriptorFactory;
24 import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractDirectStatisticsServiceTest;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsInput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowAndStatisticsMap;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapList;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapListBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowStatsBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.MultipartRequestFlowStats;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReply;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReplyBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartRequest;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
47 import org.opendaylight.yangtools.yang.common.Uint16;
48 import org.opendaylight.yangtools.yang.common.Uint32;
49 import org.opendaylight.yangtools.yang.common.Uint64;
50 import org.opendaylight.yangtools.yang.common.Uint8;
51
52 public class FlowDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
53     static final Uint8 TABLE_NO = Uint8.ONE;
54     private SingleGetFlowStatistics service;
55
56     @Override
57     public void setUp() {
58         final DeviceFlowRegistry registry = mock(DeviceFlowRegistry.class);
59         service = new SingleGetFlowStatistics(requestContextStack,
60                                                   deviceContext,
61                                                   convertorManager,
62                                                   multipartWriterProvider);
63         when(registry.retrieveDescriptor(any())).thenReturn(FlowDescriptorFactory.create(TABLE_NO, new FlowId("1")));
64         when(deviceContext.getDeviceFlowRegistry()).thenReturn(registry);
65     }
66
67     @Override
68     public void testBuildRequestBody() {
69         final GetFlowStatisticsInput input = mock(GetFlowStatisticsInput.class);
70
71         when(input.getTableId()).thenReturn(TABLE_NO);
72
73         final MultipartRequestFlowStats body = (MultipartRequestFlowStats) ((MultipartRequest) service
74             .buildRequest(new Xid(Uint32.valueOf(42L)), input))
75             .getMultipartRequestBody();
76
77         assertEquals(TABLE_NO, body.getFlowStats().getTableId());
78     }
79
80     @Override
81     public void testBuildReply() {
82         final FlowAndStatisticsMapList flowStat = new FlowAndStatisticsMapListBuilder()
83                 .setDuration(new DurationBuilder()
84                         .setSecond(new Counter32(Uint32.ONE))
85                         .setNanosecond(new Counter32(Uint32.TWO))
86                         .build())
87                 .setTableId(Uint8.valueOf(50))
88                 .setByteCount(new Counter64(Uint64.valueOf(7094)))
89                 .setPacketCount(new Counter64(Uint64.valueOf(63)))
90                 .setCookie(new FlowCookie(Uint64.valueOf(134419365)))
91                 .setFlags(new FlowModFlags(true, false, false, false, false))
92                 .setMatch(new MatchBuilder().setEthernetMatch(
93                         new EthernetMatchBuilder()
94                                 .setEthernetDestination(
95                                         new EthernetDestinationBuilder()
96                                                 .setAddress(new MacAddress("fa:16:3e:92:81:45"))
97                                                 .build()).build()).build())
98                 .setInstructions(new InstructionsBuilder().build())
99                 .setPriority(Uint16.valueOf(20))
100                 .build();
101
102         final MultipartReply reply = new MultipartReplyBuilder()
103                 .setMultipartReplyBody(new MultipartReplyFlowStatsBuilder()
104                         .setFlowAndStatisticsMapList(List.of(flowStat))
105                         .build())
106                 .build();
107
108
109         final FlowAndStatisticsMapList flowStat1 = new FlowAndStatisticsMapListBuilder()
110                 .setDuration(new DurationBuilder()
111                         .setSecond(new Counter32(Uint32.ONE))
112                         .setNanosecond(new Counter32(Uint32.TWO))
113                         .build())
114                 .setTableId(Uint8.valueOf(51))
115                 .setByteCount(new Counter64(Uint64.valueOf(9853)))
116                 .setPacketCount(new Counter64(Uint64.valueOf(99)))
117                 .setCookie(new FlowCookie(Uint64.valueOf(134550437)))
118                 .setFlags(new FlowModFlags(true, false, false, false, false))
119                 .setMatch(new MatchBuilder().setEthernetMatch(
120                         new EthernetMatchBuilder()
121                                 .setEthernetDestination(
122                                         new EthernetDestinationBuilder()
123                                                 .setAddress(new MacAddress("fa:16:3e:92:81:45"))
124                                                 .build()).build()).build())
125                 .setInstructions(new InstructionsBuilder().build())
126                 .setPriority(Uint16.valueOf(20))
127                 .build();
128
129         final MultipartReply reply1 = new MultipartReplyBuilder()
130                 .setMultipartReplyBody(new MultipartReplyFlowStatsBuilder()
131                         .setFlowAndStatisticsMapList(List.of(flowStat1))
132                         .build())
133                 .build();
134         final List<MultipartReply> input = new ArrayList<>();
135         input.add(reply);
136         input.add(reply1);
137         final GetFlowStatisticsOutput output = service.buildReply(input, true);
138         assertTrue(output.getFlowAndStatisticsMapList().size() > 0);
139         FlowAndStatisticsMap stats = output.nonnullFlowAndStatisticsMapList().iterator().next();
140         assertEquals(Uint8.valueOf(50),stats.getTableId());
141         stats = output.nonnullFlowAndStatisticsMapList().get(1);
142         assertEquals(Uint8.valueOf(51),stats.getTableId());
143     }
144
145     @Override
146     public void testStoreStatistics() {
147         final FlowAndStatisticsMapList stat = mock(FlowAndStatisticsMapList.class);
148         when(stat.getTableId()).thenReturn(TABLE_NO);
149         when(stat.getMatch()).thenReturn(new MatchBuilder().build());
150
151         final List<FlowAndStatisticsMapList> stats = List.of(stat);
152         final GetFlowStatisticsOutput output = mock(GetFlowStatisticsOutput.class);
153         when(output.nonnullFlowAndStatisticsMapList()).thenReturn(stats);
154
155         multipartWriterProvider.lookup(MultipartType.OFPMPFLOW).orElseThrow().write(output, true);
156         verify(deviceContext).writeToTransactionWithParentsSlow(eq(LogicalDatastoreType.OPERATIONAL), any(), any());
157     }
158 }