blob: 09d5bbeba98b4815ae8d900c99893317d8234e68 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.vfs2.provider.sftp;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.apache.commons.vfs2.AbstractProviderTestCase;
import org.apache.commons.vfs2.Capability;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.Selectors;
import org.apache.commons.vfs2.VFS;
import org.junit.Test;
/**
* MultiThread tests for writing with SFTP provider.
*/
public class SftpMultiThreadWriteTests extends AbstractProviderTestCase {
/**
* Sets up a scratch folder for the test to use.
*/
protected FileObject createScratchFolder() throws Exception {
final FileObject scratchFolder = getWriteFolder();
// Make sure the test folder is empty
scratchFolder.delete(Selectors.EXCLUDE_SELF);
scratchFolder.createFolder();
return scratchFolder;
}
/**
* Returns the capabilities required by the tests of this test case.
*/
@Override
protected Capability[] getRequiredCapabilities() {
return new Capability[] {Capability.CREATE, Capability.DELETE, Capability.GET_TYPE, Capability.LIST_CHILDREN,
Capability.READ_CONTENT, Capability.WRITE_CONTENT};
}
/**
* Tests file copy from local file system in parallel mode. This was a problem with SFTP channels.
*/
@Test
public void testParallelCopyFromLocalFileSystem() throws Exception {
final File localFile = new File("src/test/resources/test-data/test.zip");
final FileObject localFileObject = VFS.getManager().toFileObject(localFile);
final FileObject scratchFolder = createScratchFolder();
final List<Callable<Boolean>> tasks = new ArrayList<>();
for (int i = 0; i < 100; i++) {
final String fileName = "file" + i + "copy.txt";
tasks.add(() -> {
try {
final FileObject fileCopy = scratchFolder.resolveFile(fileName);
assertFalse(fileCopy.exists());
fileCopy.copyFrom(localFileObject, Selectors.SELECT_SELF);
} catch (final Throwable e) {
return false;
}
return true;
});
}
final ExecutorService service = Executors.newFixedThreadPool(10);
try {
final List<Future<Boolean>> futures = service.invokeAll(tasks);
assertTrue(futures.stream().allMatch(future -> {
try {
return future.get(5, TimeUnit.SECONDS);
} catch (final Exception e) {
return false;
}
}));
} finally {
service.shutdown();
}
}
}