/*
* Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.openflowplugin.openflow.md.core.translator;
import static org.mockito.Mockito.when;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowplugin.api.openflow.md.core.ConnectionConductor;
import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;
import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.AggregateFlowStatisticsUpdate;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupFeaturesUpdated;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdated;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupCapabilities;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupTypes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandTypeBitmap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregateBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeaturesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeaturesBuilder;
import org.opendaylight.yangtools.yang.binding.DataObject;
/**
* @author michal.polkorab
*
*/
@RunWith(MockitoJUnitRunner.class)
public class MultipartReplyTranslatorSecondTest {
@Mock SwitchConnectionDistinguisher cookie;
@Mock SessionContext sc;
@Mock ConnectionConductor conductor;
@Mock GetFeaturesOutput features;
MultipartReplyTranslator translator;
/**
* Initializes mocks
*/
@Before
public void startUp() {
final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
translator = new MultipartReplyTranslator(convertorManager);
when(sc.getPrimaryConductor()).thenReturn(conductor);
when(conductor.getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);
when(sc.getFeatures()).thenReturn(features);
when(features.getDatapathId()).thenReturn(new BigInteger("42"));
}
/**
* Test {@link MultipartReplyTranslator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}
* with aggregate stat
*/
@Test
public void testAggregateCase() {
MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();
mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
mpBuilder.setXid(123L);
mpBuilder.setFlags(new MultipartRequestFlags(false));
mpBuilder.setType(MultipartType.OFPMPAGGREGATE);
MultipartReplyAggregateCaseBuilder caseBuilder = new MultipartReplyAggregateCaseBuilder();
MultipartReplyAggregateBuilder aggBuilder = new MultipartReplyAggregateBuilder();
aggBuilder.setByteCount(new BigInteger("52"));
aggBuilder.setFlowCount(6587L);
aggBuilder.setPacketCount(new BigInteger("25"));
caseBuilder.setMultipartReplyAggregate(aggBuilder.build());
mpBuilder.setMultipartReplyBody(caseBuilder.build());
MultipartReplyMessage message = mpBuilder.build();
List<DataObject> list = translator.translate(cookie, sc, message);
Assert.assertEquals("Wrong list size", 1, list.size());
AggregateFlowStatisticsUpdate aggUpdate = (AggregateFlowStatisticsUpdate) list.get(0);
Assert.assertEquals("Wrong node-id", "openflow:42", aggUpdate.getId().getValue());
Assert.assertEquals("Wrong more-replies", false, aggUpdate.isMoreReplies());
Assert.assertEquals("Wrong transaction-id", 123, aggUpdate.getTransactionId().getValue().intValue());
Assert.assertEquals("Wrong byte count", 52, aggUpdate.getByteCount().getValue().intValue());
Assert.assertEquals("Wrong packet count", 25, aggUpdate.getPacketCount().getValue().intValue());
Assert.assertEquals("Wrong flow count", 6587, aggUpdate.getFlowCount().getValue().intValue());
}
/**
* Test {@link MultipartReplyTranslator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}
* with group features stat
*/
@Test
public void testGroupFeaturesCase() {
MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();
mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
mpBuilder.setXid(123L);
mpBuilder.setFlags(new MultipartRequestFlags(false));
mpBuilder.setType(MultipartType.OFPMPGROUPFEATURES);
MultipartReplyGroupFeaturesCaseBuilder caseBuilder = new MultipartReplyGroupFeaturesCaseBuilder();
MultipartReplyGroupFeaturesBuilder featBuilder = new MultipartReplyGroupFeaturesBuilder();
featBuilder.setTypes(new GroupTypes(true, false, true, false));
featBuilder.setCapabilities(new GroupCapabilities(false, true, false, true));
List<Long> maxGroups = new ArrayList<>();
maxGroups.add(1L);
maxGroups.add(2L);
maxGroups.add(3L);
maxGroups.add(4L);
featBuilder.setMaxGroups(maxGroups);
List<ActionType> actionTypes = new ArrayList<>();
ActionType actionType1 = new ActionType(true, false, true, false, false, false, true,
false, true, false, true, false, true, false, true, false, true);
actionTypes.add(actionType1);
ActionType actionType2 = new ActionType(false, true, false, true, false, true, false,
true, false, true, false, true, false, true, false, true, false);
actionTypes.add(actionType2);
ActionType actionType3 = new ActionType(false, false, false, false, false, false, false,
true, true, true, true, true, true, true, true, true, true);
actionTypes.add(actionType3);
ActionType actionType4 = new ActionType(true, true, true, true, true, true, true,
false, false, false, false, false, false, false, false, false, false);
actionTypes.add(actionType4);
featBuilder.setActionsBitmap(actionTypes);
caseBuilder.setMultipartReplyGroupFeatures(featBuilder.build());
mpBuilder.setMultipartReplyBody(caseBuilder.build());
MultipartReplyMessage message = mpBuilder.build();
List<DataObject> list = translator.translate(cookie, sc, message);
Assert.assertEquals("Wrong list size", 1, list.size());
GroupFeaturesUpdated groupUpdate = (GroupFeaturesUpdated) list.get(0);
Assert.assertEquals("Wrong node-id", "openflow:42", groupUpdate.getId().getValue());
Assert.assertEquals("Wrong more-replies", false, groupUpdate.isMoreReplies());
Assert.assertEquals("Wrong transaction-id", 123, groupUpdate.getTransactionId().getValue().intValue());
Assert.assertEquals("Wrong group types size", 2, groupUpdate.getGroupTypesSupported().size());
Assert.assertEquals("Wrong group type", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupAll",
groupUpdate.getGroupTypesSupported().get(0).getName());
Assert.assertEquals("Wrong group type", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupIndirect",
groupUpdate.getGroupTypesSupported().get(1).getName());
Assert.assertEquals("Wrong group capabilities size", 2, groupUpdate.getGroupCapabilitiesSupported().size());
Assert.assertEquals("Wrong group capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.ChainingChecks",
groupUpdate.getGroupCapabilitiesSupported().get(0).getName());
Assert.assertEquals("Wrong group capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight",
groupUpdate.getGroupCapabilitiesSupported().get(1).getName());
Assert.assertEquals("Wrong max groups", maxGroups, groupUpdate.getMaxGroups());
Assert.assertEquals("Wrong actions bitmap", 137072641, groupUpdate.getActions().get(0).longValue());
Assert.assertEquals("Wrong actions bitmap", 131336192, groupUpdate.getActions().get(1).longValue());
Assert.assertEquals("Wrong actions bitmap", 247365632, groupUpdate.getActions().get(2).longValue());
Assert.assertEquals("Wrong actions bitmap", 21043201, groupUpdate.getActions().get(3).longValue());
}
/**
* Test {@link MultipartReplyTranslator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}
* with meter features stat
*/
@Test
public void testMeterFeaturesCase() {
MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();
mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
mpBuilder.setXid(123L);
mpBuilder.setFlags(new MultipartRequestFlags(false));
mpBuilder.setType(MultipartType.OFPMPMETERFEATURES);
MultipartReplyMeterFeaturesCaseBuilder caseBuilder = new MultipartReplyMeterFeaturesCaseBuilder();
MultipartReplyMeterFeaturesBuilder featBuilder = new MultipartReplyMeterFeaturesBuilder();
featBuilder.setMaxMeter(1L);
featBuilder.setBandTypes(new MeterBandTypeBitmap(true, true));
featBuilder.setCapabilities(new MeterFlags(true, true, true, true));
featBuilder.setMaxBands((short) 2);
featBuilder.setMaxColor((short) 3);
caseBuilder.setMultipartReplyMeterFeatures(featBuilder.build());
mpBuilder.setMultipartReplyBody(caseBuilder.build());
MultipartReplyMessage message = mpBuilder.build();
List<DataObject> list = translator.translate(cookie, sc, message);
Assert.assertEquals("Wrong list size", 1, list.size());
MeterFeaturesUpdated megterUpdate = (MeterFeaturesUpdated) list.get(0);
Assert.assertEquals("Wrong node-id", "openflow:42", megterUpdate.getId().getValue());
Assert.assertEquals("Wrong more-replies", false, megterUpdate.isMoreReplies());
Assert.assertEquals("Wrong transaction-id", 123, megterUpdate.getTransactionId().getValue().intValue());
Assert.assertEquals("Wrong max meter", 1, megterUpdate.getMaxMeter().getValue().intValue());
Assert.assertEquals("Wrong max bands", 2, megterUpdate.getMaxBands().intValue());
Assert.assertEquals("Wrong max color", 3, megterUpdate.getMaxColor().intValue());
Assert.assertEquals("Wrong capabilities size", 4, megterUpdate.getMeterCapabilitiesSupported().size());
Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"
+ ".MeterBurst", megterUpdate.getMeterCapabilitiesSupported().get(0).getName());
Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"
+ ".MeterKbps", megterUpdate.getMeterCapabilitiesSupported().get(1).getName());
Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"
+ ".MeterPktps", megterUpdate.getMeterCapabilitiesSupported().get(2).getName());
Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"
+ ".MeterStats", megterUpdate.getMeterCapabilitiesSupported().get(3).getName());
Assert.assertEquals("Wrong band types size", 2, megterUpdate.getMeterBandSupported().size());
Assert.assertEquals("Wrong band type", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDrop",
megterUpdate.getMeterBandSupported().get(0).getName());
Assert.assertEquals("Wrong band type", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDscpRemark",
megterUpdate.getMeterBandSupported().get(1).getName());
}
}