package se.chalmers.gdcn.replica; import net.tomp2p.peers.Number160; import net.tomp2p.peers.PeerAddress; import net.tomp2p.storage.Data; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import se.chalmers.gdcn.communicationToUI.ClientInterface; import se.chalmers.gdcn.control.TaskManager; import se.chalmers.gdcn.control.TaskRunner; import se.chalmers.gdcn.network.WorkerID; import se.chalmers.gdcn.taskbuilder.communicationToClient.TaskListener; import utils.TaskHolder; import utils.TestUtils; import utils.WorkerHolder; import java.beans.PropertyChangeListener; import java.io.IOException; import java.io.Serializable; import java.util.List; import java.util.concurrent.Semaphore; /** * Created by Leif on 2014-04-21. */ public class SelfWorkTest { private ReplicaManager replicaManager; private Semaphore lock; private WorkerID workerA; @BeforeMethod public void setupMethod(){ ReplicaManagerBuilder builder = new ReplicaManagerBuilder(WorkerHolder.getMyWorkerID(), emptyTaskManager()); replicaManager = builder.create(); replicaManager.setWorkSelfIfRequired(true); TestUtils.loadMeta(TaskHolder.getTaskA(), replicaManager); workerA = WorkerHolder.getWorkerA(); lock = new Semaphore(0); } @Test public void oneTest(){ ReplicaBox replicaBox = replicaManager.giveReplicaToWorker(workerA); replicaManager.replicaOutdated(replicaBox.getReplicaID()); // will selfwork here lock.acquireUninterruptibly(); } @Test public void cloneTest() throws CloneNotSupportedException, IOException, ClassNotFoundException { ReplicaBox replicaBox = replicaManager.giveReplicaToWorker(workerA); //NotSerializableException? Data data = new Data(replicaManager); ReplicaManager deserialized = (ReplicaManager) data.getObject(); assert deserialized != replicaManager; assert deserialized.getReplicaResultKey(replicaBox.getReplicaID()).equals(replicaBox.getResultKey()); assert null == deserialized.giveReplicaToWorker(workerA); //NotSerializableException? new Data(replicaManager); } @Test public void test() throws IOException, CloneNotSupportedException { SerializableRunner runner = new SerializableRunner(emptyTaskManager()); runner.taskRunner = null; new Data(runner); new Data(runner.clone()); } private static class NotSerializableClass{} private static class SerializableRunner implements TaskRunner, Serializable, Cloneable { private NotSerializableClass notSerializableClass = null; private TaskRunner taskRunner; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } private SerializableRunner(TaskRunner taskRunner) { this.taskRunner = taskRunner; } @Override public void submit(Runnable runnable) { taskRunner.submit(runnable); } @Override public TaskListener getTaskListener() { return taskRunner.getTaskListener(); } } private TaskManager emptyTaskManager(){ return new TaskManager(new TaskListener() { @Override public void taskFinished(String taskName) { lock.release(); } @Override public void taskFailed(String taskName, String reason) { lock.release(); throw new AssertionError(reason); } }, new ClientInterface() { @Override public void install() { } @Override public void uninstall() { } @Override public void push(String jobName) { } @Override public void spamWork(String address, int port) { } @Override public void stopWork(String address, int port) { } @Override public void falseWork(String address, int port) { } @Override public void work(String address, int port, boolean autoWork) { } @Override public void addListener(PropertyChangeListener listener) { } @Override public void removeListener(PropertyChangeListener listener) { } @Override public void start(int port) { } @Override public void stop() { } @Override public void bootstrap(String host, int port) { } @Override public void bootstrap() { } @Override public void put(String name, Data value) { } @Override public void put(Number160 key, Data value) { } @Override public void get(String name) { } @Override public void get(Number160 key) { } @Override public List<PeerAddress> getNeighbours() { return null; } @Override public List<PeerAddress> getOldNeighbours() { return null; } @Override public void reBootstrap() { } @Override public void send(String msg) { } @Override public void put(Number160 key, Number160 domain, Data value) { } @Override public void get(Number160 key, Number160 domain) { } @Override public void deleteNeighbourFile() { } @Override public void requestWork(int index) { } @Override public Number160 getID() { return null; } }); } }