/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package test.asynchronous; import junit.framework.TestCase; import org.jboss.aspects.asynchronous.aspects.AsynchronousFacade; import org.jboss.aspects.asynchronous.aspects.AsynchronousFacadeImpl; import org.jboss.aspects.asynchronous.AsynchronousResponse; import org.jboss.aspects.asynchronous.AsynchronousConstants; import org.jboss.aspects.asynchronous.AsynchronousTask; import org.jboss.aspects.asynchronous.ThreadManagerResponse; import org.jboss.aspects.asynchronous.concurrent.ThreadManagerFactory; import org.jboss.aspects.asynchronous.ThreadManager; /** * * @version <tt>$Revision: 80997 $</tt> * @author <a href="mailto:chussenet@yahoo.com">{Claude Hussenet Independent Consultant}</a>. */ public class JUnitTestAsynchronousAspects extends TestCase implements AsynchronousConstants { public JUnitTestAsynchronousAspects(String arg0) { super(arg0); BusinessModel bm1 = new BusinessModel(); bm1.processBusinessModel(); AsynchronousTask aT = ((AsynchronousFacade)bm1).getAsynchronousTask(); ThreadManagerResponse response = aT.getResponse(); } public static void testAsynchronousCall() { BusinessModel bm1 = new BusinessModel(200); long t0 = System.currentTimeMillis(); bm1.processBusinessModel(); long t1 = System.currentTimeMillis(); assertTrue( "Not an asynchronous call:" + (t1 - t0) + " ms.", (t1 - t0) < 100); } public static void testMixinAsynchronousFacadeInterface() { BusinessModel bm1 = new BusinessModel(); assertTrue( "not an instance of AsynchronousFacade", bm1 instanceof AsynchronousFacade); } public static void testMixinAsynchronousFacadeInterface2() { BusinessModel bm1 = new BusinessModel(); BusinessModel bm2 = new BusinessModel(); assertTrue( "bm1 is not an instance of AsynchronousFacade", bm1 instanceof AsynchronousFacade); assertTrue( "bm2 is not an instance of AsynchronousFacade", bm2 instanceof AsynchronousFacade); AsynchronousFacade asynchronousFacade1 = (AsynchronousFacade)bm1; AsynchronousFacade asynchronousFacade2 = (AsynchronousFacade)bm2; asynchronousFacade1.setId("OK"); asynchronousFacade2.setId("KO"); assertNotSame( "same instances(ID) of AsynchronousFacade", asynchronousFacade1.getId(), asynchronousFacade2.getId()); } public static void test2AsynchronousCallOnSameInstance() { BusinessModel bm1 = new BusinessModel(); long res1 = bm1.processBusinessModel2(15); AsynchronousFacade asynchronousFacade = (AsynchronousFacade)bm1; AsynchronousTask asynchronousTask1 = asynchronousFacade.getAsynchronousTask(); long res2 = bm1.processBusinessModel2(10); AsynchronousTask asynchronousTask2 = asynchronousFacade.getAsynchronousTask(); assertEquals( "Method is not succesfull !", OK, asynchronousFacade.getResponseCode(asynchronousTask1)); assertTrue( "value returned is not an instance of Long", asynchronousFacade.getReturnValue(asynchronousTask1) instanceof Long); assertEquals( "Method does not return the right value !" + ((Long)asynchronousFacade.getReturnValue(asynchronousTask1)) .longValue(), ((Long)asynchronousFacade.getReturnValue(asynchronousTask1)) .longValue(), 15); assertEquals( "Method is not succesfull !", asynchronousFacade.getResponseCode(asynchronousTask2), OK); assertTrue( "value returned is not an instance of Long", asynchronousFacade.getReturnValue(asynchronousTask2) instanceof Long); assertEquals( "Method does not return the right value !" + ((Long)asynchronousFacade.getReturnValue(asynchronousTask2)) .longValue(), ((Long)asynchronousFacade.getReturnValue(asynchronousTask2)) .longValue(), 10); } public static void test2AsynchronousCallOnSameInstance2() { BusinessModel bm1 = new BusinessModel(); AsynchronousFacade asynchronousFacade = (AsynchronousFacade)bm1; asynchronousFacade.setTimeout(50); long res1 = bm1.processBusinessModel2(1000); AsynchronousTask asynchronousTask1 = asynchronousFacade.getAsynchronousTask(); asynchronousFacade.setTimeout(200); long res2 = bm1.processBusinessModel2(10); AsynchronousTask asynchronousTask2 = asynchronousFacade.getAsynchronousTask(); assertEquals( "Method did not timeout !", TIMEOUT, asynchronousFacade.getResponseCode(asynchronousTask1)); assertEquals( "Method is not succesfull !", asynchronousFacade.getResponseCode(asynchronousTask2), OK); assertTrue( "value returned is not an instance of Long", asynchronousFacade.getReturnValue(asynchronousTask2) instanceof Long); assertEquals( "Method does not return the right value !" + ((Long)asynchronousFacade.getReturnValue(asynchronousTask2)) .longValue(), ((Long)asynchronousFacade.getReturnValue(asynchronousTask2)) .longValue(), 10); } public static void testTimeout() { BusinessModel bm1 = new BusinessModel(200); AsynchronousFacade asynchronousFacade = (AsynchronousFacade)bm1; asynchronousFacade.setTimeout(100); bm1.processBusinessModel(); long t0 = System.currentTimeMillis(); //System.out.println( // asynchronousFacade.getAsynchronousTask().getResponse()); assertEquals( "Method did not timeout !", TIMEOUT, asynchronousFacade.getResponseCode()); long t1 = System.currentTimeMillis(); assertTrue("Method time out in " + (t1 - t0) + " ms.", (t1 - t0) < 120); assertTrue("Method did not run " + (t1 - t0) + " ms.", (t1 - t0) > 80); } public static void testReturnValue() { BusinessModel bm1 = new BusinessModel(); long value = bm1.processBusinessModel2(10); AsynchronousFacade asynchronousFacade = (AsynchronousFacade)bm1; assertEquals( "Method is not succesfull !", OK, asynchronousFacade.getResponseCode()); assertTrue( "value returned is not an instance of Long", asynchronousFacade.getReturnValue() instanceof Long); assertEquals( "Method does not return the right value !" + ((Long)asynchronousFacade.getReturnValue()).longValue(), ((Long)asynchronousFacade.getReturnValue()).longValue(), 10); } public static void testCleanupCallWhenTimeout() { BusinessModelWithCleanup bm1 = new BusinessModelWithCleanup(); BusinessModelWithCleanup bm2 = new BusinessModelWithCleanup(); AsynchronousFacade asynchronousFacade1 = (AsynchronousFacade)bm1; AsynchronousFacade asynchronousFacade2 = (AsynchronousFacade)bm2; asynchronousFacade1.setTimeout(100); long value1 = bm1.processBusinessModel2(200); long value2 = bm2.processBusinessModel2(200); assertEquals( "Method did not timeout !", TIMEOUT, asynchronousFacade1.getResponseCode()); assertEquals( "Method is not successfull !", OK, asynchronousFacade2.getResponseCode()); assertEquals("Cleanup method not called", true, bm1.bCleanupCalled); assertEquals("Cleanup method called", false, bm2.bCleanupCalled); } public static void testIsDone() { BusinessModel bm1 = new BusinessModel(200); bm1.processBusinessModel(); AsynchronousFacade asynchronousFacade = (AsynchronousFacade)bm1; long t0 = System.currentTimeMillis(); assertFalse("isDone returns TRUE !", asynchronousFacade.isDone()); long t1 = System.currentTimeMillis(); assertTrue( "isDone is a blocking call " + (t1 - t0) + " ms.", (t1 - t0) < 20); assertEquals( "Method is not succesfull !", OK, asynchronousFacade.getResponseCode()); assertTrue("isDone returns FALSE !", asynchronousFacade.isDone()); } public static void testExceptionRaisedInMethodCall() { BusinessModel bm1 = new BusinessModel(); long value = bm1.processBusinessModel2(-1); AsynchronousFacade asynchronousFacade = (AsynchronousFacade)bm1; assertEquals( "EXCEPTIONCAUGHT error not returned !", EXCEPTIONCAUGHT, asynchronousFacade.getResponseCode()); } public static void testPoolSizeFull() { ThreadManagerFactory.getThreadManager().setMaximumPoolSize(10); for (int i = 0; i < 10; i++) { BusinessModel bm1 = new BusinessModel(200); bm1.processBusinessModel(); } BusinessModel bm1 = new BusinessModel(200); bm1.processBusinessModel(); AsynchronousFacade asynchronousFacade = (AsynchronousFacade)bm1; assertEquals( "Pool size not full !", CAN_NOT_PROCESS, asynchronousFacade.getResponseCode()); } public static void testPerformance() { ThreadManagerFactory.getThreadManager().setMaximumPoolSize(5000); long tt0 = System.currentTimeMillis(); float nbt = 100000; for (int i = 0; i < nbt; i++) { BusinessModel bm = new BusinessModel(200); } long tt1 = System.currentTimeMillis(); float time = (tt1 - tt0) / nbt; System.out.println( (int)nbt + " advised instances created in " + (tt1 - tt0) + " (ms).Average time " + time + " (ms)."); BusinessModel bm = new BusinessModel(10); AsynchronousFacade Fbm = (AsynchronousFacade)bm; long total = 0; int iOk = 0; int nb1 = 200; int nb2 = 5; AsynchronousTask[] Tbm = new AsynchronousTask[nb2]; for (int j = 0; j < nb1; j++) { long t0 = System.currentTimeMillis(); for (int i = 0; i < nb2; i++) { bm.processBusinessModel(); Tbm[i] = Fbm.getAsynchronousTask(); } long t1 = System.currentTimeMillis(); total += (t1 - t0); for (int i = 0; i < nb2; i++) { int ok = Fbm.getResponseCode(Tbm[i]); if (ok == OK) iOk++; } } System.out.println( nb1 * nb2 + " asynchronous method invocations in " + total + " (ms).Average time " + (total / (float) (nb1 * nb2)) + " (ms)."); assertEquals("Some errors:", nb1 * nb2, iOk); } public static void testResponseTimeReturned() { BusinessModel bm1 = new BusinessModel(200); int ERROR = 20; long t0 = System.currentTimeMillis(); bm1.processBusinessModel(); AsynchronousFacade asynchronousFacade1 = (AsynchronousFacade)bm1; assertEquals( "Method is not succesfull !", OK, asynchronousFacade1.getResponseCode()); long t1 = System.currentTimeMillis(); long startingTime = asynchronousFacade1.getThreadManagerResponse().getStartingTime(); long endingTime = asynchronousFacade1.getThreadManagerResponse().getEndingTime(); assertTrue( "starting time issue ? " + (startingTime - t0), (startingTime - t0) < ERROR); assertTrue( "ending time issue ? " + (t1 - endingTime), (t1 - endingTime) < ERROR); } public static void testAsynchronousCallOnPrivateMethod() { BusinessModel bm1 = new BusinessModel(200); long t0 = System.currentTimeMillis(); bm1.callPrivateMethod(); long t1 = System.currentTimeMillis(); assertTrue( "private method not an asynchronous call:" + (t1 - t0) + " ms.", (t1 - t0) < 100); } public static void test2AsynchronousCallsOnSameInstanceFrom2DifferentThreads() { BusinessModel bm1 = new BusinessModel(100); BusinessThread businessThread1 = new BusinessThread(bm1, 100, 100, "First Call"); BusinessThread businessThread2 = new BusinessThread(bm1, 200, 200, "Second Call"); Thread th1 = new Thread(businessThread1); th1.start(); Thread th2 = new Thread(businessThread2); th2.start(); BusinessModel.sleep(500); assertNotSame( "The result from 2 differents threads are the same !", businessThread1.result, businessThread2.result); } public static void testAsynchronousCallOnStaticMethod() { Parameter object = new Parameter(); long t0 = System.currentTimeMillis(); BusinessModel.processBusinessModel4(200, object); long t1 = System.currentTimeMillis(); assertTrue( "not an instance of AsynchronousFacade", object instanceof AsynchronousFacade); assertTrue( "static method not an asynchronous call:" + (t1 - t0) + " ms.", (t1 - t0) < 100); AsynchronousFacade asynchronousFacade = (AsynchronousFacade)object; AsynchronousTask asynchronousTask1 = asynchronousFacade.getAsynchronousTask(); assertEquals( "Method does not return the right value !", 200, ((Long)asynchronousFacade.getReturnValue(asynchronousTask1)) .longValue()); } public static void testAsynchronousCallOnStaticMethodWithTimeout() { int nb = 1; for (int i = 0; i < nb; i++) { AsynchronousCallOnStaticMethodWithTimeout(); } } public static void AsynchronousCallOnStaticMethodWithTimeout() { Parameter object1 = new Parameter(); Parameter object2 = new Parameter(); Parameter object3 = new Parameter(); Parameter object4 = new Parameter(); assertTrue( "not an instance of AsynchronousFacade", object1 instanceof AsynchronousFacade || object2 instanceof AsynchronousFacade); ((AsynchronousFacade)object1).setTimeout(100); ((AsynchronousFacade)object3).setTimeout(100); ((AsynchronousFacade)object4).setTimeout(100); long t0 = System.currentTimeMillis(); BusinessModel.processBusinessModel4(200, object1); BusinessModel.processBusinessModel4(150, object2); BusinessModelWithStaticCleanup.processBusinessModel4(200, object3); BusinessModelWithStaticCleanupWithParameters.processBusinessModel4( 200, object4); System.out.println(System.currentTimeMillis()-t0); long t1 = System.currentTimeMillis(); assertTrue( "static method not an asynchronous call:" + (t1 - t0) + " ms.", (t1 - t0) < 160); AsynchronousFacade asynchronousFacade1 = (AsynchronousFacade)object1; assertEquals( "Method did not timeout !", TIMEOUT, asynchronousFacade1.getResponseCode()); AsynchronousFacade asynchronousFacade = (AsynchronousFacade)object2; AsynchronousTask asynchronousTask2 = asynchronousFacade.getAsynchronousTask(); assertEquals( "Method does not return the right value !", 150, ((Long)asynchronousFacade.getReturnValue(asynchronousTask2)) .longValue()); } }