/*
 * 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.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;

import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.NonExistingResource;
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.ResourceUtil;
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.resourceresolver.util.MockTestUtil;
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.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

public class ProviderHandlerTest {

    @SuppressWarnings("unchecked")
    @Test public void testServletRegistrationAndSyntheticResources() throws LoginException {
        final String servletpath = "/libs/a/b/GET.servlet";
        final Resource servletResource = Mockito.mock(Resource.class);
        Mockito.when(servletResource.getResourceMetadata()).then(new Answer<ResourceMetadata>() {
            @Override
            public ResourceMetadata answer(InvocationOnMock invocation) throws Throwable {
                return new ResourceMetadata();
            }
        });

        final ResourceProvider<?> leaveProvider = Mockito.mock(ResourceProvider.class);
        Mockito.when(leaveProvider.getResource(Mockito.any(ResolveContext.class), Mockito.eq(servletpath), Mockito.any(ResourceContext.class), Mockito.any(Resource.class))).thenReturn(servletResource);
        final ResourceProviderHandler h = createRPHandler(leaveProvider, "my-pid", 0, servletpath);
        ResourceResolverFactoryActivator activator = new ResourceResolverFactoryActivator();
        activator.resourceAccessSecurityTracker = new ResourceAccessSecurityTracker();
        ResourceResolver resolver = new ResourceResolverImpl(new CommonResourceResolverFactoryImpl(activator), false, null, new ResourceProviderStorageProvider() {
                
                @Override
                public ResourceProviderStorage getResourceProviderStorage() {
                    return new ResourceProviderStorage(Arrays.asList(h));
                }
            });
        activator.pathToUriMappingService = MockTestUtil.createPathToUriMappingServiceMock(resolver);

        final Resource parent = resolver.getResource(ResourceUtil.getParent(servletpath));
        assertNotNull("Parent must be available", parent);
        assertTrue("Resource should be synthetic", ResourceUtil.isSyntheticResource(parent));

        final Resource servlet = resolver.getResource(servletpath);
        assertNotNull("Servlet resource must not be null", servlet);
        assertEquals(servletResource, servlet);

        assertNotNull(resolver.getResource("/libs"));

        // now check when doing a resolve()
        assertTrue(resolver.resolve("/libs") instanceof NonExistingResource);
        assertTrue(resolver.resolve(ResourceUtil.getParent(servletpath)) instanceof NonExistingResource);
        assertNotNull(resolver.resolve(servletpath));
        resolver.close();
    }
}
