/**
* This file is licensed under the University of Illinois/NCSA Open Source License. See LICENSE.TXT for details.
*/
package edu.illinois.codingspectator.monitor.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.eclipse.core.runtime.CoreException;
import org.junit.Test;
import org.tmatesoft.svn.core.SVNException;
import edu.illinois.codingspectator.efs.EFSFile;
import edu.illinois.codingspectator.monitor.ui.submission.Submitter;
import edu.illinois.codingspectator.monitor.ui.submission.Submitter.AuthenticanResult;
import edu.illinois.codingspectator.monitor.ui.submission.Submitter.InitializationException;
import edu.illinois.codingspectator.monitor.ui.submission.Submitter.SubmissionException;
/**
*
* @author Mohsen Vakilian
*
*/
public class TestInterleavedSubmissions {
@Test
public void submissionsShouldBeEfficientWhenInterleaved() throws CoreException, InitializationException, SubmissionException, SVNException {
MockSubmitterFactory submitterFactory1= new MockSubmitterFactory(MockParticipantFactory.getMockParticipant(0));
MockSubmitterFactory submitterFactory2= new MockSubmitterFactory(MockParticipantFactory.getMockParticipant(1));
removeExistingDataIfAny(submitterFactory1);
removeExistingDataIfAny(submitterFactory2);
submitterFactory1.modifyFileInWatchedFolder();
submit(submitterFactory1);
long initialRevisionNumber= submitterFactory1.getFileRevisionNumber();
EFSFile watchedFolder= new EFSFile(Submitter.WATCHED_FOLDER);
EFSFile participant1BackupOfWatchedFolder= new EFSFile(Submitter.WATCHED_FOLDER + "_participant1_bak");
watchedFolder.moveTo(participant1BackupOfWatchedFolder);
submitterFactory2.modifyFileInWatchedFolder();
submit(submitterFactory2);
watchedFolder.delete();
participant1BackupOfWatchedFolder.moveTo(watchedFolder);
submitterFactory1.modifyFileInWatchedFolder();
assertTrue("Detected an inconsistency between local and remote data when one didn't exist.", submitterFactory1.getSubmitter().doLocalAndRemoteDataMatch());
submit(submitterFactory1);
assertEquals(initialRevisionNumber + 2, submitterFactory1.getFileRevisionNumber());
}
private void submit(MockSubmitterFactory submitterFactory) throws InitializationException, SubmissionException {
AuthenticanResult authenticanResult= submitterFactory.getSubmitter().authenticate();
assertEquals(MockSubmitterFactory.UUID, submitterFactory.getSubmitter().getUUID());
assertEquals(AuthenticanResult.OK, authenticanResult);
submitterFactory.getSubmitter().submit();
}
private void removeExistingDataIfAny(MockSubmitterFactory submitterFactory) throws SVNException {
if (submitterFactory.getSVNManager().isWatchedFolderInRepository()) {
submitterFactory.getSVNManager().doDelete(String.format("Removed the remoted data of mock participant '%s'.", submitterFactory.getUsername()));
}
}
}