com.liferay.portal.osgi.web.portlet.container.upload.test.UploadPortletTest.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portal.osgi.web.portlet.container.upload.test.UploadPortletTest.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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.
 */

package com.liferay.portal.osgi.web.portlet.container.upload.test;

import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.model.Company;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.portlet.PortletURLFactoryUtil;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCActionCommand;
import com.liferay.portal.kernel.service.CompanyLocalServiceUtil;
import com.liferay.portal.kernel.test.rule.AggregateTestRule;
import com.liferay.portal.kernel.test.util.RandomTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.HashMapDictionary;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.MapUtil;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.osgi.web.portlet.container.test.BasePortletContainerTestCase;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import com.liferay.portal.theme.ThemeDisplayFactory;
import com.liferay.portal.upload.LiferayServletRequest;
import com.liferay.portal.util.test.PortletContainerTestUtil;
import com.liferay.portal.util.test.PortletContainerTestUtil.Response;

import java.io.IOException;
import java.io.PrintWriter;

import java.util.Dictionary;
import java.util.Map;

import javax.portlet.ActionRequest;
import javax.portlet.Portlet;
import javax.portlet.PortletRequest;
import javax.portlet.PortletURL;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;

import org.junit.Assert;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceRegistration;

import org.springframework.mock.web.MockMultipartHttpServletRequest;

/**
 * @author Manuel de la Pea
 */
@RunWith(Arquillian.class)
public class UploadPortletTest extends BasePortletContainerTestCase {

    @ClassRule
    @Rule
    public static final AggregateTestRule aggregateTestRule = new LiferayIntegrationTestRule();

    @Before
    @Override
    public void setUp() throws Exception {
        super.setUp();

        _testUploadPortlet = new TestUploadPortlet() {

            @Override
            public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse)
                    throws IOException {

                PrintWriter printWriter = resourceResponse.getWriter();

                PortletURL portletURL = resourceResponse.createActionURL();

                String queryString = HttpUtil.getQueryString(portletURL.toString());

                Map<String, String[]> parameterMap = HttpUtil.getParameterMap(queryString);

                String portalAuthenticationToken = MapUtil.getString(parameterMap, "p_auth");

                printWriter.write(portalAuthenticationToken);
            }

        };

        registerMVCActionCommand(new TestUploadMVCActionCommand(_testUploadPortlet));
        registerMVCPortlet(_testUploadPortlet);
    }

    @Test
    public void testUploadFile() throws Exception {
        String content = "Enterprise. Open Source. For Life.";

        Response response = testUpload(content.getBytes());

        Assert.assertEquals(200, response.getCode());

        JSONObject jsonObject = JSONFactoryUtil.createJSONObject(response.getBody());

        Assert.assertTrue(jsonObject.getBoolean("success"));

        String key = group.getGroupId() + "_0_" + TestUploadPortlet.PARAMETER_NAME;

        TestFileEntry actualTestFileEntry = _testUploadPortlet.get(key);

        Assert.assertNotNull(actualTestFileEntry);
        Assert.assertEquals(content, StringUtil.read(actualTestFileEntry.getInputStream()));
    }

    @Test
    public void testUploadZeroBytesFile() throws Exception {
        Response response = testUpload(new byte[0]);

        Assert.assertEquals(200, response.getCode());

        JSONObject jsonObject = JSONFactoryUtil.createJSONObject(response.getBody());

        Assert.assertTrue(jsonObject.getBoolean("success"));

        String key = group.getGroupId() + "_0_" + TestUploadPortlet.PARAMETER_NAME;

        TestFileEntry actualTestFileEntry = _testUploadPortlet.get(key);

        Assert.assertNull(actualTestFileEntry.getInputStream());
    }

    protected void registerMVCActionCommand(MVCActionCommand mvcActionCommand) throws Exception {

        Bundle bundle = FrameworkUtil.getBundle(getClass());

        BundleContext bundleContext = bundle.getBundleContext();

        Dictionary<String, Object> properties = new HashMapDictionary<>();

        properties.put("javax.portlet.name", TestUploadPortlet.PORTLET_NAME);
        properties.put("mvc.command.name", TestUploadPortlet.MVC_COMMAND_NAME);

        ServiceRegistration<MVCActionCommand> serviceRegistration = bundleContext
                .registerService(MVCActionCommand.class, mvcActionCommand, properties);

        serviceRegistrations.add(serviceRegistration);
    }

    protected void registerMVCPortlet(Portlet portlet) throws Exception {
        Dictionary<String, Object> properties = new HashMapDictionary<>();

        properties.put("com.liferay.portlet.private-request-attributes", Boolean.FALSE.toString());
        properties.put("com.liferay.portlet.private-session-attributes", Boolean.FALSE.toString());
        properties.put("com.liferay.portlet.scopeable", Boolean.TRUE.toString());
        properties.put("com.liferay.portlet.struts-path", TestUploadPortlet.MVC_PATH);
        properties.put("com.liferay.portlet.use-default-template", Boolean.TRUE.toString());
        properties.put("com.liferay.portlet.webdav-storage-token", TestUploadPortlet.MVC_PATH);
        properties.put("javax.portlet.display-name", "Test Upload Portlet");
        properties.put("javax.portlet.expiration-cache", "0");
        properties.put("javax.portlet.init-param.check-auth-token", Boolean.FALSE.toString());
        properties.put("javax.portlet.init-param.single-page-application-cacheable", Boolean.FALSE.toString());
        properties.put("javax.portlet.init-param.template-path", "/");
        properties.put("javax.portlet.init-param.view-template",
                "/" + TestUploadPortlet.PORTLET_NAME + "/view.jsp");
        properties.put("javax.portlet.name", TestUploadPortlet.PORTLET_NAME);
        properties.put("javax.portlet.resource-bundle", "content.Language");
        properties.put("javax.portlet.security-role-ref", "guest,power-user,user");
        properties.put("javax.portlet.supports.mime-type", "text/html");

        setUpPortlet(portlet, properties, TestUploadPortlet.PORTLET_NAME);
    }

    protected void setUp(LiferayServletRequest liferayServletRequest, Layout layout) throws Exception {

        if (liferayServletRequest == null) {
            throw new IllegalArgumentException("Liferay servlet request is null");
        }

        if (layout == null) {
            throw new IllegalArgumentException("Layout is null");
        }

        HttpServletRequest httpServletRequest = (HttpServletRequest) liferayServletRequest.getRequest();

        httpServletRequest.setAttribute(WebKeys.LAYOUT, layout);

        ThemeDisplay themeDisplay = ThemeDisplayFactory.create();

        Company company = CompanyLocalServiceUtil.getCompany(layout.getCompanyId());

        themeDisplay.setCompany(company);

        themeDisplay.setLayout(layout);
        themeDisplay.setLayoutSet(layout.getLayoutSet());
        themeDisplay.setPlid(layout.getPlid());

        themeDisplay.setPortalURL(TestPropsValues.PORTAL_URL);
        themeDisplay.setRequest(httpServletRequest);

        Group group = layout.getGroup();

        themeDisplay.setScopeGroupId(group.getGroupId());
        themeDisplay.setSiteGroupId(group.getGroupId());

        themeDisplay.setUser(TestPropsValues.getUser());

        httpServletRequest.setAttribute(WebKeys.THEME_DISPLAY, themeDisplay);
    }

    protected Response testUpload(byte[] bytes) throws Exception {
        LiferayServletRequest liferayServletRequest = PortletContainerTestUtil
                .getMultipartRequest(TestUploadPortlet.PARAMETER_NAME, bytes);

        setUp(liferayServletRequest, layout);

        ServletRequest servletRequest = liferayServletRequest.getRequest();

        MockMultipartHttpServletRequest mockServletRequest = (MockMultipartHttpServletRequest) servletRequest;

        PortletURL portletURL = PortletURLFactoryUtil.create(mockServletRequest, TestUploadPortlet.PORTLET_NAME,
                layout.getPlid(), PortletRequest.ACTION_PHASE);

        portletURL.setParameter(ActionRequest.ACTION_NAME, TestUploadPortlet.MVC_COMMAND_NAME);
        portletURL.setParameter("randomId", RandomTestUtil.randomString());

        String url = portletURL.toString();

        mockServletRequest.addParameter("Cookie", new String[] { "test" });

        return PortletContainerTestUtil.postMultipart(url, mockServletRequest, TestUploadPortlet.PARAMETER_NAME);
    }

    private TestUploadPortlet _testUploadPortlet;

}