/* * Copyright © 2015 Yale University 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.alto.core.northbound.route.endpointcost.impl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Assert; import org.junit.Test; import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener; import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.alto.resourcepool.rev150921.context.resource.ContextTag; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.AltoModelEndpointcostService; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.QueryInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.QueryOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.QueryOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.alto.request.endpointcost.request.EndpointcostRequest; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.alto.response.endpointcost.response.EndpointcostResponseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.cost.type.container.CostType; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.endpointcost.request.data.EndpointcostParams; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.Ipv4AddressData; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.Ipv6AddressData; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.TypedAddressData; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpoint.filter.data.EndpointFilter; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpoint.filter.data.endpoint.filter.Destination; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpoint.filter.data.endpoint.filter.DestinationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpoint.filter.data.endpoint.filter.Source; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpoint.filter.data.endpoint.filter.SourceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.EndpointCostMapBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.EndpointCost; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.EndpointCostBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.endpoint.cost.Cost; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.input.request.endpointcost.request.endpointcost.params.filter.EndpointFilterData; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.input.request.endpointcost.request.endpointcost.params.filter.endpoint.filter.data.endpoint.filter.source.address.Ipv4Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.EndpointCostmapDataBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.cost.OrdinalBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.typed.address.data.Address; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; import javax.annotation.Nonnull; import javax.ws.rs.core.Response; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.anyObject; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; public class AltoNorthboundEndpointcostTest { String filter = "{\"cost-type\":{\"cost-mode\" : \"ordinal\",\"cost-metric\" : \"routingcost\"},\"endpoints\" : {\"srcs\": [ \"ipv4:192.0.2.2\" ],\"dsts\": [\"ipv4:192.0.2.89\",\"ipv4:198.51.100.34\",\"ipv4:203.0.113.45\"]}}"; String path = "test-model-endpointcost"; String costmode = "ordinal"; String costmetri = "routingcost"; List<String> endpoints_source_ipv4 = new ArrayList<String>(){ { add("192.0.2.2"); } }; List<String> endpoints_source_ipv6 = new ArrayList<String>(){ }; List<String> endpoints_destination_ipv4 = new ArrayList<String>(){ { add("192.0.2.89"); add("198.51.100.34"); add("203.0.113.45"); } }; List<String> endpoints_destination_ipv6 = new ArrayList<String>(){ }; List<String> endpoints_source = new ArrayList<String>(){ { add("ipv4:192.0.2.2"); } }; List<String> endpoints_destination = new ArrayList<String>(){ { add("ipv4:192.0.2.89"); add("ipv4:198.51.100.34"); add("ipv4:203.0.113.45"); } }; @Test public void testprepareInput() throws JsonProcessingException { AltoNorthboundRouteEndpointcost endpointcost = new AltoNorthboundRouteEndpointcost(); AltoNorthboundRouteEndpointcost endpointcostSpy = spy(endpointcost); InstanceIdentifier<ContextTag> ctagIID = InstanceIdentifier.create(ContextTag.class); //configure mock doReturn(ctagIID).when(endpointcostSpy).getResourceByPath(eq(path),(ReadOnlyTransaction) anyObject()); endpointcostSpy.setDataBroker(new DataBroker() { @Override public ReadOnlyTransaction newReadOnlyTransaction() { return null; } @Override public ReadWriteTransaction newReadWriteTransaction() { return null; } @Override public WriteTransaction newWriteOnlyTransaction() { return null; } @Override public ListenerRegistration<DataChangeListener> registerDataChangeListener(LogicalDatastoreType logicalDatastoreType, InstanceIdentifier<?> instanceIdentifier, DataChangeListener dataChangeListener, DataChangeScope dataChangeScope) { return null; } @Override public BindingTransactionChain createTransactionChain(TransactionChainListener transactionChainListener) { return null; } @Nonnull @Override public <T extends DataObject, L extends DataTreeChangeListener<T>> ListenerRegistration<L> registerDataTreeChangeListener(@Nonnull DataTreeIdentifier<T> dataTreeIdentifier, @Nonnull L l) { return null; } }); endpointcostSpy.setMapService(new AltoModelEndpointcostService() { @Override public Future<RpcResult<QueryOutput>> query(QueryInput queryInput) { return null; } }); //start test endpointcostSpy.init(); QueryInput input = endpointcostSpy.prepareInput(path,costmode,costmetri,endpoints_source,endpoints_destination); EndpointcostRequest request = (EndpointcostRequest)input.getRequest(); EndpointcostParams params = request.getEndpointcostParams(); EndpointFilter costmapFilter=((EndpointFilterData)params.getFilter()).getEndpointFilter(); Ipv4Builder ipv4 = new Ipv4Builder(); ipv4.setIpv4(new Ipv4Address("192.0.2.2")); Assert.assertEquals(costmapFilter.getSource().get(0).getAddress(), ipv4.build()); CostType costType = params.getCostType(); assertEquals(costmetri,costType.getCostMetric().getValue()); assertEquals(costmode, costType.getCostMode()); } protected Address createSourceAddress(Address from) { if (from instanceof Ipv4AddressData) { org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.source.address.Ipv4Builder builder; builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.source.address.Ipv4Builder(); builder.fieldsFrom((Ipv4AddressData)from); return builder.build(); } else if (from instanceof Ipv6AddressData) { org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.source.address.Ipv6Builder builder; builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.source.address.Ipv6Builder(); builder.fieldsFrom((Ipv6AddressData)from); return builder.build(); } return null; } protected Address createDestinationAddress(Address from) { if (from instanceof Ipv4AddressData) { org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.destination.address.Ipv4Builder builder; builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.destination.address.Ipv4Builder(); builder.fieldsFrom((Ipv4AddressData)from); return builder.build(); } else if (from instanceof Ipv6AddressData) { org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.destination.address.Ipv6Builder builder; builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.endpoint.costmap.data.endpoint.cost.map.endpoint.cost.destination.address.Ipv6Builder(); builder.fieldsFrom((Ipv6AddressData)from); return builder.build(); } return null; } protected Cost createOrdinalCost(int order) { OrdinalBuilder builder; builder = new OrdinalBuilder(); builder.setCost(order); return builder.build(); } @Test public void testgetFilteredMap() throws ExecutionException, InterruptedException, IOException { //mock config AltoNorthboundRouteEndpointcost endpointcost = new AltoNorthboundRouteEndpointcost(); AltoNorthboundRouteEndpointcost endpointcostSpy = spy(endpointcost); InstanceIdentifier<ContextTag> ctagIID = InstanceIdentifier.create(ContextTag.class); AltoModelEndpointcostService endpointcostService = mock(AltoModelEndpointcostService.class); Future<RpcResult<QueryOutput>> future = mock(Future.class); RpcResult<QueryOutput> rpcResult = mock(RpcResult.class); List<Source> sources = new ArrayList<Source>(); List<Destination> destinations = new ArrayList<Destination>(); for(String source : endpoints_source_ipv4){ SourceBuilder sourceBuilder = new SourceBuilder(); Ipv4Builder ipv4 = new Ipv4Builder(); ipv4.setIpv4(new Ipv4Address(source)); sourceBuilder.setAddress(ipv4.build()); sources.add(sourceBuilder.build()); } for(String destination : endpoints_destination_ipv4){ DestinationBuilder destinationBuilder = new DestinationBuilder(); Ipv4Builder ipv4 = new Ipv4Builder(); ipv4.setIpv4(new Ipv4Address(destination)); destinationBuilder.setAddress(ipv4.build()); destinations.add(destinationBuilder.build()); } List<? extends TypedAddressData> source = sources; List<? extends TypedAddressData> destination = destinations; int order = 0; LinkedList<EndpointCost> ecList = new LinkedList<EndpointCost>(); for (TypedAddressData src: source) { for (TypedAddressData dst: destination) { org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.endpoint.cost.SourceBuilder srcBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.endpoint.cost.SourceBuilder(); srcBuilder.setAddress(createSourceAddress(src.getAddress())); org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.endpoint.cost.DestinationBuilder dstBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.endpoint.cost.DestinationBuilder(); dstBuilder.setAddress(createDestinationAddress(dst.getAddress())); EndpointCostBuilder ecBuilder = new EndpointCostBuilder(); ecBuilder.setSource(srcBuilder.build()); ecBuilder.setDestination(dstBuilder.build()); ecBuilder.setCost(createOrdinalCost(++order)); ecList.add(ecBuilder.build()); } } EndpointCostMapBuilder ecmBuilder = new EndpointCostMapBuilder(); ecmBuilder.setEndpointCost(ecList); EndpointCostmapDataBuilder ecmdBuilder = new EndpointCostmapDataBuilder(); ecmdBuilder.setEndpointCostMap(ecmBuilder.build()); EndpointcostResponseBuilder ecrBuilder = new EndpointcostResponseBuilder(); ecrBuilder.setEndpointcostData(ecmdBuilder.build()); QueryOutputBuilder queryOutputBuilder = new QueryOutputBuilder(); queryOutputBuilder.setResponse(ecrBuilder.build()); when(rpcResult.getResult()).thenReturn(queryOutputBuilder.build()); when(future.get()).thenReturn(rpcResult); when(endpointcostService.query((QueryInput)anyObject())).thenReturn(future); endpointcostSpy.setDataBroker(new DataBroker() { @Override public ReadOnlyTransaction newReadOnlyTransaction() { return null; } @Override public ReadWriteTransaction newReadWriteTransaction() { return null; } @Override public WriteTransaction newWriteOnlyTransaction() { return null; } @Override public ListenerRegistration<DataChangeListener> registerDataChangeListener(LogicalDatastoreType logicalDatastoreType, InstanceIdentifier<?> instanceIdentifier, DataChangeListener dataChangeListener, DataChangeScope dataChangeScope) { return null; } @Override public BindingTransactionChain createTransactionChain(TransactionChainListener transactionChainListener) { return null; } @Nonnull @Override public <T extends DataObject, L extends DataTreeChangeListener<T>> ListenerRegistration<L> registerDataTreeChangeListener(@Nonnull DataTreeIdentifier<T> dataTreeIdentifier, @Nonnull L l) { return null; } }); endpointcostSpy.setMapService(endpointcostService); doReturn(ctagIID).when(endpointcostSpy).getResourceByPath(eq(path), (ReadOnlyTransaction)anyObject()); //start test endpointcostSpy.init(); Response response = endpointcostSpy.getFilteredMap(path, filter); String surex = response.getEntity().toString(); ObjectMapper mapper = new ObjectMapper(); JsonNode responseTree = mapper.readTree(surex); JsonNode endpointcostMapNode = responseTree.get("endpoint-cost-map"); JsonNode soureceNode = endpointcostMapNode.get("ipv4:192.0.2.2"); JsonNode destNode = soureceNode.get("ipv4:198.51.100.34"); assertEquals("2", destNode.asText()); } }