4e0a0efd5351243a3181266e52ce0989ec7432c1
[hc2vpp.git] /
1 /*
2  * Copyright (c) 2016 Cisco and/or its affiliates.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package io.fd.hc2vpp.routing.write.factory;
18
19 import static io.fd.hc2vpp.routing.write.trait.RouteRequestProducer.DEFAULT_VNI;
20 import static org.junit.Assert.assertEquals;
21 import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.SpecialNextHop.SpecialNextHopEnum.Blackhole;
22 import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.SpecialNextHop.SpecialNextHopEnum.Prohibit;
23 import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.SpecialNextHop.SpecialNextHopEnum.Receive;
24 import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.SpecialNextHop.SpecialNextHopEnum.Unreachable;
25
26 import io.fd.hc2vpp.common.test.util.NamingContextHelper;
27 import io.fd.hc2vpp.common.translate.util.NamingContext;
28 import io.fd.hc2vpp.routing.Ipv6RouteData;
29 import io.fd.hc2vpp.routing.helpers.ClassifyTableTestHelper;
30 import io.fd.hc2vpp.routing.helpers.RoutingRequestTestHelper;
31 import io.fd.hc2vpp.routing.helpers.SchemaContextTestHelper;
32 import io.fd.hc2vpp.vpp.classifier.context.VppClassifierContextManager;
33 import io.fd.honeycomb.test.tools.HoneycombTestRunner;
34 import io.fd.honeycomb.test.tools.annotations.InjectTestData;
35 import io.fd.honeycomb.translate.MappingContext;
36 import io.fd.honeycomb.translate.util.RWUtils;
37 import io.fd.vpp.jvpp.core.dto.IpAddDelRoute;
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.junit.runner.RunWith;
41 import org.mockito.Mock;
42 import org.mockito.MockitoAnnotations;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.StaticRoutes1;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv6.unicast.routing.rev180313.routing.control.plane.protocols.control.plane.protocol._static.routes.ipv6.Route;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev180313.routing.control.plane.protocols.control.plane.protocol.StaticRoutes;
47
48 @RunWith(HoneycombTestRunner.class)
49 public class SpecialNextHopRequestFactoryIpv6Test
50         implements RoutingRequestTestHelper, ClassifyTableTestHelper, SchemaContextTestHelper, NamingContextHelper {
51
52     private static final String PARENT_PROTOCOL_6 = "parent-protocol-6";
53     private static final int PARENT_PROTOCOL_6_INDEX = 6;
54     public static final Ipv6Prefix IPV_6_PREFIX = new Ipv6Prefix("2001:0db8:0a0b:12f0:0000:0000:0000:0001/64");
55     public static final int DST_PREFIX = 64;
56
57     @Mock
58     private VppClassifierContextManager classifierContextManager;
59
60     @Mock
61     private MappingContext mappingContext;
62
63     private NamingContext interfaceContext;
64     private NamingContext routingProtocolContextContext;
65
66     private SpecialNextHopRequestFactory factory;
67
68     @Before
69     public void init() {
70         MockitoAnnotations.initMocks(this);
71         interfaceContext = new NamingContext("iface", "interface-context");
72         routingProtocolContextContext =
73             new NamingContext("routingProtocol", "routing-protocol-context");
74         factory = SpecialNextHopRequestFactory.forContexts(classifierContextManager, interfaceContext,
75                                                            routingProtocolContextContext);
76
77         addMapping(classifierContextManager, CLASSIFY_TABLE_NAME, CLASSIFY_TABLE_INDEX, mappingContext);
78         defineMapping(mappingContext, PARENT_PROTOCOL_6, PARENT_PROTOCOL_6_INDEX, "routing-protocol-context");
79     }
80
81     @Test
82     public void testIpv6Blackhole(
83             @InjectTestData(resourcePath = "/ipv6/specialhop/specialHopRouteBlackhole.json", id = STATIC_ROUTE_PATH)
84                 StaticRoutes routes) {
85         final IpAddDelRoute request =
86             factory.createIpv6SpecialHopRequest(true, PARENT_PROTOCOL_6, extractSingleRoute(routes, IPV_6_PREFIX),
87                                                 mappingContext, Blackhole);
88
89         assertEquals(desiredSpecialResult(1, 1, Ipv6RouteData.FIRST_ADDRESS_AS_ARRAY, DST_PREFIX, 1, 0, 0, 0,
90                                           PARENT_PROTOCOL_6_INDEX, DEFAULT_VNI),
91                      request);
92     }
93
94     @Test
95     public void testIpv6Receive(
96             @InjectTestData(resourcePath = "/ipv6/specialhop/specialHopRouteReceive.json", id = STATIC_ROUTE_PATH)
97                     StaticRoutes routes) {
98         final IpAddDelRoute request =
99                 factory.createIpv6SpecialHopRequest(true, PARENT_PROTOCOL_6, extractSingleRoute(routes, IPV_6_PREFIX),
100                                                     mappingContext, Receive);
101
102         assertEquals(desiredSpecialResult(1, 1, Ipv6RouteData.FIRST_ADDRESS_AS_ARRAY, DST_PREFIX, 0, 1, 0, 0,
103                                           PARENT_PROTOCOL_6_INDEX, DEFAULT_VNI),
104                      request);
105     }
106
107     @Test
108     public void testIpv6Unreach(
109             @InjectTestData(resourcePath = "/ipv6/specialhop/specialHopRouteUnreachable.json", id = STATIC_ROUTE_PATH)
110                     StaticRoutes routes) {
111         final IpAddDelRoute request =
112                 factory.createIpv6SpecialHopRequest(true, PARENT_PROTOCOL_6, extractSingleRoute(routes, IPV_6_PREFIX),
113                                                     mappingContext, Unreachable);
114
115         assertEquals(desiredSpecialResult(1, 1, Ipv6RouteData.FIRST_ADDRESS_AS_ARRAY, DST_PREFIX, 0, 0, 1, 0,
116                                           PARENT_PROTOCOL_6_INDEX, DEFAULT_VNI),
117                      request);
118     }
119
120     @Test
121     public void testIpv6Prohibited(
122             @InjectTestData(resourcePath = "/ipv6/specialhop/specialHopRouteProhibited.json", id = STATIC_ROUTE_PATH)
123                     StaticRoutes routes) {
124         final IpAddDelRoute request =
125                 factory.createIpv6SpecialHopRequest(true, PARENT_PROTOCOL_6, extractSingleRoute(routes, IPV_6_PREFIX),
126                                                     mappingContext, Prohibit);
127
128         assertEquals(desiredSpecialResult(1, 1, Ipv6RouteData.FIRST_ADDRESS_AS_ARRAY, DST_PREFIX, 0, 0, 0, 1,
129                                           PARENT_PROTOCOL_6_INDEX, DEFAULT_VNI),
130                      request);
131     }
132
133     private Route extractSingleRoute(final StaticRoutes staticRoutes, final Ipv6Prefix id) {
134         return staticRoutes.getAugmentation(StaticRoutes1.class).getIpv6().getRoute().stream()
135                 .filter(route -> route.getDestinationPrefix().getValue().equals(id.getValue())).collect(
136                         RWUtils.singleItemCollector());
137     }
138
139 }