/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * Licensed 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 com.alibaba.citrus.service.form; import static com.alibaba.citrus.test.TestEnvStatic.*; import static org.junit.Assert.*; import java.io.File; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alibaba.citrus.service.form.impl.FormServiceImpl; import com.alibaba.citrus.service.requestcontext.RequestContext; import com.alibaba.citrus.service.requestcontext.RequestContextChainingService; import com.alibaba.citrus.service.resource.support.context.ResourceLoadingXmlApplicationContext; import com.alibaba.citrus.util.internal.Servlet3Util; import com.meterware.httpunit.GetMethodWebRequest; import com.meterware.httpunit.HttpUnitOptions; import com.meterware.httpunit.PostMethodWebRequest; import com.meterware.httpunit.WebRequest; import com.meterware.httpunit.WebResponse; import com.meterware.httpunit.protocol.UploadFileSpec; import com.meterware.servletunit.InvocationContext; import com.meterware.servletunit.ServletRunner; import com.meterware.servletunit.ServletUnitClient; import org.junit.After; import org.junit.Before; import org.springframework.context.ApplicationContext; import org.springframework.core.io.FileSystemResource; public abstract class AbstractFormServiceTests { protected static ApplicationContext factory; protected FormServiceImpl formService; // web client protected ServletUnitClient client; protected WebResponse clientResponse; // servlet request/response protected InvocationContext invocationContext; protected HttpServletRequest request; protected HttpServletResponse response; protected ServletConfig config; // request contexts protected RequestContextChainingService requestContexts; protected RequestContext rc; protected HttpServletRequest newRequest; protected HttpServletResponse newResponse; static { Servlet3Util.setDisableServlet3Features(true); // 禁用servlet3,因为httpunit还不支持 } protected final void getFormService(String name) { getFormService(name, factory); } protected final void getFormService(String name, ApplicationContext factory) { formService = (FormServiceImpl) factory.getBean(name); assertNotNull(formService); } protected static ApplicationContext createContext(String name) { return createContext(name, null); } protected static ApplicationContext createContext(String name, boolean withUpload) { ApplicationContext parent = withUpload ? createContext("services-base-with-upload.xml", null) : createContext( "services-base-without-upload.xml", null); return createContext(name, parent); } protected static ApplicationContext createContext(String name, ApplicationContext parent) { return new ResourceLoadingXmlApplicationContext(new FileSystemResource(new File(srcdir, name)), parent); } @Before public final void createWebClient() throws Exception { // Servlet container ServletRunner servletRunner = new ServletRunner(); servletRunner.registerServlet("/*", NoopServlet.class.getName()); // Servlet client client = servletRunner.newClient(); // Charset HttpUnitOptions.setDefaultCharacterSet("GBK"); } @After public final void commit() throws Exception { if (rc != null) { requestContexts.commitRequestContext(rc); } } protected final void invokeGet(Object[][] args) throws Exception { invokeGet(factory, args); } protected final void invokeGet(ApplicationContext factory, Object[][] args) throws Exception { invokeServlet(factory, new GetMethodWebRequest("http://localhost/"), args); } protected final void invokePost(Object[][] args) throws Exception { invokePost(factory, args); } protected final void invokePost(ApplicationContext factory, Object[][] args) throws Exception { invokeServlet(factory, new PostMethodWebRequest("http://localhost/"), args); } protected final void invokePostMime(Object[][] args) throws Exception { invokePostMime(factory, args); } protected final void invokePostMime(ApplicationContext factory, Object[][] args) throws Exception { invokeServlet(factory, new PostMethodWebRequest("http://localhost/", true), args); } private void invokeServlet(ApplicationContext factory, WebRequest wr, Object[][] args) throws Exception { assertNotNull(wr); if (args != null) { for (Object[] pair : args) { assertTrue(pair != null && pair.length == 2); String name = (String) pair[0]; Object value = pair[1]; if (value instanceof String[]) { wr.setParameter(name, (String[]) value); } else if (value instanceof File[] || value instanceof File) { File[] files = value instanceof File ? new File[] { (File) value } : (File[]) value; UploadFileSpec[] specs = new UploadFileSpec[files.length]; for (int i = 0; i < files.length; i++) { if (files[i].getName().contains(".")) { specs[i] = new UploadFileSpec(files[i]); } else { specs[i] = new UploadFileSpec(files[i], ""); // 对于无后缀的文件,不设contentType } } wr.setParameter(name, specs); } else { wr.setParameter(name, (String) value); } } } invocationContext = client.newInvocation(wr); request = invocationContext.getRequest(); response = invocationContext.getResponse(); config = invocationContext.getServlet().getServletConfig(); // request context requestContexts = (RequestContextChainingService) factory.getBean("requestContexts"); rc = requestContexts.getRequestContext(config.getServletContext(), request, response); assertNotNull(rc); newRequest = rc.getRequest(); newResponse = rc.getResponse(); } protected final void commitToClient() throws Exception { clientResponse = client.getResponse(invocationContext); } public static class NoopServlet extends HttpServlet { private static final long serialVersionUID = 3034658026956449398L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } }