/** * 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<>(); }