/* * 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.ui; import java.util.ArrayList; import java.util.List; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import de.dal33t.powerfolder.ConfigurationEntry; import de.dal33t.powerfolder.disk.SyncProfile; import de.dal33t.powerfolder.ui.information.uploads.UploadsTableModel; import de.dal33t.powerfolder.ui.model.TransferManagerModel; 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; /** * Tests the upload table model. * * @author <a href="mailto:totmacher@powerfolder.com">Christian Sprajc</a> * @version $Revision: 1.5 $ */ public class UploadsTableModelTest extends TwoControllerTestCase { private UploadsTableModel bartModel; private MyUploadTableModelListener bartModelListener; @Override protected void setUp() throws Exception { super.setUp(); connectBartAndLisa(); // Join on testfolder joinTestFolder(SyncProfile.AUTOMATIC_DOWNLOAD); bartModelListener = new MyUploadTableModelListener(); bartModel = new UploadsTableModel(new TransferManagerModel( getContollerBart().getTransferManager())); bartModel.addTableModelListener(bartModelListener); bartModel.setPeriodicUpdate(false); // Instant cleanup ConfigurationEntry.UPLOAD_AUTO_CLEANUP_FREQUENCY.setValue( getContollerBart(), Integer.MAX_VALUE); ConfigurationEntry.UPLOAD_AUTO_CLEANUP_FREQUENCY.setValue( getContollerBart(), "0"); } public void testSingleFileUpload() { TestHelper.createRandomFile(getFolderAtBart().getLocalBase()); scanFolder(getFolderAtBart()); // Copy TestHelper.waitMilliSeconds(1500); // No upload in tablemodel assertEquals(0, bartModel.getRowCount()); // Check correct events from model assertEquals(bartModelListener.events.toString(), 4, bartModelListener.events.size()); assertTrue(bartModelListener.events.get(0).getType() == TableModelEvent.INSERT); // Upload // Requested assertTrue(bartModelListener.events.get(1).getType() == TableModelEvent.UPDATE); // Upload // started assertTrue(bartModelListener.events.get(2).getType() == TableModelEvent.UPDATE); // Upload // completed assertTrue(bartModelListener.events.get(3).getType() == TableModelEvent.DELETE); // Completed // upload // removed } /** * This tests UPLOADS_AUTO_CLEANUP ConfigurationEntry. By default this is * true. Setting to FALSE stops completed uploads being removed. */ public void testSingleFileUploadNoAutoCleanup() { ConfigurationEntry.UPLOAD_AUTO_CLEANUP_FREQUENCY.setValue( getContollerBart(), Integer.MAX_VALUE); TestHelper.createRandomFile(getFolderAtBart().getLocalBase()); scanFolder(getFolderAtBart()); // Copy TestHelper.waitMilliSeconds(1500); // One (complete) upload in tablemodel assertEquals(1, bartModel.getRowCount()); // Check correct events from model assertEquals(bartModelListener.events.toString(), 3, bartModelListener.events.size()); assertTrue(bartModelListener.events.get(0).getType() == TableModelEvent.INSERT); // Upload // Requested assertTrue(bartModelListener.events.get(1).getType() == TableModelEvent.UPDATE); // Upload // started assertTrue(bartModelListener.events.get(2).getType() == TableModelEvent.UPDATE); // Upload // completed } public void testRunningUpload() { // Create a 10 megs file TestHelper.createRandomFile(getFolderAtBart().getLocalBase(), 10000000); scanFolder(getFolderAtBart()); TestHelper.waitForCondition(10, new Condition() { public boolean reached() { return bartModel.getRowCount() > 0; } }); // 1 active uploads assertEquals(1, bartModel.getRowCount()); TestHelper.waitForCondition(20, new ConditionWithMessage() { public boolean reached() { return bartModel.getRowCount() == 0; } public String message() { return "Bart rowcount:" + bartModel.getRowCount(); } }); // no active upload assertEquals(0, bartModel.getRowCount()); TestHelper.waitForEmptyEDT(); } public void testAbortUpload() { ConfigurationEntry.DOWNLOAD_LIMIT_LAN.setValue(getContollerLisa(), "1000"); assertEquals(0, bartModelListener.events.size()); // Create a 20 megs file TestHelper.createRandomFile(getFolderAtBart().getLocalBase(), 20000000); scanFolder(getFolderAtBart()); TestHelper.waitForCondition(30, new Condition() { public boolean reached() { return getContollerBart().getTransferManager() .getActiveUploads().size() == 1 && getContollerLisa().getTransferManager() .countActiveDownloads() == 1; } }); TestHelper.waitForEmptyEDT(); assertEquals(1, bartModel.getRowCount()); // Upload requested + started assertEquals(2, bartModelListener.events.size()); // Abort thru change of sync profile getFolderAtLisa().setSyncProfile(SyncProfile.HOST_FILES); TestHelper.waitForCondition(50, new Condition() { public boolean reached() { return bartModel.getRowCount() == 0; } }); getContollerLisa().getFolderRepository().getFileRequestor() .triggerFileRequesting(); // Wait for EDT TestHelper.waitForEmptyEDT(); // no active upload assertEquals(0, bartModel.getRowCount()); // Check correct events from model assertEquals(3, bartModelListener.events.size()); // Upload requested assertTrue(bartModelListener.events.get(0).getType() == TableModelEvent.INSERT); // Upload started assertTrue(bartModelListener.events.get(1).getType() == TableModelEvent.UPDATE); // Upload aborted assertTrue(bartModelListener.events.get(2).getType() == TableModelEvent.DELETE); TestHelper.waitForEmptyEDT(); } public void testDisconnectWhileUploadMultiple() throws Exception { for (int i = 0; i < 10; i++) { testDisconnectWhileUpload(); tearDown(); setUp(); } } public void testDisconnectWhileUpload() { getContollerBart().getTransferManager().setUploadCPSForLAN(40000); getContollerLisa().getTransferManager().setUploadCPSForWAN(40000); // Create a 30 megs file TestHelper.createRandomFile(getFolderAtBart().getLocalBase(), 30000000); scanFolder(getFolderAtBart()); TestHelper.waitForCondition(10, new Condition() { public boolean reached() { return getContollerBart().getTransferManager() .countActiveUploads() > 0 && bartModel.getRowCount() >= 1; } }); // Problem can occur: Transfer completes too quick. Uploads table model // is then empty! assertEquals(1, bartModel.getRowCount()); // Requested and Started assertEquals(2, bartModelListener.events.size()); // Upload requested assertTrue(bartModelListener.events.get(0).getType() == TableModelEvent.INSERT); // Upload started assertTrue(bartModelListener.events.get(1).getType() == TableModelEvent.UPDATE); disconnectBartAndLisa(); TestHelper.waitForCondition(10, new Condition() { public boolean reached() { return getContollerBart().getTransferManager() .countLiveUploads() == 0; } }); // Give EDT time TestHelper.waitForEmptyEDT(); // no active upload assertEquals(0, bartModel.getRowCount()); // Upload requested, started, aborted assertEquals(3, bartModelListener.events.size()); // Upload requested assertTrue(bartModelListener.events.get(0).getType() == TableModelEvent.INSERT); // Upload started assertTrue(bartModelListener.events.get(1).getType() == TableModelEvent.UPDATE); // Upload aborted assertTrue(bartModelListener.events.get(2).getType() == TableModelEvent.DELETE); TestHelper.waitForEmptyEDT(); } private class MyUploadTableModelListener implements TableModelListener { public List<TableModelEvent> events = new ArrayList<TableModelEvent>(); public void tableChanged(TableModelEvent e) { System.err.println("Got event: " + e.getType() + " row: " + e.getFirstRow() + "-" + e.getLastRow()); events.add(e); } } }