Add unit tests for northbound routes 68/36968/1
authorneal <wukunhenggo@gmail.com>
Tue, 1 Mar 2016 13:50:54 +0000 (21:50 +0800)
committerKai GAO <gaok12@mails.tsinghua.edu.cn>
Thu, 31 Mar 2016 10:33:32 +0000 (18:33 +0800)
Signed-off-by: wukunheng <wukunhenggo@gmail.com>
Change-Id: I425083780e04e5a62045d928a076781c9d71e4d1

alto-core/standard-northbound-routes/costmap/impl/src/test/java/org/opendaylight/alto/core/northbound/route/costmap/impl/AltoNorthboundCostmapTest.java [new file with mode: 0644]
alto-core/standard-northbound-routes/endpointcost/impl/src/main/java/org/opendaylight/alto/core/northbound/route/endpointcost/impl/AltoNorthboundRouteEndpointcost.java
alto-core/standard-northbound-routes/endpointcost/impl/src/test/java/org/opendaylight/alto/core/northbound/route/endpointcost/impl/AltoNorthboundEndpointcostTest.java [new file with mode: 0644]
alto-core/standard-northbound-routes/networkmap/impl/src/test/java/org/opendaylight/alto/core/northbound/route/networkmap/impl/AltoNorthboundNetworkmapTest.java [new file with mode: 0644]

diff --git a/alto-core/standard-northbound-routes/costmap/impl/src/test/java/org/opendaylight/alto/core/northbound/route/costmap/impl/AltoNorthboundCostmapTest.java b/alto-core/standard-northbound-routes/costmap/impl/src/test/java/org/opendaylight/alto/core/northbound/route/costmap/impl/AltoNorthboundCostmapTest.java
new file mode 100644 (file)
index 0000000..b324527
--- /dev/null
@@ -0,0 +1,271 @@
+/*
+ * 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.costmap.impl;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+import org.opendaylight.alto.core.northbound.api.utils.rfc7285.RFC7285CostMap;
+import org.opendaylight.alto.core.northbound.api.utils.rfc7285.RFC7285CostType;
+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.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.resourcepool.rev150921.context.resource.ContextTag;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.types.rev150921.CostMetric;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.types.rev150921.PidName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.AltoModelCostmapService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.QueryInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.QueryOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.QueryOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.alto.request.costmap.request.CostmapRequest;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.alto.response.costmap.response.CostmapResponseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.cost.type.data.CostType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.cost.type.data.CostTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.costmap.request.data.CostmapParams;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.costmap.response.data.CostmapResponseDataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.costmap.response.data.costmap.response.data.CostmapSource;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.costmap.response.data.costmap.response.data.CostmapSourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.costmap.response.data.costmap.response.data.costmap.source.CostmapDestination;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.costmap.response.data.costmap.response.data.costmap.source.CostmapDestinationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rev151021.costmap.response.data.costmap.response.data.costmap.source.costmap.destination.Cost;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rfc7285.rev151021.costmap.filter.data.CostmapFilter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rfc7285.rev151021.query.input.request.costmap.request.costmap.params.filter.CostmapFilterData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.costmap.rfc7285.rev151021.query.output.response.costmap.response.costmap.response.data.costmap.source.costmap.destination.cost.OrdinalBuilder;
+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 AltoNorthboundCostmapTest {
+
+    String filter = "{\"cost-type\": {\"cost-metric\": \"routingcost\",  \"cost-mode\": \"numerical\"}, \"pids\": {\"dsts\": [ \"PID1\",  \"PID2\", \"PID3\"   ],   \"srcs\": [  \"PID1\"   ] }}";
+    String path = "test-model-costmap";
+    String costmode = "ordinal";
+    String costmetri = "routingcost";
+    List<String> pid_source  = new ArrayList<String>(){
+        {
+            add("PID1");
+        }
+    };
+    List<String>  pid_destination = new ArrayList<String>(){
+        {
+            add("PID1");
+            add("PID2");
+            add("PID3");
+        }
+    };
+
+    @Test
+    public void testprepareInput() throws JsonProcessingException {
+
+        AltoNorthboundRouteCostmap costmap = new AltoNorthboundRouteCostmap();
+        AltoNorthboundRouteCostmap costmapSpy = spy(costmap);
+        AltoModelCostmapService mapService = mock(AltoModelCostmapService.class);
+        BindingAwareBroker.ProviderContext session = mock(BindingAwareBroker.ProviderContext.class);
+        InstanceIdentifier<ContextTag> ctagIID = InstanceIdentifier.create(ContextTag.class);
+//        doReturn("").when(mapService).query()
+
+        //configure mock
+        doReturn(ctagIID).when(costmapSpy).getResourceByPath(eq(path),(ReadOnlyTransaction) anyObject());
+        when(session.getSALService(DataBroker.class)).thenReturn(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;
+            }
+        });
+        when(session.getRpcService(AltoModelCostmapService.class)).thenReturn(new AltoModelCostmapService() {
+            @Override
+            public Future<RpcResult<QueryOutput>> query(QueryInput queryInput) {
+                return null;
+            }
+        });
+
+        //start test
+        costmapSpy.onSessionInitiated(session);
+        QueryInput input = costmapSpy.prepareInput(path,costmode,costmetri,pid_source,pid_destination);
+
+        CostmapRequest request = (CostmapRequest)input.getRequest();
+        CostmapParams params = request.getCostmapParams();
+        CostmapFilter costmapFilter=((CostmapFilterData)params.getFilter()).getCostmapFilter();
+        CostType costType = params.getCostType();
+        List<PidName> pidNames1 = new LinkedList<PidName>();
+        for (String pid:pid_source){
+            PidName p = new PidName(pid);
+            pidNames1.add(p);
+        }
+        List<PidName> pidNames2 = new LinkedList<PidName>();
+        for (String pid:pid_destination){
+            PidName p = new PidName(pid);
+            pidNames2.add(p);
+        }
+
+        assertEquals(costmetri,costType.getCostMetric().getValue());
+        assertEquals(costmode, costType.getCostMode());
+        assertEquals(pidNames1, costmapFilter.getPidSource());
+        assertEquals(pidNames2, costmapFilter.getPidDestination());
+    }
+
+//  Future<RpcResult<QueryOutput>> future;
+    protected Cost createOrdinalCost(int order) {
+        OrdinalBuilder builder=new OrdinalBuilder();
+        builder.setCost(order);
+        return builder.build();
+    }
+
+    @Test
+    public void testgetFilteredMap() throws IOException, ExecutionException, InterruptedException {
+        //mock config
+        final AltoNorthboundRouteCostmap costmap = new AltoNorthboundRouteCostmap();
+        AltoNorthboundRouteCostmap costmapSpy = spy(costmap);
+        BindingAwareBroker.ProviderContext session = mock(BindingAwareBroker.ProviderContext.class);
+        InstanceIdentifier<ContextTag> ctagIID = InstanceIdentifier.create(ContextTag.class);
+
+        AltoModelCostmapService costmapService = mock(AltoModelCostmapService.class);
+        Future<RpcResult<QueryOutput>> future = mock(Future.class);
+        RpcResult<QueryOutput> rpcResult = mock(RpcResult.class);
+        //build QueryOutput
+        int order = 0;
+        LinkedList<CostmapSource> costmapSources = new LinkedList<CostmapSource>();
+        for(String src:pid_source){
+            LinkedList<CostmapDestination> costmapDestinations= new LinkedList<CostmapDestination>();
+
+            for (String dst : pid_destination){
+                CostmapDestinationBuilder costmapDestinationBuilder= new CostmapDestinationBuilder();
+                costmapDestinationBuilder.setPidDestination(new PidName(dst));
+                costmapDestinationBuilder.setCost(createOrdinalCost(++order));
+                costmapDestinations.add(costmapDestinationBuilder.build());
+            }
+            CostmapSourceBuilder costmapSourceBuilder= new CostmapSourceBuilder();
+            costmapSourceBuilder.setPidSource(new PidName(src));
+            costmapSourceBuilder.setCostmapDestination(costmapDestinations);
+            costmapSources.add(costmapSourceBuilder.build());
+        }
+        CostTypeBuilder costType = new CostTypeBuilder();
+        costType.setCostMode(costmode);
+        costType.setCostMetric(new CostMetric(costmetri));
+        CostmapResponseDataBuilder costmapResponseDataBuilder= new CostmapResponseDataBuilder();
+        costmapResponseDataBuilder.setCostType(costType.build());
+        costmapResponseDataBuilder.setCostmapSource(costmapSources);
+
+        CostmapResponseBuilder costmapResponseBuilder= new CostmapResponseBuilder();
+        costmapResponseBuilder.setCostmapResponseData(costmapResponseDataBuilder.build());
+
+        QueryOutputBuilder queryOutput = new QueryOutputBuilder();
+        queryOutput.setResponse(costmapResponseBuilder.build());
+        when(rpcResult.getResult()).thenReturn(queryOutput.build());
+        when(future.get()).thenReturn(rpcResult);
+        when(costmapService.query((QueryInput) anyObject())).thenReturn(future);
+
+        when(session.getRpcService(AltoModelCostmapService.class)).thenReturn(costmapService);
+
+        when(session.getSALService(DataBroker.class)).thenReturn(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;
+            }
+        });
+        doReturn(ctagIID).when(costmapSpy).getResourceByPath(eq(path),(ReadOnlyTransaction) anyObject());
+        RFC7285CostMap.Meta meta = new RFC7285CostMap.Meta();
+        RFC7285CostType rfc7285costType = new RFC7285CostType();
+        rfc7285costType.metric = costmetri;
+        rfc7285costType.mode = costmode;
+        meta.costType = rfc7285costType;
+        doReturn(meta).when(costmapSpy).buildMeta((InstanceIdentifier<?>) anyObject(), (RFC7285CostType)anyObject());
+
+        //start test
+        costmapSpy.onSessionInitiated(session);
+        Response response = costmapSpy.getFilteredMap(path,filter);
+        String responseStr = response.getEntity().toString();
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode responseNode = mapper.readTree(responseStr);
+        JsonNode costmapNode = responseNode.get("cost-map");
+        JsonNode PID1Node = costmapNode.get("PID1");
+        JsonNode PID2Node = PID1Node.get("PID2");
+        assertEquals("2", PID2Node.asText());
+
+//        assertEquals(responseStr,surex);
+    }
+
+}
index 150d33ff6edddd80917c3418fc07e715d73c8d0b..093975c54c012c4d734e23246325454f290fc351 100644 (file)
@@ -280,7 +280,7 @@ public class AltoNorthboundRouteEndpointcost implements BindingAwareProvider, Au
             if(tmp[0].equals("ipv4")){
                 ipv4.setIpv4(new Ipv4Address(tmp[1]));
                 destinationBuilder.setAddress(ipv4.build());
-            }else if(tmp[0].equals("ipv4")){
+            }else if(tmp[0].equals("ipv6")){
                 ipv6.setIpv6(new Ipv6Address(tmp[1]));
                 destinationBuilder.setAddress(ipv6.build());
             }else return null;
diff --git a/alto-core/standard-northbound-routes/endpointcost/impl/src/test/java/org/opendaylight/alto/core/northbound/route/endpointcost/impl/AltoNorthboundEndpointcostTest.java b/alto-core/standard-northbound-routes/endpointcost/impl/src/test/java/org/opendaylight/alto/core/northbound/route/endpointcost/impl/AltoNorthboundEndpointcostTest.java
new file mode 100644 (file)
index 0000000..068e5af
--- /dev/null
@@ -0,0 +1,334 @@
+/*
+ * 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.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.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);
+
+        BindingAwareBroker.ProviderContext session = mock(BindingAwareBroker.ProviderContext.class);
+        InstanceIdentifier<ContextTag> ctagIID = InstanceIdentifier.create(ContextTag.class);
+
+        //configure mock
+        doReturn(ctagIID).when(endpointcostSpy).getResourceByPath(eq(path),(ReadOnlyTransaction) anyObject());
+        when(session.getSALService(DataBroker.class)).thenReturn(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;
+            }
+        });
+        when(session.getRpcService(AltoModelEndpointcostService.class)).thenReturn(new AltoModelEndpointcostService() {
+            @Override
+            public Future<RpcResult<QueryOutput>> query(QueryInput queryInput) {
+                return null;
+            }
+        });
+
+        //start test
+        endpointcostSpy.onSessionInitiated(session);
+        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);
+        BindingAwareBroker.ProviderContext session = mock(BindingAwareBroker.ProviderContext.class);
+        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);
+
+        when(session.getSALService(DataBroker.class)).thenReturn(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;
+            }
+        });
+        when(session.getRpcService(AltoModelEndpointcostService.class)).thenReturn(endpointcostService);
+
+        doReturn(ctagIID).when(endpointcostSpy).getResourceByPath(eq(path), (ReadOnlyTransaction)anyObject());
+
+        //start test
+        endpointcostSpy.onSessionInitiated(session);
+        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());
+    }
+
+}
diff --git a/alto-core/standard-northbound-routes/networkmap/impl/src/test/java/org/opendaylight/alto/core/northbound/route/networkmap/impl/AltoNorthboundNetworkmapTest.java b/alto-core/standard-northbound-routes/networkmap/impl/src/test/java/org/opendaylight/alto/core/northbound/route/networkmap/impl/AltoNorthboundNetworkmapTest.java
new file mode 100644 (file)
index 0000000..994f2e1
--- /dev/null
@@ -0,0 +1,259 @@
+/*
+ * 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.networkmap.impl;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+import org.opendaylight.alto.core.northbound.api.utils.rfc7285.RFC7285NetworkMap;
+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.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.resourcepool.rev150921.context.resource.ContextTag;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.types.rev150921.PidName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.AddressTypeBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.AddressTypeIpv4;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.AddressTypeIpv6;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.AltoModelNetworkmapService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.QueryInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.QueryOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.QueryOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.alto.request.networkmap.request.NetworkmapRequest;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.alto.response.networkmap.response.NetworkmapResponseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.networkmap.response.data.NetworkMapBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.networkmap.response.data.network.map.Partition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rev151021.networkmap.response.data.network.map.PartitionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rfc7285.rev151021.Ipv4PrefixList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rfc7285.rev151021.Ipv4PrefixListBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rfc7285.rev151021.Ipv6PrefixList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.networkmap.rfc7285.rev151021.Ipv6PrefixListBuilder;
+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 AltoNorthboundNetworkmapTest {
+    String path = "test-model-networkmap";
+    String filter = "{\n" +
+            "\t\"pids\": [\"PID1\", \"PID2\"],\n" +
+            "\t\"address-types\": [\"ipv4\", \"ipv6\"]\n" +
+            "}";
+    List<String> pids = new ArrayList<String>(){
+        {
+            add("PID1");
+            add("PID2");
+        }
+    };
+    List<String> addressTypes = new ArrayList<String>(){
+        {
+            add("ipv4");
+            add("ipv6");
+        }
+    };
+    @Test
+    public void testprepareInput() throws JsonProcessingException{
+
+
+        //configure the mock
+        AltoNorthboundRouteNetworkmap networkmap = new AltoNorthboundRouteNetworkmap();
+        AltoNorthboundRouteNetworkmap networkmapSpy = spy(networkmap);
+
+        BindingAwareBroker.ProviderContext session = mock(BindingAwareBroker.ProviderContext.class);
+        InstanceIdentifier<ContextTag> ctagIID = InstanceIdentifier.create(ContextTag.class);
+        doReturn(ctagIID).when(networkmapSpy).getResourceByPath(eq(path), (ReadOnlyTransaction) anyObject());
+        doReturn( AddressTypeIpv4.class).when(networkmapSpy).getAddressTypeByName(eq("ipv4"), eq(path), (ReadOnlyTransaction)anyObject());
+        doReturn( AddressTypeIpv6.class).when(networkmapSpy).getAddressTypeByName(eq("ipv6"), eq(path), (ReadOnlyTransaction)anyObject());
+        when(session.getSALService(DataBroker.class)).thenReturn(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;
+            }
+        });
+        when(session.getRpcService(AltoModelNetworkmapService.class)).thenReturn(new AltoModelNetworkmapService() {
+            @Override
+            public Future<RpcResult<QueryOutput>> query(QueryInput queryInput) {
+                return null;
+            }
+        });
+
+        networkmapSpy.onSessionInitiated(session);
+        QueryInput input = networkmapSpy.prepareInput(path, pids, addressTypes);
+        NetworkmapRequest request = (NetworkmapRequest)input.getRequest();
+        PidName pid1 = request.getNetworkmapFilter().getPid().get(0);
+        PidName pid2 = request.getNetworkmapFilter().getPid().get(1);
+
+        assertEquals(pid1.getValue(), "PID1");
+        assertEquals(pid2.getValue(), "PID2");
+
+        assertEquals(request.getNetworkmapFilter().getAddressType().get(0), AddressTypeIpv4.class);
+        assertEquals(request.getNetworkmapFilter().getAddressType().get(1), AddressTypeIpv6.class);
+    }
+
+    @Test
+    public void testgetFilteredMap() throws ExecutionException, InterruptedException, IOException {
+        //config mock
+        AltoNorthboundRouteNetworkmap networkmap = new AltoNorthboundRouteNetworkmap();
+        AltoNorthboundRouteNetworkmap networkmapSpy = spy(networkmap);
+
+        BindingAwareBroker.ProviderContext session = mock(BindingAwareBroker.ProviderContext.class);
+        InstanceIdentifier<ContextTag> ctagIID = InstanceIdentifier.create(ContextTag.class);
+        doReturn(ctagIID).when(networkmapSpy).getResourceByPath(eq(path), (ReadOnlyTransaction) anyObject());
+        doReturn( AddressTypeIpv4.class).when(networkmapSpy).getAddressTypeByName(eq("ipv4"), eq(path), (ReadOnlyTransaction)anyObject());
+        doReturn( AddressTypeIpv6.class).when(networkmapSpy).getAddressTypeByName(eq("ipv6"), eq(path), (ReadOnlyTransaction)anyObject());
+
+        AltoModelNetworkmapService networkmapService = mock(AltoModelNetworkmapService.class);
+
+        Future<RpcResult<QueryOutput>> future = mock(Future.class);
+        RpcResult<QueryOutput> rpcResult = mock(RpcResult.class);
+        List<Class<? extends AddressTypeBase>> types = new ArrayList<Class<? extends AddressTypeBase>>(){
+            {
+                add(AddressTypeIpv4.class);
+                add(AddressTypeIpv6.class);
+            }
+        };
+        List<Partition> partitionList = new LinkedList<>();
+        int index = 0;
+        for (String pid: pids) {
+            ++index;
+
+            PartitionBuilder partitionBuilder = new PartitionBuilder();
+            partitionBuilder.setPid(new PidName(pid));
+
+            if (types.contains(AddressTypeIpv4.class)) {
+                LinkedList<Ipv4Prefix> ipv4List = new LinkedList<Ipv4Prefix>();
+                ipv4List.add(new Ipv4Prefix("192.168." + index + ".0/24"));
+
+                Ipv4PrefixListBuilder v4Builder = new Ipv4PrefixListBuilder();
+                v4Builder.setIpv4(ipv4List);
+
+                partitionBuilder.addAugmentation(Ipv4PrefixList.class, v4Builder.build());
+            }
+            if (types.contains(AddressTypeIpv6.class)) {
+                LinkedList<Ipv6Prefix> ipv6List = new LinkedList<Ipv6Prefix>();
+                ipv6List.add(new Ipv6Prefix("2001:b8:ca2:" + index + "::0/64"));
+
+                Ipv6PrefixListBuilder v6Builder = new Ipv6PrefixListBuilder();
+                v6Builder.setIpv6(ipv6List);
+
+                partitionBuilder.addAugmentation(Ipv6PrefixList.class, v6Builder.build());
+            }
+
+            partitionList.add(partitionBuilder.build());
+        }
+        NetworkMapBuilder nmBuilder = new NetworkMapBuilder();
+        nmBuilder.setPartition(partitionList);
+
+        NetworkmapResponseBuilder nmrBuilder = new NetworkmapResponseBuilder();
+        nmrBuilder.setNetworkMap(nmBuilder.build());
+
+        QueryOutputBuilder queryOutputBuilder = new QueryOutputBuilder();
+        queryOutputBuilder.setResponse(nmrBuilder.build());
+        when(rpcResult.getResult()).thenReturn(queryOutputBuilder.build());
+        when(future.get()).thenReturn(rpcResult);
+        when(networkmapService.query((QueryInput)anyObject())).thenReturn(future);
+        when(session.getRpcService(AltoModelNetworkmapService.class)).thenReturn(networkmapService);
+        when(session.getSALService(DataBroker.class)).thenReturn(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;
+            }
+        });
+
+        doReturn(new RFC7285NetworkMap.Meta()).when(networkmapSpy).buildMeta((InstanceIdentifier<?>)anyObject());
+        //start test
+        networkmapSpy.onSessionInitiated(session);
+        Response response = networkmapSpy.getFilteredMap(path, filter);
+        String surex = response.getEntity().toString();
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode responseTree = mapper.readTree(surex);
+        JsonNode networkmapTree = responseTree.get("network-map");
+        JsonNode PID1 = networkmapTree.get("PID1");
+        JsonNode ipv4Node = PID1.get("ipv4");
+        assertEquals("192.168.1.0/24", ipv4Node.get(0).asText());
+    }
+
+}