/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.vfs.impl.file;
import com.google.common.collect.ImmutableMap;
import com.google.common.hash.Hashing;
import com.google.common.io.ByteSource;
import com.google.common.io.ByteStreams;
import org.eclipse.che.api.core.ConflictException;
import org.eclipse.che.api.core.ForbiddenException;
import org.eclipse.che.api.core.ServerException;
import org.eclipse.che.api.core.util.FileCleaner;
import org.eclipse.che.api.vfs.AbstractVirtualFileSystemProvider;
import org.eclipse.che.api.vfs.Archiver;
import org.eclipse.che.api.vfs.ArchiverFactory;
import org.eclipse.che.api.vfs.Path;
import org.eclipse.che.api.vfs.VirtualFile;
import org.eclipse.che.api.vfs.VirtualFileFilter;
import org.eclipse.che.api.vfs.VirtualFileVisitor;
import org.eclipse.che.api.vfs.search.Searcher;
import org.eclipse.che.api.vfs.search.SearcherProvider;
import org.eclipse.che.commons.lang.IoUtil;
import org.eclipse.che.commons.lang.NameGenerator;
import org.eclipse.che.commons.lang.Pair;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Mockito;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet;
import static java.util.stream.Collectors.toList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class LocalVirtualFileTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
private final String DEFAULT_CONTENT = "__TEST__";
private final byte[] DEFAULT_CONTENT_BYTES = DEFAULT_CONTENT.getBytes();
private File testDirectory;
private LocalVirtualFileSystem fileSystem;
private Searcher searcher;
private ArchiverFactory archiverFactory;
private LocalVirtualFileAssertionHelper assertionHelper;
@Before
public void setUp() throws Exception {
File targetDir = new File(Thread.currentThread().getContextClassLoader().getResource(".").getPath()).getParentFile();
testDirectory = new File(targetDir, NameGenerator.generate("fs-", 4));
assertTrue(testDirectory.mkdir());
assertionHelper = new LocalVirtualFileAssertionHelper(testDirectory);
archiverFactory = mock(ArchiverFactory.class);
SearcherProvider searcherProvider = mock(SearcherProvider.class);
fileSystem = new LocalVirtualFileSystem(testDirectory,
archiverFactory,
searcherProvider,
mock(AbstractVirtualFileSystemProvider.CloseCallback.class));
searcher = mock(Searcher.class);
when(searcherProvider.getSearcher(eq(fileSystem), eq(true))).thenReturn(searcher);
when(searcherProvider.getSearcher(eq(fileSystem))).thenReturn(searcher);
}
@After
public void tearDown() throws Exception {
fileSystem.getPathLockFactory().checkClean();
IoUtil.deleteRecursive(testDirectory);
FileCleaner.stop();
}
@Test
public void getsName() throws Exception {
String name = generateFileName();
VirtualFile root = getRoot();
VirtualFile file = root.createFile(name, DEFAULT_CONTENT);
assertEquals(name, file.getName());
}
@Test
public void getsPath() throws Exception {
String name = generateFileName();
VirtualFile root = getRoot();
VirtualFile file = root.createFile(name, DEFAULT_CONTENT);
assertEquals("/" + file.getName(), file.getPath().toString());
}
@Test
public void getsRootPath() throws Exception {
VirtualFile root = getRoot();
assertEquals("/", root.getPath().toString());
}
@Test
public void checksIsFile() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
assertTrue(file.isFile());
VirtualFile folder = root.createFolder(generateFolderName());
assertFalse(folder.isFile());
}
@Test
public void checksIsFolder() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
assertFalse(file.isFolder());
VirtualFile folder = root.createFolder(generateFolderName());
assertTrue(folder.isFolder());
}
@Test
public void checksFileExistence() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
assertionHelper.assertThatIoFileExists(file.getPath());
assertTrue(file.exists());
}
@Test
public void checksDeletedFileExistence() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
Path path = file.getPath();
file.delete();
assertionHelper.assertThatIoFileDoesNotExist(path);
assertFalse(file.exists());
}
@Test
public void checksIsRoot() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile folder = root.createFolder(generateFolderName());
assertFalse(file.isRoot());
assertFalse(folder.isRoot());
assertTrue(root.isRoot());
}
@Test
public void getsLastModificationDate() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
long beforeUpdate = file.getLastModificationDate();
Thread.sleep(1000);
file.updateContent("updated content");
long afterUpdate = file.getLastModificationDate();
assertTrue(afterUpdate > beforeUpdate);
}
@Test
public void getsParent() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
assertEquals(root, file.getParent());
}
@Test
public void getsRootParent() throws Exception {
VirtualFile root = getRoot();
assertNull(root.getParent());
}
@Test
public void getsEmptyPropertiesMapIfFileDoesNotHaveProperties() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
assertionHelper.assertThatMetadataIoFileDoesNotExist(file.getPath());
assertTrue(file.getProperties().isEmpty());
}
@Test
public void getsPropertiesMap() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), "");
Map<String, String> properties = ImmutableMap.of("property1", "value1", "property2", "value2");
file.updateProperties(properties);
assertionHelper.assertThatMetadataIoFileHasContent(file.getPath(), serializeVirtualFileMetadata(properties));
assertEquals(properties, file.getProperties());
}
@Test
public void getsProperty() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), "");
Map<String, String> properties = ImmutableMap.of("property1", "value1");
file.updateProperties(ImmutableMap.of("property1", "value1"));
assertionHelper.assertThatMetadataIoFileHasContent(file.getPath(), serializeVirtualFileMetadata(properties));
assertEquals("value1", file.getProperty("property1"));
}
@Test
public void updatesProperties() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), "");
file.updateProperties(ImmutableMap.of("property1", "valueX",
"new property1", "value3"));
Map<String, String> expected = ImmutableMap.of("property1", "valueX",
"new property1", "value3");
assertionHelper.assertThatMetadataIoFileHasContent(file.getPath(), serializeVirtualFileMetadata(expected));
assertEquals(expected, file.getProperties());
}
@Test
public void setsProperty() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), "");
file.setProperty("property1", "value1");
Map<String, String> expected = ImmutableMap.of("property1", "value1");
assertionHelper.assertThatMetadataIoFileHasContent(file.getPath(), serializeVirtualFileMetadata(expected));
assertEquals(expected, file.getProperties());
}
@Test
public void removesPropertyBySetValueToNull() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), "");
file.setProperty("property1", "value1");
Map<String, String> expected = ImmutableMap.of("property1", "value1");
assertEquals(expected, file.getProperties());
file.setProperty("property1", null);
assertionHelper.assertThatMetadataIoFileDoesNotExist(file.getPath());
assertTrue(file.getProperties().isEmpty());
}
@Test
public void acceptsVisitor() throws Exception {
VirtualFile root = getRoot();
boolean[] visitedFlag = new boolean[]{false};
VirtualFileVisitor visitor = virtualFile -> {
assertSame(root, virtualFile);
visitedFlag[0] = true;
};
root.accept(visitor);
assertTrue("visit(VirtualFile) method was not invoked", visitedFlag[0]);
}
@Test
public void countsMd5Sums() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder(generateFolderName());
VirtualFile file1 = folder.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile file2 = folder.createFile(generateFileName(), "xxx");
root.createFolder(generateFolderName());
Set<Pair<String, String>> expected = newHashSet(Pair.of(countMd5Sum(file1), file1.getPath().subPath(folder.getPath()).toString()),
Pair.of(countMd5Sum(file2), file2.getPath().subPath(folder.getPath()).toString()));
assertEquals(expected, newHashSet(folder.countMd5Sums()));
}
@Test
public void returnsEmptyListWhenCountMd5SumsOnFile() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
assertTrue(file.countMd5Sums().isEmpty());
}
@Test
public void getsChildren() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder(generateFolderName());
VirtualFile file1 = root.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile file2 = root.createFile(generateFileName(), DEFAULT_CONTENT);
List<VirtualFile> expectedResult = newArrayList(file1, file2, folder);
Collections.sort(expectedResult);
assertEquals(expectedResult, root.getChildren());
}
@Test
public void doesNotShowDotVfsFolderInListOfChildren() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder(generateFolderName());
VirtualFile file1 = root.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile file2 = root.createFile(generateFileName(), DEFAULT_CONTENT);
File dotVfs = new File(root.toIoFile(), ".vfs");
assertTrue(dotVfs.exists() || dotVfs.mkdir());
List<VirtualFile> expectedResult = newArrayList(folder, file1, file2);
Collections.sort(expectedResult);
assertEquals(expectedResult, root.getChildren());
}
@Test
public void getsChildrenWithFilter() throws Exception {
VirtualFile root = getRoot();
root.createFolder(generateFolderName());
VirtualFile file1 = root.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile file2 = root.createFile(generateFileName(), DEFAULT_CONTENT);
List<VirtualFile> expectedResult = newArrayList(file1, file2);
Collections.sort(expectedResult);
List<VirtualFile> children = root.getChildren(file -> file.equals(file1) || file.equals(file2));
assertEquals(expectedResult, children);
}
@Test
public void getsChild() throws Exception {
VirtualFile root = getRoot();
String name = generateFileName();
VirtualFile file = root.createFile(name, DEFAULT_CONTENT);
assertEquals(file, root.getChild(Path.of(name)));
}
@Test
public void hideDotVfsFolderWhenTryAccessItByPath() throws Exception {
VirtualFile root = getRoot();
File dotVfs = new File(root.toIoFile(), ".vfs");
assertTrue(dotVfs.exists() || dotVfs.mkdir());
assertTrue(new File(dotVfs, "a.txt").createNewFile());
assertNull(root.getChild(Path.of(".vfs/a.txt")));
}
@Test
public void getsChildByHierarchicalPath() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder("a/b/c/d");
String name = generateFileName();
VirtualFile file = folder.createFile(name, DEFAULT_CONTENT);
assertEquals(file, root.getChild(folder.getPath().newPath(name)));
}
@Test
public void getsContentAsStream() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
byte[] bytes;
try (InputStream content = file.getContent()) {
bytes = ByteStreams.toByteArray(content);
}
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
assertEquals(DEFAULT_CONTENT, new String(bytes));
}
@Test
public void getsContentAsBytes() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
byte[] content = file.getContentAsBytes();
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
assertEquals(DEFAULT_CONTENT, new String(content));
}
@Test
public void getsContentAsString() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
String content = file.getContentAsString();
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
assertEquals(DEFAULT_CONTENT, content);
}
@Test
public void failsGetContentOfFolderAsStream() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder(generateFolderName());
thrown.expect(ForbiddenException.class);
folder.getContent();
}
@Test
public void failsGetContentOfFolderAsBytes() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder(generateFolderName());
thrown.expect(ForbiddenException.class);
folder.getContentAsBytes();
}
@Test
public void failsGetContentOfFolderAsString() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder(generateFolderName());
thrown.expect(ForbiddenException.class);
folder.getContentAsString();
}
@Test
public void updatesContentByStream() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
file.updateContent(new ByteArrayInputStream("updated content".getBytes()));
assertionHelper.assertThatIoFileHasContent(file.getPath(), "updated content".getBytes());
assertEquals("updated content", file.getContentAsString());
}
@Test
public void updatesContentByBytes() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
file.updateContent("updated content".getBytes());
assertionHelper.assertThatIoFileHasContent(file.getPath(), "updated content".getBytes());
assertEquals("updated content", file.getContentAsString());
}
@Test
public void updatesContentByString() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
file.updateContent("updated content");
assertionHelper.assertThatIoFileHasContent(file.getPath(), "updated content".getBytes());
assertEquals("updated content", file.getContentAsString());
}
@Test
public void updatesContentOfLockedFileByStreamWithLockToken() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
String lockToken = file.lock(0);
file.updateContent(new ByteArrayInputStream("updated content".getBytes()), lockToken);
assertionHelper.assertThatIoFileHasContent(file.getPath(), "updated content".getBytes());
assertEquals("updated content", file.getContentAsString());
}
@Test
public void updatesContentOfLockedFileByBytesWithLockToken() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
String lockToken = file.lock(0);
file.updateContent("updated content".getBytes(), lockToken);
assertionHelper.assertThatIoFileHasContent(file.getPath(), "updated content".getBytes());
assertEquals("updated content", file.getContentAsString());
}
@Test
public void updatesContentOfLockedFileByStringWithLockToken() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
String lockToken = file.lock(0);
file.updateContent("updated content", lockToken);
assertionHelper.assertThatIoFileHasContent(file.getPath(), "updated content".getBytes());
assertEquals("updated content", file.getContentAsString());
}
@Test
public void failsUpdateContentOfLockedFileByStreamWithoutLockToken() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
file.lock(0);
try {
file.updateContent(new ByteArrayInputStream("updated content".getBytes()));
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException expected) {
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
}
}
@Test
public void failsUpdateContentOfLockedFileByBytesWithoutLockToken() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
file.lock(0);
try {
file.updateContent("updated content".getBytes());
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException expected) {
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
}
}
@Test
public void failsUpdateContentOfLockedFileByStringWithoutLockToken() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
file.lock(0);
try {
file.updateContent("updated content");
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException expected) {
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
}
}
@Test
public void failsUpdateContentOfLockedFileByStreamWhenLockTokenIsInvalid() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
String invalidLockToken = invalidateLockToken(file.lock(0));
try {
file.updateContent(new ByteArrayInputStream("updated content".getBytes()), invalidLockToken);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException expected) {
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
}
}
@Test
public void failsUpdateContentOfLockedFileByBytesWhenLockTokenIsInvalid() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
String invalidLockToken = invalidateLockToken(file.lock(0));
try {
file.updateContent("updated content".getBytes(), invalidLockToken);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException expected) {
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
}
}
@Test
public void failsUpdateContentOfLockedFileByStringWhenLockTokenIsInvalid() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
String invalidLockToken = invalidateLockToken(file.lock(0));
try {
file.updateContent("updated content", invalidLockToken);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException expected) {
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
}
}
@Test
public void getsFileContentLength() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
assertEquals(DEFAULT_CONTENT_BYTES.length, file.getLength());
}
@Test
public void folderContentLengthIsZero() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder(generateFolderName());
assertEquals(0, folder.getLength());
}
@Test
public void copiesFile() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
VirtualFile targetFolder = root.createFolder(generateFolderName());
VirtualFile copy = file.copyTo(targetFolder);
assertionHelper.assertThatIoFilesHaveSameContent(file.getPath(), copy.getPath());
assertionHelper.assertThatMetadataIoFilesHaveSameContent(file.getPath(), copy.getPath());
}
@Test
public void copiesLockedFile() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
file.lock(0);
VirtualFile targetFolder = root.createFolder(generateFolderName());
VirtualFile copy = file.copyTo(targetFolder);
assertFalse(copy.isLocked());
assertionHelper.assertThatIoFilesHaveSameContent(file.getPath(), copy.getPath());
assertionHelper.assertThatLockIoFileDoesNotExist(copy.getPath());
}
@Test
public void copiesFileUnderNewName() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
VirtualFile targetFolder = root.createFolder(generateFolderName());
VirtualFile copy = file.copyTo(targetFolder, "new name", false);
assertionHelper.assertThatIoFilesHaveSameContent(file.getPath(), copy.getPath());
assertionHelper.assertThatMetadataIoFilesHaveSameContent(file.getPath(), copy.getPath());
}
@Test
public void copiesFileUnderNewNameAndOverwritesExistedFile() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
VirtualFile targetFolder = root.createFolder(generateFolderName());
targetFolder.createFile("existed_name", "existed content");
VirtualFile copy = file.copyTo(targetFolder, "existed_name", true);
assertionHelper.assertThatIoFilesHaveSameContent(file.getPath(), copy.getPath());
assertionHelper.assertThatMetadataIoFilesHaveSameContent(file.getPath(), copy.getPath());
}
@Test
public void failsCopyFileWhenItemWithTheSameNameExistsInTargetFolderAndOverwritingIsDisabled() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile targetFolder = root.createFolder(generateFolderName());
VirtualFile conflictFile = targetFolder.createFile("existed_name", "xxx");
try {
file.copyTo(targetFolder, "existed_name", false);
thrown.expect(ConflictException.class);
} catch (ConflictException e) {
assertionHelper.assertThatIoFileHasContent(conflictFile.getPath(), "xxx".getBytes());
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
}
}
@Test
public void copiesFolder() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
createFileTree(folder, 3);
List<VirtualFile> originalTree = getFileTreeAsList(folder);
for (int i = 0; i < originalTree.size(); i++) {
originalTree.get(i).setProperty("property" + i, "value" + 1);
}
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile copiedFolder = folder.copyTo(targetFolder);
List<VirtualFile> copiedTree = getFileTreeAsList(copiedFolder);
Iterator<VirtualFile> originalIterator = originalTree.iterator();
Iterator<VirtualFile> copiedIterator = copiedTree.iterator();
while (originalIterator.hasNext() && copiedIterator.hasNext()) {
VirtualFile original = originalIterator.next();
VirtualFile copy = copiedIterator.next();
assertionHelper.assertThatIoFileExists(copy.getPath());
assertionHelper.assertThatMetadataIoFilesHaveSameContent(original.getPath(), copy.getPath());
if (original.isFile()) {
assertionHelper.assertThatIoFilesHaveSameContent(original.getPath(), copy.getPath());
}
}
assertFalse(originalIterator.hasNext() || copiedIterator.hasNext());
}
@Test
public void copiesFolderThatContainsLockedFile() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
file.lock(0);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile copiedFolder = folder.copyTo(targetFolder);
VirtualFile copiedFile = copiedFolder.getChild(Path.of(file.getName()));
assertionHelper.assertThatIoFileExists(copiedFolder.getPath());
assertionHelper.assertThatIoFilesHaveSameContent(file.getPath(), copiedFile.getPath());
assertionHelper.assertThatLockIoFileDoesNotExist(copiedFile.getPath());
}
@Test
public void copiesFolderUnderNewName() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile copiedFolder = folder.copyTo(targetFolder, "new_name", false);
VirtualFile copiedFile = copiedFolder.getChild(Path.of(file.getName()));
assertionHelper.assertThatIoFileExists(copiedFolder.getPath());
assertionHelper.assertThatIoFilesHaveSameContent(file.getPath(), copiedFile.getPath());
}
@Test
public void copiesFolderAndReplaceExistedItem() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
targetFolder.createFolder(folder.getName());
VirtualFile copiedFolder = folder.copyTo(targetFolder, null, true);
VirtualFile copiedFile = copiedFolder.getChild(Path.of(file.getName()));
assertionHelper.assertThatIoFileExists(copiedFolder.getPath());
assertionHelper.assertThatIoFilesHaveSameContent(file.getPath(), copiedFile.getPath());
}
@Test
public void copiesFolderUnderNewNameAndReplaceExistedItem() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
targetFolder.createFolder("new_name");
VirtualFile copiedFolder = folder.copyTo(targetFolder, "new_name", true);
VirtualFile copiedFile = copiedFolder.getChild(Path.of(file.getName()));
assertionHelper.assertThatIoFileExists(copiedFolder.getPath());
assertionHelper.assertThatIoFilesHaveSameContent(file.getPath(), copiedFile.getPath());
}
@Test
public void failsCopyFolderWhenTargetFolderContainsItemWithSameNameAndOverwritingIsDisabled() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile conflictFolder = targetFolder.createFolder(folder.getName());
try {
folder.copyTo(targetFolder);
thrown.expect(ConflictException.class);
} catch (ConflictException expected) {
assertionHelper.assertThatIoFileDoesNotExist(conflictFolder.getPath().newPath(file.getName()));
}
}
@Test
public void failsCopyFolderUnderNewNameWhenTargetFolderContainsItemWithSameNameAndOverwritingIsDisabled() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile conflictFolder = targetFolder.createFolder("new_name");
try {
folder.copyTo(targetFolder, "new_name", false);
thrown.expect(ConflictException.class);
} catch (ConflictException expected) {
assertionHelper.assertThatIoFileDoesNotExist(conflictFolder.getPath().newPath(file.getName()));
}
}
@Test
public void failsCopyFolderWhenTargetFolderNeedBeOverwrittenButContainsLockedFile() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile conflictFolder = targetFolder.createFolder(folder.getName());
VirtualFile lockedFileInConflictFolder = conflictFolder.createFile(generateFileName(), "xxx");
lockedFileInConflictFolder.lock(0);
try {
folder.copyTo(targetFolder, null, true);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException expected) {
assertionHelper.assertThatIoFileHasContent(lockedFileInConflictFolder.getPath(), "xxx".getBytes());
assertionHelper.assertThatIoFileDoesNotExist(conflictFolder.getPath().newPath(file.getName()));
}
}
@Test
public void movesFile() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile movedFile = file.moveTo(targetFolder);
assertionHelper.assertThatMetadataIoFileHasContent(movedFile.getPath(),
serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper.assertThatIoFileHasContent(movedFile.getPath(), DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatIoFileDoesNotExist(filePath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(filePath);
}
@Test
public void movesFileUnderNewName() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile movedFile = file.moveTo(targetFolder, "new_name", false, null);
assertionHelper.assertThatMetadataIoFileHasContent(movedFile.getPath(),
serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper.assertThatIoFileHasContent(movedFile.getPath(), DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatIoFileDoesNotExist(filePath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(filePath);
}
@Test
public void movesFileUnderNewNameAndOverwriteExistedFile() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
targetFolder.createFolder("new_name");
VirtualFile movedFile = file.moveTo(targetFolder, "new_name", true, null);
assertionHelper.assertThatMetadataIoFileHasContent(movedFile.getPath(),
serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper.assertThatIoFileHasContent(movedFile.getPath(), DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatIoFileDoesNotExist(filePath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(filePath);
}
@Test
public void movesLockedFileWithLockToken() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
String lockToken = file.lock(0);
Path filePath = file.getPath();
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile movedFile = file.moveTo(targetFolder, null, false, lockToken);
assertionHelper.assertThatIoFileHasContent(movedFile.getPath(), DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatLockIoFileDoesNotExist(movedFile.getPath());
assertionHelper.assertThatIoFileDoesNotExist(filePath);
assertionHelper.assertThatLockIoFileDoesNotExist(filePath);
}
@Test
public void failsMoveLockedFileWithoutLockToken() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
file.lock(0);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
Path movedFilePath = targetFolder.getPath().newPath(file.getName());
try {
file.moveTo(targetFolder);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatIoFileDoesNotExist(movedFilePath);
assertionHelper.assertThatLockIoFileDoesNotExist(movedFilePath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(movedFilePath);
assertionHelper.assertThatIoFileHasContent(filePath, DEFAULT_CONTENT_BYTES);
assertionHelper
.assertThatMetadataIoFileHasContent(filePath, serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper.assertThatLockIoFileExists(filePath);
}
}
@Test
public void failsMoveLockedFileWhenLockTokenIsInvalid() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
String invalidLockToken = invalidateLockToken(file.lock(0));
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
Path movedFilePath = targetFolder.getPath().newPath(file.getName());
try {
file.moveTo(targetFolder, null, false, invalidLockToken);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatIoFileDoesNotExist(movedFilePath);
assertionHelper.assertThatLockIoFileDoesNotExist(movedFilePath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(movedFilePath);
assertionHelper.assertThatIoFileHasContent(filePath, DEFAULT_CONTENT_BYTES);
assertionHelper
.assertThatMetadataIoFileHasContent(filePath, serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper.assertThatLockIoFileExists(filePath);
}
}
@Test
public void failsMoveFileWhenTargetFolderContainsItemWithTheSameNameAndOverwritingIsDisabled() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
Path filePath = file.getPath();
VirtualFile existedFile = targetFolder.createFile("existed_name", "existed content");
try {
file.moveTo(targetFolder, "existed_name", false, null);
thrown.expect(ConflictException.class);
} catch (ConflictException e) {
assertEquals(file, getRoot().getChild(filePath));
assertEquals("existed content", existedFile.getContentAsString());
}
}
@Test
public void movesFolder() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
createFileTree(folder, 3);
List<VirtualFile> originalTree = getFileTreeAsList(folder);
for (int i = 0; i < originalTree.size(); i++) {
originalTree.get(i).setProperty("property" + i, "value" + i);
}
List<Path> originalTreePaths = originalTree.stream().map(VirtualFile::getPath).collect(toList());
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile movedFolder = folder.moveTo(targetFolder);
List<VirtualFile> movedTree = getFileTreeAsList(movedFolder);
Iterator<Path> originalPathIterator = originalTreePaths.iterator();
Iterator<VirtualFile> movedIterator = movedTree.iterator();
int i = 0;
while (originalPathIterator.hasNext() && movedIterator.hasNext()) {
Path originalPath = originalPathIterator.next();
VirtualFile moved = movedIterator.next();
assertEquals(originalPath, moved.getPath().subPath(targetFolder.getPath()));
if (moved.isFile()) {
assertionHelper.assertThatIoFileHasContent(moved.getPath(), DEFAULT_CONTENT_BYTES);
}
assertionHelper.assertThatMetadataIoFileHasContent(moved.getPath(),
serializeVirtualFileMetadata(ImmutableMap.of("property" + i, "value" + i)));
assertionHelper.assertThatIoFileDoesNotExist(originalPath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(originalPath);
i++;
}
assertFalse(originalPathIterator.hasNext() || movedIterator.hasNext());
}
@Test
public void movesFolderUnderNewName() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
Path folderPath = folder.getPath();
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile movedFolder = folder.moveTo(targetFolder, "new_name", false, null);
VirtualFile movedFile = movedFolder.getChild(Path.of(file.getName()));
assertionHelper.assertThatIoFileExists(movedFolder.getPath());
assertionHelper.assertThatIoFileHasContent(movedFile.getPath(), DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatIoFileDoesNotExist(folderPath);
}
@Test
public void movesFolderAndReplaceExistedItem() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
Path folderPath = folder.getPath();
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
targetFolder.createFolder(folder.getName());
VirtualFile movedFolder = folder.moveTo(targetFolder, null, true, null);
VirtualFile movedFile = movedFolder.getChild(Path.of(file.getName()));
assertionHelper.assertThatIoFileExists(movedFolder.getPath());
assertionHelper.assertThatIoFileHasContent(movedFile.getPath(), DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatIoFileDoesNotExist(folderPath);
}
@Test
public void movesFolderUnderNewNameAndReplaceExistedItem() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
Path folderPath = folder.getPath();
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
targetFolder.createFolder("new_name");
VirtualFile movedFolder = folder.moveTo(targetFolder, "new_name", true, null);
VirtualFile movedFile = movedFolder.getChild(Path.of(file.getName()));
assertionHelper.assertThatIoFileExists(movedFolder.getPath());
assertionHelper.assertThatIoFileHasContent(movedFile.getPath(), DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatIoFileDoesNotExist(folderPath);
}
@Test
public void failsMoveFolderWhenItContainsLockedFile() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile lockedFile = folder.createFile(generateFileName(), DEFAULT_CONTENT);
lockedFile.lock(0);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
Path movedFolderPath = targetFolder.getPath().newPath(folder.getName());
try {
folder.moveTo(targetFolder);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatIoFileDoesNotExist(movedFolderPath);
assertionHelper.assertThatIoFileExists(folder.getPath());
assertionHelper.assertThatIoFileExists(lockedFile.getPath());
assertionHelper.assertThatLockIoFileExists(lockedFile.getPath());
}
}
@Test
public void failsMoveFolderWhenTargetFolderContainsItemWithTheSameNameAndOverwritingIsDisabled() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile conflictFolder = targetFolder.createFolder(folder.getName());
try {
folder.moveTo(targetFolder);
thrown.expect(ConflictException.class);
} catch (ConflictException expected) {
assertionHelper.assertThatIoFileDoesNotExist(conflictFolder.getPath().newPath(file.getName()));
assertionHelper.assertThatIoFileExists(folder.getPath());
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
}
}
@Test
public void failsMoveFolderUnderNewNameWhenTargetFolderContainsItemWithTheSameNameAndOverwritingIsDisabled() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile conflictFolder = targetFolder.createFolder("new_name");
try {
folder.moveTo(targetFolder, "new_name", false, null);
thrown.expect(ConflictException.class);
} catch (ConflictException expected) {
assertionHelper.assertThatIoFileDoesNotExist(conflictFolder.getPath().newPath(file.getName()));
assertionHelper.assertThatIoFileExists(folder.getPath());
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
}
}
@Test
public void failsMoveFolderWhenTargetFolderNeedBeOverwrittenButContainsLockedFile() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile targetFolder = getRoot().createFolder(generateFolderName());
VirtualFile conflictFolder = targetFolder.createFolder(folder.getName());
VirtualFile lockedFileInConflictFolder = conflictFolder.createFile(generateFileName(), "xxx");
lockedFileInConflictFolder.lock(0);
try {
folder.moveTo(targetFolder, null, true, null);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException expected) {
assertionHelper.assertThatIoFileHasContent(lockedFileInConflictFolder.getPath(), "xxx".getBytes());
assertionHelper.assertThatIoFileDoesNotExist(conflictFolder.getPath().newPath(file.getName()));
assertionHelper.assertThatIoFileExists(folder.getPath());
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
}
}
@Test
public void renamesFile() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
VirtualFile renamedFile = file.rename("new name");
assertionHelper.assertThatIoFileHasContent(renamedFile.getPath(), DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatMetadataIoFileHasContent(renamedFile.getPath(),
serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper.assertThatIoFileDoesNotExist(filePath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(filePath);
}
@Test
public void renamesLockedFileWithLockToken() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
Path filePath = file.getPath();
String lockToken = file.lock(0);
VirtualFile renamedFile = file.rename("new name", lockToken);
assertionHelper.assertThatIoFileHasContent(renamedFile.getPath(), DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatLockIoFileDoesNotExist(renamedFile.getPath());
assertionHelper.assertThatIoFileDoesNotExist(filePath);
assertionHelper.assertThatLockIoFileDoesNotExist(filePath);
}
@Test
public void failsRenameLockedFileWithoutLockToken() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
Path newPath = folder.getPath().newPath("new name");
file.lock(0);
try {
file.rename("new name");
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatIoFileHasContent(filePath, DEFAULT_CONTENT_BYTES);
assertionHelper
.assertThatMetadataIoFileHasContent(filePath, serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper.assertThatLockIoFileExists(filePath);
assertionHelper.assertThatIoFileDoesNotExist(newPath);
assertionHelper.assertThatLockIoFileDoesNotExist(newPath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(newPath);
}
}
@Test
public void failsRenameLockedFileWhenLockTokenIsInvalid() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
Path newPath = folder.getPath().newPath("new name");
String invalidLockToken = invalidateLockToken(file.lock(0));
try {
file.rename("new name", invalidLockToken);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatIoFileHasContent(filePath, DEFAULT_CONTENT_BYTES);
assertionHelper
.assertThatMetadataIoFileHasContent(filePath, serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper.assertThatLockIoFileExists(filePath);
assertionHelper.assertThatIoFileDoesNotExist(newPath);
assertionHelper.assertThatLockIoFileDoesNotExist(newPath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(newPath);
}
}
@Test
public void failsRenameFileWhenFolderContainsItemWithSameName() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
Path filePath = file.getPath();
file.setProperty("property1", "value1");
VirtualFile conflictFile = folder.createFile("existed_name", "xxx");
Path conflictFilePath = conflictFile.getPath();
conflictFile.setProperty("property2", "value2");
try {
file.rename("existed_name");
thrown.expect(ConflictException.class);
} catch (ConflictException e) {
assertionHelper.assertThatIoFileHasContent(conflictFilePath, "xxx".getBytes());
assertionHelper.assertThatMetadataIoFileHasContent(conflictFilePath,
serializeVirtualFileMetadata(ImmutableMap.of("property2", "value2")));
assertionHelper.assertThatIoFileHasContent(filePath, DEFAULT_CONTENT_BYTES);
assertionHelper
.assertThatMetadataIoFileHasContent(filePath, serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
}
}
@Test
public void renamesFolder() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
Path folderPath = folder.getPath();
folder.setProperty("property1", "value1");
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
String fileName = file.getName();
file.setProperty("property2", "value2");
VirtualFile renamed = folder.rename("new_name");
Path newFilePath = renamed.getPath().newPath(fileName);
assertionHelper.assertThatIoFileExists(renamed.getPath());
assertionHelper.assertThatIoFileHasContent(newFilePath, DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatMetadataIoFileHasContent(renamed.getPath(),
serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper
.assertThatMetadataIoFileHasContent(newFilePath, serializeVirtualFileMetadata(ImmutableMap.of("property2", "value2")));
assertionHelper.assertThatIoFileDoesNotExist(folderPath);
assertionHelper.assertThatIoFileDoesNotExist(folderPath.newPath(fileName));
assertionHelper.assertThatMetadataIoFileDoesNotExist(folderPath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(folderPath.newPath(fileName));
}
@Test
public void failsRenameFolderWheItContainsLockedFile() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile lockedFile = folder.createFile(generateFileName(), DEFAULT_CONTENT);
lockedFile.lock(0);
Path renamedFolderPath = Path.of("/new_name");
try {
folder.rename("new_name");
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatIoFileDoesNotExist(renamedFolderPath);
assertionHelper.assertThatIoFileExists(folder.getPath());
assertionHelper.assertThatIoFileHasContent(lockedFile.getPath(), DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatLockIoFileExists(lockedFile.getPath());
}
}
@Test
public void failsRenameFolderWhenParentContainsItemWithSameName() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile conflictFolder = getRoot().createFolder("new_name");
try {
folder.rename("new_name");
thrown.expect(ConflictException.class);
} catch (ConflictException expected) {
assertionHelper.assertThatIoFileDoesNotExist(conflictFolder.getPath().newPath(file.getName()));
assertionHelper.assertThatIoFileExists(folder.getPath());
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
}
}
@Test
public void deletesFile() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
file.delete();
assertionHelper.assertThatIoFileDoesNotExist(filePath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(filePath);
}
@Test
public void deletesLockedFileWithLockToken() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
String lockToken = file.lock(0);
file.delete(lockToken);
assertionHelper.assertThatIoFileDoesNotExist(filePath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(filePath);
assertionHelper.assertThatLockIoFileDoesNotExist(filePath);
}
@Test
public void failsDeleteLockedFileWithoutLockToken() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
file.lock(0);
try {
file.delete();
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatIoFileHasContent(filePath, DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatMetadataIoFileHasContent(file.getPath(),
serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper.assertThatLockIoFileExists(filePath);
}
}
@Test
public void failsDeleteLockedFileWhenLockTokenIsInvalid() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder(generateFolderName());
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
String invalidLockToken = invalidateLockToken(file.lock(0));
try {
file.delete(invalidLockToken);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatIoFileHasContent(filePath, DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatMetadataIoFileHasContent(file.getPath(),
serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper.assertThatLockIoFileExists(filePath);
}
}
@Test
public void deletesFolder() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
folder.setProperty("property1", "value1");
Path folderPath = folder.getPath();
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property1", "value1");
Path filePath = file.getPath();
folder.delete();
assertionHelper.assertThatIoFileDoesNotExist(folderPath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(folderPath);
assertionHelper.assertThatIoFileDoesNotExist(filePath);
assertionHelper.assertThatMetadataIoFileDoesNotExist(filePath);
}
@Test
public void failsDeleteFolderWhenItContainsLockedFile() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
folder.setProperty("property1", "value1");
Path folderPath = folder.getPath();
VirtualFile file = folder.createFile(generateFileName(), DEFAULT_CONTENT);
file.setProperty("property2", "value2");
Path filePath = file.getPath();
file.lock(0);
try {
folder.delete();
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatIoFileExists(folderPath);
assertionHelper.assertThatMetadataIoFileHasContent(folder.getPath(),
serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
assertionHelper.assertThatIoFileHasContent(filePath, DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatMetadataIoFileHasContent(file.getPath(),
serializeVirtualFileMetadata(ImmutableMap.of("property2", "value2")));
}
}
@Test
public void compressesFolderToZipArchive() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
Archiver archiver = mock(Archiver.class);
when(archiverFactory.createArchiver(eq(folder), eq("zip"))).thenReturn(archiver);
folder.zip();
verify(archiver).compress(any(OutputStream.class), any(VirtualFileFilter.class));
}
@Test
public void failsZipFile() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
thrown.expect(ForbiddenException.class);
file.zip();
}
@Test
public void unzipsInFolder() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
Archiver archiver = mock(Archiver.class);
when(archiverFactory.createArchiver(eq(folder), eq("zip"))).thenReturn(archiver);
folder.unzip(new ByteArrayInputStream(new byte[0]), false, 0);
verify(archiver).extract(any(InputStream.class), eq(false), eq(0));
}
@Test
public void failsUnzipInFile() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
thrown.expect(ForbiddenException.class);
file.unzip(new ByteArrayInputStream(new byte[0]), false, 0);
}
@Test
public void compressFolderToTarArchive() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
Archiver archiver = mock(Archiver.class);
when(archiverFactory.createArchiver(eq(folder), eq("tar"))).thenReturn(archiver);
folder.tar();
verify(archiver).compress(any(OutputStream.class), any(VirtualFileFilter.class));
}
@Test
public void failsTarFile() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
thrown.expect(ForbiddenException.class);
file.tar();
}
@Test
public void untarsInFolder() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
Archiver archiver = mock(Archiver.class);
when(archiverFactory.createArchiver(eq(folder), eq("tar"))).thenReturn(archiver);
folder.untar(new ByteArrayInputStream(new byte[0]), false, 0);
verify(archiver).extract(any(InputStream.class), eq(false), eq(0));
}
@Test
public void locksFile() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
file.lock(0);
assertionHelper.assertThatLockIoFileExists(file.getPath());
assertTrue(file.isLocked());
}
@Test
public void lockExpiredAfterTimeout() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
file.lock(500);
assertionHelper.assertThatLockIoFileExists(file.getPath());
assertTrue(file.isLocked());
Thread.sleep(1000);
assertFalse(file.isLocked());
assertionHelper.assertThatLockIoFileDoesNotExist(file.getPath());
}
@Test
public void failsLockFolder() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
try {
folder.lock(0);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatLockIoFileDoesNotExist(folder.getPath());
assertFalse(folder.isLocked());
}
}
@Test
public void unlocksFile() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
String lockToken = file.lock(0);
file.unlock(lockToken);
assertionHelper.assertThatLockIoFileDoesNotExist(file.getPath());
assertFalse(file.isLocked());
}
@Test
public void failsUnlockFileWhenLockTokenIsNull() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
file.lock(0);
try {
file.unlock(null);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatLockIoFileExists(file.getPath());
assertTrue(file.isLocked());
}
}
@Test
public void failsUnlockFileWhenLockTokenIsInvalid() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
String invalidLockToken = invalidateLockToken(file.lock(0));
try {
file.unlock(invalidLockToken);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException e) {
assertionHelper.assertThatLockIoFileExists(file.getPath());
assertTrue(file.isLocked());
}
}
@Test
public void createsFileWithStringContent() throws Exception {
VirtualFile folder = getRoot().createFolder("a/b/c");
VirtualFile file = folder.createFile("new_file", DEFAULT_CONTENT);
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
assertEquals(file, folder.getChild(Path.of("new_file")));
assertEquals("/a/b/c/new_file", file.getPath().toString());
assertEquals(DEFAULT_CONTENT, file.getContentAsString());
}
@Test
public void createsFileWithBytesContent() throws Exception {
VirtualFile folder = getRoot().createFolder("a/b/c");
VirtualFile file = folder.createFile("new_file", DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
assertEquals(file, folder.getChild(Path.of("new_file")));
assertEquals("/a/b/c/new_file", file.getPath().toString());
assertEquals(DEFAULT_CONTENT, file.getContentAsString());
}
@Test
public void createsFileWithStreamContent() throws Exception {
VirtualFile folder = getRoot().createFolder("a/b/c");
VirtualFile file = folder.createFile("new_file", new ByteArrayInputStream(DEFAULT_CONTENT_BYTES));
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
assertEquals(file, folder.getChild(Path.of("new_file")));
assertEquals("/a/b/c/new_file", file.getPath().toString());
assertEquals(DEFAULT_CONTENT, file.getContentAsString());
}
@Test
public void failsCreateFileWhenNameContainsSlash() throws Exception {
VirtualFile folder = getRoot().createFolder("a/b/c");
String name = "x/new_file";
thrown.expect(ServerException.class);
thrown.expectMessage(String.format("Invalid name '%s'", name));
folder.createFile(name, new ByteArrayInputStream(DEFAULT_CONTENT_BYTES));
}
@Test
public void failsCreateFileWhenNameOfNewFileConflictsWithExistedFile() throws Exception {
VirtualFile file = getRoot().createFile("file", DEFAULT_CONTENT);
file.setProperty("property1", "value1");
try {
getRoot().createFile("file", "xxx");
thrown.expect(ConflictException.class);
} catch (ConflictException expected) {
assertionHelper.assertThatIoFileHasContent(file.getPath(), DEFAULT_CONTENT_BYTES);
assertionHelper.assertThatMetadataIoFileHasContent(file.getPath(),
serializeVirtualFileMetadata(ImmutableMap.of("property1", "value1")));
}
}
@Test
public void failsCreateFileWhenParenIsNotFolder() throws Exception {
VirtualFile parent = getRoot().createFile("parent", "");
try {
parent.createFile("file", DEFAULT_CONTENT);
thrown.expect(ForbiddenException.class);
} catch (ForbiddenException expected) {
assertionHelper.assertThatIoFileDoesNotExist(parent.getPath().newPath("file"));
}
}
@Test
public void createsFolder() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder("new_folder");
assertionHelper.assertThatIoFileExists(folder.getPath());
assertEquals(folder, root.getChild(Path.of("new_folder")));
}
@Test
public void createsFolderHierarchy() throws Exception {
VirtualFile root = getRoot();
VirtualFile folder = root.createFolder("a/b");
assertionHelper.assertThatIoFileExists(folder.getPath());
assertEquals(folder, root.getChild(Path.of("a/b")));
}
@Test
public void convertsToIoFile() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), DEFAULT_CONTENT);
assertEquals(new File(testDirectory, file.getPath().toString()), file.toIoFile());
}
@Test
public void comparesFileAndFolder() throws Exception {
VirtualFile root = getRoot();
VirtualFile file = root.createFile(generateFileName(), "");
VirtualFile folder = root.createFolder(generateFolderName());
assertTrue(folder.compareTo(file) < 0);
}
@Test
public void comparesTwoFiles() throws Exception {
VirtualFile root = getRoot();
VirtualFile fileA = root.createFile("a", "");
VirtualFile fileB = root.createFile("b", "");
assertTrue(fileA.compareTo(fileB) < 0);
}
@Test
public void comparesTwoFolders() throws Exception {
VirtualFile root = getRoot();
VirtualFile folderA = root.createFolder("a");
VirtualFile folderB = root.createFolder("b");
assertTrue(folderA.compareTo(folderB) < 0);
}
@Test
public void addsNewlyCreatedFileInSearcher() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
verify(searcher).add(file);
}
@Test
public void addsFileThatCopiedFromOtherFileInSearcher() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile folder = getRoot().createFolder(generateFolderName());
Mockito.reset(searcher);
VirtualFile copy = file.copyTo(folder);
verify(searcher).add(copy);
}
@Test
public void addsFolderThatCopiedFromOtherFolderInSearcher() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
VirtualFile newParent = getRoot().createFolder(generateFolderName());
VirtualFile copy = folder.copyTo(newParent);
verify(searcher).add(copy);
}
@Test
public void doesNotAddNewlyCreatedFolderInSearcher() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
verify(searcher, never()).add(folder);
}
@Test
public void removesDeletedFileFromSearcher() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
String path = file.getPath().toString();
file.delete();
verify(searcher).delete(path, true);
}
@Test
public void removesDeletedFolderFromSearcher() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
String path = folder.getPath().toString();
folder.delete();
verify(searcher).delete(path, false);
}
@Test
public void updatesFileInSearcherWhenContentUpdatedByStream() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), "");
file.updateContent(new ByteArrayInputStream(DEFAULT_CONTENT_BYTES));
verify(searcher).update(file);
}
@Test
public void updatesFileInSearcherWhenContentUpdatedByBytes() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), "");
file.updateContent(DEFAULT_CONTENT_BYTES);
verify(searcher).update(file);
}
@Test
public void updatesFileInSearcherWhenContentUpdatedByString() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), "");
file.updateContent(DEFAULT_CONTENT);
verify(searcher).update(file);
}
@Test
public void updatesFileInSearcherWhenItIsRenamed() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
String oldPath = file.getPath().toString();
Mockito.reset(searcher);
VirtualFile renamed = file.rename("new_name");
verify(searcher).add(renamed);
verify(searcher).delete(oldPath, true);
}
@Test
public void updatesFolderInSearcherWhenItIsRenamed() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
String oldPath = folder.getPath().toString();
Mockito.reset(searcher);
VirtualFile renamed = folder.rename("new_name");
verify(searcher).add(renamed);
verify(searcher).delete(oldPath, false);
}
@Test
public void updatesFileInSearcherWhenItIsMoved() throws Exception {
VirtualFile file = getRoot().createFile(generateFileName(), DEFAULT_CONTENT);
VirtualFile newParent = getRoot().createFolder(generateFolderName());
String oldPath = file.getPath().toString();
Mockito.reset(searcher);
VirtualFile moved = file.moveTo(newParent);
verify(searcher).add(moved);
verify(searcher).delete(oldPath, true);
}
@Test
public void updatesFolderInSearcherWhenItIsMoved() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFileName());
VirtualFile newParent = getRoot().createFolder(generateFolderName());
String oldPath = folder.getPath().toString();
Mockito.reset(searcher);
VirtualFile moved = folder.moveTo(newParent);
verify(searcher).add(moved);
verify(searcher).delete(oldPath, false);
}
@Test
public void addFolderInSearcherAfterExtractZipArchive() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
Mockito.reset(searcher);
Archiver archiver = mock(Archiver.class);
when(archiverFactory.createArchiver(eq(folder), eq("zip"))).thenReturn(archiver);
folder.unzip(new ByteArrayInputStream(new byte[0]), false, 0);
verify(searcher).add(folder);
}
@Test
public void addFolderInSearcherAfterExtractTarArchive() throws Exception {
VirtualFile folder = getRoot().createFolder(generateFolderName());
Mockito.reset(searcher);
Archiver archiver = mock(Archiver.class);
when(archiverFactory.createArchiver(eq(folder), eq("tar"))).thenReturn(archiver);
folder.untar(new ByteArrayInputStream(new byte[0]), false, 0);
verify(searcher).add(folder);
}
private VirtualFile getRoot() {
return fileSystem.getRoot();
}
private String generateFileName() {
return NameGenerator.generate("file-", 8);
}
private String generateFolderName() {
return NameGenerator.generate("folder-", 8);
}
private byte[] serializeVirtualFileMetadata(Map<String, String> properties) throws IOException {
ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
DataOutputStream dataOutput = new DataOutputStream(byteOutput);
new FileMetadataSerializer().write(dataOutput, properties);
dataOutput.flush();
return byteOutput.toByteArray();
}
private String countMd5Sum(VirtualFile file) throws Exception {
return ByteSource.wrap(file.getContentAsBytes()).hash(Hashing.md5()).toString();
}
private String invalidateLockToken(String lockToken) {
return new StringBuilder(lockToken).reverse().toString();
}
private List<VirtualFile> getFileTreeAsList(VirtualFile rootOfTree) throws Exception {
List<VirtualFile> list = newArrayList();
rootOfTree.accept(new VirtualFileVisitor() {
@Override
public void visit(VirtualFile virtualFile) throws ServerException {
list.add(virtualFile);
if (virtualFile.isFolder()) {
for (VirtualFile child : virtualFile.getChildren()) {
child.accept(this);
}
}
}
});
return list;
}
private void createFileTree(VirtualFile rootOfTree, int depth) throws Exception {
if (depth > 0) {
VirtualFile folder = rootOfTree.createFolder(generateFolderName());
for (int i = 0; i < 3; i++) {
folder.createFile(generateFileName(), DEFAULT_CONTENT);
}
createFileTree(folder, depth - 1);
}
}
}