/*
 * 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.servlets.resolver.it;

import javax.servlet.http.HttpServletResponse;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerClass;

@RunWith(PaxExam.class)
@ExamReactorStrategy(PerClass.class)
public class ServletSelectionIT extends ServletResolverTestSupport {

    @Before
    public void setupTestServlets() throws Exception {

        new TestServlet("FooPathServlet")
        .with(P_PATHS, "/foo")
        .register(bundleContext);

        new TestServlet("AllExceptPathsIgnored")
        .with(P_PATHS, "/allprops")
        .with(P_RESOURCE_TYPES, "allresource")
        .with(P_METHODS, "allmethod")
        .with(P_EXTENSIONS, "allext")
        .with(P_SELECTORS, "allsel")
        .register(bundleContext);

        new TestServlet("ExtServlet")
        .with(P_RESOURCE_TYPES, RT_DEFAULT)
        .with(P_METHODS, M_GET)
        .with(P_EXTENSIONS, "testext")
        .register(bundleContext);

        new TestServlet("ExtPostServlet")
        .with(P_RESOURCE_TYPES, RT_DEFAULT)
        .with(P_METHODS, M_POST)
        .with(P_EXTENSIONS, "testext")
        .register(bundleContext);

        new TestServlet("ExtSelServlet")
        .with(P_RESOURCE_TYPES, RT_DEFAULT)
        .with(P_METHODS, M_GET)
        .with(P_EXTENSIONS, "testext")
        .with(P_SELECTORS, "testsel")
        .register(bundleContext);

        new TestServlet("ExtPaths")
        .with(P_PATHS, "/extpaths")
        .with(P_STRICT_PATHS, "true")
        .with(P_METHODS, "POST")
        .with(P_EXTENSIONS, "extPathsExt")
        .with(P_SELECTORS, "extPathsSel")
        .register(bundleContext);

        new TestServlet("ExtPathsMultipleSelectors")
        .with(P_PATHS, "/extpaths_multiple")
        .with(P_STRICT_PATHS, "true")
        .with(P_SELECTORS, new String[] { "one", "two" })
        .register(bundleContext);

        new TestServlet("EmptySelectors")
        .with(P_PATHS, "/emptySel")
        .with(P_STRICT_PATHS, "true")
        .with(P_SELECTORS, new String[] { ".EMPTY." })
        .register(bundleContext);

        new TestServlet("EmptyExtensions")
        .with(P_PATHS, "/emptyExt")
        .with(P_STRICT_PATHS, "true")
        .with(P_EXTENSIONS, new String[] { ".EMPTY." })
        .register(bundleContext);

        new TestServlet("EmptyExtensionsAndSelectors")
        .with(P_PATHS, "/emptyExtSel")
        .with(P_STRICT_PATHS, "true")
        .with(P_SELECTORS, new String[] { ".EMPTY." })
        .with(P_EXTENSIONS, new String[] { ".EMPTY." })
        .register(bundleContext);

        new TestServlet("DuplicateA")
        .with(P_PATHS, "/duplicate")
        .with(P_STRICT_PATHS, "true")
        .with(P_SELECTORS, new String[] { "dup", "licate" })
        .with(P_EXTENSIONS, new String[] { "json" })
        .register(bundleContext);

        new TestServlet("DuplicateB")
        .with(P_PATHS, "/duplicate")
        .with(P_STRICT_PATHS, "true")
        .with(P_SELECTORS, new String[] { "dup", "licate" })
        .with(P_EXTENSIONS, new String[] { "json" })
        .register(bundleContext);
    }

    @Test
    public void testFooPathServlet() throws Exception {
        assertTestServlet("/foo", "FooPathServlet");
    }

    @Test
    public void testFooPathServletWithSelectorAndExtension() throws Exception {
        assertTestServlet("/foo.someExtension", "FooPathServlet");
        assertTestServlet("/foo.someSelector.someExtension", "FooPathServlet");
        assertTestServlet("/foo.anotherSelector.someSelector.someExtension", "FooPathServlet");
    }

    @Test
    public void testFooPathServletWithPathSuffix() throws Exception {
        assertTestServlet("/foo/path/suffix", HttpServletResponse.SC_NOT_FOUND);
        assertTestServlet("/foo.someExtensions/path/suffix", "FooPathServlet");
        assertTestServlet("/foo.someSelector.someExtension/path/suffix", "FooPathServlet");
    }

    @Test
    public void testExtServlet() throws Exception {
        assertTestServlet("/.testext", "ExtServlet");
    }

    @Test
    public void testExtSelServlet() throws Exception {
        assertTestServlet("/.testsel.testext", "ExtSelServlet");
    }

    @Test
    public void testNoServletForExtension() throws Exception {
        assertTestServlet("/.yapas", HttpServletResponse.SC_NOT_FOUND);
    }

    @Test
    public void testExtPostServlet() throws Exception {
        assertTestServlet(M_POST, "/.testext", "ExtPostServlet");
    }

    @Test
    public void testAllExceptPathsIgnored() throws Exception {
        assertTestServlet("/allprops", "AllExceptPathsIgnored");
        assertTestServlet("/allprops.zero", "AllExceptPathsIgnored");
        assertTestServlet("/allprops.one.two", "AllExceptPathsIgnored");
        assertTestServlet(M_POST, "/allprops", "AllExceptPathsIgnored");
        assertTestServlet(M_POST, "/allprops.ext", "AllExceptPathsIgnored");
        assertTestServlet(M_POST, "/allprops.three.four", "AllExceptPathsIgnored");
        assertTestServlet("/allprops.five.six/suffix", "AllExceptPathsIgnored");
        assertTestServlet(M_POST, "/allprops.seven.eight/suffix", "AllExceptPathsIgnored");
        assertTestServlet(M_POST, "/allprops.nine/suffix", "AllExceptPathsIgnored");
    }

    @Test
    public void testExtPaths() throws Exception {
        // We just check that the "extpaths" feature is wired in,
        // the details of its logic are verified in unit tests
        assertTestServlet("/extpaths", HttpServletResponse.SC_FORBIDDEN);
        assertTestServlet(M_POST, "/extpaths", HttpServletResponse.SC_FORBIDDEN);
        assertTestServlet(M_POST, "/extpaths.extPathsExt", HttpServletResponse.SC_FORBIDDEN);
        assertTestServlet(M_GET, "/extpaths.extPathsSel.extPathsExt", HttpServletResponse.SC_FORBIDDEN);
        assertTestServlet(M_POST, "/extpaths.extPathsSel.extPathsExt", "ExtPaths");
        assertTestServlet(M_POST, "/extpaths.extPathsSel.extPathsExt/with/some/suffix", "ExtPaths");
    }

    @Test
    public void testExtPathsMultipleSelectors() throws Exception {
        assertTestServlet("/extpaths_multiple", HttpServletResponse.SC_FORBIDDEN);
        assertTestServlet("/extpaths_multiple.one.html", "ExtPathsMultipleSelectors");
        assertTestServlet("/extpaths_multiple.one.two.html", "ExtPathsMultipleSelectors");
        assertTestServlet("/extpaths_multiple.two.three.html", "ExtPathsMultipleSelectors");
        assertTestServlet("/extpaths_multiple.two.html", "ExtPathsMultipleSelectors");
        assertTestServlet("/extpaths_multiple.three.html", HttpServletResponse.SC_FORBIDDEN);
    }

    @Test
    public void testEmptyExtensionsAndSelectors() throws Exception {
        assertTestServlet("/emptyExtSel", "EmptyExtensionsAndSelectors");
        assertTestServlet("/emptyExtSel.ext", HttpServletResponse.SC_FORBIDDEN);
        assertTestServlet("/emptyExtSel.sel.ext", HttpServletResponse.SC_FORBIDDEN);

        assertTestServlet("/emptyExt", "EmptyExtensions");
        assertTestServlet("/emptyExt.sel.", "EmptyExtensions");
        assertTestServlet("/emptyExt.sel.ext", HttpServletResponse.SC_FORBIDDEN);

        assertTestServlet("/emptySel", "EmptySelectors");
        assertTestServlet("/emptySel.", "EmptySelectors");
        assertTestServlet("/emptySel.ext", "EmptySelectors");
        assertTestServlet("/emptySel.sel.ext", HttpServletResponse.SC_FORBIDDEN);
    }

    @Test
    public void testDuplicate() throws Exception {
        assertTestServlet("/duplicate.dup.json", "DuplicateA");
    }
}