2 * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.openflowplugin.impl.statistics.services.direct.singlelayer;
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;
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;
52 public class FlowDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
53 static final Uint8 TABLE_NO = Uint8.ONE;
54 private FlowDirectStatisticsService service;
58 final DeviceFlowRegistry registry = mock(DeviceFlowRegistry.class);
59 service = new FlowDirectStatisticsService(requestContextStack,
62 multipartWriterProvider);
63 when(registry.retrieveDescriptor(any())).thenReturn(FlowDescriptorFactory.create(TABLE_NO, new FlowId("1")));
64 when(deviceContext.getDeviceFlowRegistry()).thenReturn(registry);
68 public void testBuildRequestBody() {
69 final GetFlowStatisticsInput input = mock(GetFlowStatisticsInput.class);
71 when(input.getTableId()).thenReturn(TABLE_NO);
73 final MultipartRequestFlowStats body = (MultipartRequestFlowStats) ((MultipartRequest) service
74 .buildRequest(new Xid(Uint32.valueOf(42L)), input))
75 .getMultipartRequestBody();
77 assertEquals(TABLE_NO, body.getFlowStats().getTableId());
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))
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))
102 final MultipartReply reply = new MultipartReplyBuilder()
103 .setMultipartReplyBody(new MultipartReplyFlowStatsBuilder()
104 .setFlowAndStatisticsMapList(List.of(flowStat))
109 final FlowAndStatisticsMapList flowStat1 = new FlowAndStatisticsMapListBuilder()
110 .setDuration(new DurationBuilder()
111 .setSecond(new Counter32(Uint32.ONE))
112 .setNanosecond(new Counter32(Uint32.TWO))
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))
129 final MultipartReply reply1 = new MultipartReplyBuilder()
130 .setMultipartReplyBody(new MultipartReplyFlowStatsBuilder()
131 .setFlowAndStatisticsMapList(List.of(flowStat1))
134 final List<MultipartReply> input = new ArrayList<>();
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());
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());
151 final List<FlowAndStatisticsMapList> stats = List.of(stat);
152 final GetFlowStatisticsOutput output = mock(GetFlowStatisticsOutput.class);
153 when(output.nonnullFlowAndStatisticsMapList()).thenReturn(stats);
155 multipartWriterProvider.lookup(MultipartType.OFPMPFLOW).orElseThrow().write(output, true);
156 verify(deviceContext).writeToTransactionWithParentsSlow(eq(LogicalDatastoreType.OPERATIONAL), any(), any());