HONEYCOMB-58 - Routing Api
[honeycomb.git] / nat / nat2vpp / src / test / java / io / fd / honeycomb / nat / util / MappingEntryContextTest.java
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.honeycomb.nat.util;
18
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.assertFalse;
21 import static org.junit.Assert.assertSame;
22 import static org.mockito.Matchers.any;
23 import static org.mockito.Mockito.verify;
24 import static org.mockito.Mockito.when;
25 import static org.mockito.MockitoAnnotations.initMocks;
26
27 import com.google.common.base.Optional;
28 import com.google.common.collect.Lists;
29 import io.fd.honeycomb.translate.MappingContext;
30 import io.fd.honeycomb.translate.vpp.util.Ipv4Translator;
31 import io.fd.vpp.jvpp.snat.dto.SnatStaticMappingDetails;
32 import java.util.Collections;
33 import java.util.List;
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.mockito.Mock;
37 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.nat.context.rev161214.mapping.entry.context.attributes.nat.mapping.entry.context.nat.instance.MappingTableBuilder;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev150908.nat.config.nat.instances.nat.instance.mapping.table.MappingEntry;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev150908.nat.config.nat.instances.nat.instance.mapping.table.MappingEntryBuilder;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev150908.nat.config.nat.instances.nat.instance.mapping.table.MappingEntryKey;
43 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
44
45 @SuppressWarnings("unchecked")
46 public class MappingEntryContextTest implements Ipv4Translator {
47
48     private MappingEntryContext ctx = new MappingEntryContext();
49     @Mock
50     private MappingContext mappingCtx;
51
52     @Before
53     public void setUp() throws Exception {
54         initMocks(this);
55     }
56
57     @Test
58     public void testAdd() throws Exception {
59         when(mappingCtx.read(any(InstanceIdentifier.class))).thenReturn(Optional.absent());
60         final long natId = 7;
61         final long entryId = 99;
62         final MappingEntry entry = getEntry(natId, "192.168.1.5", "17.14.4.6");
63
64         ctx.addEntry(natId, entryId, entry, mappingCtx);
65
66         verify(mappingCtx).put(MappingEntryContext.getId(natId, MappingEntryContext.entryToKey(entry)), MappingEntryContext.toCtxMapEntry(entry, entryId));
67     }
68
69     @Test
70     public void testRemove() throws Exception {
71         final long natId = 0;
72         final MappingEntry entry = getEntry(natId, "192.168.1.5", "17.14.4.6");
73
74         ctx.removeEntry(natId, entry, mappingCtx);
75
76         verify(mappingCtx).delete(MappingEntryContext.getId(natId, MappingEntryContext.entryToKey(entry)));
77     }
78
79     @Test
80     public void testGetExistingIndex() throws Exception {
81         final long natId = 0;
82         final long entryId = 12;
83         final MappingEntry entry = getEntry(entryId, "192.168.1.5", "17.14.4.6");
84         final SnatStaticMappingDetails details = getDetails(entryId, "192.168.1.5", "17.14.4.6");
85
86         when(mappingCtx.read(MappingEntryContext.getId(natId, MappingEntryContext.entryToKey(entry))))
87                 .thenReturn(Optional.of(MappingEntryContext.toCtxMapEntry(entry, entryId)));
88
89         assertEquals(12, ctx.getStoredOrArtificialIndex(natId, details, mappingCtx));
90         verify(mappingCtx).read(MappingEntryContext.getId(natId, MappingEntryContext.entryToKey(entry)));
91     }
92
93     @Test
94     public void testFindDetails() throws Exception {
95         final long natId = 0;
96         final MappingEntry entry = getEntry(0, "192.168.1.5", "17.14.4.6");
97         final SnatStaticMappingDetails details = getDetails(0, "192.168.1.5", "17.14.4.6");
98         final MappingEntry entry2 = getEntry(1, "192.168.1.8", "17.14.4.10");
99         final SnatStaticMappingDetails details2 = getDetails(1, "192.168.1.8", "17.14.4.10");
100
101         final List<SnatStaticMappingDetails> someDetails = Lists.newArrayList(details, details2);
102
103         when(mappingCtx.read(MappingEntryContext.getTableId(natId)))
104                 .thenReturn(Optional.of(new MappingTableBuilder()
105                         .setMappingEntry(Lists.newArrayList(
106                                 MappingEntryContext.toCtxMapEntry(entry, 0),
107                                 MappingEntryContext.toCtxMapEntry(entry2, 1)))
108                         .build()));
109
110         assertSame(details, ctx.findDetails(someDetails, natId, 0, mappingCtx));
111     }
112
113     @Test(expected = IllegalStateException.class)
114     public void testFindDetailsNoMappingStored() throws Exception {
115         final long natId = 0;
116         final long entryId = 12;
117         final SnatStaticMappingDetails details = getDetails(entryId, "192.168.1.5", "17.14.4.6");
118         final List<SnatStaticMappingDetails> someDetails = Lists.newArrayList(details);
119         when(mappingCtx.read(MappingEntryContext.getTableId(natId))).thenReturn(Optional.absent());
120
121         ctx.findDetails(someDetails, natId, entryId, mappingCtx);
122     }
123
124     @Test(expected = IllegalStateException.class)
125     public void testFindDetailsNoMappingStored2() throws Exception {
126         final long natId = 0;
127         final long entryId = 12;
128         final SnatStaticMappingDetails details = getDetails(entryId, "192.168.1.5", "17.14.4.6");
129         final List<SnatStaticMappingDetails> someDetails = Lists.newArrayList(details);
130
131         when(mappingCtx.read(MappingEntryContext.getTableId(natId)))
132                 .thenReturn(Optional.of(new MappingTableBuilder().setMappingEntry(Collections.emptyList()).build()));
133
134         ctx.findDetails(someDetails, natId, entryId, mappingCtx);
135     }
136
137     @Test
138     public void testGetArtificialIndex() throws Exception {
139         final long natId = 0;
140         final long entryId = 0;
141         final MappingEntry entry = getEntry(entryId, "192.168.1.5", "17.14.4.6");
142         final long entryId2 = 55;
143         final MappingEntry entry2 = getEntry(entryId2, "192.168.1.6", "17.14.4.7");
144         final long entryId3 = 18954;
145         final MappingEntry entry3 = getEntry(entryId3, "192.168.1.7", "17.14.4.8");
146         final long entryId4 = 18955;
147         final MappingEntry entry4 = getEntry(entryId4, "192.168.1.8", "17.14.4.9");
148
149         final long newEntryId = 18956;
150         final MappingEntry newEntry = getEntry(newEntryId, "192.168.1.99", "17.14.4.99");
151         final SnatStaticMappingDetails newDetails = getDetails(newEntryId, "192.168.1.99", "17.14.4.99");
152         when(mappingCtx.read(MappingEntryContext.getId(natId, MappingEntryContext.entryToKey(newEntry))))
153                 .thenReturn(Optional.absent());
154
155         when(mappingCtx.read(MappingEntryContext.getTableId(natId)))
156                 .thenReturn(Optional.of(new MappingTableBuilder()
157                         .setMappingEntry(Lists.newArrayList(
158                                 MappingEntryContext.toCtxMapEntry(entry, entryId),
159                                 MappingEntryContext.toCtxMapEntry(entry3, entryId3),
160                                 MappingEntryContext.toCtxMapEntry(entry4, entryId4),
161                                 MappingEntryContext.toCtxMapEntry(entry2, entryId2)))
162                         .build()));
163
164         assertFalse(ctx.getStoredIndex(natId, newEntry, mappingCtx).isPresent());
165         assertEquals(newEntryId, ctx.getStoredOrArtificialIndex(natId, newDetails, mappingCtx));
166     }
167
168     private SnatStaticMappingDetails getDetails(final long vrfId, final String localIp, final String externIp) {
169         final SnatStaticMappingDetails snatStaticMappingDetails = new SnatStaticMappingDetails();
170         snatStaticMappingDetails.vrfId = (int) vrfId;
171         snatStaticMappingDetails.addrOnly = 1;
172         snatStaticMappingDetails.isIp4 = 1;
173         snatStaticMappingDetails.localIpAddress = ipv4AddressNoZoneToArray(localIp);
174         snatStaticMappingDetails.externalIpAddress = ipv4AddressNoZoneToArray(externIp);
175         return snatStaticMappingDetails;
176     }
177
178     @Test(expected = IllegalArgumentException.class)
179     public void testAddExisting() throws Exception {
180         final long natId = 7;
181         final long entryId = 99;
182         final MappingEntry entry = getEntry(natId, "192.168.1.5", "17.14.4.6");
183         final org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.nat.context.rev161214.mapping.entry.context.attributes.nat.mapping.entry.context.nat.instance.mapping.table.MappingEntry
184                 data = MappingEntryContext.toCtxMapEntry(entry, entryId);
185         when(mappingCtx.read(any(InstanceIdentifier.class))).thenReturn(Optional.of(data));
186
187         ctx.addEntry(natId, entryId, entry, mappingCtx);
188     }
189
190     private static MappingEntry getEntry(final long id, final String longernalIpv4, final String externalIpv4) {
191         return new MappingEntryBuilder()
192                 .setKey(new MappingEntryKey(id))
193                 .setType(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev150908.MappingEntry.Type.Static)
194                 .setInternalSrcAddress(new IpAddress(new Ipv4Address(longernalIpv4)))
195                 .setExternalSrcAddress(new Ipv4Address(externalIpv4))
196                 .build();
197     }
198 }