/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.transport.file;
import org.mule.api.MuleException;
import org.mule.tck.junit4.FunctionalTestCase;
import org.mule.tck.probe.PollingProber;
import org.mule.tck.probe.Probe;
import org.mule.util.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
public class FileMoveToFunctionalTestCase extends FunctionalTestCase {
private static final String INPUT_DIRECTORY_PROPERTY = "FileMoveToFunctionalTestCase-inputDirectory";
private static final String MOVE_TO_DIRECTORY_PROPERTY = "FileMoveToFunctionalTestCase-moveToDirectory";
private static final int PROBER_POLLING_INTERVAL = 100;
private static final int PROBER_TIMEOUT = 25000;
private static final int ITERATIONS = 10;
private static final int NUMBER_OF_FILES = 50;
private static final int FILE_SIZE = 1024;
@Rule
public TemporaryFolder inputTemporaryFolder = new TemporaryFolder();
@Rule
public TemporaryFolder moveToTemporaryFolder = new TemporaryFolder();
@Override
protected String getConfigFile() {
return "file-functional-move-to.xml";
}
@Override
protected void doSetUpBeforeMuleContextCreation() throws Exception
{
System.setProperty(INPUT_DIRECTORY_PROPERTY, inputTemporaryFolder.getRoot().getAbsolutePath());
System.setProperty(MOVE_TO_DIRECTORY_PROPERTY, moveToTemporaryFolder.getRoot().getAbsolutePath());
}
@Override
public void doTearDown() throws MuleException
{
System.clearProperty(INPUT_DIRECTORY_PROPERTY);
System.clearProperty(MOVE_TO_DIRECTORY_PROPERTY);
}
@Test
public void testMoveToWithStreaming() throws IOException, InterruptedException
{
configureConnector(true);
copyFiles();
}
@Test
public void testMoveToWithoutStreaming() throws IOException, InterruptedException
{
configureConnector(false);
copyFiles();
}
private void configureConnector(boolean isStreaming)
{
FileConnector connector = (FileConnector) muleContext.getRegistry().lookupConnector("FileConnector");
connector.setStreaming(isStreaming);
}
private void copyFiles() throws InterruptedException, IOException {
for (int i=1; i <= ITERATIONS; i++)
{
List<File> files = createFiles(inputTemporaryFolder, NUMBER_OF_FILES, FILE_SIZE);
waitForFiles(moveToTemporaryFolder.getRoot(), i * NUMBER_OF_FILES);
}
}
private List<File> createFiles(TemporaryFolder folder, int amount, int size) throws IOException
{
List<File> files = new ArrayList<File>(size);
for (int i=0; i < amount; i++)
{
File tempInputFile = createFile(folder, String.valueOf(i), size);
files.add(tempInputFile);
}
return files;
}
private File createFile(TemporaryFolder folder, String name, int size) throws IOException
{
File tempInputFile = folder.newFile("input_file_" + name);
tempInputFile.deleteOnExit();
byte[] content = new byte[size];
Arrays.fill(content, (byte)0);
FileUtils.writeByteArrayToFile(tempInputFile, content);
return tempInputFile;
}
private void waitForFiles(final File folder, final int expectedAmount) throws InterruptedException
{
PollingProber prober = new PollingProber(PROBER_TIMEOUT, PROBER_POLLING_INTERVAL);
prober.check(new Probe() {
int lastAmount = 0;
@Override
public boolean isSatisfied() {
lastAmount = FileUtils.listFiles(folder, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE).size();
return lastAmount >= expectedAmount;
}
@Override
public String describeFailure() {
return String.valueOf(expectedAmount) + " files were expected, but only " + String.valueOf(lastAmount) + " were present.";
}
});
}
}