Author: sseifert Date: Fri Nov 14 09:55:05 2014 New Revision: 1639589 URL: http://svn.apache.org/r1639589 Log: SLING-4162 Introduce "OsgiContext" junit rule for OSGi and OsgiContextImpl
Added: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java (with props) sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java (with props) sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java (with props) sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java (with props) sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java (with props) sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/ sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java (with props) sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/junit/ sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java (with props) Modified: sling/trunk/testing/mocks/osgi-mock/pom.xml sling/trunk/testing/mocks/sling-mock/pom.xml sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/junit/SlingContext.java sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/junit/package-info.java sling/trunk/testing/mocks/sling-mock/src/test/java/org/apache/sling/testing/mock/sling/context/SlingContextImplTest.java sling/trunk/testing/mocks/sling-mock/src/test/java/org/apache/sling/testing/mock/sling/junit/SlingContextTest.java Modified: sling/trunk/testing/mocks/osgi-mock/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/pom.xml?rev=1639589&r1=1639588&r2=1639589&view=diff ============================================================================== --- sling/trunk/testing/mocks/osgi-mock/pom.xml (original) +++ sling/trunk/testing/mocks/osgi-mock/pom.xml Fri Nov 14 09:55:05 2014 @@ -92,7 +92,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <scope>test</scope> + <scope>compile</scope> </dependency> </dependencies> Added: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java?rev=1639589&view=auto ============================================================================== --- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java (added) +++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java Fri Nov 14 09:55:05 2014 @@ -0,0 +1,185 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.sling.testing.mock.osgi.context; + +import java.lang.reflect.Array; +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Map; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.sling.testing.mock.osgi.MockOsgi; +import org.osgi.framework.BundleContext; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.osgi.service.component.ComponentContext; + +import aQute.bnd.annotation.ConsumerType; + +import com.google.common.collect.ImmutableMap; + +/** + * Defines OSGi context objects and helper methods. Should not be used directly + * but via the {@link org.apache.sling.testing.mock.osgi.junit.OsgiContext} JUnit rule. + */ +@ConsumerType +public class OsgiContextImpl { + + protected ComponentContext componentContext; + + /** + * Setup actions before test method execution + */ + protected void setUp() { + // can be overridden by subclasses + } + + /** + * Teardown actions after test method execution + */ + protected void tearDown() { + // can be overridden by subclasses + } + + /** + * @return OSGi component context + */ + public final ComponentContext componentContext() { + if (this.componentContext == null) { + this.componentContext = MockOsgi.newComponentContext(); + } + return this.componentContext; + } + + /** + * @return OSGi Bundle context + */ + public final BundleContext bundleContext() { + return componentContext().getBundleContext(); + } + + /** + * Registers a service in the mocked OSGi environment. + * @param <T> Service type + * @param service Service instance + * @return Registered service instance + */ + public final <T> T registerService(final T service) { + return registerService(null, service, null); + } + + /** + * Registers a service in the mocked OSGi environment. + * @param <T> Service type + * @param serviceClass Service class + * @param service Service instance + * @return Registered service instance + */ + public final <T> T registerService(final Class<T> serviceClass, final T service) { + return registerService(serviceClass, service, null); + } + + /** + * Registers a service in the mocked OSGi environment. + * @param <T> Service type + * @param serviceClass Service class + * @param service Service instance + * @param properties Service properties (optional) + * @return Registered service instance + */ + public final <T> T registerService(final Class<T> serviceClass, final T service, final Map<String, Object> properties) { + Dictionary<String, Object> serviceProperties = null; + if (properties != null) { + serviceProperties = new Hashtable<String, Object>(properties); + } + bundleContext().registerService(serviceClass != null ? serviceClass.getName() : null, service, + serviceProperties); + return service; + } + + /** + * Injects dependencies, activates and registers a service in the mocked + * OSGi environment. + * @param <T> Service type + * @param service Service instance + * @return Registered service instance + */ + public final <T> T registerInjectActivateService(final T service) { + return registerInjectActivateService(service, ImmutableMap.<String, Object> of()); + } + + /** + * Injects dependencies, activates and registers a service in the mocked + * OSGi environment. + * @param <T> Service type + * @param service Service instance + * @param properties Service properties (optional) + * @return Registered service instance + */ + public final <T> T registerInjectActivateService(final T service, final Map<String, Object> properties) { + MockOsgi.injectServices(service, bundleContext()); + MockOsgi.activate(service, bundleContext(), properties); + registerService(null, service, null); + return service; + } + + /** + * Lookup a single service + * @param <ServiceType> Service type + * @param serviceType The type (interface) of the service. + * @return The service instance, or null if the service is not available. + */ + @SuppressWarnings("unchecked") + public final <ServiceType> ServiceType getService(final Class<ServiceType> serviceType) { + ServiceReference serviceReference = bundleContext().getServiceReference(serviceType.getName()); + if (serviceReference != null) { + return (ServiceType)bundleContext().getService(serviceReference); + } else { + return null; + } + } + + /** + * Lookup one or several services + * @param <ServiceType> Service type + * @param serviceType The type (interface) of the service. + * @param filter An optional filter (LDAP-like, see OSGi spec) + * @return The services instances or an empty array. + * @throws RuntimeException If the <code>filter</code> string is not a valid OSGi service filter string. + */ + @SuppressWarnings("unchecked") + public final <ServiceType> ServiceType[] getServices(final Class<ServiceType> serviceType, final String filter) { + try { + ServiceReference[] serviceReferences = bundleContext().getServiceReferences(serviceType.getName(), + filter); + if (serviceReferences != null) { + ServiceType[] services = (ServiceType[])Array.newInstance(serviceType, serviceReferences.length); + for (int i = 0; i < serviceReferences.length; i++) { + services[i] = (ServiceType)bundleContext().getService(serviceReferences[i]); + } + return services; + } else { + return (ServiceType[])ArrayUtils.EMPTY_OBJECT_ARRAY; + } + } catch (InvalidSyntaxException ex) { + throw new RuntimeException("Invalid filter syntax: " + filter, ex); + } + } + +} Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java ------------------------------------------------------------------------------ --- svn:keywords (added) +++ svn:keywords Fri Nov 14 09:55:05 2014 @@ -0,0 +1 @@ +LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java?rev=1639589&view=auto ============================================================================== --- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java (added) +++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java Fri Nov 14 09:55:05 2014 @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +/** + * OSGi context implementation for unit tests. + */ +@aQute.bnd.annotation.Version("1.0") +package org.apache.sling.testing.mock.osgi.context; Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java ------------------------------------------------------------------------------ --- svn:keywords (added) +++ svn:keywords Fri Nov 14 09:55:05 2014 @@ -0,0 +1 @@ +LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/context/package-info.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java?rev=1639589&view=auto ============================================================================== --- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java (added) +++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java Fri Nov 14 09:55:05 2014 @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.sling.testing.mock.osgi.junit; + +import org.apache.sling.testing.mock.osgi.context.OsgiContextImpl; +import org.junit.rules.ExternalResource; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +/** + * JUnit rule for setting up and tearing down OSGi context for unit tests. + */ +public final class OsgiContext extends OsgiContextImpl implements TestRule { + + private final OsgiContextCallback setUpCallback; + private final OsgiContextCallback tearDownCallback; + private final TestRule delegate; + + /** + * Initialize Sling context with default resource resolver type: + * {@link org.apache.sling.testing.mock.sling.MockSling#DEFAULT_RESOURCERESOLVER_TYPE}. + */ + public OsgiContext() { + this(null, null); + } + + /** + * Initialize Sling context with default resource resolver type: + * {@link org.apache.sling.testing.mock.sling.MockSling#DEFAULT_RESOURCERESOLVER_TYPE}. + * @param setUpCallback Allows the application to register an own callback + * function that is called after the built-in setup rules are + * executed. + */ + public OsgiContext(final OsgiContextCallback setUpCallback) { + this(setUpCallback, null); + } + + /** + * Initialize Sling context with resource resolver type. + * @param setUpCallback Allows the application to register an own callback + * function that is called after the built-in setup rules are + * executed. + * @param tearDownCallback Allows the application to register an own + * callback function that is called before the built-in teardown + * rules are executed. + * @param resourceResolverType Resource resolver type. + */ + public OsgiContext(final OsgiContextCallback setUpCallback, final OsgiContextCallback tearDownCallback) { + + this.setUpCallback = setUpCallback; + this.tearDownCallback = tearDownCallback; + + // wrap {@link ExternalResource} rule executes each test method once + this.delegate = new ExternalResource() { + @Override + protected void before() { + OsgiContext.this.setUp(); + OsgiContext.this.executeSetUpCallback(); + } + + @Override + protected void after() { + OsgiContext.this.executeTearDownCallback(); + OsgiContext.this.tearDown(); + } + }; + } + + @Override + public Statement apply(final Statement base, final Description description) { + return this.delegate.apply(base, description); + } + + private void executeSetUpCallback() { + if (this.setUpCallback != null) { + try { + this.setUpCallback.execute(this); + } catch (Throwable ex) { + throw new RuntimeException("Executing setup callback failed.", ex); + } + } + } + + private void executeTearDownCallback() { + if (this.tearDownCallback != null) { + try { + this.tearDownCallback.execute(this); + } catch (Throwable ex) { + throw new RuntimeException("Executing setup callback failed.", ex); + } + } + } + +} Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java ------------------------------------------------------------------------------ --- svn:keywords (added) +++ svn:keywords Fri Nov 14 09:55:05 2014 @@ -0,0 +1 @@ +LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContext.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java?rev=1639589&view=auto ============================================================================== --- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java (added) +++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java Fri Nov 14 09:55:05 2014 @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.sling.testing.mock.osgi.junit; + +import java.io.IOException; + +/** + * Callback-interface for application-specific setup and teardown operations to + * customize the {@link OsgiContext} JUnit rule. + */ +public interface OsgiContextCallback { + + /** + * Execute callback action + * @param context Sling context + * @throws IOException + * @throws PersistenceException + */ + void execute(OsgiContext context) throws IOException; + +} Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java ------------------------------------------------------------------------------ --- svn:keywords (added) +++ svn:keywords Fri Nov 14 09:55:05 2014 @@ -0,0 +1 @@ +LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextCallback.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java?rev=1639589&view=auto ============================================================================== --- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java (added) +++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java Fri Nov 14 09:55:05 2014 @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +/** + * Rule for providing easy access to OSGi context in JUnit tests. + */ +@aQute.bnd.annotation.Version("1.0") +package org.apache.sling.testing.mock.osgi.junit; Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java ------------------------------------------------------------------------------ --- svn:keywords (added) +++ svn:keywords Fri Nov 14 09:55:05 2014 @@ -0,0 +1 @@ +LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author Propchange: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/junit/package-info.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java?rev=1639589&view=auto ============================================================================== --- sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java (added) +++ sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java Fri Nov 14 09:55:05 2014 @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.sling.testing.mock.osgi.context; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.osgi.framework.ServiceReference; + +public class OsgiContextImplTest { + + private OsgiContextImpl context; + + @Before + public void setUp() throws Exception { + this.context = new OsgiContextImpl(); + this.context.setUp(); + } + + @After + public void tearDown() throws Exception { + this.context.tearDown(); + } + + @Test + public void testContextObjects() { + assertNotNull(context.componentContext()); + assertNotNull(context.bundleContext()); + } + + @Test + public void testRegisterService() { + Set<String> myService = new HashSet<String>(); + context.registerService(Set.class, myService); + + Set<?> serviceResult = context.getService(Set.class); + assertSame(myService, serviceResult); + } + + @Test + public void testRegisterServiceWithProperties() { + Map<String, Object> props = new HashMap<String, Object>(); + props.put("prop1", "value1"); + + Set<String> myService = new HashSet<String>(); + context.registerService(Set.class, myService, props); + + ServiceReference serviceReference = context.bundleContext().getServiceReference(Set.class.getName()); + Object serviceResult = context.bundleContext().getService(serviceReference); + assertSame(myService, serviceResult); + assertEquals("value1", serviceReference.getProperty("prop1")); + } + + @Test + public void testRegisterMultipleServices() { + Set<String> myService1 = new HashSet<String>(); + context.registerService(Set.class, myService1); + Set<String> myService2 = new HashSet<String>(); + context.registerService(Set.class, myService2); + + Set[] serviceResults = context.getServices(Set.class, null); + assertSame(myService1, serviceResults[0]); + assertSame(myService2, serviceResults[1]); + } + + @Test + public void testRegisterInjectActivate() { + context.registerInjectActivateService(new Object()); + } + +} Propchange: sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java ------------------------------------------------------------------------------ --- svn:keywords (added) +++ svn:keywords Fri Nov 14 09:55:05 2014 @@ -0,0 +1 @@ +LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author Propchange: sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java?rev=1639589&view=auto ============================================================================== --- sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java (added) +++ sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java Fri Nov 14 09:55:05 2014 @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.sling.testing.mock.osgi.junit; + +import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import java.io.IOException; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class OsgiContextTest { + + private final OsgiContextCallback contextSetup = mock(OsgiContextCallback.class); + private final OsgiContextCallback contextTeardown = mock(OsgiContextCallback.class); + + // Run all unit tests for each resource resolver types listed here + @Rule + public OsgiContext context = new OsgiContext(contextSetup, contextTeardown); + + @Before + public void setUp() throws IOException { + verify(contextSetup).execute(context); + } + + @Test + public void testBundleContext() { + assertNotNull(context.bundleContext()); + } + +} Propchange: sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java ------------------------------------------------------------------------------ --- svn:keywords (added) +++ svn:keywords Fri Nov 14 09:55:05 2014 @@ -0,0 +1 @@ +LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author Propchange: sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/junit/OsgiContextTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: sling/trunk/testing/mocks/sling-mock/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/sling-mock/pom.xml?rev=1639589&r1=1639588&r2=1639589&view=diff ============================================================================== --- sling/trunk/testing/mocks/sling-mock/pom.xml (original) +++ sling/trunk/testing/mocks/sling-mock/pom.xml Fri Nov 14 09:55:05 2014 @@ -49,7 +49,7 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.testing.osgi-mock</artifactId> - <version>1.0.0</version> + <version>1.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency> <dependency> Modified: sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java?rev=1639589&r1=1639588&r2=1639589&view=diff ============================================================================== --- sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java (original) +++ sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java Fri Nov 14 09:55:05 2014 @@ -18,9 +18,6 @@ */ package org.apache.sling.testing.mock.sling.context; -import java.util.Dictionary; -import java.util.Hashtable; -import java.util.Map; import java.util.Set; import javax.jcr.RepositoryException; @@ -47,7 +44,7 @@ import org.apache.sling.models.impl.inje import org.apache.sling.models.spi.ImplementationPicker; import org.apache.sling.models.spi.Injector; import org.apache.sling.settings.SlingSettingsService; -import org.apache.sling.testing.mock.osgi.MockOsgi; +import org.apache.sling.testing.mock.osgi.context.OsgiContextImpl; import org.apache.sling.testing.mock.sling.MockSling; import org.apache.sling.testing.mock.sling.ResourceResolverType; import org.apache.sling.testing.mock.sling.builder.ContentBuilder; @@ -58,11 +55,10 @@ import org.apache.sling.testing.mock.sli import org.apache.sling.testing.mock.sling.servlet.MockRequestPathInfo; import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest; import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletResponse; -import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; -import org.osgi.service.component.ComponentContext; -import com.google.common.collect.ImmutableMap; +import aQute.bnd.annotation.ConsumerType; + import com.google.common.collect.ImmutableSet; /** @@ -70,7 +66,8 @@ import com.google.common.collect.Immutab * directly but via the {@link org.apache.sling.testing.mock.sling.junit.SlingContext} JUnit * rule. */ -public class SlingContextImpl { +@ConsumerType +public class SlingContextImpl extends OsgiContextImpl { // default to publish instance run mode static final Set<String> DEFAULT_RUN_MODES = ImmutableSet.<String> builder().add("publish").build(); @@ -78,7 +75,6 @@ public class SlingContextImpl { protected ResourceResolverFactory resourceResolverFactory; protected MockModelAdapterFactory modelAdapterFactory; protected ResourceResolverType resourceResolverType; - protected ComponentContext componentContext; protected ResourceResolver resourceResolver; protected MockSlingHttpServletRequest request; protected MockSlingHttpServletResponse response; @@ -97,6 +93,7 @@ public class SlingContextImpl { * Setup actions before test method execution */ protected void setUp() { + super.setUp(); MockSling.setAdapterManagerBundleContext(bundleContext()); this.resourceResolverFactory = newResourceResolverFactory(); registerDefaultServices(); @@ -171,6 +168,8 @@ public class SlingContextImpl { this.contentBuilder = null; MockSling.clearAdapterManagerBundleContext(); + + super.tearDown(); } /** @@ -181,23 +180,6 @@ public class SlingContextImpl { } /** - * @return OSGi component context - */ - public final ComponentContext componentContext() { - if (this.componentContext == null) { - this.componentContext = MockOsgi.newComponentContext(); - } - return this.componentContext; - } - - /** - * @return OSGi Bundle context - */ - public final BundleContext bundleContext() { - return componentContext().getBundleContext(); - } - - /** * @return Resource resolver */ public final ResourceResolver resourceResolver() { @@ -277,94 +259,6 @@ public class SlingContextImpl { } /** - * Registers a service in the mocked OSGi environment. - * @param <T> Service type - * @param service Service instance - * @return Registered service instance - */ - public final <T> T registerService(final T service) { - return registerService(null, service, null); - } - - /** - * Registers a service in the mocked OSGi environment. - * @param <T> Service type - * @param serviceClass Service class - * @param service Service instance - * @return Registered service instance - */ - public final <T> T registerService(final Class<T> serviceClass, final T service) { - return registerService(serviceClass, service, null); - } - - /** - * Registers a service in the mocked OSGi environment. - * @param <T> Service type - * @param serviceClass Service class - * @param service Service instance - * @param properties Service properties (optional) - * @return Registered service instance - */ - public final <T> T registerService(final Class<T> serviceClass, final T service, final Map<String, Object> properties) { - Dictionary<String, Object> serviceProperties = null; - if (properties != null) { - serviceProperties = new Hashtable<String, Object>(properties); - } - bundleContext().registerService(serviceClass != null ? serviceClass.getName() : null, service, - serviceProperties); - return service; - } - - /** - * Injects dependencies, activates and registers a service in the mocked - * OSGi environment. - * @param <T> Service type - * @param service Service instance - * @return Registered service instance - */ - public final <T> T registerInjectActivateService(final T service) { - return registerInjectActivateService(service, ImmutableMap.<String, Object> of()); - } - - /** - * Injects dependencies, activates and registers a service in the mocked - * OSGi environment. - * @param <T> Service type - * @param service Service instance - * @param properties Service properties (optional) - * @return Registered service instance - */ - public final <T> T registerInjectActivateService(final T service, final Map<String, Object> properties) { - MockOsgi.injectServices(service, bundleContext()); - MockOsgi.activate(service, bundleContext(), properties); - registerService(null, service, null); - return service; - } - - /** - * Lookup a single service - * @param <ServiceType> Service type - * @param serviceType The type (interface) of the service. - * @return The service instance, or null if the service is not available. - */ - public final <ServiceType> ServiceType getService(final Class<ServiceType> serviceType) { - return slingScriptHelper().getService(serviceType); - } - - /** - * Lookup one or several services - * @param <ServiceType> Service type - * @param serviceType The type (interface) of the service. - * @param filter An optional filter (LDAP-like, see OSGi spec) - * @return The services object or null. - * @throws org.apache.sling.api.scripting.InvalidServiceFilterSyntaxException If the <code>filter</code> - * string is not a valid OSGi service filter string. - */ - public final <ServiceType> ServiceType[] getServices(final Class<ServiceType> serviceType, final String filter) { - return slingScriptHelper().getServices(serviceType, filter); - } - - /** * @return Current resource */ public final Resource currentResource() { Modified: sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java?rev=1639589&r1=1639588&r2=1639589&view=diff ============================================================================== --- sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java (original) +++ sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/context/package-info.java Fri Nov 14 09:55:05 2014 @@ -19,5 +19,5 @@ /** * Sling context implementation for unit tests. */ -@aQute.bnd.annotation.Version("1.0") +@aQute.bnd.annotation.Version("2.0") package org.apache.sling.testing.mock.sling.context; Modified: sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/junit/SlingContext.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/junit/SlingContext.java?rev=1639589&r1=1639588&r2=1639589&view=diff ============================================================================== --- sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/junit/SlingContext.java (original) +++ sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/junit/SlingContext.java Fri Nov 14 09:55:05 2014 @@ -33,7 +33,6 @@ public final class SlingContext extends private final SlingContextCallback setUpCallback; private final SlingContextCallback tearDownCallback; - private final ResourceResolverType resourceResolverType; private final TestRule delegate; /** @@ -103,10 +102,11 @@ public final class SlingContext extends this.setUpCallback = setUpCallback; this.tearDownCallback = tearDownCallback; - this.resourceResolverType = resourceResolverType; - // user default rule that directly executes each test method once + // set resource resolver type in parent context setResourceResolverType(this.resourceResolverType); + + // wrap {@link ExternalResource} rule executes each test method once this.delegate = new ExternalResource() { @Override protected void before() { Modified: sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/junit/package-info.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/junit/package-info.java?rev=1639589&r1=1639588&r2=1639589&view=diff ============================================================================== --- sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/junit/package-info.java (original) +++ sling/trunk/testing/mocks/sling-mock/src/main/java/org/apache/sling/testing/mock/sling/junit/package-info.java Fri Nov 14 09:55:05 2014 @@ -19,5 +19,5 @@ /** * Rule for providing easy access to Sling context in JUnit tests. */ -@aQute.bnd.annotation.Version("1.0") +@aQute.bnd.annotation.Version("2.0") package org.apache.sling.testing.mock.sling.junit; Modified: sling/trunk/testing/mocks/sling-mock/src/test/java/org/apache/sling/testing/mock/sling/context/SlingContextImplTest.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/sling-mock/src/test/java/org/apache/sling/testing/mock/sling/context/SlingContextImplTest.java?rev=1639589&r1=1639588&r2=1639589&view=diff ============================================================================== --- sling/trunk/testing/mocks/sling-mock/src/test/java/org/apache/sling/testing/mock/sling/context/SlingContextImplTest.java (original) +++ sling/trunk/testing/mocks/sling-mock/src/test/java/org/apache/sling/testing/mock/sling/context/SlingContextImplTest.java Fri Nov 14 09:55:05 2014 @@ -24,9 +24,6 @@ import static org.junit.Assert.assertNul import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; import java.util.Set; import javax.inject.Inject; @@ -47,7 +44,6 @@ import org.apache.sling.testing.mock.sli import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.osgi.framework.ServiceReference; public class SlingContextImplTest { @@ -89,41 +85,6 @@ public class SlingContextImplTest { } @Test - public void testRegisterService() { - Set<String> myService = new HashSet<String>(); - context.registerService(Set.class, myService); - - Set<?> serviceResult = context.getService(Set.class); - assertSame(myService, serviceResult); - } - - @Test - public void testRegisterServiceWithProperties() { - Map<String, Object> props = new HashMap<String, Object>(); - props.put("prop1", "value1"); - - Set<String> myService = new HashSet<String>(); - context.registerService(Set.class, myService, props); - - ServiceReference serviceReference = context.bundleContext().getServiceReference(Set.class.getName()); - Object serviceResult = context.bundleContext().getService(serviceReference); - assertSame(myService, serviceResult); - assertEquals("value1", serviceReference.getProperty("prop1")); - } - - @Test - public void testRegisterMultipleServices() { - Set<String> myService1 = new HashSet<String>(); - context.registerService(Set.class, myService1); - Set<String> myService2 = new HashSet<String>(); - context.registerService(Set.class, myService2); - - Set[] serviceResults = context.getServices(Set.class, null); - assertSame(myService1, serviceResults[0]); - assertSame(myService2, serviceResults[1]); - } - - @Test public void testSetCurrentResource() { context.currentResource("/content/sample/en/jcr:content/par/colctrl"); assertEquals("/content/sample/en/jcr:content/par/colctrl", context.currentResource().getPath()); @@ -178,11 +139,6 @@ public class SlingContextImplTest { } @Test - public void testRegisterInjectActivate() { - context.registerInjectActivateService(new Object()); - } - - @Test public void testRunModes() { SlingSettingsService slingSettings = context.getService(SlingSettingsService.class); assertEquals(SlingContextImpl.DEFAULT_RUN_MODES, slingSettings.getRunModes()); Modified: sling/trunk/testing/mocks/sling-mock/src/test/java/org/apache/sling/testing/mock/sling/junit/SlingContextTest.java URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/sling-mock/src/test/java/org/apache/sling/testing/mock/sling/junit/SlingContextTest.java?rev=1639589&r1=1639588&r2=1639589&view=diff ============================================================================== --- sling/trunk/testing/mocks/sling-mock/src/test/java/org/apache/sling/testing/mock/sling/junit/SlingContextTest.java (original) +++ sling/trunk/testing/mocks/sling-mock/src/test/java/org/apache/sling/testing/mock/sling/junit/SlingContextTest.java Fri Nov 14 09:55:05 2014 @@ -20,14 +20,12 @@ package org.apache.sling.testing.mock.sl import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import java.io.IOException; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.testing.mock.sling.ResourceResolverType; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -55,12 +53,4 @@ public class SlingContextTest { assertNotNull(context.request()); } - @After - public void tearDown() { - // reset required because mockito gets puzzled with the parameterized - // JUnit rule - // TODO: better solution? - reset(contextSetup); - } - }