blob: 3e74a6206d3e0809b415bcc9051eecbc4be33913 [file] [log] [blame]
/*
* 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.resourceresolver.impl;
import static org.apache.sling.resourceresolver.impl.MockedResourceResolverImplTest.createRPHandler;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.sling.api.resource.AbstractResource;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceMetadata;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.SyntheticResource;
import org.apache.sling.resourceresolver.impl.providers.ResourceProviderHandler;
import org.apache.sling.resourceresolver.impl.providers.ResourceProviderStorage;
import org.apache.sling.resourceresolver.impl.providers.ResourceProviderStorageProvider;
import org.apache.sling.spi.resource.provider.ResolveContext;
import org.apache.sling.spi.resource.provider.ResourceContext;
import org.apache.sling.spi.resource.provider.ResourceProvider;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.osgi.framework.Constants;
@SuppressWarnings("unchecked")
public class ResourceProviderEntryTest {
private List<ResourceProviderHandler> providers = new ArrayList<ResourceProviderHandler>();
private ResourceResolver providersBasedResolver;
private ResourceResolver mockedRootResolver;
@Before public void setUp() throws Exception {
this.mockedRootResolver = Mockito.mock(ResourceResolver.class);
this.providersBasedResolver = null;
this.providers.clear();
final ResourceProvider<?> rootProvider = Mockito.mock(ResourceProvider.class);
Mockito.when(rootProvider.getResource(Mockito.any(ResolveContext.class), Mockito.anyString(), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(this.mockedRootResolver));
providers.add(createRPHandler(rootProvider, "rp0", 0, "/"));
}
@Test public void testRootProvider() throws LoginException {
assertNull(getResource("relpath"));
assertEqualsResolver(this.mockedRootResolver, getResource("/"));
assertEqualsResolver(this.mockedRootResolver, getResource("/rootel"));
assertEqualsResolver(this.mockedRootResolver, getResource("/rootel/child"));
assertEqualsResolver(this.mockedRootResolver, getResource("/apps/sling/sample/html.js"));
assertEqualsResolver(this.mockedRootResolver, getResource("/apps/sling/microsling/html.js"));
}
@Test public void testAdd1Provider() throws LoginException {
String firstPath = "/rootel";
final ResourceResolver resolver = Mockito.mock(ResourceResolver.class);
final ResourceProvider<?> first = Mockito.mock(ResourceProvider.class);
Mockito.when(first.getResource(Mockito.any(ResolveContext.class), Mockito.startsWith(firstPath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(resolver));
providers.add(createRPHandler(first, "rp1", 1, "/rootel"));
this.providersBasedResolver = null;
assertEqualsResolver(this.mockedRootResolver, getResource("/"));
assertEqualsResolver(resolver, getResource("/rootel"));
assertEqualsResolver(resolver, getResource("/rootel/html.js"));
assertEqualsResolver(resolver, getResource("/rootel/child"));
assertEqualsResolver(resolver, getResource("/rootel/child/html.js"));
assertEqualsResolver(this.mockedRootResolver, getResource("/apps/sling/sample/html.js"));
assertEqualsResolver(this.mockedRootResolver, getResource("/apps/sling/microsling/html.js"));
}
@Test public void testAdd3Providers() throws LoginException {
String firstPath = "/rootel";
String secondPath = firstPath + "/child";
String thirdPath = "/apps/sling/sample";
final ResourceResolver firstResolver = Mockito.mock(ResourceResolver.class);
final ResourceProvider<?> first = Mockito.mock(ResourceProvider.class);
Mockito.when(first.getResource(Mockito.any(ResolveContext.class), Mockito.startsWith(firstPath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(firstResolver));
final ResourceResolver secondResolver = Mockito.mock(ResourceResolver.class);
final ResourceProvider<?> second = Mockito.mock(ResourceProvider.class);
Mockito.when(second.getResource(Mockito.any(ResolveContext.class), Mockito.startsWith(secondPath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(secondResolver));
final ResourceResolver thirdResolver = Mockito.mock(ResourceResolver.class);
final ResourceProvider<?> third = Mockito.mock(ResourceProvider.class);
Mockito.when(third.getResource(Mockito.any(ResolveContext.class), Mockito.startsWith(thirdPath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(thirdResolver));
providers.add(createRPHandler(first, "rp1", 1, firstPath));
providers.add(createRPHandler(second, "rp2", 2, secondPath));
providers.add(createRPHandler(third, "rp3", 3, thirdPath));
this.providersBasedResolver = null;
assertEqualsResolver(this.mockedRootResolver, getResource("/"));
assertEqualsResolver(firstResolver, getResource("/rootel"));
assertEqualsResolver(firstResolver, getResource("/rootel/html.js"));
assertEqualsResolver(secondResolver, getResource("/rootel/child"));
assertEqualsResolver(secondResolver, getResource("/rootel/child/html.js"));
assertEqualsResolver(thirdResolver, getResource("/apps/sling/sample/html.js"));
assertEqualsResolver(this.mockedRootResolver, getResource("/apps/sling/microsling/html.js"));
}
@Test public void testAdd3ProvidersReverse() throws LoginException {
String firstPath = "/rootel";
String secondPath = firstPath + "/child";
String thirdPath = "/apps/sling/sample";
final ResourceResolver firstResolver = Mockito.mock(ResourceResolver.class);
final ResourceProvider<?> first = Mockito.mock(ResourceProvider.class);
Mockito.when(first.getResource(Mockito.any(ResolveContext.class), Mockito.startsWith(firstPath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(firstResolver));
final ResourceResolver secondResolver = Mockito.mock(ResourceResolver.class);
final ResourceProvider<?> second = Mockito.mock(ResourceProvider.class);
Mockito.when(second.getResource(Mockito.any(ResolveContext.class), Mockito.startsWith(secondPath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(secondResolver));
final ResourceResolver thirdResolver = Mockito.mock(ResourceResolver.class);
final ResourceProvider<?> third = Mockito.mock(ResourceProvider.class);
Mockito.when(third.getResource(Mockito.any(ResolveContext.class), Mockito.startsWith(thirdPath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(thirdResolver));
providers.add(createRPHandler(first, "rp1", 1, firstPath));
providers.add(createRPHandler(second, "rp2", 2, secondPath));
providers.add(createRPHandler(third, "rp3", 3, thirdPath));
this.providersBasedResolver = null;
assertEqualsResolver(this.mockedRootResolver, getResource("/"));
assertEqualsResolver(firstResolver, getResource("/rootel"));
assertEqualsResolver(firstResolver, getResource("/rootel/html.js"));
assertEqualsResolver(secondResolver, getResource("/rootel/child"));
assertEqualsResolver(secondResolver, getResource("/rootel/child/html.js"));
assertEqualsResolver(thirdResolver, getResource("/apps/sling/sample/html.js"));
assertEqualsResolver(this.mockedRootResolver, getResource("/apps/sling/microsling/html.js"));
}
@Test public void testRemoveProviders() throws LoginException {
String firstPath = "/rootel";
String thirdPath = "/apps/sling/sample";
String secondPath = firstPath + "/child";
final ResourceResolver firstResolver = Mockito.mock(ResourceResolver.class);
final ResourceProvider<?> first = Mockito.mock(ResourceProvider.class);
Mockito.when(first.getResource(Mockito.any(ResolveContext.class), Mockito.startsWith(firstPath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(firstResolver));
final ResourceResolver secondResolver = Mockito.mock(ResourceResolver.class);
final ResourceProvider<?> second = Mockito.mock(ResourceProvider.class);
Mockito.when(second.getResource(Mockito.any(ResolveContext.class), Mockito.startsWith(secondPath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(secondResolver));
final ResourceResolver thirdResolver = Mockito.mock(ResourceResolver.class);
final ResourceProvider<?> third = Mockito.mock(ResourceProvider.class);
Mockito.when(third.getResource(Mockito.any(ResolveContext.class), Mockito.startsWith(thirdPath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(thirdResolver));
final Map<String, Object> firstProps = new HashMap<String, Object>();
firstProps.put(Constants.SERVICE_ID, (long)1);
final Map<String, Object> secondProps = new HashMap<String, Object>();
secondProps.put(Constants.SERVICE_ID, (long)2);
final Map<String, Object> thirdProps = new HashMap<String, Object>();
thirdProps.put(Constants.SERVICE_ID, (long)3);
ResourceProviderHandler firstH = createRPHandler(first, "rp1", 1, firstPath);
providers.add(firstH);
providers.add(createRPHandler(second, "rp2", 2, secondPath));
providers.add(createRPHandler(third, "rp3", 3, thirdPath));
this.providersBasedResolver = null;
assertEqualsResolver(this.mockedRootResolver, getResource("/"));
assertEqualsResolver(firstResolver, getResource("/rootel/html.js"));
assertEqualsResolver(secondResolver, getResource("/rootel/child/html.js"));
providers.remove(firstH);
this.providersBasedResolver = null;
assertEqualsResolver(this.mockedRootResolver, getResource("/"));
assertEqualsResolver(this.mockedRootResolver, getResource("/rootel/sddsf/sdfsdf/html.js"));
assertEqualsResolver(this.mockedRootResolver, getResource("/rootel/html.js"));
assertEqualsResolver(secondResolver, getResource("/rootel/child/html.js"));
providers.add(firstH);
this.providersBasedResolver = null;
assertEqualsResolver(this.mockedRootResolver, getResource("/"));
assertEqualsResolver(firstResolver, getResource("/rootel/html.js"));
assertEqualsResolver(secondResolver, getResource("/rootel/child/html.js"));
}
@Test public void testRemoveTheOnlyProvider() throws LoginException {
long counter = 1;
providers.clear();
for(String path : new String[] { "/foo", "/", "/foo/bar" }) {
final ResourceResolver resolver = Mockito.mock(ResourceResolver.class);
final ResourceProvider<?> p = Mockito.mock(ResourceProvider.class);
Mockito.when(p.getResource(Mockito.any(ResolveContext.class), Mockito.startsWith(path), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(new TestResource(resolver));
++counter;
ResourceProviderHandler h = createRPHandler(p, "rp"+counter, counter, path);
providers.add(h);
this.providersBasedResolver = null;
{
final Resource r = getResource(path);
assertEqualsResolver(resolver, r);
assertFalse(r instanceof SyntheticResource);
}
providers.remove(h);
this.providersBasedResolver = null;
{
final Resource r = getResource(path);
// If our provider is indeed gone, we should get one of the following conditions
if(r == null) {
//fine
} else if(!p.equals(r.getResourceResolver())) {
//fine
} else {
fail("Expecting inactive provider after removing it for " + path);
}
}
}
}
private void assertEqualsResolver(final ResourceResolver resolver, final Resource res) {
assertEquals(resolver, res.getResourceResolver());
}
private Resource getResource(String path) throws LoginException {
return getResolver().getResource(path);
}
private ResourceResolver getResolver() throws LoginException {
if (providersBasedResolver == null) {
final ResourceResolverFactoryActivator activator = new ResourceResolverFactoryActivator();
activator.resourceAccessSecurityTracker = new ResourceAccessSecurityTracker();
providersBasedResolver = new ResourceResolverImpl(new CommonResourceResolverFactoryImpl(activator), false, null,
new ResourceProviderStorageProvider() {
@Override
public ResourceProviderStorage getResourceProviderStorage() {
return new ResourceProviderStorage(providers);
}
});
}
return providersBasedResolver;
}
private static class TestResource extends AbstractResource {
private final ResourceResolver resourceResolver;
public TestResource(ResourceResolver resourceResolver) {
this.resourceResolver = resourceResolver;
}
@Override
public String getPath() {
return null;
}
@Override
public ResourceMetadata getResourceMetadata() {
return new ResourceMetadata();
}
@Override
public ResourceResolver getResourceResolver() {
return resourceResolver;
}
@Override
public String getResourceType() {
return null;
}
@Override
public String getResourceSuperType() {
return null;
}
@Override
public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
return null;
}
@Override
public boolean hasChildren() {
return false;
}
}
}