/*
* Copyright (C) 2012 Glencoe Software, Inc. All rights reserved.
*
* This program 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; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package integration;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertTrue;
import static org.testng.AssertJUnit.fail;
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import omero.ServerError;
import omero.cmd.CmdCallbackI;
import omero.cmd.DoAll;
import omero.cmd.ERR;
import omero.cmd.HandlePrx;
import omero.cmd.Request;
import omero.cmd.Response;
import omero.cmd.Status;
import omero.cmd.Timing;
import omero.sys.EventContext;
import org.testng.annotations.Test;
import Ice.Current;
/**
* Various uses of the {@link omero.cmd.CmdCallbackI} object.
*/
@SuppressWarnings("serial")
public class CmdCallbackTest extends AbstractServerTest {
class TestCB extends CmdCallbackI {
final CountDownLatch finished = new CountDownLatch(1);
final AtomicInteger steps = new AtomicInteger();
public TestCB(omero.client client, HandlePrx handle) throws ServerError {
super(client, handle);
}
@Override
public void step(int complete, int total, Current __current) {
steps.incrementAndGet();
}
@Override
public void onFinished(Response rsp, Status s, Current __current) {
finished.countDown();
}
public void assertSteps(int expected) {
assertEquals(expected, steps.get());
}
public void assertFinished() {
assertEquals(0, finished.getCount());
assertFalse(isCancelled());
assertFalse(isFailure());
Response rsp = getResponse();
if (rsp == null) {
fail("null response");
} else if (rsp instanceof ERR) {
ERR err = (ERR) rsp;
String msg = String.format("%s\ncat:%s\nname:%s\nparams:%s\n",
err, err.category, err.name, err.parameters);
fail(msg);
}
}
public void assertFinished(int expectedSteps) {
assertFinished();
assertSteps(expectedSteps);
}
public void assertCancelled() {
assertEquals(0, finished.getCount());
assertTrue(isCancelled());
}
}
TestCB run(Request req) throws Exception {
EventContext ec = newUserAndGroup("rw----");
loginUser(ec);
HandlePrx handle = client.getSession().submit(req);
return new TestCB(client, handle);
}
// Timing
// =========================================================================
TestCB timing(int millis, int steps) throws Exception {
Timing t = new Timing();
t.millisPerStep = millis;
t.steps = steps;
return run(t);
}
@Test
public void testTimingFinishesOnLatch() throws Exception {
TestCB cb = timing(25, 4 * 10); // Runs 1 second
cb.finished.await(1500, TimeUnit.MILLISECONDS);
assertEquals(0, cb.finished.getCount());
cb.assertFinished(10); // Modulus-10
}
@Test
public void testTimingFinishesOnBlock() throws Exception {
TestCB cb = timing(25, 4 * 10); // Runs 1 second
cb.block(1500);
cb.assertFinished(10); // Modulus-10
}
@Test
public void testTimingFinishesOnLoop() throws Exception {
TestCB cb = timing(25, 4 * 10); // Runs 1 second
cb.loop(3, scalingFactor);
cb.assertFinished(10); // Modulus-10
}
// DoAll
// =========================================================================
TestCB doAllOfNothing() throws Exception {
return run(new DoAll());
}
TestCB doAllTiming(int count) throws Exception {
Timing[] timings = new Timing[count];
for (int i = 0; i < count; i++) {
timings[i] = new Timing(3, 2); // 6 ms
}
return run(new DoAll(Arrays.<Request> asList(timings), null));
}
@Test
public void testDoNothingFinishesOnLatch() throws Exception {
TestCB cb = doAllOfNothing();
cb.finished.await(5, TimeUnit.SECONDS);
cb.assertCancelled();
}
@Test
public void testDoNothingFinishesOnLoop() throws Exception {
TestCB cb = doAllOfNothing();
cb.loop(5, scalingFactor);
cb.assertCancelled();
}
@Test
public void testDoAllTimingFinishesOnLoop() throws Exception {
TestCB cb = doAllTiming(5);
cb.loop(5, scalingFactor);
cb.assertFinished();
// For some reason the number of steps is varying between 10 and 15
}
}