b38ce6e2674d956b74a6685b813f29ac000ee3b5
[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.common.translate.util;
18
19 import static org.hamcrest.MatcherAssert.assertThat;
20 import static org.hamcrest.Matchers.contains;
21 import static org.hamcrest.Matchers.hasSize;
22 import static org.junit.Assert.assertEquals;
23 import static org.mockito.Mockito.times;
24 import static org.mockito.Mockito.verify;
25 import static org.mockito.Mockito.when;
26
27 import com.google.common.base.Optional;
28 import io.fd.honeycomb.test.tools.HoneycombTestRunner;
29 import io.fd.honeycomb.test.tools.annotations.InjectTestData;
30 import io.fd.honeycomb.test.tools.annotations.InjectablesProcessor;
31 import io.fd.honeycomb.test.tools.annotations.SchemaContextProvider;
32 import io.fd.honeycomb.translate.MappingContext;
33 import io.fd.honeycomb.translate.util.RWUtils;
34 import java.util.Collections;
35 import java.util.List;
36 import org.junit.Before;
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39 import org.mockito.ArgumentCaptor;
40 import org.mockito.Captor;
41 import org.mockito.Mock;
42 import org.mockito.Mockito;
43 import org.mockito.MockitoAnnotations;
44 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.multi.naming.context.rev160411.$YangModuleInfoImpl;
45 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.multi.naming.context.rev160411.MultiMappingCtxAugmentation;
46 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.multi.naming.context.rev160411.multi.naming.contexts.attributes.MultiNamingContexts;
47 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.multi.naming.context.rev160411.multi.naming.contexts.attributes.multi.naming.contexts.MultiNaming;
48 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.multi.naming.context.rev160411.multi.naming.contexts.attributes.multi.naming.contexts.MultiNamingKey;
49 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.multi.naming.context.rev160411.multi.naming.contexts.attributes.multi.naming.contexts.multi.naming.Mappings;
50 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.multi.naming.context.rev160411.multi.naming.contexts.attributes.multi.naming.contexts.multi.naming.mappings.Mapping;
51 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.multi.naming.context.rev160411.multi.naming.contexts.attributes.multi.naming.contexts.multi.naming.mappings.MappingKey;
52 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.multi.naming.context.rev160411.multi.naming.contexts.attributes.multi.naming.contexts.multi.naming.mappings.mapping.Value;
53 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.multi.naming.context.rev160411.multi.naming.contexts.attributes.multi.naming.contexts.multi.naming.mappings.mapping.ValueBuilder;
54 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.multi.naming.context.rev160411.multi.naming.contexts.attributes.multi.naming.contexts.multi.naming.mappings.mapping.ValueKey;
55 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.Contexts;
56 import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
57 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
58 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
59
60 @RunWith(HoneycombTestRunner.class)
61 public class MultiNamingContextTest implements InjectablesProcessor {
62
63     private static final String NON_EXISTING_PARENT = "non-existing-parent";
64     private static final String PARENT_1 = "parent-1";
65     private static final String PARENT_2 = "parent-2";
66     private static final String PARENT_3 = "parent-3";
67     private static final String CHILD_1 = "child-1";
68     private static final String CHILD_2 = "child-2";
69     private static final String CHILD_3 = "child-3";
70
71     @Mock
72     private MappingContext mappingContext;
73
74     @Captor
75     private ArgumentCaptor<InstanceIdentifier> instanceIdentifierArgumentCaptor;
76
77     @Captor
78     private ArgumentCaptor<Mapping> mappingArgumentCaptor;
79
80     private MultiNamingContext namingContext;
81     private KeyedInstanceIdentifier<MultiNaming, MultiNamingKey> multiNamingContextIid;
82
83     @InjectTestData(resourcePath = "/multi-mapping.json",
84             id = "/naming-context:contexts/" +
85                     "multi-naming-context:multi-naming-contexts" +
86                     "/multi-naming-context:multi-naming[multi-naming-context:name='context']" +
87                     "/multi-naming-context:mappings")
88     private Mappings mappings;
89
90     @SchemaContextProvider
91     public ModuleInfoBackedContext schemaContext() {
92         return provideSchemaContextFor(Collections.singleton($YangModuleInfoImpl.getInstance()));
93     }
94
95     @Before
96     public void init() {
97         MockitoAnnotations.initMocks(this);
98         this.namingContext = new MultiNamingContext("context", 3);
99         this.multiNamingContextIid = InstanceIdentifier.create(Contexts.class)
100                 .augmentation(MultiMappingCtxAugmentation.class)
101                 .child(MultiNamingContexts.class)
102                 .child(MultiNaming.class, new MultiNamingKey("context"));
103
104         when(mappingContext.read(multiNamingContextIid.child(Mappings.class))).thenReturn(Optional.of(mappings));
105         when(mappingContext.read(parentKey(NON_EXISTING_PARENT))).thenReturn(Optional.absent());
106         when(mappingContext.read(parentKey(PARENT_1))).thenReturn(Optional.of(filterForParent(PARENT_1)));
107         when(mappingContext.read(parentKey(PARENT_2))).thenReturn(Optional.of(filterForParent(PARENT_2)));
108         when(mappingContext.read(parentKey(PARENT_3))).thenReturn(Optional.of(filterForParent(PARENT_3)));
109     }
110
111     private Mapping filterForParent(final String parent) {
112         return mappings.getMapping().stream()
113                 .filter(mapping -> mapping.getName().equals(parent))
114                 .collect(RWUtils.singleItemCollector());
115     }
116
117     private KeyedInstanceIdentifier<Mapping, MappingKey> parentKey(final String parent) {
118         return multiNamingContextIid.child(Mappings.class).child(Mapping.class, new MappingKey(parent));
119     }
120
121     @Test
122     public void addChildSpecificIndex() throws Exception {
123         namingContext.addChild(PARENT_1, 3, CHILD_1, mappingContext);
124
125         verify(mappingContext, times(1))
126                 .merge(instanceIdentifierArgumentCaptor.capture(), mappingArgumentCaptor.capture());
127
128         assertEquals(instanceIdentifierArgumentCaptor.getValue(), parentKey(PARENT_1));
129
130         final Mapping mapping = mappingArgumentCaptor.getValue();
131         final List<Value> values = mapping.getValue();
132         assertEquals(PARENT_1, mapping.getName());
133         assertThat(values, hasSize(1));
134
135         final Value child = values.get(0);
136         assertEquals(CHILD_1, child.getName());
137         assertEquals(3, child.getIndex().intValue());
138     }
139
140     @Test(expected = IllegalArgumentException.class)
141     public void addInvalidIndex() {
142         namingContext.addChild(PARENT_1, 2, CHILD_1, mappingContext);
143     }
144
145     @Test
146     public void addChildNextAvailableIndex() throws Exception {
147         namingContext.addChild(PARENT_1, CHILD_1, mappingContext);
148
149         verify(mappingContext, times(1))
150                 .merge(instanceIdentifierArgumentCaptor.capture(), mappingArgumentCaptor.capture());
151         assertEquals(instanceIdentifierArgumentCaptor.getValue(), parentKey(PARENT_1));
152
153         final Mapping mapping = mappingArgumentCaptor.getValue();
154         final List<Value> values = mapping.getValue();
155         assertEquals(PARENT_1, mapping.getName());
156         assertThat(values, hasSize(1));
157
158         final Value child = values.get(0);
159         assertEquals(CHILD_1, child.getName());
160         assertEquals(4, child.getIndex().intValue());
161     }
162
163     @Test
164     public void getChildName() throws Exception {
165         assertEquals(CHILD_1, namingContext.getChildName(PARENT_1, 1, mappingContext));
166     }
167
168     @Test
169     public void getChildIndex() throws Exception {
170         assertEquals(1, namingContext.getChildIndex(PARENT_1, CHILD_1, mappingContext));
171     }
172
173     @Test
174     public void removeChild() throws Exception {
175         namingContext.removeChild(PARENT_1, CHILD_1, mappingContext);
176
177         verify(mappingContext, times(1))
178                 .put(instanceIdentifierArgumentCaptor.capture(), mappingArgumentCaptor.capture());
179
180         assertEquals(instanceIdentifierArgumentCaptor.getValue(), parentKey(PARENT_1));
181         final Mapping mapping = mappingArgumentCaptor.getValue();
182         final List<Value> values = mapping.getValue();
183
184         assertEquals(PARENT_1, mapping.getName());
185         assertThat(values, hasSize(2));
186         assertThat(values, contains(valueFor(CHILD_2, 2), valueFor(CHILD_3, 3)));
187     }
188
189     @Test
190     public void removeChildNonExistingParent() {
191         namingContext.removeChild(NON_EXISTING_PARENT, CHILD_1, mappingContext);
192         // if parent doest not exist, do nothing
193         verify(mappingContext, times(0)).put(Mockito.any(), Mockito.any());
194     }
195
196     private Value valueFor(final String name, final int index) {
197         return new ValueBuilder().setName(name).setIndex(index).setKey(new ValueKey(name)).build();
198     }
199 }
200