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.math.BigInteger;
19 import java.util.Collections;
20 import java.util.List;
22 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
23 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
24 import org.opendaylight.openflowplugin.api.openflow.registry.flow.DeviceFlowRegistry;
25 import org.opendaylight.openflowplugin.impl.registry.flow.FlowDescriptorFactory;
26 import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractDirectStatisticsServiceTest;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowAndStatisticsMap;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapList;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapListBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapListKey;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowStatsBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
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.statistics.types.rev130925.duration.DurationBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReply;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReplyBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartRequest;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
45 import org.opendaylight.yangtools.yang.common.Uint32;
46 import org.opendaylight.yangtools.yang.common.Uint8;
48 public class FlowDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
49 static final Uint8 TABLE_NO = Uint8.ONE;
50 private FlowDirectStatisticsService service;
54 service = new FlowDirectStatisticsService(requestContextStack,
57 multipartWriterProvider);
58 final DeviceFlowRegistry registry = mock(DeviceFlowRegistry.class);
59 when(registry.retrieveDescriptor(any())).thenReturn(FlowDescriptorFactory.create(TABLE_NO, new FlowId("1")));
60 when(deviceContext.getDeviceFlowRegistry()).thenReturn(registry);
64 public void testBuildRequestBody() {
65 final GetFlowStatisticsInput input = mock(GetFlowStatisticsInput.class);
67 when(input.getTableId()).thenReturn(TABLE_NO);
69 final MultipartRequestFlowStats body = (MultipartRequestFlowStats) ((MultipartRequest) service
70 .buildRequest(new Xid(Uint32.valueOf(42L)), input))
71 .getMultipartRequestBody();
73 assertEquals(TABLE_NO, body.getFlowStats().getTableId());
77 public void testBuildReply() {
78 final FlowAndStatisticsMapList flowStat = new FlowAndStatisticsMapListBuilder()
79 .setDuration(new DurationBuilder()
80 .setSecond(new Counter32(1L))
81 .setNanosecond(new Counter32(1L))
84 .setByteCount(new Counter64(BigInteger.ONE))
85 .setPacketCount(new Counter64(BigInteger.ONE))
86 .setFlags(new FlowModFlags(true, false, false, false, false))
87 .setMatch(new MatchBuilder().build())
90 final MultipartReply reply = new MultipartReplyBuilder()
91 .setMultipartReplyBody(new MultipartReplyFlowStatsBuilder()
92 .setFlowAndStatisticsMapList(Collections.singletonList(flowStat))
96 final List<MultipartReply> input = Collections.singletonList(reply);
98 final GetFlowStatisticsOutput output = service.buildReply(input, true);
99 assertTrue(output.getFlowAndStatisticsMapList().size() > 0);
101 final FlowAndStatisticsMap stats = output.nonnullFlowAndStatisticsMapList().values().iterator().next();
103 assertEquals(stats.getTableId(), TABLE_NO);
107 public void testStoreStatistics() {
108 final FlowAndStatisticsMapList stat = mock(FlowAndStatisticsMapList.class);
109 when(stat.getTableId()).thenReturn(TABLE_NO);
110 when(stat.getMatch()).thenReturn(new MatchBuilder().build());
112 final Map<FlowAndStatisticsMapListKey, FlowAndStatisticsMapList> stats
113 = Collections.singletonMap(stat.key(), stat);
114 final GetFlowStatisticsOutput output = mock(GetFlowStatisticsOutput.class);
115 when(output.nonnullFlowAndStatisticsMapList()).thenReturn(stats);
117 multipartWriterProvider.lookup(MultipartType.OFPMPFLOW).get().write(output, true);
118 verify(deviceContext).writeToTransactionWithParentsSlow(eq(LogicalDatastoreType.OPERATIONAL), any(), any());