SLING-848 Updated versioning integration tests

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1660831 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pom.xml b/pom.xml
index 4f489fb..c3ebe71 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,5 +57,23 @@
             <version>2.0</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.resourceresolver</artifactId>
+            <version>1.1.15-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.jcr.resource</artifactId>
+            <version>2.4.5-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.api</artifactId>
+            <version>2.8.1-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/src/test/java/org/apache/sling/jcr/resource/it/ResourceVersioningTest.java b/src/test/java/org/apache/sling/jcr/resource/it/ResourceVersioningTest.java
index 40b62dd..0c45c1c 100644
--- a/src/test/java/org/apache/sling/jcr/resource/it/ResourceVersioningTest.java
+++ b/src/test/java/org/apache/sling/jcr/resource/it/ResourceVersioningTest.java
@@ -35,8 +35,9 @@
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ValueMap;
-import org.apache.sling.testing.mock.sling.MockSling;
-import org.apache.sling.testing.mock.sling.ResourceResolverType;
+import org.apache.sling.commons.testing.jcr.RepositoryProvider;
+import org.apache.sling.jcr.api.SlingRepository;
+import org.apache.sling.testing.mock.sling.MockJcrResourceResolverFactory;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -53,7 +54,8 @@
 
     @Before
     public void setUp() throws Exception {
-        resolver = MockSling.newResourceResolver(ResourceResolverType.JCR_JACKRABBIT);
+        SlingRepository repository = RepositoryProvider.instance().getRepository();
+        resolver = new MockJcrResourceResolverFactory(repository).getAdministrativeResourceResolver(null);
         session = resolver.adaptTo(Session.class);
         versionManager = session.getWorkspace().getVersionManager();
         registerNamespace("sling", "http://sling.apache.org/jcr/sling/1.0");
diff --git a/src/test/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverFactory.java b/src/test/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverFactory.java
new file mode 100644
index 0000000..96b0732
--- /dev/null
+++ b/src/test/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverFactory.java
@@ -0,0 +1,135 @@
+/*
+ * 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.sling;
+
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ResourceProvider;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
+import org.apache.sling.jcr.api.SlingRepository;
+import org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProviderFactory;
+import org.apache.sling.jcr.resource.internal.helper.jcr.PathMapper;
+import org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl;
+import org.apache.sling.resourceresolver.impl.ResourceAccessSecurityTracker;
+import org.apache.sling.resourceresolver.impl.ResourceResolverImpl;
+import org.apache.sling.resourceresolver.impl.helper.ResourceResolverContext;
+import org.apache.sling.testing.mock.osgi.MockOsgi;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.ComponentContext;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Mock {@link ResourceResolver} implementation. Simulates OSGi environment and
+ * initiates real Sling ResourceResolver and JCR implementation, but with a
+ * mocked JCR repository implementation underneath.
+ */
+public class MockJcrResourceResolverFactory implements ResourceResolverFactory {
+
+    private final SlingRepository slingRepository;
+
+    public MockJcrResourceResolverFactory(final SlingRepository repository) {
+        this.slingRepository = repository;
+    }
+
+    private ResourceResolver getResourceResolverInternal(Map<String, Object> authenticationInfo, boolean isAdmin) throws LoginException {
+        // setup mock OSGi environment
+        BundleContext bundleContext = MockOsgi.newBundleContext();
+
+        Dictionary<String, Object> resourceProviderFactoryFactoryProps = new Hashtable<String, Object>();
+        resourceProviderFactoryFactoryProps.put(Constants.SERVICE_VENDOR, "sling-mock");
+        resourceProviderFactoryFactoryProps.put(Constants.SERVICE_DESCRIPTION, "sling-mock");
+        resourceProviderFactoryFactoryProps.put("resource.resolver.manglenamespaces", true);
+        resourceProviderFactoryFactoryProps.put("resource.resolver.searchpath", new String[] { "/apps", "/libs" });
+        ComponentContext resourceProviderComponentContext = MockOsgi.newComponentContext(bundleContext, resourceProviderFactoryFactoryProps);
+
+        // setup mocked JCR environment
+        bundleContext.registerService(SlingRepository.class.getName(), this.slingRepository, null);
+        bundleContext.registerService(PathMapper.class.getName(), new PathMapper(), null);
+
+        // setup real sling JCR resource provider implementation for use in
+        // mocked context
+        JcrResourceProviderFactory jcrResourceProviderFactory = new JcrResourceProviderFactory();
+        MockOsgi.injectServices(jcrResourceProviderFactory, bundleContext);
+        MockOsgi.activate(jcrResourceProviderFactory, bundleContext, ImmutableMap.<String, Object> of());
+
+        ResourceProvider resourceProvider;
+        if (isAdmin) {
+            resourceProvider = jcrResourceProviderFactory.getAdministrativeResourceProvider(authenticationInfo);
+        }
+        else {
+            resourceProvider = jcrResourceProviderFactory.getResourceProvider(authenticationInfo);
+        }
+
+        Dictionary<Object, Object> resourceProviderProps = new Hashtable<Object, Object>();
+        resourceProviderProps.put(ResourceProvider.ROOTS, new String[] { "/" });
+        bundleContext.registerService(ResourceProvider.class.getName(), resourceProvider, resourceProviderProps);
+        ServiceReference resourceProviderServiceReference = bundleContext.getServiceReference(ResourceProvider.class.getName());
+
+        // setup real sling resource resolver implementation for use in mocked
+        // context
+        MockResourceResolverFactoryActivator activator = new MockResourceResolverFactoryActivator();
+        activator.bindResourceProvider(resourceProvider,
+                getServiceReferenceProperties(resourceProviderServiceReference));
+        activator.activate(resourceProviderComponentContext);
+        CommonResourceResolverFactoryImpl commonFactoryImpl = new CommonResourceResolverFactoryImpl(activator);
+        ResourceResolverContext context = new ResourceResolverContext(true, authenticationInfo, new ResourceAccessSecurityTracker());
+        ResourceResolverImpl resourceResolver = new ResourceResolverImpl(commonFactoryImpl, context);
+        return resourceResolver;
+    }
+
+    private Map<String, Object> getServiceReferenceProperties(final ServiceReference serviceReference) {
+        Map<String, Object> props = new HashMap<String, Object>();
+        String[] keys = serviceReference.getPropertyKeys();
+        for (String key : keys) {
+            props.put(key, serviceReference.getProperty(key));
+        }
+        return props;
+    }
+
+    @Override
+    public ResourceResolver getResourceResolver(final Map<String, Object> authenticationInfo) throws LoginException {
+        return getResourceResolverInternal(authenticationInfo, false);
+    }
+
+    @Override
+    public ResourceResolver getAdministrativeResourceResolver(final Map<String, Object> authenticationInfo)
+            throws LoginException {
+        return getResourceResolverInternal(authenticationInfo, true);
+    }
+
+    // part of Sling API 2.7
+    public ResourceResolver getServiceResourceResolver(final Map<String, Object> authenticationInfo)
+            throws LoginException {
+        return getResourceResolverInternal(authenticationInfo, true);
+    }
+
+    // part of Sling API 2.8
+    public ResourceResolver getThreadResourceResolver() {
+        throw new UnsupportedOperationException();
+    }
+
+}