2 * Copyright (c) 2016 Cisco and/or its affiliates.
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:
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package io.fd.hc2vpp.common.translate.util;
19 import static org.junit.Assert.assertEquals;
20 import static org.mockito.ArgumentMatchers.any;
21 import static org.mockito.Mockito.mock;
22 import static org.mockito.Mockito.times;
23 import static org.mockito.Mockito.verify;
24 import static org.mockito.Mockito.when;
26 import com.google.common.base.Optional;
27 import com.google.common.collect.Lists;
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 org.junit.Before;
36 import org.junit.Test;
37 import org.junit.runner.RunWith;
38 import org.mockito.ArgumentCaptor;
39 import org.mockito.Captor;
40 import org.mockito.Mock;
41 import org.mockito.MockitoAnnotations;
42 import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
43 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.$YangModuleInfoImpl;
44 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.Contexts;
45 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.contexts.NamingContextKey;
46 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.contexts.naming.context.Mappings;
47 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.contexts.naming.context.MappingsBuilder;
48 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.contexts.naming.context.mappings.Mapping;
49 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.contexts.naming.context.mappings.MappingBuilder;
50 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.contexts.naming.context.mappings.MappingKey;
51 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
52 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
54 @RunWith(HoneycombTestRunner.class)
55 public class NamingContextTest implements InjectablesProcessor {
57 private static final String NAME_1 = "name-1";
58 private static final String NAME_2 = "name-2";
60 @InjectTestData(resourcePath = "/naming.json", id = "/naming-context:contexts" +
61 "/naming-context:naming-context[naming-context:name='context']" +
62 "/naming-context:mappings")
63 private Mappings mappings;
66 private MappingContext mappingContext;
69 private ArgumentCaptor<InstanceIdentifier> instanceIdentifierArgumentCaptor;
72 private ArgumentCaptor<Mapping> mappingArgumentCaptor;
74 private NamingContext namingContext;
75 private KeyedInstanceIdentifier<org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.contexts.NamingContext, NamingContextKey>
78 @SchemaContextProvider
79 public ModuleInfoBackedContext schemaContext() {
80 return provideSchemaContextFor(Collections.singleton($YangModuleInfoImpl.getInstance()));
85 MockitoAnnotations.initMocks(this);
87 this.namingContext = new NamingContext("prefix", "context");
88 this.namingContextIid = InstanceIdentifier.create(Contexts.class).child(
89 org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.contexts.NamingContext.class,
90 new NamingContextKey("context"));
92 when(mappingContext.read(namingContextIid.child(Mappings.class))).thenReturn(Optional.of(mappings));
93 when(mappingContext.read(parentKey(NAME_1))).thenReturn(Optional.of(filterForParent(NAME_1)));
94 when(mappingContext.read(parentKey(NAME_2))).thenReturn(Optional.of(filterForParent(NAME_2)));
99 public void addName() throws Exception {
100 namingContext.addName("name-3", mappingContext);
101 verify(mappingContext, times(1))
102 .put(instanceIdentifierArgumentCaptor.capture(), mappingArgumentCaptor.capture());
104 assertEquals(instanceIdentifierArgumentCaptor.getValue(), parentKey("name-3"));
105 assertEquals(mappingArgumentCaptor.getValue(), new MappingBuilder()
112 public void addNameNoMapings() throws Exception {
113 when(mappingContext.read(namingContextIid.child(Mappings.class))).thenReturn(Optional.absent());
115 namingContext.addName("name-0", mappingContext);
116 verify(mappingContext, times(1))
117 .put(instanceIdentifierArgumentCaptor.capture(), mappingArgumentCaptor.capture());
119 assertEquals(instanceIdentifierArgumentCaptor.getValue(), parentKey("name-0"));
120 assertEquals(mappingArgumentCaptor.getValue(), new MappingBuilder()
126 @Test(expected = IllegalArgumentException.class)
127 public void getAndThrow() {
128 when(mappingContext.read(any())).thenReturn(Optional.absent());
130 .getIndex("non-existing", mappingContext, () -> new IllegalArgumentException("Non existing index"));
133 @Test(expected = IllegalStateException.class)
134 public void getNameIfPresentFails() {
135 final Mapping mapping1 = mock(Mapping.class);
136 final Mapping mapping2 = mock(Mapping.class);
137 final Mappings mappings = new MappingsBuilder().setMapping(Lists.newArrayList(mapping1, mapping2)).build();
138 when(mappingContext.read(namingContextIid.child(Mappings.class))).thenReturn(Optional.of(mappings));
140 namingContext.getNameIfPresent(0, mappingContext);
144 public void getNameIfPresentReturnsAbsent() {
145 final Mapping mapping1 = new MappingBuilder().setIndex(1).setName(NAME_1).build();
146 final Mappings mappings = new MappingsBuilder().setMapping(Lists.newArrayList(mapping1)).build();
147 when(mappingContext.read(namingContextIid.child(Mappings.class))).thenReturn(Optional.of(mappings));
149 assertEquals(Optional.absent(), namingContext.getNameIfPresent(0, mappingContext));
153 public void getNameIfPresent() {
154 final Mapping mapping1 = new MappingBuilder().setIndex(1).setName(NAME_1).build();
155 final Mappings mappings = new MappingsBuilder().setMapping(Lists.newArrayList(mapping1)).build();
156 when(mappingContext.read(namingContextIid.child(Mappings.class))).thenReturn(Optional.of(mappings));
158 assertEquals(Optional.of(NAME_1), namingContext.getNameIfPresent(1, mappingContext));
161 private Mapping filterForParent(final String parent) {
162 return mappings.getMapping().stream()
163 .filter(mapping -> mapping.getName().equals(parent))
164 .collect(RWUtils.singleItemCollector());
167 private KeyedInstanceIdentifier<Mapping, MappingKey> parentKey(final String parent) {
168 return namingContextIid.child(Mappings.class).child(Mapping.class, new MappingKey(parent));