/* * Copyright 2004 - 2008 Christian Sprajc. All rights reserved. * * This file is part of PowerFolder. * * PowerFolder is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation. * * PowerFolder 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PowerFolder. If not, see <http://www.gnu.org/licenses/>. * * $Id: AddLicenseHeader.java 4282 2008-06-16 03:25:09Z tot $ */ package de.dal33t.powerfolder.test.transfer; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.logging.Level; import de.dal33t.powerfolder.ConfigurationEntry; import de.dal33t.powerfolder.disk.FolderWatcher; import de.dal33t.powerfolder.disk.SyncProfile; import de.dal33t.powerfolder.event.TransferManagerEvent; import de.dal33t.powerfolder.event.TransferManagerListener; import de.dal33t.powerfolder.light.FileInfo; import de.dal33t.powerfolder.light.FileInfoFactory; import de.dal33t.powerfolder.transfer.DownloadManager; import de.dal33t.powerfolder.util.DateUtil; import de.dal33t.powerfolder.util.FileUtils; import de.dal33t.powerfolder.util.Format; import de.dal33t.powerfolder.util.logging.LoggingManager; import de.dal33t.powerfolder.util.test.Condition; import de.dal33t.powerfolder.util.test.ConditionWithMessage; import de.dal33t.powerfolder.util.test.TestHelper; import de.dal33t.powerfolder.util.test.TwoControllerTestCase; import de.schlichtherle.truezip.file.TFile; import de.schlichtherle.truezip.file.TFileInputStream; import de.schlichtherle.truezip.file.TFileOutputStream; /** * Tests file transfer between nodes. * * @author <a href="mailto:totmacher@powerfolder.com">Christian Sprajc</a> * @version $Revision: 1.2 $ */ public class FileTransferTest extends TwoControllerTestCase { @Override protected void setUp() throws Exception { super.setUp(); deleteTestFolderContents(); connectBartAndLisa(); // Join on testfolder joinTestFolder(SyncProfile.AUTOMATIC_DOWNLOAD); getFolderAtBart().getFolderWatcher().setIngoreAll(true); getFolderAtLisa().getFolderWatcher().setIngoreAll(true); } public void testNonExtractZIPJAR() throws IOException { assertTrue(getFolderAtBart().isEncrypted()); assertEquals(0, getFolderAtBart().getKnownItemCount()); TFile zip = new TFile("src/test-resources/testzip.zip"); TFile tzip = new TFile(getFolderAtBart().getLocalBase(), zip.getName()); zip.cp(tzip); TFile jar = new TFile("src/test-resources/testjar.jar"); TFile tjar = new TFile(getFolderAtBart().getLocalBase(), jar.getName()); jar.cp(tjar); scanFolder(getFolderAtBart()); assertEquals(2, getFolderAtBart().getKnownItemCount()); } /** * #2480: Filename imcompatibilties between Mac client and Windows server * * @throws IOException */ public void testSpecialChars() throws IOException { // |, ?, ", *, <, :, > String filename = " subdir1|/ %%:::: ./ |||:::*?<> . "; File f = TestHelper.createRandomFile(getFolderAtBart().getLocalBase(), FileInfoFactory.encodeIllegalChars(filename)); assertTrue(f.toString(), f.exists()); scanFolder(getFolderAtBart()); assertEquals(getFolderAtBart().getKnownFiles().toString(), 1, getFolderAtBart().getKnownFiles().size()); FileInfo fInfo = getFolderAtBart().getKnownFiles().iterator().next(); assertEquals(filename, fInfo.getRelativeName()); // Give them time to copy TestHelper.waitForCondition(20, new Condition() { public boolean reached() { return 1 == getContollerLisa().getTransferManager() .countCompletedDownloads(); } }); FileInfo fInfoLisa = getFolderAtLisa().getKnownFiles().iterator() .next(); assertEquals(filename, fInfoLisa.getRelativeName()); assertEquals(fInfo, fInfoLisa); File fLisa = fInfoLisa.getDiskFile(getContollerLisa() .getFolderRepository()); assertTrue( fInfoLisa + " @ " + fLisa.toString() + ". EXPECED: " + FileInfoFactory.encodeIllegalChars(filename), fLisa.getAbsolutePath().replace("\\", "/") .endsWith(FileInfoFactory.encodeIllegalChars(filename))); // Test update TestHelper.changeFile(fLisa); scanFolder(getFolderAtLisa()); TestHelper.waitForCondition(20, new Condition() { public boolean reached() { return 1 == getContollerBart().getTransferManager() .countCompletedDownloads(); } }); assertEquals(getFolderAtBart().getKnownFiles().toString(), 1, getFolderAtBart().getKnownFiles().size()); fInfo = getFolderAtBart().getKnownFiles().iterator().next(); assertEquals(filename, fInfo.getRelativeName()); // Test restore from archive assertTrue("Bart does not have file in archive: " + fInfo, getFolderAtBart().getFileArchiver().hasArchivedFileInfo(fInfo)); FileInfo aFInfo = getFolderAtBart().getFileArchiver() .getArchivedFilesInfos(fInfo).get(0); assertTrue( "Bart was unable to restore file from archive: " + fInfo, getFolderAtBart().getFileArchiver().restore(aFInfo, aFInfo.getDiskFile(getContollerBart().getFolderRepository()))); } public void testFileCopyCert8() throws IOException { File testFileBart = new TFile(getFolderAtBart().getLocalBase(), "cert8.db"); File origFile = new TFile("src/test-resources/cert8.db"); FileUtils.copyFile(origFile, testFileBart); // Let him scan the new content scanFolder(getFolderAtBart()); assertEquals("Known items at bart: " + getFolderAtBart().getKnownItemCount(), 1, getFolderAtBart() .getKnownItemCount()); // Give them time to copy TestHelper.waitForCondition(20, new Condition() { public boolean reached() { return 1 == getFolderAtLisa().getKnownItemCount(); } }); // Test ;) assertEquals("Known items at lisa: " + getFolderAtLisa().getKnownItemCount(), 1, getFolderAtLisa() .getKnownItemCount()); File testFileLisa = new TFile(getFolderAtLisa().getLocalBase(), "cert8.db"); assertEquals(origFile.length(), testFileLisa.length()); assertEquals(testFileBart.length(), testFileLisa.length()); TestHelper.assertIncompleteFilesGone(this); } public void testFileCopyURLclassifier2() throws IOException { File testFileBart = new TFile(getFolderAtBart().getLocalBase(), "urlclassifier2.sqlite"); File origFile = new TFile("src/test-resources/urlclassifier2.sqlite"); FileUtils.copyFile(origFile, testFileBart); // Let him scan the new content scanFolder(getFolderAtBart()); assertEquals("Known items at bart: " + getFolderAtBart().getKnownItemCount(), 1, getFolderAtBart() .getKnownItemCount()); // Give them time to copy TestHelper.waitForCondition(20, new Condition() { public boolean reached() { return 1 == getFolderAtLisa().getKnownItemCount(); } }); // Test ;) assertEquals("Known items at lisa: " + getFolderAtLisa().getKnownItemCount(), 1, getFolderAtLisa() .getKnownItemCount()); File testFileLisa = new TFile(getFolderAtLisa().getLocalBase(), "urlclassifier2.sqlite"); assertEquals(origFile.length(), testFileLisa.length()); assertEquals(testFileBart.length(), testFileLisa.length()); TestHelper.assertIncompleteFilesGone(this); } public void testSmallFileCopy() throws IOException { File testFileBart = new TFile(getFolderAtBart().getLocalBase(), "TestFile.txt"); TFileOutputStream fOut = new TFileOutputStream(testFileBart); byte[] testContent = "This is the contenent of the testfile".getBytes(); fOut.write(testContent); fOut.close(); // Let him scan the new content scanFolder(getFolderAtBart()); assertEquals("Known items at bart: " + getFolderAtBart().getKnownItemCount(), 1, getFolderAtBart() .getKnownItemCount()); // Give them time to copy TestHelper.waitForCondition(5, new Condition() { public boolean reached() { return 1 == getFolderAtLisa().getKnownItemCount(); } }); // Test ;) assertEquals("Known items at lisa: " + getFolderAtLisa().getKnownItemCount(), 1, getFolderAtLisa() .getKnownItemCount()); File testFileLisa = new TFile(getFolderAtLisa().getLocalBase(), "TestFile.txt"); assertEquals(testContent.length, testFileLisa.length()); assertEquals(testFileBart.length(), testFileLisa.length()); TestHelper.assertIncompleteFilesGone(this); } public void testFileUpdate() throws IOException { // First copy file testSmallFileCopy(); final File testFile1 = new TFile(getFolderAtBart().getLocalBase() + "/TestFile.txt"); OutputStream fOut = new TFileOutputStream(testFile1, true); fOut.write("-> Next content<-".getBytes()); fOut.close(); // Readin file content InputStream fIn = new TFileInputStream(testFile1); byte[] content1 = new byte[(int) testFile1.length()]; fIn.read(content1); fIn.close(); // Let him scan the new content scanFolder(getFolderAtBart()); TestHelper.waitForCondition(10, new ConditionWithMessage() { public String message() { return "Icoming files at lisa: " + getFolderAtLisa().getIncomingFiles().size(); } public boolean reached() { return getFolderAtLisa().getIncomingFiles().size() == 1; } }); // Give them time to copy TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return testFile1.length() == getFolderAtLisa().getKnownFiles() .iterator().next().getSize(); } public String message() { return "Testfile length: " + testFile1.length() + ". Known size: " + getFolderAtLisa().getKnownFiles().iterator().next() .getSize(); } }); // Test ;) assertEquals("Known items at lisa: " + getFolderAtLisa().getKnownItemCount(), 1, getFolderAtLisa() .getKnownItemCount()); FileInfo testFileInfo2 = getFolderAtLisa().getKnownFiles().iterator() .next(); assertEquals(testFile1.length(), testFileInfo2.getSize()); // Read content File testFile2 = testFileInfo2.getDiskFile(getContollerLisa() .getFolderRepository()); fIn = new TFileInputStream(testFile2); byte[] conten2 = new byte[fIn.available()]; fIn.read(conten2); fIn.close(); // Check version assertEquals( "Test file version not 1: " + testFileInfo2.toDetailString(), 1, testFileInfo2.getVersion()); // Check content assertEquals(new String(content1), new String(conten2)); TestHelper.assertIncompleteFilesGone(this); } public void testEmptyFileCopy() throws IOException { // Register listeners MyTransferManagerListener bartsListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartsListener); final MyTransferManagerListener lisasListener = new MyTransferManagerListener(); getContollerLisa().getTransferManager().addListener(lisasListener); File testFile1 = new TFile(getFolderAtBart().getLocalBase() + "/TestFile.txt"); OutputStream fOut = new TFileOutputStream(testFile1); fOut.write(new byte[]{}); fOut.close(); assertTrue("Testfile does not exists:" + testFile1, testFile1.exists()); File testFile2 = new TFile(getFolderAtBart().getLocalBase() + "/subdir/TestFile2.txt"); assertTrue("Unable mkdirs: " + testFile2.getParentFile(), testFile2 .getParentFile().mkdirs()); fOut = new TFileOutputStream(testFile2); fOut.write(new byte[]{}); fOut.close(); assertTrue("Testfile does not exists:" + testFile2, testFile2.exists()); // Let him scan the new content scanFolder(getFolderAtBart()); TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return lisasListener.downloadCompleted >= 2; } public String message() { return "Lisa dls requested " + lisasListener.downloadRequested + ", completed " + lisasListener.downloadCompleted; } }); // Check correct event fireing assertEquals("Bart uploadRequested: " + bartsListener.uploadRequested, 0, bartsListener.uploadRequested); assertEquals("Bart uploadStarted " + bartsListener.uploadStarted, 0, bartsListener.uploadStarted); assertEquals("Bart uploadCompleted " + bartsListener.uploadCompleted, 0, bartsListener.uploadCompleted); assertEquals("Bart uploadAborted " + bartsListener.uploadAborted, 0, bartsListener.uploadAborted); assertEquals("Bart uploadBroken " + bartsListener.uploadBroken, 0, bartsListener.uploadBroken); // Check correct event fireing assertEquals("Lisa downloadRequested " + lisasListener.downloadRequested, 0, lisasListener.downloadRequested); assertEquals("Lisa downloadQueued " + lisasListener.downloadQueued, 0, lisasListener.downloadQueued); assertEquals("Lisa downloadStarted " + lisasListener.downloadStarted, 0, lisasListener.downloadStarted); assertEquals("Lisa downloadCompleted " + lisasListener.downloadCompleted, 2, lisasListener.downloadCompleted); assertEquals("Lisa downloadAborted " + lisasListener.downloadAborted, 0, lisasListener.downloadAborted); assertEquals("Lisa downloadBroken " + lisasListener.downloadBroken, 0, lisasListener.downloadBroken); assertEquals("Lisa downloadsCompletedRemoved " + lisasListener.downloadsCompletedRemoved, 0, lisasListener.downloadsCompletedRemoved); // Test ;) assertEquals("Lisa.getKnownItemCount: " + getFolderAtLisa().getKnownItemCount(), 3, getFolderAtLisa() .getKnownItemCount()); // 3 physical files (1 file + 1 system dir + 1 subdir) assertEquals("Lisa.getLocalBase.list: " + getFolderAtLisa().getLocalBase().list().length, 3, getFolderAtLisa().getLocalBase().list().length); // No active downloads? TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return getContollerLisa().getTransferManager() .countActiveDownloads() == 0; } public String message() { return "Lisa.countActiveDownloads: " + getContollerLisa().getTransferManager() .countActiveDownloads(); } }); clearCompletedDownloadsAtLisa(); // give time for event firering // Thread.sleep(500); // assertEquals(2, lisasListener.downloadsCompletedRemoved); TestHelper.assertIncompleteFilesGone(this); } /** * */ private void clearCompletedDownloadsAtLisa() { // Clear completed downloads Collection<DownloadManager> list = getContollerLisa() .getTransferManager().getCompletedDownloadsCollection(); for (DownloadManager download : list) { getContollerLisa().getTransferManager().clearCompletedDownload( download); } } /** * */ private void clearCompletedDownloadsAtBart() { // Clear completed downloads Collection<DownloadManager> list = getContollerBart() .getTransferManager().getCompletedDownloadsCollection(); for (DownloadManager download : list) { getContollerBart().getTransferManager().clearCompletedDownload( download); } } /** * Tests the copy of a big file. approx. 10 megs. */ public void testBigFileCopy() { // Register listeners final MyTransferManagerListener bartsListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartsListener); final MyTransferManagerListener lisasListener = new MyTransferManagerListener( true); getContollerLisa().getTransferManager().addListener(lisasListener); // 12 Meg testfile TestHelper.createRandomFile(getFolderAtBart().getLocalBase(), 12 * 1024 * 1024); // Let him scan the new content scanFolder(getFolderAtBart()); TestHelper.waitForCondition(100, new Condition() { public boolean reached() { return lisasListener.downloadRequested >= 1 && lisasListener.downloadCompleted >= 1 && bartsListener.uploadCompleted >= 1; } }); // Check correct event fireing assertEquals("Bart uploadRequested: " + bartsListener.uploadRequested, 1, bartsListener.uploadRequested); assertEquals("Bart uploadStarted: " + bartsListener.uploadStarted, 1, bartsListener.uploadStarted); assertEquals("Bart uploadCompleted: " + bartsListener.uploadCompleted, 1, bartsListener.uploadCompleted); assertEquals("Bart uploadAborted: " + bartsListener.uploadAborted, 0, bartsListener.uploadAborted); assertEquals("Bart uploadBroken: " + bartsListener.uploadBroken, 0, bartsListener.uploadBroken); // Check correct event fireing assertEquals("Lisa downloadRequested " + lisasListener.downloadCompleted, 1, lisasListener.downloadRequested); // We can't rely on that all downloads have been queued. // Might be started fast! So now queued message is sent // assertEquals(1, lisasListener.downloadQueued); assertEquals("Lisa downloadStarted " + lisasListener.downloadStarted, 1, lisasListener.downloadStarted); assertEquals("Lisa downloadCompleted " + lisasListener.downloadCompleted + ": " + lisasListener.downloadsCompleted, 1, lisasListener.downloadCompleted); assertEquals("Lisa downloadAborted " + lisasListener.downloadAborted, 0, lisasListener.downloadAborted); assertEquals("Lisa downloadBroken " + lisasListener.downloadBroken, 0, lisasListener.downloadBroken); assertEquals("Lisa downloadsCompletedRemoved " + lisasListener.downloadsCompletedRemoved, 0, lisasListener.downloadsCompletedRemoved); // Test ;) assertEquals("Lisa.getKnownItemCount: " + getFolderAtLisa().getKnownItemCount(), 1, getFolderAtLisa() .getKnownItemCount()); // 2 physical files (1 + 1 system dir) assertEquals("Lisa.getLocalBase.list: " + getFolderAtLisa().getLocalBase().list().length, 2, getFolderAtLisa().getLocalBase().list().length); // No active downloads? TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return getContollerLisa().getTransferManager() .countActiveDownloads() == 0; } public String message() { return "Lisa.countActiveDownloads: " + getContollerLisa().getTransferManager() .countActiveDownloads(); } }); clearCompletedDownloadsAtLisa(); assertEquals("Lisa downloadsCompletedRemoved " + lisasListener.downloadsCompletedRemoved, 1, lisasListener.downloadsCompletedRemoved); TestHelper.assertIncompleteFilesGone(this); } public void testMultipleFilesCopy() { // Register listeners final MyTransferManagerListener bartsListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartsListener); final MyTransferManagerListener lisasListener = new MyTransferManagerListener(); getContollerLisa().getTransferManager().addListener(lisasListener); final int nFiles = 35; for (int i = 0; i < nFiles; i++) { TestHelper.createRandomFile(getFolderAtBart().getLocalBase()); } // Let him scan the new content scanFolder(getFolderAtBart()); assertEquals(nFiles, getFolderAtBart().getKnownItemCount()); assertEquals("Connected nodes at bart: " + getContollerBart().getNodeManager().getConnectedNodes(), 1, getContollerBart().getNodeManager().getConnectedNodes().size()); assertEquals("Connected nodes at lisa: " + getContollerLisa().getNodeManager().getConnectedNodes(), 1, getContollerLisa().getNodeManager().getConnectedNodes().size()); // Wait for copy (timeout 50) TestHelper.waitForCondition(200, new ConditionWithMessage() { public boolean reached() { return lisasListener.downloadRequested >= nFiles && lisasListener.downloadCompleted >= nFiles && bartsListener.uploadCompleted >= nFiles; } public String message() { return "lisa: " + lisasListener.downloadRequested + ", lisa dl comp: " + lisasListener.downloadCompleted + ", bart ul comp: " + bartsListener.uploadCompleted + " should be " + nFiles; } }); // Check correct event fireing assertEquals("Bart uploadAborted: " + bartsListener, 0, bartsListener.uploadAborted); assertEquals("Bart uploadBroken: " + bartsListener, 0, bartsListener.uploadBroken); assertEquals("Bart uploadRequested: " + bartsListener, nFiles, bartsListener.uploadRequested); assertEquals("Bart uploadStarted: " + bartsListener, nFiles, bartsListener.uploadStarted); assertEquals("Bart uploadCompleted: " + bartsListener, nFiles, bartsListener.uploadCompleted); // Check correct event fireing assertEquals("Lisa downloadRequested " + lisasListener, nFiles, lisasListener.downloadRequested); // We can't rely on that all downloads have been queued. // Might be started fast! So now queued message is sent // assertEquals(nFiles, lisasListener.downloadQueued); assertEquals("Lisa downloadStarted " + lisasListener, nFiles, lisasListener.downloadStarted); assertEquals("Lisa downloadCompleted " + lisasListener, nFiles, lisasListener.downloadCompleted); assertEquals("Lisa downloadAborted " + lisasListener, 0, lisasListener.downloadAborted); assertEquals("Lisa downloadBroken " + lisasListener, 0, lisasListener.downloadBroken); assertEquals("Lisa downloadsCompletedRemoved " + lisasListener, 0, lisasListener.downloadsCompletedRemoved); // Test ;) assertEquals("Lisa.getKnownItemCount: " + getFolderAtLisa().getKnownItemCount(), nFiles, getFolderAtLisa() .getKnownItemCount()); // test physical files (1 + 1 system dir) assertEquals("Lisa.getLocalBase.list: " + getFolderAtLisa().getLocalBase().list().length, nFiles + 1, getFolderAtLisa().getLocalBase().list().length); // No active downloads? TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return getContollerLisa().getTransferManager() .countActiveDownloads() == 0; } public String message() { return "Lisa.countActiveDownloads: " + getContollerLisa().getTransferManager() .countActiveDownloads(); } }); clearCompletedDownloadsAtLisa(); assertEquals("Lisa downloadsCompletedRemoved " + lisasListener, nFiles, lisasListener.downloadsCompletedRemoved); TestHelper.assertIncompleteFilesGone(this); } public void testMultipleFilesCopyWithFolderWatcher() { // Register listeners if (!FolderWatcher.isLibLoaded()) { return; } getFolderAtBart().setSyncProfile(SyncProfile.AUTOMATIC_SYNCHRONIZATION); getFolderAtBart().getFolderWatcher().setIngoreAll(false); getFolderAtLisa().setSyncProfile(SyncProfile.AUTOMATIC_SYNCHRONIZATION); getFolderAtLisa().getFolderWatcher().setIngoreAll(false); final MyTransferManagerListener bartsListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartsListener); final MyTransferManagerListener lisasListener = new MyTransferManagerListener(); getContollerLisa().getTransferManager().addListener(lisasListener); scanFolder(getFolderAtBart()); TestHelper.waitMilliSeconds(2500); final int nFiles = 35; for (int i = 0; i < nFiles; i++) { TestHelper.createRandomFile(getFolderAtLisa().getLocalBase()); } TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return getFolderAtLisa().getKnownItemCount() == 35; } public String message() { return "Known files at bart: " + getFolderAtLisa().getKnownItemCount() + " Expected: " + 35; } }); assertEquals(nFiles, getFolderAtLisa().getKnownItemCount()); assertEquals("Connected nodes at lisa: " + getContollerLisa().getNodeManager().getConnectedNodes(), 1, getContollerLisa().getNodeManager().getConnectedNodes().size()); assertEquals("Connected nodes at bart: " + getContollerBart().getNodeManager().getConnectedNodes(), 1, getContollerBart().getNodeManager().getConnectedNodes().size()); // Wait for copy (timeout 50) TestHelper.waitForCondition(200, new ConditionWithMessage() { public boolean reached() { return bartsListener.downloadRequested >= nFiles && bartsListener.downloadCompleted >= nFiles && lisasListener.uploadCompleted >= nFiles; } public String message() { return "bart dl req: " + bartsListener.downloadRequested + ", bart dl comp: " + bartsListener.downloadCompleted + ", lisas ul comp: " + lisasListener.uploadCompleted + " should be " + nFiles; } }); // Check correct event fireing assertEquals(0, lisasListener.uploadAborted); assertEquals(0, lisasListener.uploadBroken); assertEquals(nFiles, lisasListener.uploadRequested); assertEquals(nFiles, lisasListener.uploadStarted); assertEquals(nFiles, lisasListener.uploadCompleted); // Check correct event fireing assertEquals(nFiles, bartsListener.downloadRequested); // We can't rely on that all downloads have been queued. // Might be started fast! So now queued message is sent // assertEquals(nFiles, lisasListener.downloadQueued); assertEquals(nFiles, bartsListener.downloadStarted); assertEquals(nFiles, bartsListener.downloadCompleted); assertEquals(0, bartsListener.downloadAborted); assertEquals(0, bartsListener.downloadBroken); assertEquals(0, bartsListener.downloadsCompletedRemoved); // Test ;) assertEquals(nFiles, getFolderAtBart().getKnownItemCount()); // test physical files (1 + 1 system dir) assertEquals(nFiles + 1, getFolderAtBart().getLocalBase().list().length); // No active downloads?! assertEquals(0, getContollerBart().getTransferManager() .countActiveDownloads()); clearCompletedDownloadsAtBart(); assertEquals(nFiles, bartsListener.downloadsCompletedRemoved); TestHelper.assertIncompleteFilesGone(this); } public void testMultipleMultipleFilesCopy() throws Exception { for (int i = 0; i < 10; i++) { testMultipleFilesCopy(); tearDown(); setUp(); } } public void testManySmallFilesCopy() { // Register listeners final MyTransferManagerListener bartsListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartsListener); final MyTransferManagerListener lisasListener = new MyTransferManagerListener(); getContollerLisa().getTransferManager().addListener(lisasListener); long totalSize = 0; final int nFiles = 450; for (int i = 0; i < nFiles; i++) { File f = TestHelper.createRandomFile(getFolderAtBart() .getLocalBase(), (long) (Math.random() * 40) + 1); totalSize += f.length(); } // Let him scan the new content scanFolder(getFolderAtBart()); assertEquals(nFiles, getFolderAtBart().getKnownItemCount()); long start = System.currentTimeMillis(); // Wait for copy TestHelper.waitForCondition(300, new ConditionWithMessage() { public boolean reached() { return lisasListener.downloadRequested >= nFiles && lisasListener.downloadCompleted >= nFiles && bartsListener.uploadCompleted >= nFiles; } public String message() { return "Lisa downloads completed: " + lisasListener.downloadCompleted + ". Bart uploads completed: " + bartsListener.uploadCompleted; } }); long took = System.currentTimeMillis() - start; double kbs = ((double) totalSize) / took; System.err.println("Transfer stats: " + nFiles + " files, " + Format.formatBytesShort(totalSize) + ", " + kbs / 1024 + ", " + took + "ms"); // Test ;) assertEquals(nFiles, getFolderAtLisa().getKnownItemCount()); // test physical files (1 + 1 system dir) assertEquals(nFiles + 1, getFolderAtLisa().getLocalBase().list().length); // Check correct event fireing assertEquals(0, bartsListener.uploadAborted); assertEquals(0, bartsListener.uploadBroken); assertEquals(nFiles, bartsListener.uploadRequested); assertEquals(nFiles, bartsListener.uploadStarted); assertEquals(nFiles, bartsListener.uploadCompleted); // Check correct event fireing assertEquals(0, lisasListener.downloadAborted); assertEquals(0, lisasListener.downloadBroken); assertEquals(0, lisasListener.downloadsCompletedRemoved); assertEquals(nFiles, lisasListener.downloadRequested); // We can't rely on that all downloads have been queued. // Might be started fast! So now queued message is sent // assertEquals(nFiles, lisasListener.downloadQueued); assertEquals(nFiles, lisasListener.downloadStarted); assertEquals(nFiles, lisasListener.downloadCompleted); // No active downloads?! assertEquals(0, getContollerLisa().getTransferManager() .countActiveDownloads()); clearCompletedDownloadsAtLisa(); assertEquals(nFiles, lisasListener.downloadsCompletedRemoved); TestHelper.assertIncompleteFilesGone(this); } public void testManyPow2FilesCopy() { // Register listeners final MyTransferManagerListener bartsListener = new MyTransferManagerListener( true); getContollerBart().getTransferManager().addListener(bartsListener); final MyTransferManagerListener lisasListener = new MyTransferManagerListener( true); getContollerLisa().getTransferManager().addListener(lisasListener); final int nFiles = 450; for (int i = 0; i < nFiles; i++) { TestHelper.createRandomFile(getFolderAtBart().getLocalBase(), 1 << (i % 18)); } // Let him scan the new content scanFolder(getFolderAtBart()); assertEquals("getFolderAtBart().getKnownItemCount(): " + getFolderAtBart().getKnownItemCount(), nFiles, getFolderAtBart() .getKnownItemCount()); // Wait for copy TestHelper.waitForCondition(200, new ConditionWithMessage() { public boolean reached() { return lisasListener.downloadRequested >= nFiles && lisasListener.downloadCompleted >= nFiles && bartsListener.uploadCompleted >= nFiles; } public String message() { return "lisa.dreq: " + lisasListener.downloadRequested + " lisa.dcomp: " + lisasListener.downloadCompleted + " bart.upcomp: " + bartsListener.uploadCompleted + " vs " + nFiles; } }); // Give the system a small amount of time to acknowledge the completion // of all downloads TestHelper.waitMilliSeconds(100); // No active downloads? TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return getContollerLisa().getTransferManager() .countActiveDownloads() == 0; } public String message() { return "Lisa.countActiveDownloads: " + getContollerLisa().getTransferManager() .countActiveDownloads(); } }); clearCompletedDownloadsAtLisa(); assertEquals("Lisa downloadsCompletedRemoved " + lisasListener.downloadsCompletedRemoved, nFiles, lisasListener.downloadsCompletedRemoved); TestHelper.assertIncompleteFilesGone(this); } public void testMultipleManPow2() throws Exception { // Logger l = // Logger.getLogger(AbstractDownloadManager.class.getRelativeName()); // l.setFilter(null); // l.setLevel(Level.ALL); // ConsoleHandler ch = new ConsoleHandler(); // ch.setLevel(Level.ALL); // l.addHandler(ch); for (int i = 0; i < 10; i++) { if (i > 0) { tearDown(); setUp(); } testManyPow2FilesCopy(); } } public void testManyIncreasingFilesCopy() { // Register listeners final MyTransferManagerListener bartsListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartsListener); final MyTransferManagerListener lisasListener = new MyTransferManagerListener(); getContollerLisa().getTransferManager().addListener(lisasListener); final int nFiles = 100; for (int i = 0; i < nFiles; i++) { TestHelper.createRandomFile(getFolderAtBart().getLocalBase(), (long) ((i << 7) + Math.random() * (1 << 7) - 1) + 1); } // Let him scan the new content scanFolder(getFolderAtBart()); assertEquals(nFiles, getFolderAtBart().getKnownItemCount()); // Wait for copy TestHelper.waitForCondition(200, new Condition() { public boolean reached() { return lisasListener.downloadRequested >= nFiles && lisasListener.downloadCompleted >= nFiles && bartsListener.uploadCompleted >= nFiles; } }); // No active downloads?! assertEquals(0, getContollerLisa().getTransferManager() .countActiveDownloads()); clearCompletedDownloadsAtLisa(); assertEquals(nFiles, lisasListener.downloadsCompletedRemoved); TestHelper.assertIncompleteFilesGone(this); } public void testMany0SizeFilesCopyMulti() throws Exception { for (int i = 0; i < 5; i++) { testMany0SizeFilesCopy(); tearDown(); setUp(); } } public void testMany0SizeFilesCopy() { // Register listeners MyTransferManagerListener bartsListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartsListener); final MyTransferManagerListener lisasListener = new MyTransferManagerListener(); getContollerLisa().getTransferManager().addListener(lisasListener); getFolderAtLisa().setSyncProfile(SyncProfile.MANUAL_SYNCHRONIZATION); final int nFiles = 450; for (int i = 0; i < nFiles; i++) { TestHelper.createRandomFile(getFolderAtBart().getLocalBase(), 0); } System.err.println("Created!"); assertEquals(0, lisasListener.downloadCompleted); // Let him scan the new content scanFolder(getFolderAtBart()); assertEquals(nFiles, getFolderAtBart().getKnownItemCount()); getFolderAtLisa().setSyncProfile(SyncProfile.AUTOMATIC_SYNCHRONIZATION); // Wait for copy TestHelper.waitForCondition(100, new ConditionWithMessage() { public boolean reached() { return lisasListener.downloadCompleted >= nFiles && getFolderAtLisa().getKnownItemCount() == nFiles; } public String message() { return "Completed downloads at lisa actual: " + lisasListener.downloadCompleted + ". Expected: " + nFiles; } }); // Test ;) assertEquals(nFiles, getFolderAtLisa().getKnownItemCount()); // test physical files (1 + 1 system dir) assertEquals(nFiles + 1, getFolderAtLisa().getLocalBase().list().length); // Check correct event fireing assertEquals(0, bartsListener.uploadAborted); assertEquals(0, bartsListener.uploadBroken); assertEquals(0, bartsListener.uploadRequested); assertEquals(0, bartsListener.uploadStarted); assertEquals(0, bartsListener.uploadCompleted); // Check correct event fireing assertEquals(0, lisasListener.downloadAborted); assertEquals(0, lisasListener.downloadBroken); assertEquals(0, lisasListener.downloadsCompletedRemoved); // 0 bytes downloads never get requested, nor queued or started. assertEquals(0, lisasListener.downloadRequested); assertEquals(0, lisasListener.downloadQueued); assertEquals(0, lisasListener.downloadStarted); assertEquals(nFiles, lisasListener.downloadCompleted); // No active downloads?! assertEquals(0, getContollerLisa().getTransferManager() .countActiveDownloads()); clearCompletedDownloadsAtLisa(); assertEquals(nFiles, lisasListener.downloadsCompletedRemoved); TestHelper.assertIncompleteFilesGone(this); } public void testMany0SizeFilesCopyDeltaSync() { ConfigurationEntry.USE_DELTA_ON_LAN .setValue(getContollerBart(), "true"); ConfigurationEntry.USE_DELTA_ON_LAN .setValue(getContollerLisa(), "true"); // Register listeners MyTransferManagerListener bartsListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartsListener); final MyTransferManagerListener lisasListener = new MyTransferManagerListener(); getContollerLisa().getTransferManager().addListener(lisasListener); final int nFiles = 450; for (int i = 0; i < nFiles; i++) { TestHelper.createRandomFile(getFolderAtBart().getLocalBase(), 0); } System.err.println("Created!"); // Let him scan the new content scanFolder(getFolderAtBart()); assertEquals(nFiles, getFolderAtBart().getKnownItemCount()); // Wait for copy TestHelper.waitForCondition(100, new ConditionWithMessage() { public boolean reached() { return lisasListener.downloadCompleted >= nFiles; } public String message() { return "Completed downloads at lisa. Actual: " + lisasListener.downloadCompleted + ", Expected: " + nFiles; } }); // Test ;) assertEquals(nFiles, getFolderAtLisa().getKnownItemCount()); // test physical files (1 + 1 system dir) assertEquals(nFiles + 1, getFolderAtLisa().getLocalBase().list().length); // Check correct event fireing assertEquals(0, bartsListener.uploadAborted); assertEquals(0, bartsListener.uploadBroken); assertEquals(0, bartsListener.uploadRequested); assertEquals(0, bartsListener.uploadStarted); assertEquals(0, bartsListener.uploadCompleted); // Check correct event fireing assertEquals(0, lisasListener.downloadAborted); assertEquals(0, lisasListener.downloadBroken); assertEquals(0, lisasListener.downloadsCompletedRemoved); assertEquals(0, lisasListener.downloadRequested); // 0 bytes downloads never get requested, nor queued or started. assertEquals(0, lisasListener.downloadRequested); assertEquals(0, lisasListener.downloadQueued); assertEquals(0, lisasListener.downloadStarted); assertEquals(nFiles, lisasListener.downloadCompleted); // No active downloads?! assertEquals(0, getContollerLisa().getTransferManager() .countActiveDownloads()); clearCompletedDownloadsAtLisa(); assertEquals(nFiles, lisasListener.downloadsCompletedRemoved); TestHelper.assertIncompleteFilesGone(this); } public void xtestMultipleResumeTransfer() throws Exception { // Logger l = // Logger.getLogger(AbstractDownloadManager.class.getRelativeName()); // l.setFilter(null); // l.setLevel(Level.ALL); // ConsoleHandler ch = new ConsoleHandler(); // ch.setLevel(Level.ALL); // l.addHandler(ch); for (int i = 0; i < 20; i++) { testResumeTransfer(); tearDown(); setUp(); } } public void testRecoverFromMD5ErrorMultipe() throws Exception { for (int i = 0; i < 10; i++) { testRecoverFromMD5Error(); tearDown(); setUp(); } } /** * TRAC #1904 */ public void testRecoverFromMD5Error() { getContollerBart().getTransferManager().setUploadCPSForLAN(400000); getContollerBart().getTransferManager().setUploadCPSForWAN(400000); ConfigurationEntry.USE_DELTA_ON_LAN.setValue(getContollerBart(), true); ConfigurationEntry.USE_DELTA_ON_LAN.setValue(getContollerLisa(), true); // testfile File testFile = TestHelper.createRandomFile(getFolderAtBart() .getLocalBase()); testFile.setLastModified(System.currentTimeMillis() - 6000); scanFolder(getFolderAtBart()); TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return getFolderAtLisa().getKnownItemCount() == 1; } public String message() { return "getFolderAtLisa().getKnownItemCount(): " + getFolderAtLisa().getKnownItemCount(); } }); TestHelper.changeFile(testFile, 20 * 1024 * 1024); // Let him scan the new content scanFolder(getFolderAtBart()); TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return getContollerLisa().getTransferManager() .countActiveDownloads() > 0; } public String message() { return "getContollerLisa.countActiveDownloads(): " + getContollerLisa().getTransferManager() .countActiveDownloads(); } }); final File tempFile = getContollerLisa().getTransferManager() .getActiveDownloads().iterator().next().getTempFile(); // Let them copy some ~1 megs final long mbUntilBreak = 1; TestHelper.waitForCondition(100, new Condition() { public boolean reached() { return tempFile.length() > mbUntilBreak * 1024 * 1024; } }); disconnectBartAndLisa(); TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return getContollerLisa().getTransferManager() .countActiveDownloads() == 0; } public String message() { return "Active downloads @ lisa: " + getContollerLisa().getTransferManager() .countActiveDownloads(); } }); LoggingManager.setConsoleLogging(Level.FINE); assertTrue(tempFile.exists()); assertTrue(tempFile.length() > 0); assertTrue(tempFile.length() < testFile.length()); assertTrue("Size inc. file: " + tempFile.length() + ", size testfile: " + testFile.length(), tempFile.length() < testFile.length()); // Now mess up the tempfile = Force a MD5_ERROR long tempMod = tempFile.lastModified(); TestHelper.changeFile(tempFile, tempFile.length()); tempFile.setLastModified(tempMod); // Reconnect /Resume transfer connectBartAndLisa(); TestHelper.waitForCondition(20, new ConditionWithMessage() { public boolean reached() { return !tempFile.exists(); } public String message() { return "Tempfile does exist although MD5_ERROR has been observed:" + tempFile; } }); getContollerLisa().getFolderRepository().getFileRequestor() .triggerFileRequesting(); TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { getContollerLisa().getFolderRepository().getFileRequestor() .triggerFileRequesting(); return getContollerLisa().getTransferManager() .countCompletedDownloads() > 1; } public String message() { return "getContollerLisa.countCompletedDownloads(): " + getContollerLisa().getTransferManager() .countCompletedDownloads(); } }); FileInfo fBart = getFolderAtBart().getKnownFiles().iterator().next(); File fileBart = fBart.getDiskFile(getContollerBart() .getFolderRepository()); FileInfo fLisa = getFolderAtLisa().getKnownFiles().iterator().next(); File fileLisa = fLisa.getDiskFile(getContollerLisa() .getFolderRepository()); assertEquals("File version at bart not 1: " + fBart.toDetailString(), 1, fBart.getVersion()); assertEquals("File version at lisa not 1: " + fLisa.toDetailString(), 1, fLisa.getVersion()); assertTrue("File content mismatch: " + fileBart + " and " + fileLisa, TestHelper.compareFiles(fileBart, fileLisa)); } /** * Tests the copy and download resume of a big file. * <p> * TRAC #415 */ public void testResumeTransfer() { getContollerBart().getTransferManager().setUploadCPSForLAN(100000); getContollerBart().getTransferManager().setUploadCPSForWAN(100000); getContollerBart().getReconnectManager().shutdown(); getContollerLisa().getReconnectManager().shutdown(); assertFalse(getContollerBart().getReconnectManager().isStarted()); // Register listeners final MyTransferManagerListener bartsListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartsListener); final MyTransferManagerListener lisasListener = new MyTransferManagerListener(); getContollerLisa().getTransferManager().addListener(lisasListener); // testfile File testFile = TestHelper.createRandomFile(getFolderAtBart() .getLocalBase(), 30 * 1024 * 1024); testFile.setLastModified(System.currentTimeMillis() - 1000L * 60 * 60); // Let him scan the new content scanFolder(getFolderAtBart()); TestHelper.waitForCondition(10, new Condition() { public boolean reached() { return getContollerLisa().getTransferManager() .countActiveDownloads() > 0 && new TFile(getFolderAtLisa().getSystemSubDir(), "transfers").listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.contains("(incomplete) "); } }) != null; } }); FileInfo fInfo = getFolderAtLisa().getIncomingFiles().iterator().next(); File file = fInfo.getDiskFile(getContollerLisa().getFolderRepository()); final File incompleteFile = new TFile(getFolderAtLisa() .getSystemSubDir(), "transfers").listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.contains("(incomplete) "); } })[0]; FileInfo bartFInfo = getFolderAtBart().getKnownFiles().iterator() .next(); File bartFile = bartFInfo.getDiskFile(getContollerBart() .getFolderRepository()); assertFileMatch(bartFile, bartFInfo, getContollerBart()); // Let them copy some ~1 megs final long mbUntilBreak = 1; TestHelper.waitForCondition(100, new Condition() { public boolean reached() { return incompleteFile.length() > mbUntilBreak * 1024 * 1024; } }); assertEquals(1, getContollerLisa().getTransferManager() .getActiveDownload(fInfo).getSources().size()); assertEquals(0, lisasListener.downloadBroken); // Disconnected disconnectBartAndLisa(); TestHelper.waitMilliSeconds(100); assertTrue(incompleteFile.length() < testFile.length()); assertTrue(incompleteFile.exists()); assertTrue(incompleteFile.length() > 0); assertTrue("Size inc. file: " + incompleteFile.length() + ", size testfile: " + testFile.length(), incompleteFile.length() < testFile.length()); assertEquals(1, bartsListener.uploadRequested); assertEquals(1, bartsListener.uploadStarted); assertEquals(0, bartsListener.uploadCompleted); assertEquals(1, bartsListener.uploadAborted); assertEquals(0, bartsListener.uploadBroken); assertEquals(1, lisasListener.downloadRequested); assertEquals(1, lisasListener.downloadStarted); assertEquals(0, lisasListener.downloadCompleted); assertEquals(0, lisasListener.downloadAborted); assertEquals(1, lisasListener.downloadBroken); assertEquals(0, lisasListener.downloadsCompletedRemoved); assertFalse(file.exists()); assertTrue(incompleteFile.exists()); assertTrue(incompleteFile.length() > mbUntilBreak * 1024 * 1024); long bytesDownloaded = getContollerLisa().getTransferManager() .getDownloadCounter().getBytesTransferred(); // Test has to be >= because it could happen that the download gets // broken before the received data is written assertTrue("Downloaded: " + bytesDownloaded + " filesize: " + incompleteFile.length(), bytesDownloaded >= incompleteFile.length()); // System.err.println("Incomplete file: " + // incompleteFile.lastModified() // + ", size: " + incompleteFile.length()); assertEquals(bartFile.lastModified(), bartFInfo.getModifiedDate() .getTime()); assertTrue( "Last modified date mismatch of orignial file and incompleted dl file", DateUtil.equalsFileDateCrossPlattform(bartFile.lastModified(), incompleteFile.lastModified())); assertEquals(bartFInfo.getModifiedDate().getTime(), incompleteFile.lastModified()); System.err.println("Transferred " + incompleteFile.length() + " bytes"); // Reconnect /Resume transfer connectBartAndLisa(); // Trigger. FIXME: Should be automatically done on connect! getContollerLisa().getFolderRepository().getFileRequestor() .triggerFileRequesting(); // Wait untill download is started TestHelper.waitForCondition(20, new ConditionWithMessage() { public boolean reached() { return lisasListener.downloadStarted >= 2; } public String message() { return "Lisa download started: " + lisasListener.downloadStarted + " requested, " + lisasListener.downloadRequested + ", broken: " + lisasListener.downloadBroken + ", last problem: " + lisasListener.lastEvent.getTransferProblem() + ": " + lisasListener.lastEvent.getProblemInformation(); } }); // Temp file should be greater than 3mb already // TODO: I added speed limits above because on my machine the transfer // was too fast and the // file was completed already. Please check if this test is correct. assertTrue("Tempfile already removed", incompleteFile.exists()); assertTrue("Temp file should be greater than " + mbUntilBreak + "mb already. got " + Format.formatBytes(incompleteFile.length()), incompleteFile.length() > mbUntilBreak * 1024 * 1024); TestHelper.waitForCondition(60, new ConditionWithMessage() { public boolean reached() { return lisasListener.downloadCompleted == 1 && lisasListener.downloadRequested == 2 && lisasListener.downloadStarted == 2 && lisasListener.downloadAborted == 0 && lisasListener.downloadBroken == 1 && bartsListener.uploadRequested == 2 && bartsListener.uploadStarted == 2 && bartsListener.uploadAborted == 1 && bartsListener.uploadBroken == 0 && bartsListener.uploadCompleted == 1; } public String message() { return "lisa: completed dl= " + lisasListener.downloadCompleted + ", req dl= " + lisasListener.downloadRequested + ", srtd dl= " + lisasListener.downloadStarted + ", brkn dl= " + lisasListener.downloadBroken + ", abrt dl= " + lisasListener.downloadAborted + "; bart: req ul= " + bartsListener.uploadRequested + ", srtd ul= " + bartsListener.uploadStarted + ", cmpld ul= " + bartsListener.uploadCompleted + ", brkn ul= " + bartsListener.uploadBroken + ", abrt ul=" + bartsListener.uploadAborted; } }); // Check correct event fireing assertEquals(2, bartsListener.uploadRequested); assertEquals(2, bartsListener.uploadStarted); assertEquals(1, bartsListener.uploadCompleted); assertEquals(1, bartsListener.uploadAborted); assertEquals(0, bartsListener.uploadBroken); // Check correct event fireing assertEquals(2, lisasListener.downloadRequested); // assertEquals(2, lisasListener.downloadQueued); assertEquals(2, lisasListener.downloadStarted); assertEquals(1, lisasListener.downloadCompleted); assertEquals("Aborted dl found! broken: " + lisasListener.downloadBroken, 0, lisasListener.downloadAborted); assertEquals(1, lisasListener.downloadBroken); assertEquals(0, lisasListener.downloadsCompletedRemoved); assertTrue(file.exists()); // Total bytes downloaded should be == file size // More bytes downloaded means no resume! bytesDownloaded = getContollerLisa().getTransferManager() .getDownloadCounter().getBytesTransferred(); // assertEquals("Mismatch, bytes Downloaded: " + bytesDownloaded // + ", file size: " + file.length(), bytesDownloaded, file.length()); // Test ;) assertEquals(1, getFolderAtLisa().getKnownItemCount()); // 2 physical files (1 + 1 system dir) assertEquals(2, getFolderAtLisa().getLocalBase().list().length); // No active downloads? assertEquals(0, getContollerLisa().getTransferManager() .countActiveDownloads()); clearCompletedDownloadsAtLisa(); assertEquals(1, lisasListener.downloadsCompletedRemoved); TestHelper.assertIncompleteFilesGone(this); } public void testBrokenTransferFileChanged() { // Register listeners MyTransferManagerListener bartListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartListener); MyTransferManagerListener lisaListener = new MyTransferManagerListener(); getContollerLisa().getTransferManager().addListener(lisaListener); // 1 Meg testfile File testFile = TestHelper.createRandomFile(getFolderAtBart() .getLocalBase(), 1024); // Let him scan the new content scanFolder(getFolderAtBart()); // Now change the file TestHelper.changeFile(testFile); // Database not in sync! TestHelper.waitMilliSeconds(2500); // Check correct event fireing assertEquals( "Bart. Uploads requested: " + bartListener.uploadRequested, 0, bartListener.uploadRequested); assertEquals("Bart. Uploads started: " + bartListener.uploadStarted, 0, bartListener.uploadStarted); assertEquals( "Bart. Uploads completed: " + bartListener.uploadCompleted, 0, bartListener.uploadCompleted); assertEquals("Bart. Uploads aborted: " + bartListener.uploadAborted, 0, bartListener.uploadAborted); assertEquals( "Bart. Uploads uploadBroken: " + bartListener.uploadBroken, 0, bartListener.uploadBroken); // Check correct event fireing assertEquals("Lisa. downloadRequested: " + lisaListener.downloadRequested, 1, lisaListener.downloadRequested); // assertEquals(2, lisasListener.downloadQueued); assertEquals("Lisa. downloadStarted: " + lisaListener.downloadStarted, 0, lisaListener.downloadStarted); assertEquals("Lisa. downloadCompleted: " + lisaListener.downloadCompleted, 0, lisaListener.downloadCompleted); assertEquals("Lisa. downloadAborted: " + lisaListener.downloadAborted, 1, lisaListener.downloadAborted); assertEquals("Lisa. downloadBroken: " + lisaListener.downloadBroken, 0, lisaListener.downloadBroken); assertEquals("Lisa. downloadsCompletedRemoved: " + lisaListener.downloadsCompletedRemoved, 0, lisaListener.downloadsCompletedRemoved); TestHelper.assertIncompleteFilesGone(this); } public void xtestDeltaFileNotChangedMultipe() throws Exception { for (int i = 0; i < 50; i++) { testDeltaFileNotChanged(); tearDown(); setUp(); } } public void testDeltaFileNotChanged() throws InterruptedException { ConfigurationEntry.USE_DELTA_ON_LAN .setValue(getContollerBart(), "true"); ConfigurationEntry.USE_DELTA_ON_LAN .setValue(getContollerLisa(), "true"); // Register listeners final MyTransferManagerListener bartListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartListener); final MyTransferManagerListener lisaListener = new MyTransferManagerListener(); getContollerLisa().getTransferManager().addListener(lisaListener); // 1 Meg testfile File fbart = TestHelper .createRandomFile(getFolderAtBart().getLocalBase(), (long) (1024 * 1024 + Math.random() * 1024 * 1024)); // Let him scan the new content scanFolder(getFolderAtBart()); TestHelper.waitForCondition(20, new Condition() { public boolean reached() { return lisaListener.downloadRequested >= 1 && lisaListener.downloadCompleted >= 1 && bartListener.uploadCompleted >= 1 && getFolderAtLisa().getKnownFiles().size() >= 1; } }); FileInfo linfo = getFolderAtLisa().getKnownFiles().iterator().next(); File flisa = linfo .getDiskFile(getContollerLisa().getFolderRepository()); assertTrue(TestHelper.compareFiles(fbart, flisa)); disconnectBartAndLisa(); long oldByteCount = getFolderAtLisa().getStatistic() .getDownloadCounter().getBytesTransferred(); Thread.sleep(3000); // Change and scan file. assertTrue(fbart.setLastModified(System.currentTimeMillis() + 4000)); assertTrue("Bart lastmod: " + fbart.lastModified() + ", Lisa lastmod: " + flisa.lastModified(), fbart.lastModified() - 2000 > flisa.lastModified()); scanFolder(getFolderAtBart()); assertEquals(1, getFolderAtBart().getKnownItemCount()); assertEquals(1, getFolderAtLisa().getKnownItemCount()); assertTrue(getFolderAtBart().getKnownFiles().iterator().next() .isNewerThan(getFolderAtLisa().getKnownFiles().iterator().next())); FileInfo binfo = getFolderAtBart().getKnownFiles().iterator().next(); assertFileMatch(fbart, binfo, getContollerBart()); assertEquals(1, binfo.getVersion()); assertEquals(0, linfo.getVersion()); assertTrue(getFolderAtBart().getKnownFiles().iterator().next() .isNewerThan(getFolderAtLisa().getKnownFiles().iterator().next())); assertTrue(binfo.inSyncWithDisk(fbart)); connectBartAndLisa(); TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return lisaListener.downloadCompleted >= 2 && lisaListener.downloadRequested >= 2 && lisaListener.downloadStarted >= 2 && lisaListener.downloadAborted == 0 && lisaListener.downloadBroken == 0 && bartListener.uploadRequested >= 2 && bartListener.uploadStarted >= 2 && bartListener.uploadAborted == 0 && bartListener.uploadBroken == 0 && bartListener.uploadCompleted >= 2; } public String message() { return "lisa: " + lisaListener + " bart: " + bartListener; } }); assertTrue(TestHelper.compareFiles(fbart, flisa)); assertTrue("Failed: " + getFolderAtLisa().getStatistic().getDownloadCounter() .getBytesTransferred() + " == " + oldByteCount, getFolderAtLisa().getStatistic().getDownloadCounter() .getBytesTransferred() == oldByteCount); TestHelper.assertIncompleteFilesGone(this); } public void testDeltaFileChanged() throws IOException { ConfigurationEntry.USE_DELTA_ON_LAN.setValue(getContollerBart(), Boolean.TRUE.toString()); ConfigurationEntry.USE_DELTA_ON_LAN.setValue(getContollerLisa(), Boolean.TRUE.toString()); // Register listeners final MyTransferManagerListener bartListener = new MyTransferManagerListener(); getContollerBart().getTransferManager().addListener(bartListener); final MyTransferManagerListener lisaListener = new MyTransferManagerListener(); getContollerLisa().getTransferManager().addListener(lisaListener); // 1 Meg testfile File fbart = TestHelper .createRandomFile(getFolderAtBart().getLocalBase(), (long) (1024 * 1024 + Math.random() * 1024 * 1024)); // Let him scan the new content scanFolder(getFolderAtBart()); TestHelper.waitForCondition(20, new Condition() { public boolean reached() { return lisaListener.downloadCompleted >= 1 && lisaListener.downloadRequested >= 1 && bartListener.uploadCompleted >= 1 && getFolderAtLisa().getKnownFiles().size() == 1; } }); FileInfo linfo = getFolderAtLisa().getKnownFiles().iterator().next(); File flisa = linfo .getDiskFile(getContollerLisa().getFolderRepository()); assertTrue(TestHelper.compareFiles(fbart, flisa)); disconnectBartAndLisa(); // Wait at least 3000ms TestHelper.waitMilliSeconds(3000); // Make a modification in bart's file TFile tmpCopy = new TFile(System.getProperty("tmp.dir"), fbart.getName()); FileUtils.copyFile(fbart, tmpCopy); int modSize = (int) (1024 + Math.random() * 8192); long seek = (long) (Math.random() * (fbart.length() - modSize)); byte[] buf = new byte[(int) seek]; TFileInputStream in = new TFileInputStream(tmpCopy); in.read(buf); TFileOutputStream out = new TFileOutputStream(fbart); out.write(buf); for (int i = 0; i < modSize; i++) { out.write((int) (Math.random() * 256)); } out.close(); in.close(); tmpCopy.rm(); // RandomAccessFile rbart = new RandomAccessFile(fbart, "rw"); // rbart.seek(seek); // for (int i = 0; i < modSize; i++) { // rbart.write((int) (Math.random() * 256)); // } // rbart.close(); long oldByteCount = getFolderAtLisa().getStatistic() .getDownloadCounter().getBytesTransferred(); // Scan changed file assertTrue(fbart.lastModified() > flisa.lastModified()); scanFolder(getFolderAtBart()); assertTrue(getFolderAtBart().getKnownFiles().iterator().next() .isNewerThan(getFolderAtLisa().getKnownFiles().iterator().next())); FileInfo binfo = getFolderAtBart().getKnownFiles().iterator().next(); assertFileMatch(fbart, binfo, getContollerBart()); assertEquals("Bart version: " + binfo.getVersion(), 1, binfo.getVersion()); assertEquals(0, linfo.getVersion()); assertTrue(getFolderAtBart().getKnownFiles().iterator().next() .isNewerThan(getFolderAtLisa().getKnownFiles().iterator().next())); connectBartAndLisa(); scanFolder(getFolderAtLisa()); TestHelper.waitForCondition(20, new ConditionWithMessage() { public boolean reached() { return lisaListener.downloadCompleted >= 2 && lisaListener.downloadRequested >= 2 && lisaListener.downloadAborted == 0 && lisaListener.downloadBroken == 0 && bartListener.uploadRequested >= 2 && bartListener.uploadAborted == 0 && bartListener.uploadBroken == 0 && bartListener.uploadStarted >= 2 && bartListener.uploadCompleted >= 2; } public String message() { return "lisa: completed dl= " + lisaListener.downloadCompleted + ", req dl= " + lisaListener.downloadRequested + ", srtd dl= " + lisaListener.downloadStarted + ", brkn dl= " + lisaListener.downloadBroken + ", abrt dl= " + lisaListener.downloadAborted + "; bart: req ul= " + bartListener.uploadRequested + ", srtd ul= " + bartListener.uploadStarted + ", cmpld ul= " + bartListener.uploadCompleted + ", brkn ul= " + bartListener.uploadBroken + ", abrt ul=" + bartListener.uploadAborted; } }); assertTrue(TestHelper.compareFiles(fbart, flisa)); assertTrue( "Expected " + getFolderAtLisa().getStatistic().getDownloadCounter() .getBytesTransferred() + " - " + oldByteCount + " < " + fbart.length() / 2, getFolderAtLisa().getStatistic() .getDownloadCounter().getBytesTransferred() - oldByteCount < fbart.length() / 2); TestHelper.assertIncompleteFilesGone(this); } /** * Tests load/store of pending downloads. * <p> * TRAC #629 */ public void testPendingDownloadsRestore() { // Prepare getFolderAtLisa().setSyncProfile(SyncProfile.HOST_FILES); TestHelper.createRandomFile(getFolderAtBart().getLocalBase(), 8 * 1024 * 1024); scanFolder(getFolderAtBart()); FileInfo fInfo = getFolderAtBart().getKnownFiles().iterator().next(); getContollerLisa().getTransferManager().downloadNewestVersion(fInfo); TestHelper.waitForCondition(10, new ConditionWithMessage() { public String message() { return "Lisa active downloads: " + getContollerLisa().getTransferManager() .countActiveDownloads(); } public boolean reached() { return getContollerLisa().getTransferManager() .countActiveDownloads() > 0; } }); // Break connection disconnectBartAndLisa(); TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return getContollerLisa().getTransferManager() .getPendingDownloads().size() >= 1; } public String message() { return "Pending downloads at lisa: " + getContollerLisa().getTransferManager() .getPendingDownloads().size(); } }); // Shutdown and restart lisa getContollerLisa().shutdown(); startControllerLisa(); // Lisa should have 1 pending download assertEquals(1, getContollerLisa().getTransferManager() .getPendingDownloads().size()); connectBartAndLisa(); TestHelper.waitForCondition(10, new ConditionWithMessage() { public String message() { return "Lisa active downloads: " + getContollerLisa().getTransferManager() .countActiveDownloads(); } public boolean reached() { return getContollerLisa().getTransferManager() .countActiveDownloads() > 0; } }); // No pending download no more TestHelper.waitForCondition(10, new ConditionWithMessage() { public String message() { return "Lisa pending downloads: " + getContollerLisa().getTransferManager() .getPendingDownloads(); } public boolean reached() { return getContollerLisa().getTransferManager() .getPendingDownloads().isEmpty(); } }); TestHelper.assertIncompleteFilesGone(this); } public void testSwitchSyncProfileMultiple() throws Exception { for (int i = 0; i < 10; i++) { testSwitchSyncProfile(); tearDown(); setUp(); } } /** * Test to switch sync profiles during active transfers. * <p> * TRAC #1086 */ public void testSwitchSyncProfile() { getContollerBart().getTransferManager().setUploadCPSForLAN(1000000); getContollerLisa().getTransferManager().setUploadCPSForLAN(1000000); // Prepare getFolderAtLisa().setSyncProfile(SyncProfile.AUTOMATIC_SYNCHRONIZATION); TestHelper.createRandomFile(getFolderAtBart().getLocalBase(), 4 * 1024 * 1024); scanFolder(getFolderAtBart()); TestHelper.waitForCondition(10, new Condition() { public boolean reached() { return getContollerLisa().getTransferManager() .countActiveDownloads() == 1; } }); TestHelper.waitForCondition(10, new Condition() { public boolean reached() { return getContollerBart().getTransferManager() .countAllUploads() == 1; } }); // Switch! getFolderAtLisa().setSyncProfile(SyncProfile.MANUAL_SYNCHRONIZATION); // Download should break TestHelper.waitForCondition(10, new Condition() { public boolean reached() { return getContollerLisa().getTransferManager() .countActiveDownloads() == 0; } }); // Since this download was auto-requested it shouldn't be added to the // list of pending downloads. assertEquals(0, getContollerLisa().getTransferManager() .getPendingDownloads().size()); TestHelper.waitForCondition(10, new Condition() { public boolean reached() { return getContollerBart().getTransferManager() .countAllUploads() == 0; } }); // Switch back, dls should continue getFolderAtLisa().setSyncProfile(SyncProfile.AUTOMATIC_DOWNLOAD); TestHelper.waitForCondition(11, new ConditionWithMessage() { public boolean reached() { // #2557 getContollerLisa().getFolderRepository().getFileRequestor() .triggerFileRequesting(); return getContollerLisa().getTransferManager() .countCompletedDownloads() == 1; } public String message() { return "Completed downloads at lisa: " + getContollerLisa().getTransferManager() .countCompletedDownloads(); } }); TestHelper.waitForCondition(10, new ConditionWithMessage() { public boolean reached() { return getContollerBart().getTransferManager() .countAllUploads() == 1 && getContollerBart().getTransferManager() .countLiveUploads() == 0; } public String message() { return "Barts uploads: " + getContollerBart().getTransferManager().countAllUploads(); } }); TestHelper.assertIncompleteFilesGone(this); } /** * For checking the correct events. */ private class MyTransferManagerListener implements TransferManagerListener { public int downloadRequested; public int downloadQueued; public int pendingDownloadEnqued; public int downloadStarted; public int downloadBroken; public int downloadAborted; public int downloadCompleted; public int downloadsCompletedRemoved; public int uploadsCompletedRemoved; public int uploadRequested; public int uploadStarted; public int uploadBroken; public int uploadAborted; public int uploadCompleted; private TransferManagerEvent lastEvent; public List<FileInfo> uploadsRequested = new ArrayList<FileInfo>(); public List<FileInfo> downloadsRequested = new ArrayList<FileInfo>(); public List<FileInfo> downloadsCompleted = new ArrayList<FileInfo>(); private final boolean failOnSecondRequest; public MyTransferManagerListener(boolean failOnSecondRequest) { this.failOnSecondRequest = failOnSecondRequest; } public MyTransferManagerListener() { failOnSecondRequest = false; } public synchronized void downloadRequested(TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } downloadRequested++; if (downloadsRequested.contains(event.getFile())) { if (failOnSecondRequest) { fail("Second download request for " + event.getFile().toDetailString()); } else { System.err.println("Second download request for " + event.getFile().toDetailString()); } } downloadsRequested.add(event.getFile()); } public synchronized void downloadQueued(TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } downloadQueued++; lastEvent = event; } public synchronized void downloadStarted(TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } downloadStarted++; lastEvent = event; } public synchronized void downloadAborted(TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } downloadAborted++; } public synchronized void downloadBroken(TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } downloadBroken++; lastEvent = event; } public synchronized void downloadCompleted(TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } downloadsCompleted.add(event.getFile()); downloadCompleted++; lastEvent = event; } public synchronized void completedDownloadRemoved( TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } downloadsCompletedRemoved++; lastEvent = event; } public synchronized void pendingDownloadEnqueued( TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } pendingDownloadEnqued++; lastEvent = event; } public synchronized void uploadRequested(TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } uploadRequested++; lastEvent = event; if (uploadsRequested.contains(event.getFile())) { System.err.println("Second upload request for " + event.getFile().toDetailString()); } uploadsRequested.add(event.getFile()); } public synchronized void uploadStarted(TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } uploadStarted++; lastEvent = event; } public synchronized void uploadAborted(TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } uploadAborted++; lastEvent = event; } public synchronized void uploadBroken(TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } uploadAborted++; lastEvent = event; } public synchronized void uploadCompleted(TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } uploadCompleted++; lastEvent = event; } public synchronized void completedUploadRemoved( TransferManagerEvent event) { if (event.getFile().getFolderInfo().isMetaFolder()) { return; } uploadsCompletedRemoved++; lastEvent = event; } public boolean fireInEventDispatchThread() { return false; } @Override public String toString() { return "[pendingDownloadEnqued=" + pendingDownloadEnqued + ", downloadRequested=" + downloadRequested + ", downloadQueued=" + downloadQueued + ", downloadStarted=" + downloadStarted + ", downloadBroken=" + downloadBroken + ", downloadAborted=" + downloadAborted + ", downloadCompleted=" + downloadCompleted + ", downloadsCompletedRemoved=" + downloadsCompletedRemoved + ", uploadRequested=" + uploadRequested + ", uploadStarted=" + uploadStarted + ", uploadBroken=" + uploadBroken + ", uploadAborted=" + uploadAborted + ", uploadCompleted=" + uploadCompleted + ", uploadsCompletedRemoved=" + uploadsCompletedRemoved + "]"; } } }