org.pentaho.test.platform.web.GetResourceIT.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.test.platform.web.GetResourceIT.java

Source

/*!
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.test.platform.web;

import org.apache.commons.lang3.mutable.MutableInt;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.pentaho.platform.api.repository2.unified.IUnifiedRepository;
import org.pentaho.platform.api.repository2.unified.RepositoryFile;
import org.pentaho.platform.api.repository2.unified.data.simple.SimpleRepositoryFileData;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.core.system.boot.PlatformInitializationException;
import org.pentaho.platform.web.servlet.GetResource;
import org.pentaho.test.platform.engine.core.MicroPlatform;
import org.pentaho.test.platform.utils.TestResourceLocation;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;

import static junit.framework.Assert.assertEquals;
import static org.mockito.Mockito.*;

/**
 * Tests for <code>org.pentaho.platform.web.servlet.GetResource</code>.
 * 
 * @author mlowery
 */
@SuppressWarnings("nls")
public class GetResourceIT {
    private static final String TEST_MIME_TYPE = "test-mime-type";
    private static final String RESOURCE_PARAM = "resource";
    private static final String CONTENT_DISPOSITION_HEADER = "content-disposition";

    private MicroPlatform mp = new MicroPlatform(TestResourceLocation.TEST_RESOURCES + "/web-servlet-solution");
    private HttpServletRequest request;
    private HttpServletResponse response;
    private GetResource servlet;

    @Before
    public void setUp() throws PlatformInitializationException, ServletException {
        request = mock(HttpServletRequest.class);
        when(request.getMethod()).thenReturn("GET");

        response = mock(HttpServletResponse.class);

        servlet = spy(new GetResource());
        final ServletConfig servletConfig = mock(ServletConfig.class);
        final ServletContext servletContext = mock(ServletContext.class);
        when(servletContext.getMimeType(anyString())).thenReturn(TEST_MIME_TYPE);
        when(servletConfig.getServletContext()).thenReturn(servletContext);
        servlet.init(servletConfig);

        mp.start();
    }

    @After
    public void tearDown() throws Exception {
        mp.stop();

        request = null;
        response = null;
        servlet = null;
        mp = null;
    }

    @Test
    public void testGetResource() throws ServletException, IOException {
        String resource = "adhoc/picklist.xsl";

        when(request.getParameter(RESOURCE_PARAM)).thenReturn(resource);

        final ServletOutputStream outputStream = mock(ServletOutputStream.class);
        final MutableInt fileLength = new MutableInt(0);
        doAnswer(new Answer<Void>() {
            @Override
            public Void answer(InvocationOnMock invocation) throws Throwable {
                fileLength.add((Integer) invocation.getArguments()[2]);
                return null;
            }
        }).when(outputStream).write(any(byte[].class), anyInt(), anyInt());
        when(response.getOutputStream()).thenReturn(outputStream);

        servlet.service(request, response);

        verify(response).setContentType(eq(TEST_MIME_TYPE));
        verify(response).setHeader(eq(CONTENT_DISPOSITION_HEADER),
                endsWith(resource.substring(resource.lastIndexOf("/") + 1)));

        final int expected = new Long(
                new File(PentahoSystem.getApplicationContext().getSolutionPath("system/custom/xsl/" + resource))
                        .length()).intValue();
        assertEquals(expected, fileLength.intValue());
        verify(response).setContentLength(eq(expected));
    }

    @Test
    public void testNotSupportedExt() throws ServletException, IOException {
        when(request.getParameter(RESOURCE_PARAM)).thenReturn("not_supported.nsp");

        servlet.service(request, response);

        verify(response).setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
        verify(servlet).error(matches(".*ERROR_0002.*"));
    }

    @Test
    public void testParentPath() throws ServletException, IOException {
        when(request.getParameter(RESOURCE_PARAM)).thenReturn("../some_file.jar");

        servlet.service(request, response);

        verify(response).setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
        verify(servlet).error(matches(".*ERROR_0001.*"));
    }

    @Test
    public void testFileNotExist() throws ServletException, IOException {
        when(request.getParameter(RESOURCE_PARAM)).thenReturn("not_exist.xsl");

        servlet.service(request, response);

        verify(response).setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
        verify(servlet).error(matches(".*ERROR_0003.*"));
    }

    @Test
    public void testRepositoryFile() throws ServletException, IOException {
        final String repoFileName = "repo_file.jpg";
        final int repoFileLength = 100;

        final RepositoryFile repositoryFile = mock(RepositoryFile.class);

        final InputStream inputStream = mock(InputStream.class);
        when(inputStream.read(any(byte[].class))).thenReturn(repoFileLength, -1);

        final SimpleRepositoryFileData repositoryFileData = mock(SimpleRepositoryFileData.class);
        when(repositoryFileData.getStream()).thenReturn(inputStream);

        final IUnifiedRepository repo = mock(IUnifiedRepository.class);
        when(repo.getFile(eq(repoFileName))).thenReturn(repositoryFile);
        when(repo.getDataForRead(any(Serializable.class), eq(SimpleRepositoryFileData.class)))
                .thenReturn(repositoryFileData);
        mp.defineInstance(IUnifiedRepository.class, repo);

        when(request.getParameter(RESOURCE_PARAM)).thenReturn(repoFileName);

        final ServletOutputStream outputStream = mock(ServletOutputStream.class);
        when(response.getOutputStream()).thenReturn(outputStream);

        servlet.service(request, response);

        verify(response).setContentType(eq(TEST_MIME_TYPE));
        verify(response).setHeader(eq(CONTENT_DISPOSITION_HEADER), endsWith(repoFileName));
        verify(response).setContentLength(repoFileLength);
    }
}