diff options
author | Maros Marsalek <mmarsale@cisco.com> | 2016-11-08 10:13:36 +0100 |
---|---|---|
committer | Maros Marsalek <mmarsale@cisco.com> | 2016-11-08 13:17:57 +0100 |
commit | 757222979bc02d0aaba1870eea36413383d15bde (patch) | |
tree | 3fe2a502026fbfa9a4ae5627e1a453a057f6c1fa /infra/translate-impl/src/test/java/io/fd/honeycomb/translate/impl/read/registry/CompositeReaderRegistryTest.java | |
parent | 03a638b95da83e150d4f69451c8733b5f09c37aa (diff) |
HONEYCOMB-270 Add isPresent() to Readers/Customizers
So that they can influence whether empty data is to be considered as present
+ Move registries implementations from util to impl
+ Introduce DelegatingReader trait
+ Extend GenericReader where possible to reduce duplication
Change-Id: I5a416acd0c4eab1fbc30fcbe585719991dbe9215
Signed-off-by: Maros Marsalek <mmarsale@cisco.com>
Diffstat (limited to 'infra/translate-impl/src/test/java/io/fd/honeycomb/translate/impl/read/registry/CompositeReaderRegistryTest.java')
-rw-r--r-- | infra/translate-impl/src/test/java/io/fd/honeycomb/translate/impl/read/registry/CompositeReaderRegistryTest.java | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/infra/translate-impl/src/test/java/io/fd/honeycomb/translate/impl/read/registry/CompositeReaderRegistryTest.java b/infra/translate-impl/src/test/java/io/fd/honeycomb/translate/impl/read/registry/CompositeReaderRegistryTest.java new file mode 100644 index 000000000..40068e02c --- /dev/null +++ b/infra/translate-impl/src/test/java/io/fd/honeycomb/translate/impl/read/registry/CompositeReaderRegistryTest.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2016 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.honeycomb.translate.impl.read.registry; + +import static io.fd.honeycomb.translate.util.DataObjects.DataObject3; +import static io.fd.honeycomb.translate.util.DataObjects.DataObject3.DataObject31; +import static io.fd.honeycomb.translate.util.DataObjects.DataObject4; +import static io.fd.honeycomb.translate.util.DataObjects.DataObject4.DataObject41; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import io.fd.honeycomb.translate.read.ReadContext; +import io.fd.honeycomb.translate.read.Reader; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InOrder; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.opendaylight.yangtools.concepts.Builder; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class CompositeReaderRegistryTest { + + @Mock + private ReadContext ctx; + private CompositeReaderRegistry reg; + private Reader<DataObject31, Builder<DataObject31>> reader31; + private Reader<DataObject3, Builder<DataObject3>> rootReader3; + private Reader<DataObject41, Builder<DataObject41>> reader41; + private Reader<DataObject4, Builder<DataObject4>> rootReader4; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + + reader31 = mockReader(DataObject31.class); + final Reader<DataObject3, Builder<DataObject3>> mockedReader3 = mockReader(DataObject3.class); + rootReader3 = + Mockito.spy(CompositeReader.createForReader( + mockedReader3, + ImmutableMap.of(DataObject31.class, reader31))); + // This is a workaround. This functionality is already present in CompositeReader, however when wrapping as spy + // null is always returned. That's why we need to explicitly stub the method with its actual implementation. + // The problem is that the method is inherited as default method from an interface and mockito's spy seems to + // have a problem there + doReturn(mockedReader3.getBuilder(InstanceIdentifier.create(DataObject3.class))) + .when(rootReader3).getBuilder(any(InstanceIdentifier.class)); + + reader41 = mockReader(DataObject41.class); + final Reader<DataObject4, Builder<DataObject4>> mockedReader4 = mockReader(DataObject4.class); + rootReader4 = + Mockito.spy(CompositeReader.createForReader( + mockedReader4, ImmutableMap.of( + DataObject41.class, reader41))); + // Workaround + doReturn(mockedReader4.getBuilder(InstanceIdentifier.create(DataObject4.class))) + .when(rootReader4).getBuilder(any(InstanceIdentifier.class)); + + reg = new CompositeReaderRegistry(Lists.newArrayList(rootReader3, rootReader4)); + } + + @Test + public void testReadAll() throws Exception { + reg.readAll(ctx); + + // Invoked according to composite ordering + final InOrder inOrder = inOrder(rootReader3, rootReader4, reader31, reader41); + inOrder.verify(rootReader3).read(any(InstanceIdentifier.class), any(ReadContext.class)); + inOrder.verify(reader31).read(any(InstanceIdentifier.class), any(ReadContext.class)); + inOrder.verify(rootReader4).read(any(InstanceIdentifier.class), any(ReadContext.class)); + inOrder.verify(reader41).read(any(InstanceIdentifier.class), any(ReadContext.class)); + } + + @Test + public void testReadSingleRoot() throws Exception { + reg.read(DataObject3.IID, ctx); + + // Invoked according to composite ordering + final InOrder inOrder = inOrder(rootReader3, rootReader4, reader31, reader41); + inOrder.verify(rootReader3).read(any(InstanceIdentifier.class), any(ReadContext.class)); + inOrder.verify(reader31).read(any(InstanceIdentifier.class), any(ReadContext.class)); + + // Only subtree under DataObject3 should be read + verify(rootReader4, times(0)).read(any(InstanceIdentifier.class), any(ReadContext.class)); + verify(reader41, times(0)).read(any(InstanceIdentifier.class), any(ReadContext.class)); + } + + @SuppressWarnings("unchecked") + static <D extends DataObject, B extends Builder<D>> Reader<D, B> mockReader(final Class<D> dataType) + throws Exception { + final Reader r = mock(Reader.class); + final Object iid = dataType.getDeclaredField("IID").get(null); + when(r.getManagedDataObjectType()).thenReturn((InstanceIdentifier) iid); + final Builder builder = mock(Builder.class); + when(builder.build()).thenReturn(mock(dataType)); + when(r.getBuilder(any(InstanceIdentifier.class))).thenReturn(builder); + when(r.read(any(InstanceIdentifier.class), any(ReadContext.class))).thenReturn(Optional.of(mock(dataType))); + return (Reader<D, B>) r; + } +}
\ No newline at end of file |