package com.muleinaction; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.mockftpserver.fake.FakeFtpServer; import org.mockftpserver.fake.UserAccount; import org.mockftpserver.fake.filesystem.DirectoryEntry; import org.mockftpserver.fake.filesystem.FileEntry; import org.mockftpserver.fake.filesystem.FileSystem; import org.mockftpserver.fake.filesystem.UnixFakeFileSystem; import org.mule.api.context.notification.EndpointMessageNotificationListener; import org.mule.api.context.notification.ServerNotification; import org.mule.tck.junit4.FunctionalTestCase; import org.mule.util.FileUtils; import java.io.File; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; import static org.junit.Assert.assertEquals; public class FTPFunctionalTestCase extends FunctionalTestCase { private FakeFtpServer fakeFtpServer; private CountDownLatch getFilesLatch; private CountDownLatch putFilesLatch; @Override protected String getConfigResources() { return "src/main/app/ftp-config.xml"; } @BeforeClass public static void setupDirectories() throws Exception { File dataDirectory = new File("./data"); if (dataDirectory.exists()) { FileUtils.deleteDirectory(dataDirectory); } dataDirectory.mkdirs(); new File("./data/sales/statistics").mkdirs(); new File("./data/in").mkdirs(); } @Override protected void doSetUp() throws Exception { super.doSetUp(); startServer(); getFilesLatch = new CountDownLatch(1); putFilesLatch = new CountDownLatch(1); muleContext.registerListener(new EndpointMessageNotificationListener() { public void onNotification(final ServerNotification notification) { if ("retrieveSalesStatistics".equals(notification.getResourceIdentifier()) && "end dispatch".equals(notification.getActionName())) { getFilesLatch.countDown(); } } }); muleContext.registerListener(new EndpointMessageNotificationListener() { public void onNotification(final ServerNotification notification) { if ("ftpProductCatalog".equals(notification.getResourceIdentifier()) && "end dispatch".equals(notification.getActionName())) { putFilesLatch.countDown(); } } }); } @Override protected void doTearDown() throws Exception { stopServer(); } @Test public void testCanGetFiles() throws Exception { assertEquals(0, FileUtils.listFiles(new File("./data/sales/statistics"), new String[]{"dat"}, false).size()); assertTrue(getFilesLatch.await(15, TimeUnit.SECONDS)); assertEquals(1, FileUtils.listFiles(new File("./data/sales/statistics"), new String[]{"dat"}, false).size()); } @Test public void testCanPutFiles() throws Exception { FileUtils.writeStringToFile(new File("./data/in/foo.txt"),"foo"); assertTrue(putFilesLatch.await(15, TimeUnit.SECONDS)); } void startServer() { fakeFtpServer = new FakeFtpServer(); fakeFtpServer.setServerControlPort(9879); fakeFtpServer.addUserAccount(new UserAccount("joe", "123456", "/")); FileSystem fileSystem = new UnixFakeFileSystem(); fileSystem.add(new DirectoryEntry("/data/prancingdonkey/catalog")); fileSystem.add(new FileEntry("/ftp/incoming/file1.txt", "MULEINACTION")); fakeFtpServer.setFileSystem(fileSystem); fakeFtpServer.start(); } void stopServer() { fakeFtpServer.stop(); } }