org.seasar.cubby.controller.impl.MultipartRequestParserImplMultipartRequestTest.java Source code

Java tutorial

Introduction

Here is the source code for org.seasar.cubby.controller.impl.MultipartRequestParserImplMultipartRequestTest.java

Source

/*
 * Copyright 2004-2010 the Seasar Foundation and the Others.
 *
 * 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 org.seasar.cubby.controller.impl;

import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.getCurrentArguments;
import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Map;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.ByteArrayPartSource;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.PartSource;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.easymock.IAnswer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.seasar.cubby.controller.RequestParser;
import org.seasar.cubby.mock.MockContainerProvider;
import org.seasar.cubby.plugin.PluginRegistry;
import org.seasar.cubby.plugins.BinderPlugin;
import org.seasar.cubby.spi.ContainerProvider;
import org.seasar.cubby.spi.container.Container;

public class MultipartRequestParserImplMultipartRequestTest {

    private final PluginRegistry pluginRegistry = PluginRegistry.getInstance();

    private final RequestParser requestParser = new MultipartRequestParser();

    private HttpServletRequest request;

    private final Hashtable<String, Object> attributes = new Hashtable<String, Object>();

    private InputStream input;

    private MultipartRequestEntity entity;

    @Before
    @SuppressWarnings("unchecked")
    public void setupRequest() throws Exception {
        request = createMock(HttpServletRequest.class);
        expect(request.getCharacterEncoding()).andStubReturn("UTF-8");
        expect(request.getAttribute(String.class.cast(anyObject()))).andStubAnswer(new IAnswer<Object>() {

            public Object answer() throws Throwable {
                return attributes.get(getCurrentArguments()[0]);
            }

        });
        request.setAttribute(String.class.cast(anyObject()), anyObject());
        expectLastCall().andStubAnswer(new IAnswer<Object>() {

            public Object answer() throws Throwable {
                attributes.put(String.class.cast(getCurrentArguments()[0]), getCurrentArguments()[1]);
                return null;
            }

        });
        expect(request.getAttributeNames()).andStubAnswer(new IAnswer<Enumeration>() {

            public Enumeration answer() throws Throwable {
                return attributes.keys();
            }

        });
        expect(request.getParameterMap()).andStubReturn(attributes);
        expect(request.getContentType()).andStubAnswer(new IAnswer<String>() {

            public String answer() throws Throwable {
                return entity.getContentType();
            }

        });
        expect(request.getContentLength()).andStubAnswer(new IAnswer<Integer>() {

            public Integer answer() throws Throwable {
                return (int) entity.getContentLength();
            }

        });
        expect(request.getInputStream()).andStubReturn(new ServletInputStream() {

            @Override
            public int read() throws IOException {
                return input.read();
            }

        });
        replay(request);

        final FileUpload fileUpload = new ServletFileUpload();
        fileUpload.setFileItemFactory(new DiskFileItemFactory());
        final RequestContext requestContext = new ServletRequestContext(request);
        BinderPlugin binderPlugin = new BinderPlugin();
        binderPlugin.bind(ContainerProvider.class).toInstance(new MockContainerProvider(new Container() {

            public <T> T lookup(final Class<T> type) {
                if (FileUpload.class.equals(type)) {
                    return type.cast(fileUpload);
                }

                if (RequestContext.class.equals(type)) {
                    return type.cast(requestContext);
                }

                return null;
            }

        }));
        pluginRegistry.register(binderPlugin);
    }

    @After
    public void tearDownProvider() {
        pluginRegistry.clear();
    }

    @Test
    public void getParameterMap() throws Exception {
        final PartSource filePartSource = new ByteArrayPartSource("upload.txt", "upload test".getBytes("UTF-8"));
        final PostMethod method = new PostMethod();
        final Part[] parts = new Part[] { new StringPart("a", "12345"), new StringPart("b", "abc"),
                new StringPart("b", "def"), new FilePart("file", filePartSource) };
        this.entity = new MultipartRequestEntity(parts, method.getParams());
        final ByteArrayOutputStream out = new ByteArrayOutputStream();
        this.entity.writeRequest(out);
        out.flush();
        out.close();
        this.input = new ByteArrayInputStream(out.toByteArray());
        this.attributes.put("c", new String[] { "999" });

        final Map<String, Object[]> parameterMap = requestParser.getParameterMap(request);
        assertEquals("parameterMap.size()", 4, parameterMap.size());
        final Object[] a = parameterMap.get("a");
        assertEquals("a.length", 1, a.length);
        assertEquals("a[0]", "12345", a[0]);
        final Object[] b = parameterMap.get("b");
        assertEquals("b.length", 2, b.length);
        assertEquals("b[0]", "abc", b[0]);
        assertEquals("b[1]", "def", b[1]);
        final Object[] c = parameterMap.get("c");
        assertEquals("c.length", 1, c.length);
        assertEquals("c[0]", "999", c[0]);
        final Object[] file = parameterMap.get("file");
        assertEquals("file.length", 1, file.length);
        assertTrue("file[0]", file[0] instanceof FileItem);
        final FileItem item = (FileItem) file[0];
        assertEquals("upload test", new String(item.get(), "UTF-8"));
    }

    @Test
    public void getParameterMapEmpty() throws Exception {
        final PostMethod method = new PostMethod();
        final Part[] parts = new Part[0];
        this.entity = new MultipartRequestEntity(parts, method.getParams());
        final ByteArrayOutputStream out = new ByteArrayOutputStream();
        this.entity.writeRequest(out);
        out.flush();
        out.close();
        this.input = new ByteArrayInputStream(out.toByteArray());

        final Map<String, Object[]> parameterMap = requestParser.getParameterMap(request);
        assertTrue("parameterMap.isEmpty()", parameterMap.isEmpty());
    }

}