com.liferay.document.library.webdav.test.WebDAVOSXTest.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.document.library.webdav.test.WebDAVOSXTest.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.document.library.webdav.test;

import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.service.DLAppLocalServiceUtil;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.test.rule.AggregateTestRule;
import com.liferay.portal.kernel.test.rule.Sync;
import com.liferay.portal.kernel.test.rule.SynchronousDestinationTestRule;
import com.liferay.portal.kernel.test.util.ServiceContextTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Tuple;
import com.liferay.portal.kernel.webdav.WebDAVUtil;
import com.liferay.portal.kernel.webdav.methods.Method;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import com.liferay.portal.util.PropsValues;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

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;

/**
 * <p>
 * Based on Microsoft Office 2008 for OS X.
 * </p>
 *
 * @author Alexander Chow
 */
@RunWith(Arquillian.class)
@Sync
public class WebDAVOSXTest extends BaseWebDAVTestCase {

    @ClassRule
    @Rule
    public static final AggregateTestRule aggregateTestRule = new AggregateTestRule(
            new LiferayIntegrationTestRule(), SynchronousDestinationTestRule.INSTANCE,
            WebDAVEnvironmentConfigTestRule.INSTANCE);

    @Before
    public void setUp() throws Exception {
        Class<?> clazz = getClass();

        _testFileBytes = FileUtil.getBytes(clazz, _OFFICE_TEST_DOCX);
        _testMetaBytes = FileUtil.getBytes(clazz, _OFFICE_TEST_META_DOCX);
        _testDeltaBytes = FileUtil.getBytes(clazz, _OFFICE_TEST_DELTA_DOCX);

        servicePut(_TEST_FILE_NAME, _testFileBytes, getLock(_TEST_FILE_NAME));
    }

    @Test
    public void testGetFileWithEscapedCharactersInFileName() throws Exception {
        FileEntry fileEntry = null;

        try {
            Group group = GroupLocalServiceUtil.getFriendlyURLGroup(PortalUtil.getDefaultCompanyId(),
                    getGroupFriendlyURL());

            Folder folder = DLAppLocalServiceUtil.getFolder(group.getGroupId(),
                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, getFolderName());

            fileEntry = DLAppLocalServiceUtil.addFileEntry(TestPropsValues.getUserId(), group.getGroupId(),
                    folder.getFolderId(), _TEST_FILE_NAME_ILLEGAL_CHARACTERS, ContentTypes.APPLICATION_MSWORD,
                    _TEST_FILE_NAME_ILLEGAL_CHARACTERS, StringPool.BLANK, StringPool.BLANK, _testFileBytes,
                    ServiceContextTestUtil.getServiceContext(group.getGroupId()));

            assertCode(HttpServletResponse.SC_OK, serviceGet(_TEST_FILE_NAME_ILLEGAL_CHARACTERS_ESCAPED));
        } finally {
            if (fileEntry != null) {
                DLAppLocalServiceUtil.deleteFileEntry(fileEntry.getFileEntryId());
            }
        }
    }

    @Test
    public void testMSOffice1Create() throws Exception {
        Tuple tuple = null;

        for (int i = 0; i < 3; i++) {
            lock(HttpServletResponse.SC_OK, _TEST_FILE_NAME);
            unlock(_TEST_FILE_NAME);
        }

        lock(HttpServletResponse.SC_OK, _TEST_FILE_NAME);

        assertCode(HttpServletResponse.SC_CREATED,
                servicePut(_TEST_FILE_NAME, _testFileBytes, getLock(_TEST_FILE_NAME)));

        unlock(_TEST_FILE_NAME);

        for (int i = 0; i < 3; i++) {
            lock(HttpServletResponse.SC_OK, _TEST_FILE_NAME);

            tuple = serviceGet(_TEST_FILE_NAME);

            assertCode(HttpServletResponse.SC_OK, tuple);
            Assert.assertArrayEquals(_testFileBytes, getResponseBody(tuple));

            unlock(_TEST_FILE_NAME);
        }

        for (int i = 0; i < 2; i++) {
            assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(_TEST_META_NAME));
            assertCode(HttpServletResponse.SC_CREATED, servicePut(_TEST_META_NAME, _testMetaBytes));

            lock(HttpServletResponse.SC_OK, _TEST_META_NAME);

            assertCode(HttpServletResponse.SC_CREATED,
                    servicePut(_TEST_META_NAME, _testMetaBytes, getLock(_TEST_META_NAME)));
            assertCode(WebDAVUtil.SC_MULTI_STATUS, servicePropFind(_TEST_META_NAME));

            tuple = serviceGet(_TEST_META_NAME);

            assertCode(HttpServletResponse.SC_OK, tuple);
            Assert.assertArrayEquals(_testMetaBytes, getResponseBody(tuple));

            unlock(_TEST_META_NAME);

            assertCode(HttpServletResponse.SC_NO_CONTENT, serviceDelete(_TEST_META_NAME));
        }

        for (int i = 0; i < 3; i++) {
            if (i == 1) {
                lock(HttpServletResponse.SC_OK, _TEST_META_NAME);

                tuple = serviceGet(_TEST_META_NAME);

                assertCode(HttpServletResponse.SC_OK, tuple);
                Assert.assertArrayEquals(_testMetaBytes, getResponseBody(tuple));
            } else {
                lock(HttpServletResponse.SC_CREATED, _TEST_META_NAME);

                tuple = serviceGet(_TEST_META_NAME);

                assertCode(HttpServletResponse.SC_OK, tuple);
                Assert.assertTrue(getResponseBody(tuple).length == 0);
            }

            unlock(_TEST_META_NAME);

            if (i == 0) {
                assertCode(HttpServletResponse.SC_CREATED,
                        servicePut(_TEST_META_NAME, _testMetaBytes, getLock(_TEST_META_NAME)));

                tuple = serviceGet(_TEST_META_NAME);

                assertCode(HttpServletResponse.SC_OK, tuple);
                Assert.assertArrayEquals(_testMetaBytes, getResponseBody(tuple));

                assertCode(WebDAVUtil.SC_MULTI_STATUS, servicePropFind(_TEST_META_NAME));
            }
        }
    }

    @Test
    public void testMSOffice2Open() throws Exception {
        Tuple tuple = null;

        assertCode(WebDAVUtil.SC_MULTI_STATUS, servicePropFind(_TEST_FILE_NAME));
        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind("MCF-Test.docx"));

        lock(HttpServletResponse.SC_OK, _TEST_FILE_NAME);

        tuple = serviceGet(_TEST_FILE_NAME);

        assertCode(HttpServletResponse.SC_OK, tuple);
        Assert.assertArrayEquals(_testFileBytes, getResponseBody(tuple));

        unlock(_TEST_FILE_NAME);
        lock(HttpServletResponse.SC_OK, _TEST_FILE_NAME);

        tuple = serviceGet(_TEST_FILE_NAME);

        assertCode(HttpServletResponse.SC_OK, tuple);
        Assert.assertArrayEquals(_testFileBytes, getResponseBody(tuple));
    }

    @Test
    public void testMSOffice3Modify() throws Exception {
        Tuple tuple = null;

        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(_TEMP_FILE_NAME_1));
        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind("MCF-Word Work File D_1.tmp"));
        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(_TEMP_FILE_NAME_1));
        assertCode(HttpServletResponse.SC_CREATED, servicePut(_TEMP_FILE_NAME_1, _testDeltaBytes));
        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(_TEMP_META_NAME_1));
        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(_TEMP_META_NAME_1));
        assertCode(HttpServletResponse.SC_CREATED, servicePut(_TEMP_META_NAME_1, _testMetaBytes));

        lock(HttpServletResponse.SC_OK, _TEMP_META_NAME_1);

        assertCode(HttpServletResponse.SC_CREATED,
                servicePut(_TEMP_META_NAME_1, _testMetaBytes, getLock(_TEMP_META_NAME_1)));
        assertCode(WebDAVUtil.SC_MULTI_STATUS, servicePropFind(_TEMP_FILE_NAME_1));

        unlock(_TEMP_META_NAME_1);
        lock(HttpServletResponse.SC_OK, _TEMP_FILE_NAME_1);
        unlock(_TEMP_FILE_NAME_1);
        lock(HttpServletResponse.SC_OK, _TEMP_FILE_NAME_1);

        assertCode(HttpServletResponse.SC_CREATED,
                servicePut(_TEMP_FILE_NAME_1, _testDeltaBytes, getLock(_TEMP_FILE_NAME_1)));
        assertCode(WebDAVUtil.SC_MULTI_STATUS, servicePropFind(_TEMP_FILE_NAME_1));

        unlock(_TEST_FILE_NAME);
        lock(HttpServletResponse.SC_OK, _TEST_FILE_NAME);

        tuple = serviceGet(_TEST_FILE_NAME);

        assertCode(HttpServletResponse.SC_OK, tuple);
        Assert.assertArrayEquals(_testFileBytes, getResponseBody(tuple));

        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind("Backup of Test.docx"));
        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(_TEMP_FILE_NAME_2));

        unlock(_TEST_FILE_NAME);

        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(_TEMP_FILE_NAME_2));
        assertCode(HttpServletResponse.SC_CREATED,
                serviceCopyOrMove(Method.MOVE, _TEST_FILE_NAME, _TEMP_FILE_NAME_2));
        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(_TEST_META_NAME));
        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(_TEMP_META_NAME_2));

        for (int i = 0; i < 2; i++) {
            lock(HttpServletResponse.SC_OK, _TEMP_FILE_NAME_2);

            tuple = serviceGet(_TEMP_FILE_NAME_2);

            assertCode(HttpServletResponse.SC_OK, tuple);
            Assert.assertArrayEquals(_testFileBytes, getResponseBody(tuple));

            unlock(_TEMP_FILE_NAME_2);
        }

        for (int i = 0; i < 2; i++) {
            String orig = _TEMP_FILE_NAME_1;
            String dest = _TEST_FILE_NAME;

            if (i == 1) {
                orig = _TEMP_META_NAME_1;
                dest = _TEST_META_NAME;
            }

            assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(dest));
            assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(dest));

            if (i == 0) {
                assertCode(HttpServletResponse.SC_CREATED,
                        serviceCopyOrMove(Method.MOVE, orig, dest, getLock(orig)));

                moveLock(orig, dest);
            }
        }

        for (int i = 0; i < 2; i++) {
            lock(HttpServletResponse.SC_OK, _TEST_FILE_NAME);

            tuple = serviceGet(_TEST_FILE_NAME);

            assertCode(HttpServletResponse.SC_OK, tuple);
            Assert.assertArrayEquals(_testDeltaBytes, getResponseBody(tuple));

            unlock(_TEST_FILE_NAME);
        }

        lock(HttpServletResponse.SC_CREATED, _TEST_META_NAME);

        tuple = serviceGet(_TEST_META_NAME);

        assertCode(HttpServletResponse.SC_OK, tuple);
        Assert.assertTrue(getResponseBody(tuple).length == 0);

        assertCode(HttpServletResponse.SC_CREATED,
                servicePut(_TEST_META_NAME, _testMetaBytes, getLock(_TEST_META_NAME)));
        assertCode(WebDAVUtil.SC_MULTI_STATUS, servicePropFind(_TEST_META_NAME));

        unlock(_TEST_META_NAME);
        unlock(_TEMP_FILE_NAME_2);

        assertCode(HttpServletResponse.SC_NO_CONTENT, serviceDelete(_TEMP_FILE_NAME_2));
        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(_TEMP_META_NAME_2));
        assertCode(HttpServletResponse.SC_NOT_FOUND, servicePropFind(_TEMP_FILE_NAME_2));
    }

    protected String getLock(String fileName) {
        return _lockMap.get(fileName);
    }

    @Override
    protected String getUserAgent() {
        return _USER_AGENT;
    }

    protected void lock(int statusCode, String fileName) {
        Tuple tuple = serviceLock(fileName, null, 0);

        assertCode(statusCode, tuple);

        _lockMap.put(fileName, getLock(tuple));
    }

    protected void moveLock(String src, String dest) {
        String lock = _lockMap.remove(src);

        if (lock != null) {
            _lockMap.put(dest, lock);
        }
    }

    protected void unlock(String fileName) {
        String lock = _lockMap.remove(fileName);

        assertCode(HttpServletResponse.SC_NO_CONTENT, serviceUnlock(fileName, lock));
    }

    private static final String _OFFICE_TEST_DELTA_DOCX = "/com/liferay/document/library/dependencies/OSX_Test_Delta.docx";

    private static final String _OFFICE_TEST_DOCX = "/com/liferay/document/library/dependencies/OSX_Test.docx";

    private static final String _OFFICE_TEST_META_DOCX = "/com/liferay/document/library/dependencies/OSX_Test_Meta.docx";

    private static final String _TEMP_FILE_NAME_1 = "Word Work File D_1.tmp";

    private static final String _TEMP_FILE_NAME_2 = "Word Work File L_2.tmp";

    private static final String _TEMP_META_NAME_1 = "._Word Work File D_1.tmp";

    private static final String _TEMP_META_NAME_2 = "._Word Work File L_2.tmp";

    private static final String _TEST_FILE_NAME = "Test.docx";

    private static final String _TEST_FILE_NAME_ILLEGAL_CHARACTERS = "Test/0.docx";

    private static final String _TEST_FILE_NAME_ILLEGAL_CHARACTERS_ESCAPED = "Test"
            + PropsValues.DL_WEBDAV_SUBSTITUTION_CHAR + "0.docx";

    private static final String _TEST_META_NAME = "._Test.docx";

    private static final String _USER_AGENT = "WebDAVFS/1.8 (01808000) Darwin/10.3.0 (i386)";

    private static byte[] _testDeltaBytes;
    private static byte[] _testFileBytes;
    private static byte[] _testMetaBytes;

    private final Map<String, String> _lockMap = new HashMap<>();

}