blob: 1b7fb9f3d7bfefec43ca0f545786f8fa9a09b6ba [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 groovy.servlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.ServletContext
import javax.servlet.ServletConfig
/**
* This test case tests the AbstractHttpServlet class. It uses a test
* specific subclass called ConcreteHttpServlet to test the abstract
* class in isolation from any implementations.
*/
class AbstractHttpServletTest extends GroovyTestCase {
def servlet
void setUp() {
super.setUp()
servlet = new ConcreteHttpServlet()
}
/**
* getScriptUri() concatenates the servlet path and path info
* attributes if attributes exist on the http request.
*/
void testGetScriptUri_AllAttributesExist() {
// just return whatever attributes were requested
def request = { attribute -> attribute }
assert servlet.getScriptUri(request as HttpServletRequest) ==
AbstractHttpServlet.INC_SERVLET_PATH + AbstractHttpServlet.INC_PATH_INFO
}
/**
* getScriptUri() returns the servlet path if the http request
* contains path but no path info attribute.
*/
void testGetScriptUri_NoPathInfoAttribute() {
// just return whatever attributes were requested, except for path info attribute
def request = { attribute ->
attribute == AbstractHttpServlet.INC_PATH_INFO ? null : attribute
}
assert servlet.getScriptUri(request as HttpServletRequest) ==
AbstractHttpServlet.INC_SERVLET_PATH
}
/**
* Tests getScriptUri when no attributes exist, but servletPath and
* pathInfo methods return data.
*/
void testGetScriptUri_NoAttributesPathInfoExists() {
def request = [
getAttribute: { null },
getServletPath: { 'servletPath' },
getPathInfo: { 'pathInfo' }
] as HttpServletRequest
def servlet = new ConcreteHttpServlet()
assert servlet.getScriptUri(request) == 'servletPathpathInfo'
}
/**
* Tests getScriptUri when no attributes exist, no path info exists,
* but servletPath returns data.
*/
void testGetScriptUri_NoAttributesPathInfoMissing() {
def request = [
getAttribute: { null },
getServletPath: { 'servletPath' },
getPathInfo: { null }
] as HttpServletRequest
def servlet = new ConcreteHttpServlet()
assert servlet.getScriptUri(request) == 'servletPath'
}
/**
* Tests getting URIs as files.
*/
void testGetScriptURIasFile() {
def request = [
getAttribute: { null },
getServletPath: { 'servletPath' },
getPathInfo: { 'pathInfo' }
] as HttpServletRequest
def servletContext = [
getRealPath: { arg -> 'realPath' + arg }
] as ServletContext
def servletConfig = [
getServletContext: { servletContext },
getInitParameter: { null }
] as ServletConfig
servlet.init(servletConfig)
def file = servlet.getScriptUriAsFile(request)
assert file.getName() == 'realPathservletPathpathInfo'
}
/**
* Tests getting URIs as files where filename not available.
*/
void testGetScriptURIasFileNoMapping() {
def request = [
getAttribute: { null },
getServletPath: { 'servletPath' },
getPathInfo: { 'pathInfo' }
] as HttpServletRequest
def servletContext = [
getRealPath: { arg -> null }
] as ServletContext
def servletConfig = [
getServletContext: { servletContext },
getInitParameter: { null }
] as ServletConfig
servlet.init(servletConfig)
def file = servlet.getScriptUriAsFile(request)
assert file == null
}
/**
* Tests that exception is thrown when resource is not found.
*/
void testGetResourceConnection_MissingResource() {
def servletContext = [
getRealPath: { arg -> 'realPath' + arg },
getResource: { arg -> null }
] as ServletContext
def servletConfig = [
getServletContext: { servletContext },
getInitParameter: { null }
] as ServletConfig
// servlet config is used to find resources
servlet.init(servletConfig)
shouldFail(groovy.util.ResourceException) {
servlet.getResourceConnection('someresource')
}
}
/**
* Tests finding resource.
*/
void testGetResourceConnection_FoundInCurrentDir() {
def urlStub = new java.net.URL('file:realPath/someresource')
def servletContext = [
getRealPath: { arg -> 'realPath' + arg },
getResource: { arg -> arg == '/someresource' ? urlStub : null }
] as ServletContext
def servletConfig = [
getServletContext: { servletContext },
getInitParameter: { null }
] as ServletConfig
// servlet config is used to find resources
servlet.init(servletConfig)
def connection = servlet.getResourceConnection('someresource')
assert connection.getURL() == urlStub
}
/**
* Tests finding resource in web-inf directory.
*/
void testGetResourceConnection_FoundInWebInf() {
def urlStub = new java.net.URL('file:realPath/WEB-INF/groovy/someresource')
def servletContext = [
getRealPath: { arg -> 'realPath' + arg },
getResource: { arg -> arg == '/WEB-INF/groovy/someresource' ? urlStub : null }
] as ServletContext
def servletConfig = [
getServletContext: { servletContext },
getInitParameter: { null }
] as ServletConfig
// servlet config is used to find resources
servlet.init(servletConfig)
def connection = servlet.getResourceConnection('someresource')
assert connection.getURL() == urlStub
}
/**
* Tests regex style resource replacement for first occurrence.
*/
void testGetResourceConnection_Replace1stFooWithBar() {
def servletContext = [
getRealPath: { arg -> 'realPath' + arg },
getResource: { arg ->
if (arg.startsWith('//')) arg = arg.substring(2)
new URL('http://' + (arg == '/' ? '' : arg))
}
] as ServletContext
def servletConfig = [
getServletContext: { servletContext },
getInitParameter: { arg ->
// replace first occurrence of foo resources with bar resources
if (arg == 'resource.name.regex') return 'foo'
else if (arg == 'resource.name.replacement') return 'bar'
else if (arg == 'resource.name.replace.all') return 'false'
return null
}
] as ServletConfig
def request = [
getAttribute: { null },
getServletPath: { '/somefoo/foo' },
getPathInfo: { null }
] as HttpServletRequest
// servlet config is used to find resources
servlet.init(servletConfig)
// replace first foo with bar in resources
def connection = servlet.getResourceConnection(servlet.getScriptUri(request))
assert connection.getURL().toExternalForm() == new URL('http:/somebar/foo').toExternalForm()
}
/**
* Tests regex style resource replacement for all occurrences.
*/
void testGetResourceConnection_ReplaceAllFooWithBar() {
def servletContext = [
getRealPath: { arg -> 'realPath' + arg },
getResource: { arg ->
if (arg.startsWith('//')) arg = arg.substring(2)
new URL('http://' + (arg == '/' ? '' : arg))
}
] as ServletContext
def servletConfig = [
getServletContext: { servletContext },
getInitParameter: { arg ->
// replace all occurrences of foo resources with bar resources
if (arg == 'resource.name.regex') return 'foo'
else if (arg == 'resource.name.replacement') return 'bar'
else if (arg == 'resource.name.replace.all') return 'true'
return null
}
] as ServletConfig
def request = [
getAttribute: { null },
getServletPath: { '/somefoo/foo' },
getPathInfo: { null }
] as HttpServletRequest
// servlet config is used to find resources
servlet.init(servletConfig)
// replace all foo(s) with bar in resources
def connection = servlet.getResourceConnection(servlet.getScriptUri(request))
assert connection.getURL().toExternalForm() == new URL('http:/somebar/bar').toExternalForm()
}
}
// test specific subclass
class ConcreteHttpServlet extends AbstractHttpServlet {}