blob: 4a0bc05070ea55ee86af2dc043ae043934d2ea06 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 GitHub Inc. 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:
* GitHub Inc. - initial API and implementation
* Tasktop Technologies - improvements
*******************************************************************************/
package org.eclipse.mylyn.reviews.core.spi.remote.emf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.reviews.core.spi.remote.AbstractRemoteConsumer;
import org.eclipse.mylyn.reviews.core.spi.remote.JobRemoteService;
import org.junit.Test;
/**
* @author Miles Parker
*/
public class RemoteServiceTest {
class Consumer extends AbstractRemoteConsumer {
boolean retrieve;
boolean apply;
boolean notify;
boolean async = true;
IStatus status;
@Override
public void pull(boolean force, IProgressMonitor monitor) throws CoreException {
retrieve = true;
}
@Override
public void applyModel(boolean force) {
apply = true;
}
@Override
public void notifyDone(IStatus status) {
this.status = status;
}
@Override
public boolean isAsynchronous() {
return async;
}
@Override
public String getDescription() {
return "";
}
protected void waitForDone() {
long delay;
delay = 0;
while (delay < 100) {
if (status == null) {
try {
Thread.sleep(10);
delay += 10;
} catch (InterruptedException e) {
}
} else {
break;
}
}
assertThat(status, notNullValue());
}
@Override
public boolean isUserJob() {
// ignore
return false;
}
@Override
public boolean isSystemJob() {
// ignore
return false;
}
}
@Test
public void testExecute() throws CoreException {
JobRemoteService remoteService = new JobRemoteService();
Consumer consumer = new Consumer();
remoteService.retrieve(consumer, false);
consumer.waitForDone();
assertThat(consumer.status.getSeverity(), is(IStatus.OK));
assertThat(consumer.retrieve, is(true));
assertThat(consumer.apply, is(true));
}
@Test
public void testExecuteSync() throws CoreException {
JobRemoteService remoteService = new JobRemoteService();
Consumer consumer = new Consumer();
consumer.async = false;
remoteService.retrieve(consumer, false);
consumer.waitForDone();
assertThat(consumer.status.getSeverity(), is(IStatus.OK));
assertThat(consumer.retrieve, is(true));
assertThat(consumer.apply, is(true));
}
class BrokenConsumer extends Consumer {
@Override
public void pull(boolean force, IProgressMonitor monitor) throws CoreException {
throw new CoreException(new Status(IStatus.ERROR, "blah", "Whoops!"));
}
}
@Test
public void testExecuteCoreException() throws CoreException {
JobRemoteService remoteService = new JobRemoteService();
Consumer consumer = new BrokenConsumer();
remoteService.retrieve(consumer, false);
consumer.waitForDone();
assertThat(consumer.status.getSeverity(), is(IStatus.WARNING));
assertThat(consumer.retrieve, is(false));
assertThat(consumer.apply, is(false));
}
@Test
public void testExecuteCoreExceptionSync() throws CoreException {
JobRemoteService remoteService = new JobRemoteService();
Consumer consumer = new BrokenConsumer();
consumer.async = false;
remoteService.retrieve(consumer, false);
consumer.waitForDone();
assertThat(consumer.status.getSeverity(), is(IStatus.ERROR));
assertThat(consumer.retrieve, is(false));
assertThat(consumer.apply, is(false));
}
Thread testThread;
class ThreadedService extends JobRemoteService {
@Override
public void modelExec(Runnable runnable, boolean block) {
testThread = new Thread(runnable, "Test Thread");
testThread.start();
}
}
class ModelThreadConsumer extends Consumer {
Thread modelThread;
Thread retrieveThread;
@Override
public void pull(boolean force, IProgressMonitor monitor) throws CoreException {
retrieveThread = Thread.currentThread();
super.pull(force, monitor);
}
@Override
public void applyModel(boolean force) {
modelThread = Thread.currentThread();
super.applyModel(force);
}
}
@Test
public void testExecuteModelThread() throws CoreException {
JobRemoteService remoteService = new ThreadedService();
ModelThreadConsumer consumer = new ModelThreadConsumer();
remoteService.retrieve(consumer, false);
consumer.waitForDone();
assertThat(consumer.modelThread.getName(), is("Test Thread"));
assertThat(consumer.retrieveThread.getName(), not("Test Thread"));
assertThat(consumer.status.getSeverity(), is(IStatus.OK));
assertThat(consumer.retrieve, is(true));
assertThat(consumer.apply, is(true));
assertThat(consumer.retrieveThread, not(Thread.currentThread()));
}
@Test
public void testExecuteModelThreadSync() throws CoreException {
JobRemoteService remoteService = new ThreadedService();
ModelThreadConsumer consumer = new ModelThreadConsumer();
consumer.async = false;
remoteService.retrieve(consumer, false);
consumer.waitForDone();
assertThat(consumer.modelThread.getName(), is("Test Thread"));
assertThat(consumer.retrieveThread.getName(), not("Test Thread"));
assertThat(consumer.status.getSeverity(), is(IStatus.OK));
assertThat(consumer.retrieve, is(true));
assertThat(consumer.apply, is(true));
assertThat(consumer.retrieveThread, is(Thread.currentThread()));
}
}