package org.zstack.test.aop; import junit.framework.Assert; import org.junit.Before; import org.junit.Test; import org.zstack.core.cloudbus.CloudBusIN; import org.zstack.core.componentloader.ComponentLoader; import org.zstack.core.thread.AsyncThread; import org.zstack.header.AbstractService; import org.zstack.header.Service; import org.zstack.header.core.AsyncBackup; import org.zstack.header.core.Completion; import org.zstack.header.core.NoErrorCompletion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.core.workflow.FlowTrigger; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; import org.zstack.header.message.NeedReplyMessage; import org.zstack.test.BeanConstructor; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import java.util.concurrent.TimeUnit; /** */ public class TestAsyncBackup2 { CLogger logger = Utils.getLogger(TestAsyncBackup2.class); boolean success; ComponentLoader loader; CloudBusIN bus; @Before public void setUp() throws Exception { BeanConstructor con = new BeanConstructor(); loader = con.build(); bus = loader.getComponent(CloudBusIN.class); } private void testMethod(final AsyncBackup completion) { new NoErrorCompletion(completion) { @Override @AsyncThread public void done() { throw new RuntimeException("on purpose"); } }.done(); } @Test public void test() throws InterruptedException { success = false; testMethod(new Completion(null) { @Override public void success() { } @Override public void fail(ErrorCode errorCode) { success = true; logger.debug(errorCode.toString()); } }); TimeUnit.SECONDS.sleep(1); Assert.assertTrue(success); } @Test public void test1() throws InterruptedException { success = false; testMethod(new NoErrorCompletion() { @Override public void done() { success = true; } }); TimeUnit.SECONDS.sleep(1); Assert.assertTrue(success); } @Test public void test2() throws InterruptedException { success = false; testMethod(new ReturnValueCompletion(null) { @Override public void success(Object returnValue) { } @Override public void fail(ErrorCode errorCode) { success = true; } }); TimeUnit.SECONDS.sleep(1); Assert.assertTrue(success); } @Test public void test3() throws InterruptedException { success = false; testMethod(new FlowTrigger() { @Override public void fail(ErrorCode errorCode) { success = true; } @Override public void next() { } @Override public void setError(ErrorCode error) { } }); TimeUnit.SECONDS.sleep(1); Assert.assertTrue(success); } public static class TestMsg extends NeedReplyMessage { } @Test public void test4() throws InterruptedException { success = false; Service serv = new AbstractService() { @Override public void handleMessage(final Message msg) { new Completion(msg) { @Override @AsyncThread public void success() { throw new RuntimeException("on purpose"); } @Override public void fail(ErrorCode errorCode) { } }.success(); } @Override public String getId() { return "Test1"; } @Override public boolean start() { return true; } @Override public boolean stop() { return true; } }; bus.registerService(serv); bus.activeService(serv); TestMsg msg = new TestMsg(); msg.setServiceId("Test1"); msg.setTimeout(500); MessageReply reply = bus.call(msg); Assert.assertFalse(reply.isSuccess()); } }