Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/repository/FileReaderTest2.java')
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/repository/FileReaderTest2.java221
1 files changed, 221 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/repository/FileReaderTest2.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/repository/FileReaderTest2.java
new file mode 100644
index 000000000..214523f61
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/repository/FileReaderTest2.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Wind River and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.equinox.p2.tests.repository;
+
+import java.io.*;
+import java.net.URI;
+import java.util.Date;
+import java.util.EventObject;
+import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.jobs.*;
+import org.eclipse.equinox.internal.p2.repository.DownloadProgressEvent;
+import org.eclipse.equinox.internal.p2.transport.ecf.FileReader;
+import org.eclipse.equinox.internal.provisional.p2.core.eventbus.IProvisioningEventBus;
+import org.eclipse.equinox.internal.provisional.p2.core.eventbus.ProvisioningListener;
+import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
+import org.junit.Test;
+
+public class FileReaderTest2 extends AbstractProvisioningTest {
+
+ abstract class PauseJob extends Job {
+
+ private FileReader reader;
+
+ public PauseJob(String name, FileReader reader) {
+ super(name);
+ this.reader = reader;
+ }
+
+ public FileReader getReader() {
+ return reader;
+ }
+ }
+
+ @Test
+ public void testPauseAndResume() throws IOException, CoreException {
+ IProvisioningEventBus eventBus = getEventBus();
+ class PauseResumeProvisioningListener implements ProvisioningListener {
+ boolean downloadIsOngoing = false;
+ boolean isPaused = false;
+ float downloadProgressEventAfterPaused = 0;
+
+ public void notify(EventObject event) {
+ if (event instanceof DownloadProgressEvent) {
+ downloadIsOngoing = true;
+ if (isPaused) {
+ downloadProgressEventAfterPaused++;
+ }
+ }
+ }
+ }
+ final PauseResumeProvisioningListener listener = new PauseResumeProvisioningListener();
+ eventBus.addListener(listener);
+ try {
+ final org.eclipse.equinox.internal.p2.transport.ecf.FileReader reader = new org.eclipse.equinox.internal.p2.transport.ecf.FileReader(getAgent(), null);
+ final Job resumeJob = new Job("resume") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ listener.isPaused = false;
+ System.out.println("Download job is resumed at " + new Date());
+ reader.resume();
+ return Status.OK_STATUS;
+ }
+ };
+ PauseJob pauseJob = new PauseJob("pause", reader) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ reader.pause();
+ // wait for actual downloading thread is paused.
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ listener.isPaused = true;
+ System.out.println("Download job is paused at " + new Date());
+ resumeJob.schedule(10000);
+ return Status.OK_STATUS;
+ }
+ };
+ doFileReaderTest(pauseJob, null);
+ assertTrue("No download progress event is fired!", listener.downloadIsOngoing);
+ assertEquals("Download is not paused!", 0, listener.downloadProgressEventAfterPaused, 1);
+ } finally {
+ eventBus.removeListener(listener);
+ }
+ }
+
+ @Test
+ public void testPauseAndResumeMoreThanOnce() throws IOException, CoreException {
+ final org.eclipse.equinox.internal.p2.transport.ecf.FileReader reader = new org.eclipse.equinox.internal.p2.transport.ecf.FileReader(getAgent(), null);
+ abstract class ResumeJob extends Job {
+ PauseJob pausejob;
+
+ public ResumeJob(String name, PauseJob pauseJob) {
+ super(name);
+ this.pausejob = pauseJob;
+ }
+ }
+
+ final PauseJob pauseJob = new PauseJob("pause", reader) {
+ int count = 0;
+ final int threhold = 3;
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ reader.pause();
+ // wait for actual downloading thread is paused.
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ System.out.println("Download job is paused at " + new Date());
+ final ResumeJob resumeJob = new ResumeJob("resume", this) {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor1) {
+ System.out.println("Download job is resumed at " + new Date());
+ reader.resume();
+ if (count++ < threhold)
+ this.pausejob.schedule(5000);
+ return Status.OK_STATUS;
+ }
+ };
+ resumeJob.schedule(10000);
+ return Status.OK_STATUS;
+ }
+ };
+ doFileReaderTest(pauseJob, null);
+ }
+
+ @Test
+ public void testCancelPausedDownload() throws IOException, CoreException {
+ final org.eclipse.equinox.internal.p2.transport.ecf.FileReader reader = new org.eclipse.equinox.internal.p2.transport.ecf.FileReader(getAgent(), null);
+ PauseJob pauseJob = new PauseJob("pause", reader) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ reader.pause();
+ // wait for actual downloading thread is paused.
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ System.out.println("Download job is paused at " + new Date());
+ return Status.OK_STATUS;
+ }
+ };
+ try {
+ class CancelDownloadListener extends JobChangeAdapter {
+ boolean cancelDownload = false;
+
+ @Override
+ public void done(IJobChangeEvent event) {
+ try {
+ Thread.sleep(3000);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ cancelDownload = true;
+ }
+ }
+ final CancelDownloadListener pauseJobListener = new CancelDownloadListener();
+ pauseJob.addJobChangeListener(pauseJobListener);
+ doFileReaderTest(pauseJob, new NullProgressMonitor() {
+ @Override
+ public boolean isCanceled() {
+ return pauseJobListener.cancelDownload;
+ }
+ });
+ fail("Don't throw operation cancel exception.");
+ } catch (OperationCanceledException e) {
+ // expected
+ }
+ }
+
+ private void doFileReaderTest(PauseJob pauseJob, IProgressMonitor monitor) throws IOException, CoreException {
+ final String testRemoteFileURL = "http://ftp.osuosl.org/pub/eclipse/rt/ecf/3.5.4/site.p2/plugins/org.eclipse.ecf.doc_1.3.0.v20111230-0120.jar";
+ OutputStream out = null;
+ OutputStream out1 = null;
+ File tmpFolder = getTempFolder();
+ File tmpFile = new File(tmpFolder, "testDownloadPauseResume.zip");
+ File tmpFile1 = new File(tmpFolder, "testDownloadWithoutPause.zip");
+ try {
+ tmpFile1.createNewFile();
+ out1 = new FileOutputStream(tmpFile1);
+ FileReader readerWithoutPausing = new FileReader(null, null);
+ readerWithoutPausing.readInto(URI.create(testRemoteFileURL), out1, null);
+ assertNotNull(readerWithoutPausing.getResult());
+ assertTrue(readerWithoutPausing.getResult().isOK());
+ tmpFile.createNewFile();
+ out = new FileOutputStream(tmpFile);
+ FileReader reader = pauseJob.getReader();
+ pauseJob.schedule(5000);
+ reader.readInto(URI.create(testRemoteFileURL), out, monitor);
+ assertNotNull(reader.getResult());
+ assertTrue(reader.getResult().isOK());
+ assertEquals("File with pausing/resuming is not identical with file without pausing.", tmpFile1.length(), tmpFile.length());
+ } finally {
+ if (out1 != null)
+ out1.close();
+ tmpFile1.delete();
+ if (out != null)
+ out.close();
+ tmpFile.delete();
+ delete(tmpFolder);
+ }
+ }
+}

Back to the top