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;
21 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
22 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
23 import org.opendaylight.openflowplugin.api.openflow.registry.flow.DeviceFlowRegistry;
24 import org.opendaylight.openflowplugin.impl.registry.flow.FlowDescriptorFactory;
25 import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractDirectStatisticsServiceTest;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
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.FlowModFlags;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.MultipartRequestFlowStats;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReply;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReplyBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartRequest;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
43 import org.opendaylight.yangtools.yang.common.Uint32;
44 import org.opendaylight.yangtools.yang.common.Uint8;
46 public class FlowDirectStatisticsServiceTest extends AbstractDirectStatisticsServiceTest {
47 static final Uint8 TABLE_NO = Uint8.ONE;
48 private FlowDirectStatisticsService service;
52 service = new FlowDirectStatisticsService(requestContextStack,
55 multipartWriterProvider);
56 final DeviceFlowRegistry registry = mock(DeviceFlowRegistry.class);
57 when(registry.retrieveDescriptor(any())).thenReturn(FlowDescriptorFactory.create(TABLE_NO, new FlowId("1")));
58 when(deviceContext.getDeviceFlowRegistry()).thenReturn(registry);
62 public void testBuildRequestBody() {
63 final GetFlowStatisticsInput input = mock(GetFlowStatisticsInput.class);
65 when(input.getTableId()).thenReturn(TABLE_NO);
67 final MultipartRequestFlowStats body = (MultipartRequestFlowStats) ((MultipartRequest) service
68 .buildRequest(new Xid(Uint32.valueOf(42L)), input))
69 .getMultipartRequestBody();
71 assertEquals(TABLE_NO, body.getFlowStats().getTableId());
75 public void testBuildReply() {
76 final FlowAndStatisticsMapList flowStat = new FlowAndStatisticsMapListBuilder()
77 .setDuration(new DurationBuilder()
78 .setSecond(new Counter32(1L))
79 .setNanosecond(new Counter32(1L))
82 .setByteCount(new Counter64(BigInteger.ONE))
83 .setPacketCount(new Counter64(BigInteger.ONE))
84 .setFlags(new FlowModFlags(true, false, false, false, false))
85 .setMatch(new MatchBuilder().build())
88 final MultipartReply reply = new MultipartReplyBuilder()
89 .setMultipartReplyBody(new MultipartReplyFlowStatsBuilder()
90 .setFlowAndStatisticsMapList(Collections.singletonList(flowStat))
94 final List<MultipartReply> input = Collections.singletonList(reply);
96 final GetFlowStatisticsOutput output = service.buildReply(input, true);
97 assertTrue(output.getFlowAndStatisticsMapList().size() > 0);
99 final FlowAndStatisticsMap stats = output.getFlowAndStatisticsMapList().get(0);
101 assertEquals(stats.getTableId(), TABLE_NO);
105 public void testStoreStatistics() {
106 final FlowAndStatisticsMapList stat = mock(FlowAndStatisticsMapList.class);
107 when(stat.getTableId()).thenReturn(TABLE_NO);
108 when(stat.getMatch()).thenReturn(new MatchBuilder().build());
110 final List<FlowAndStatisticsMapList> stats = Collections.singletonList(stat);
111 final GetFlowStatisticsOutput output = mock(GetFlowStatisticsOutput.class);
112 when(output.getFlowAndStatisticsMapList()).thenReturn(stats);
114 multipartWriterProvider.lookup(MultipartType.OFPMPFLOW).get().write(output, true);
115 verify(deviceContext).writeToTransactionWithParentsSlow(eq(LogicalDatastoreType.OPERATIONAL), any(), any());