From 41acd1beef170c2676389219316e58177c97bde1 Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Thu, 19 Dec 2013 16:17:21 +0100 Subject: [PATCH] Add testing support for registering OSGi services to AbstractConfigTest Change-Id: I17117683f7cba46708bc392e6b36b6a1e40a2dcc Signed-off-by: Maros Marsalek --- .../manager/impl/AbstractConfigTest.java | 84 +++++++++++++++++-- .../config/yang/store/impl/MbeParser.java | 27 +----- .../yang/store/impl/YangParserWrapper.java | 68 +++++++++++++++ 3 files changed, 150 insertions(+), 29 deletions(-) create mode 100644 opendaylight/config/yang-store-impl/src/main/java/org/opendaylight/controller/config/yang/store/impl/YangParserWrapper.java diff --git a/opendaylight/config/config-manager/src/test/java/org/opendaylight/controller/config/manager/impl/AbstractConfigTest.java b/opendaylight/config/config-manager/src/test/java/org/opendaylight/controller/config/manager/impl/AbstractConfigTest.java index fa9e0f169e..81b0921660 100644 --- a/opendaylight/config/config-manager/src/test/java/org/opendaylight/controller/config/manager/impl/AbstractConfigTest.java +++ b/opendaylight/config/config-manager/src/test/java/org/opendaylight/controller/config/manager/impl/AbstractConfigTest.java @@ -7,8 +7,13 @@ */ package org.opendaylight.controller.config.manager.impl; +import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; +import junit.framework.Assert; import org.junit.After; import org.mockito.Matchers; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; import org.opendaylight.controller.config.api.jmx.CommitStatus; import org.opendaylight.controller.config.manager.impl.factoriesresolver.ModuleFactoriesResolver; import org.opendaylight.controller.config.manager.impl.jmx.BaseJMXRegistrator; @@ -26,14 +31,20 @@ import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanServer; import javax.management.ObjectName; import java.io.Closeable; +import java.io.InputStream; import java.lang.management.ManagementFactory; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.Dictionary; +import java.util.List; +import java.util.Map; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; /** @@ -55,6 +66,10 @@ public abstract class AbstractConfigTest extends protected BundleContext mockedContext = mock(BundleContext.class); protected ServiceRegistration mockedServiceRegistration; + protected Map getBundleContextServiceRegistrationHandlers() { + return Maps.newHashMap(); + } + // this method should be called in @Before protected void initConfigTransactionManagerImpl( ModuleFactoriesResolver resolver) { @@ -63,17 +78,14 @@ public abstract class AbstractConfigTest extends configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator( platformMBeanServer); - this.mockedServiceRegistration = mock(ServiceRegistration.class); - doNothing().when(mockedServiceRegistration).unregister(); - doReturn(mockedServiceRegistration).when(mockedContext).registerService( - Matchers.any(String[].class), any(Closeable.class), - any(Dictionary.class)); + initBundleContext(); internalJmxRegistrator = new InternalJMXRegistrator(platformMBeanServer); baseJmxRegistrator = new BaseJMXRegistrator(internalJmxRegistrator); configRegistry = new ConfigRegistryImpl(resolver, platformMBeanServer, baseJmxRegistrator); + try { configRegistryJMXRegistrator.registerToJMX(configRegistry); } catch (InstanceAlreadyExistsException e) { @@ -82,6 +94,35 @@ public abstract class AbstractConfigTest extends configRegistryClient = new ConfigRegistryJMXClient(platformMBeanServer); } + private void initBundleContext() { + this.mockedServiceRegistration = mock(ServiceRegistration.class); + doNothing().when(mockedServiceRegistration).unregister(); + + RegisterServiceAnswer answer = new RegisterServiceAnswer(); + + doAnswer(answer).when(mockedContext).registerService(Matchers.any(String[].class), + any(Closeable.class), Matchers.>any()); + doAnswer(answer).when(mockedContext).registerService(Matchers.>any(), any(Closeable.class), + Matchers.>any()); + } + + + public Collection getFilesAsInputStreams(List paths) { + final Collection resources = new ArrayList<>(); + List failedToFind = new ArrayList<>(); + for (String path : paths) { + InputStream resourceAsStream = getClass().getResourceAsStream(path); + if (resourceAsStream == null) { + failedToFind.add(path); + } else { + resources.add(resourceAsStream); + } + } + Assert.assertEquals("Some files were not found", Collections.emptyList(), failedToFind); + + return resources; + } + @After public final void cleanUpConfigTransactionManagerImpl() { configRegistryJMXRegistrator.close(); @@ -154,4 +195,35 @@ public abstract class AbstractConfigTest extends Class configBeanClass, String implementationName) { return new ClassBasedModuleFactory(implementationName, configBeanClass); } + + + public static interface BundleContextServiceRegistrationHandler { + + void handleServiceRegistration(Object serviceInstance); + + } + + private class RegisterServiceAnswer implements Answer { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + Object[] args = invocation.getArguments(); + + Preconditions.checkArgument(args.length == 3); + + Preconditions.checkArgument(args[0] instanceof Class); + Class serviceType = (Class) args[0]; + Object serviceInstance = args[1]; + + BundleContextServiceRegistrationHandler serviceRegistrationHandler = getBundleContextServiceRegistrationHandlers() + .get(serviceType); + + Preconditions.checkArgument(serviceType.isAssignableFrom(serviceInstance.getClass())); + + if (serviceRegistrationHandler != null) { + serviceRegistrationHandler.handleServiceRegistration(serviceType.cast(serviceInstance)); + } + + return mockedServiceRegistration; + } + } } diff --git a/opendaylight/config/yang-store-impl/src/main/java/org/opendaylight/controller/config/yang/store/impl/MbeParser.java b/opendaylight/config/yang-store-impl/src/main/java/org/opendaylight/controller/config/yang/store/impl/MbeParser.java index 211da6bfef..2be6c81ee7 100644 --- a/opendaylight/config/yang-store-impl/src/main/java/org/opendaylight/controller/config/yang/store/impl/MbeParser.java +++ b/opendaylight/config/yang-store-impl/src/main/java/org/opendaylight/controller/config/yang/store/impl/MbeParser.java @@ -9,7 +9,6 @@ package org.opendaylight.controller.config.yang.store.impl; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import org.apache.commons.io.IOUtils; import org.opendaylight.controller.config.yang.store.api.YangStoreException; import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry; @@ -22,13 +21,10 @@ import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -37,26 +33,11 @@ public class MbeParser { public YangStoreSnapshotImpl parseYangFiles( Collection allInput) throws YangStoreException { - YangParserImpl parser = new YangParserImpl(); + YangParserImpl parser = YangParserWrapper.getYangParserInstance(); - List bufferedInputStreams = new ArrayList<>(); - for (InputStream is : allInput) { - String content; - try { - content = IOUtils.toString(is); - } catch (IOException e) { - throw new YangStoreException("Can not get yang as String from " - + is, e); - } - InputStream buf = new ByteArrayInputStream(content.getBytes()); - bufferedInputStreams.add(buf); - } - - Map allYangModules = parser - .parseYangModelsFromStreamsMapped(bufferedInputStreams); + Map allYangModules = YangParserWrapper.parseYangFiles(parser, allInput); - SchemaContext resolveSchemaContext = parser.resolveSchemaContext(Sets - .newHashSet(allYangModules.values())); + SchemaContext resolveSchemaContext = YangParserWrapper.getSchemaContextFromModules(parser, allYangModules); // JMX generator @@ -115,7 +96,7 @@ public class MbeParser { public Map parseYangFilesToString( Collection allYangs) { - YangParserImpl parser = new YangParserImpl(); + YangParserImpl parser = YangParserWrapper.getYangParserInstance(); Map allYangModules = parser .parseYangModelsFromStreamsMapped(Lists.newArrayList(allYangs)); diff --git a/opendaylight/config/yang-store-impl/src/main/java/org/opendaylight/controller/config/yang/store/impl/YangParserWrapper.java b/opendaylight/config/yang-store-impl/src/main/java/org/opendaylight/controller/config/yang/store/impl/YangParserWrapper.java new file mode 100644 index 0000000000..7c428181aa --- /dev/null +++ b/opendaylight/config/yang-store-impl/src/main/java/org/opendaylight/controller/config/yang/store/impl/YangParserWrapper.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.config.yang.store.impl; + +import com.google.common.collect.Sets; +import org.apache.commons.io.IOUtils; +import org.opendaylight.controller.config.yang.store.api.YangStoreException; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser; +import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class YangParserWrapper { + + /** + * throw IllegalStateException if it is unable to parse yang files + */ + public static SchemaContext parseYangFiles(Collection yangFilesAsInputStreams) { + YangParserImpl parser = getYangParserInstance(); + Map mappedYangModules = null; + try { + mappedYangModules = parseYangFiles(parser, yangFilesAsInputStreams); + } catch (YangStoreException e) { + throw new IllegalStateException("Unable to parse yang files", e); + } + return getSchemaContextFromModules(parser, mappedYangModules); + } + + static YangParserImpl getYangParserInstance() { + return new YangParserImpl(); + } + + static SchemaContext getSchemaContextFromModules(YangModelParser parser, Map allYangModules) { + return parser.resolveSchemaContext(Sets + .newHashSet(allYangModules.values())); + } + + static Map parseYangFiles(YangModelParser parser, Collection allInput) throws YangStoreException { + List bufferedInputStreams = new ArrayList<>(); + for (InputStream is : allInput) { + String content; + try { + content = IOUtils.toString(is); + } catch (IOException e) { + throw new YangStoreException("Can not get yang as String from " + + is, e); + } + InputStream buf = new ByteArrayInputStream(content.getBytes()); + bufferedInputStreams.add(buf); + } + + return parser + .parseYangModelsFromStreamsMapped(bufferedInputStreams); + } +} -- 2.36.6