[jboss-cvs] jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test ...

Peter Muir peter at bleepbleep.org.uk
Mon Oct 15 09:32:14 EDT 2007


  User: pmuir   
  Date: 07/10/15 09:32:14

  Added:       examples/quartz/src/org/jboss/seam/example/quartz/test            
                        CronTest.java AsynchronousTest.java testng.xml
                        TestPaymentController.java EventsTest.java
                        NthBusinessDayTest.java TransactionStatus.java
                        TestPaymentProcessor.java AccountTest.java
                        OnceTest.java BaseData.xml RepeatingTest.java
  Log:
  Tests for quartz example
  
  Revision  Changes    Path
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/CronTest.java
  
  Index: CronTest.java
  ===================================================================
  package org.jboss.seam.example.quartz.test;
  
  import static org.jboss.seam.example.quartz.Payment.Frequency.EVERY_SECOND;
  
  import java.math.BigDecimal;
  
  import org.jboss.seam.async.QuartzTriggerHandle;
  import org.jboss.seam.example.quartz.Account;
  import org.jboss.seam.example.quartz.Payment;
  import org.jboss.seam.example.quartz.Payment.Frequency;
  import org.jboss.seam.mock.DBUnitSeamTest;
  import org.testng.annotations.Test;
  
  /**
   * @author Pete Muir
   * 
   */
  
  public class CronTest  extends DBUnitSeamTest 
  {
      private QuartzTriggerHandle quartzTriggerHandle;
      private Long paymentId;
      
      private static final Frequency REPEATING = EVERY_SECOND;
  
      
      @Override
      protected void prepareDBUnitOperations() {
          beforeTestOperations.add(
                  new DataSetOperation("org/jboss/seam/example/quartz/test/BaseData.xml")
          );
      }
  
      
      
      
    
      @Test
      public void scheduleCron() throws Exception
      {
                          
          try
          {
              String id = new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("110.00"));
                      setValue("#{newPayment.paymentCron}", "*/2 * * * * ?" );
                  }
                  
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      // schedule a the repeating job and immediately pause it
                      // this allows you to carefully control how long the timer
                      // runs for
                      assert "persisted".equals(invokeMethod("#{paymentHome.saveAndScheduleCron}"));
                      Payment payment = (Payment) getValue("#{newPayment}");
                      quartzTriggerHandle = payment.getQuartzTriggerHandle();
                      quartzTriggerHandle.pause();
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      // Check the job exists
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;            
                      
                      Payment payment = (Payment) getValue("#{newPayment}");
                      assert payment.getPayee().equals("IRS");
                      assert payment.getAmount().equals(new BigDecimal("110.00"));
                      assert payment.getAccount() != null;
                      assert payment.getAccount().getId() == 1;
                      assert payment.getActive();
                  }
                  
              }.run();
              
              // Start the triggerHandle, wait a lot shorter than the job takes
              // At this point the job should have executed once exactly
              quartzTriggerHandle.resume();
              pause((long) (REPEATING.getInterval() * 0.1));
              quartzTriggerHandle.pause();
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert payment.getActive();
                      assert "*/2 * * * * ?".equals(payment.getPaymentCron());
                      
                      assert new BigDecimal("891.46").equals(account.getBalance());
                  }
                  
              }.run();
              
              // Start the triggerHandle, wait until some short time after the 
              // job triggers once
              quartzTriggerHandle.resume();
              pause(2000l);
              quartzTriggerHandle.pause();
              
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      // Job should have run twice
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert payment.getActive();
                      assert "*/2 * * * * ?".equals(payment.getPaymentCron());
                      assert payment.getLastPaid() != null;
                      assert new BigDecimal("781.46").equals(account.getBalance());
                      paymentId = payment.getId();
                  }
                  
              }.run();
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                      setParameter("paymentId", paymentId.toString());
                  }
                  
                  @Override
                  protected void invokeApplication() throws Exception
                  {
                      // Resume the job, then cancel it
                      quartzTriggerHandle.resume();
                      invokeMethod("#{paymentHome.cancel}");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert !payment.getActive();
                      assert payment.getLastPaid() != null;
                      assert new BigDecimal("781.46").equals(account.getBalance());
                  }
                  
              }.run();
              
              // Wait until some short time after another execution would
              // have occurred to check it really stops
              pause(2000l);
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert new BigDecimal("781.46").equals(account.getBalance());
                  }
                  
              }.run();
              
          }
          finally
          {
              if (quartzTriggerHandle != null)
              {
                  quartzTriggerHandle.cancel();
              }
          }
      }
  
      @Test
      public void scheduleCronWithStartAndEndTime() throws Exception
      {
                          
          try
          {
              String id = new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("110.00"));
                      setValue("#{newPayment.paymentCron}", "*/2 * * * * ?" );
                  }
                  
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      // schedule a the repeating job and immediately pause it
                      // this allows you to carefully control how long the timer
                      // runs for
                      Payment payment = (Payment) getValue("#{newPayment}");
                      payment.setPaymentDate(new java.sql.Timestamp( System.currentTimeMillis() + REPEATING.getInterval()));
                      payment.setPaymentEndDate(new java.sql.Timestamp( (long) (System.currentTimeMillis() + (REPEATING.getInterval() * 4.5))));
                      assert "persisted".equals(invokeMethod("#{paymentHome.saveAndScheduleCron}"));
                      quartzTriggerHandle = payment.getQuartzTriggerHandle();
                      quartzTriggerHandle.pause();
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      // Check the job exists
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;            
                      
                      Payment payment = (Payment) getValue("#{newPayment}");
                      assert payment.getPayee().equals("IRS");
                      assert payment.getAmount().equals(new BigDecimal("110.00"));
                      assert payment.getAccount() != null;
                      assert payment.getAccount().getId() == 1;
                      assert payment.getActive();
                  }
                  
              }.run();
              
              // Start the triggerHandle, wait a lot shorter than the job takes
              // At this point the job should have executed once exactly
              quartzTriggerHandle.resume();
              pause((long) (REPEATING.getInterval() * 0.1));
              quartzTriggerHandle.pause();
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert payment.getActive();
                      assert "*/2 * * * * ?".equals(payment.getPaymentCron());
                      
                      assert new BigDecimal("1001.46").equals(account.getBalance());
                  }
                  
              }.run();
              
              // Start the triggerHandle, wait until some short time after the initial
              // expiration
              quartzTriggerHandle.resume();
              pause(REPEATING.getInterval());
              quartzTriggerHandle.pause();
              
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      // Job should have run twice
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert payment.getActive();
                      assert "*/2 * * * * ?".equals(payment.getPaymentCron());
                      assert payment.getLastPaid() != null;
                      assert new BigDecimal("891.46").equals(account.getBalance());
                      paymentId = payment.getId();
                  }
                  
              }.run();
              
              // Start the triggerHandle, wait until some short time after the 
              // job triggers once
              quartzTriggerHandle.resume();
              pause(2000l);
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      // Job should have run twice
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert payment.getActive();
                      assert "*/2 * * * * ?".equals(payment.getPaymentCron());
                      assert payment.getLastPaid() != null;
                      assert new BigDecimal("781.46").equals(account.getBalance());
                      paymentId = payment.getId();
                  }
                  
              }.run();
                            
              // Wait until some short time after another execution would
              // have occurred to check it really stops
              pause(2000l);
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert new BigDecimal("781.46").equals(account.getBalance());
                  }
                  
              }.run();
              
          }
          finally
          {
              if (quartzTriggerHandle != null)
              {
                  quartzTriggerHandle.cancel();
              }
          }
      }
      
      private void pause(long ms) {
          try {
              Thread.sleep(ms);
          } catch (InterruptedException e) {
              
          }                
      }
  
      
      
  }
  
  
  
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/AsynchronousTest.java
  
  Index: AsynchronousTest.java
  ===================================================================
  package org.jboss.seam.example.quartz.test;
  
  import static org.jboss.seam.example.quartz.Payment.Frequency.ONCE;
  
  import java.math.BigDecimal;
  
  import org.jboss.seam.example.quartz.Account;
  import org.jboss.seam.example.quartz.Payment;
  import org.jboss.seam.mock.DBUnitSeamTest;
  import org.testng.annotations.Test;
  
  /**
   * 
   * @author Pete Muir
   *
   */
  
  // Actually this doesn't happen in the example, but lets test it here to keep
  // all quartz tests in one place
  public class AsynchronousTest extends DBUnitSeamTest 
  {
      
      @Override
      protected void prepareDBUnitOperations() {
          beforeTestOperations.add(
                  new DataSetOperation("org/jboss/seam/example/quartz/test/BaseData.xml")
          );
      }
        
      @Test
      public void testAsynchronous() throws Exception
      {
              String id = new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("100.00"));
                      setValue("#{newPayment.paymentFrequency}", ONCE);
                  }
      
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      invokeMethod("#{paymentHome.scheduleAndSaveAsynchronously}");
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;               
                  }
                  
              }.run();
              
              // Wait, let quartz execute the async method which schedules the job
              // for immediate execution
              pause(50);
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("100.00").equals(payment.getAmount());
                      //assert !payment.getActive();
                      //assert payment.getLastPaid() != null;
                      assert new BigDecimal("901.46").equals(account.getBalance());
                  }
                  
              }.run();
      }
  
      
      private void pause(long ms) {
          try {
              Thread.sleep(ms);
          } catch (InterruptedException e) {
              
          }                
      }
  
      
      
  }
  
  
  
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/testng.xml
  
  Index: testng.xml
  ===================================================================
  <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
  
  <suite name="Quartz Example" verbose="2" parallel="false">
  	<test name="Quartz Example">
        
          <parameter name="datasourceJndiName" value="java:/DefaultDS"/>
          
  		<classes>
  			<class name="org.jboss.seam.example.quartz.test.AccountTest" />
              <class name="org.jboss.seam.example.quartz.test.CronTest" />
              <class name="org.jboss.seam.example.quartz.test.NthBusinessDayTest" />
              <class name="org.jboss.seam.example.quartz.test.OnceTest" />
              <class name="org.jboss.seam.example.quartz.test.RepeatingTest" />
              <class name="org.jboss.seam.example.quartz.test.AsynchronousTest" />
              <class name="org.jboss.seam.example.quartz.test.EventsTest" />
  		</classes>
  	</test>
  </suite>
  
  
  
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/TestPaymentController.java
  
  Index: TestPaymentController.java
  ===================================================================
  package org.jboss.seam.example.quartz.test;
  
  import static org.jboss.seam.annotations.Install.MOCK;
  
  import java.sql.Timestamp;
  
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.annotations.Install;
  import org.jboss.seam.annotations.Logger;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.async.QuartzTriggerHandle;
  import org.jboss.seam.async.Schedule;
  import org.jboss.seam.async.TimerSchedule;
  import org.jboss.seam.core.Events;
  import org.jboss.seam.example.quartz.Payment;
  import org.jboss.seam.example.quartz.PaymentController;
  import org.jboss.seam.log.Log;
  
  /**
   * @author Pete Muir
   *
   */
  @Name("paymentHome")
  @Install(precedence=MOCK)
  public class TestPaymentController extends PaymentController
  {
      
      @In TestPaymentProcessor processor;
      
      @Logger Log log;
      
      public String scheduleAndSaveAsynchronously()
      {
          String result = persist();
          
          Payment payment = getInstance();
          
          log.info("scheduling instance #0", payment);
          QuartzTriggerHandle handle = processor.schedulePayment(payment.getPaymentDate(), 
                                                  payment.getPaymentFrequency().getInterval(), 
                                                  payment.getPaymentEndDate(), 
                                                  payment);
          
          payment.setQuartzTriggerHandle( handle );
  
          return result;
      }
      
      public void scheduleAndSaveUsingAsynchronousEvent()
      {
          persist();
          Events.instance().raiseAsynchronousEvent("org.jboss.seam.example.quartz.test.scheduleAndSave", getInstance());
      }
      
      public void scheduleAndSaveUsingTimedEvent()
      {
          persist();
          // A simple once-only which exprires in 1000ms
          Schedule schedule = new TimerSchedule( new Timestamp( System.currentTimeMillis() + 1000l ) );
          Events.instance().raiseTimedEvent("org.jboss.seam.example.quartz.test.scheduleAndSave", schedule, getInstance());
      }
      
      public void scheduleAndSaveWithTransactionEvents()
      {
          TransactionStatus.clear();
          Events.instance().raiseTransactionSuccessEvent("org.jboss.seam.example.quartz.test.transactionSuccess", getInstance());
          Events.instance().raiseTransactionCompletionEvent("org.jboss.seam.example.quartz.test.transactionCompletion", getInstance());
          try
          {
              super.saveAndSchedule();
          }
          catch (Exception e) 
          {
              e.printStackTrace();
          }
      }
      
      @Override
      public Class<Payment> getEntityClass()
      {
          return Payment.class;
      }
      
  }
  
  
  
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/EventsTest.java
  
  Index: EventsTest.java
  ===================================================================
  package org.jboss.seam.example.quartz.test;
  
  import static org.jboss.seam.example.quartz.Payment.Frequency.ONCE;
  
  import java.math.BigDecimal;
  
  import org.jboss.seam.example.quartz.Account;
  import org.jboss.seam.example.quartz.Payment;
  import org.jboss.seam.mock.DBUnitSeamTest;
  import org.testng.annotations.Test;
  
  /**
   * 
   * @author Pete Muir
   *
   */
  
  // Actually this doesn't happen in the example, but lets test it here to keep
  // all quartz tests in one place
  public class EventsTest extends DBUnitSeamTest 
  {
      
      @Override
      protected void prepareDBUnitOperations() {
          beforeTestOperations.add(
                  new DataSetOperation("org/jboss/seam/example/quartz/test/BaseData.xml")
          );
      }
  
      @Test
      public void testAsynchronousEvent() throws Exception
      {
              String id = new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("110.00"));
                      setValue("#{newPayment.paymentFrequency}", ONCE);
                  }
      
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      invokeMethod("#{paymentHome.scheduleAndSaveUsingAsynchronousEvent}");
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;               
                  }
                  
              }.run();
              
              // Wait, let quartz execute the async method which schedules the job
              // for immediate execution
              pause(50);
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
                      System.out.println("running renderResponse");
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      //assert !payment.getActive();
                      //assert payment.getLastPaid() != null;
                      assert new BigDecimal("891.46").equals(account.getBalance());
                  }
                  
              }.run();
      }
  
      
      @Test
      public void testTransactionSuccessEvents() throws Exception
      {
              String id = new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("110.00"));
                      setValue("#{newPayment.paymentFrequency}", ONCE);
                  }
      
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      invokeMethod("#{paymentHome.scheduleAndSaveWithTransactionEvents}");
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;               
                  }
                  
              }.run();
              
              // Wait, let quartz execute the async method which schedules the job
              // for immediate execution
              pause(50);
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
                      System.out.println("running renderResponse");
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      //assert !payment.getActive();
                      //assert payment.getLastPaid() != null;
                      assert new BigDecimal("891.46").equals(account.getBalance());
                      assert (Boolean) getValue("#{transactionStatus.transactionCompleted}");
                      assert (Boolean) getValue("#{transactionStatus.transactionSucceded}"); 
                      assert payment.getId().equals(getValue("#{transactionStatus.id}"));
                  }
                  
              }.run();
      }
      
      @Test
      public void testTimedEvent() throws Exception
      {
              String id = new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("120.00"));
                      setValue("#{newPayment.paymentFrequency}", ONCE);
                  }
      
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      invokeMethod("#{paymentHome.scheduleAndSaveUsingTimedEvent}");
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;               
                  }
                  
              }.run();
              
              // Wait, let quartz execute the async method which schedules the job
              // for immediate execution
              pause(1000l);
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
                      System.out.println("running renderResponse");
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("120.00").equals(payment.getAmount());
                      //assert !payment.getActive();
                      //assert payment.getLastPaid() != null;
                      assert new BigDecimal("881.46").equals(account.getBalance());
                  }
                  
              }.run();
      }
  
      
      
      private void pause(long ms) {
          try {
              Thread.sleep(ms);
          } catch (InterruptedException e) {
              
          }                
      }
  
      
      
  }
  
  
  
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/NthBusinessDayTest.java
  
  Index: NthBusinessDayTest.java
  ===================================================================
  package org.jboss.seam.example.quartz.test;
  
  import static org.jboss.seam.async.NthBusinessDay.BusinessDayIntervalType.WEEKLY;
  
  import java.math.BigDecimal;
  import java.sql.Timestamp;
  import java.util.Date;
  
  import org.jboss.seam.async.QuartzTriggerHandle;
  import org.jboss.seam.example.quartz.Account;
  import org.jboss.seam.example.quartz.Payment;
  import org.jboss.seam.mock.DBUnitSeamTest;
  import org.testng.annotations.Test;
  
  /**
   * 
   * @author Pete Muir
   *
   */
  
  public class NthBusinessDayTest 
      extends DBUnitSeamTest 
  {
      private QuartzTriggerHandle quartzTriggerHandle;    
  
      
      @Override
      protected void prepareDBUnitOperations() {
          beforeTestOperations.add(
                  new DataSetOperation("org/jboss/seam/example/quartz/test/BaseData.xml")
          );
      }
      
      @Test
      public void scheduleNthBusinessDay() throws Exception
      {
          try
          {
              new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("100.00"));
                      setValue("#{newPayment.paymentNthBusinessDay.interval}", WEEKLY);
                  }
      
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      assert "persisted".equals(invokeMethod("#{paymentHome.saveAndScheduleNthBusinessDay}"));
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;               
                      
                      Payment payment = (Payment) getValue("#{newPayment}");
                      assert payment.getPayee().equals("IRS");
                      assert payment.getAmount().equals(new BigDecimal("100.00"));
                      assert payment.getAccount() != null;
                      assert payment.getAccount().getId() == 1;
                      quartzTriggerHandle = payment.getQuartzTriggerHandle();
                  }
                  
              }.run();
              
              // test that the payment is around
              new FacesRequest("/search.xhtml") {
                  @Override
                  protected void beforeRequest() {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;        
                  }            
              }.run();
          }
          finally
          {
              // Always cancel the job
              if (quartzTriggerHandle != null)
              {
                  quartzTriggerHandle.cancel();
                  quartzTriggerHandle = null;
              }
          }
      }
      
      // Can't do much here until we deal with business days better.
      // Could provide an Test version of NthBusinessDays that has deterministic
      // behaviour
      @Test
      public void scheduleNthBusinessDayWithStartAndEnd() throws Exception
      {
          final Date startDate = new Timestamp(System.currentTimeMillis() + 1000);
          final Date endDate = new Timestamp(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7);
          
          try
          {
              new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("100.00"));
                      setValue("#{newPayment.paymentNthBusinessDay.interval}", WEEKLY);
                      setValue("#{newPayment.paymentDate}", startDate);
                      setValue("#{newPayment.paymentEndDate}", endDate);
                  }
      
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      assert "persisted".equals(invokeMethod("#{paymentHome.saveAndScheduleNthBusinessDay}"));
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;               
                      
                      Payment payment = (Payment) getValue("#{newPayment}");
                      assert payment.getPayee().equals("IRS");
                      assert payment.getAmount().equals(new BigDecimal("100.00"));
                      assert payment.getAccount() != null;
                      assert payment.getAccount().getId() == 1;
                      quartzTriggerHandle = payment.getQuartzTriggerHandle();
                  }
                  
              }.run();
              
              // test that the payment is around
              new FacesRequest("/search.xhtml") {
                  @Override
                  protected void beforeRequest() {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1; 
                      assert account.getPayments().get(0).getPaymentDate().equals(startDate);
                      assert account.getPayments().get(0).getPaymentEndDate().equals(endDate);
                  }            
              }.run();
          }
          finally
          {
              // Always cancel the job
              if (quartzTriggerHandle != null)
              {
                  quartzTriggerHandle.cancel();
                  quartzTriggerHandle = null;
              }
          }
      }
      
      @Test
      public void scheduleNthBusinessDayWithStart() throws Exception
      {
          final Date startDate = new Timestamp(System.currentTimeMillis() + 1000);        
          try
          {
              new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("100.00"));
                      setValue("#{newPayment.paymentNthBusinessDay.interval}", WEEKLY);
                      setValue("#{newPayment.paymentDate}", startDate);
                  }
      
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      assert "persisted".equals(invokeMethod("#{paymentHome.saveAndScheduleNthBusinessDay}"));
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;               
                      
                      Payment payment = (Payment) getValue("#{newPayment}");
                      assert payment.getPayee().equals("IRS");
                      assert payment.getAmount().equals(new BigDecimal("100.00"));
                      assert payment.getAccount() != null;
                      assert payment.getAccount().getId() == 1;
                      quartzTriggerHandle = payment.getQuartzTriggerHandle();
                  }
                  
              }.run();
              
              // test that the payment is around
              new FacesRequest("/search.xhtml") {
                  @Override
                  protected void beforeRequest() {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1; 
                      assert account.getPayments().get(0).getPaymentDate().equals(startDate);
                  }            
              }.run();
          }
          finally
          {
              // Always cancel the job
              if (quartzTriggerHandle != null)
              {
                  quartzTriggerHandle.cancel();
                  quartzTriggerHandle = null;
              }
          }
      }
      
  }
  
  
  
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/TransactionStatus.java
  
  Index: TransactionStatus.java
  ===================================================================
  package org.jboss.seam.example.quartz.test;
  
  import org.jboss.seam.Component;
  import org.jboss.seam.ScopeType;
  import org.jboss.seam.annotations.AutoCreate;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.contexts.Contexts;
  
  /**
   * @author Pete Muir
   *
   */
  @Name("transactionStatus")
  @Scope(ScopeType.APPLICATION)
  @AutoCreate
  public class TransactionStatus
  {
      private Object id;
      private boolean transactionSucceded;
      private boolean transactionCompleted;
      /**
       * @return the transactionSuccess
       */
      public boolean getTransactionSucceded()
      {
          return this.transactionSucceded;
      }
      /**
       * @param transactionSuccess the transactionSuccess to set
       */
      public void setTransactionSucceded(boolean transactionSuccess)
      {
          this.transactionSucceded = transactionSuccess;
      }
      /**
       * @return the transactionCompleted
       */
      public boolean getTransactionCompleted()
      {
          return this.transactionCompleted;
      }
      /**
       * @param transactionCompleted the transactionCompleted to set
       */
      public void setTransactionCompleted(boolean transactionCompleted)
      {
          this.transactionCompleted = transactionCompleted;
      }
      
      public static void clear()
      {
          Contexts.getApplicationContext().remove("transactionStatus");
      }
      
      public static TransactionStatus instance()
      {
          return (TransactionStatus) Component.getInstance("transactionStatus");
      }
      /**
       * @return the id
       */
      public Object getId()
      {
          return this.id;
      }
      /**
       * @param id the id to set
       */
      public void setId(Object id)
      {
          this.id = id;
      }
  
  }
  
  
  
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/TestPaymentProcessor.java
  
  Index: TestPaymentProcessor.java
  ===================================================================
  package org.jboss.seam.example.quartz.test;
  
  import static org.jboss.seam.annotations.Install.MOCK;
  
  import java.math.BigDecimal;
  import java.util.Date;
  
  import javax.persistence.EntityManager;
  
  import org.jboss.seam.annotations.AutoCreate;
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.annotations.Install;
  import org.jboss.seam.annotations.Logger;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Observer;
  import org.jboss.seam.annotations.Transactional;
  import org.jboss.seam.annotations.async.Asynchronous;
  import org.jboss.seam.annotations.async.Expiration;
  import org.jboss.seam.annotations.async.FinalExpiration;
  import org.jboss.seam.annotations.async.IntervalBusinessDay;
  import org.jboss.seam.async.NthBusinessDay;
  import org.jboss.seam.async.QuartzTriggerHandle;
  import org.jboss.seam.core.Events;
  import org.jboss.seam.example.quartz.Payment;
  import org.jboss.seam.example.quartz.PaymentProcessor;
  import org.jboss.seam.log.Log;
  
  /**
   * @author Pete Muir
   *
   */
  @Name("processor")
  @Install(precedence=MOCK)
  @AutoCreate
  public class TestPaymentProcessor extends PaymentProcessor
  {
      
      @In 
      EntityManager entityManager;
  
      @Logger Log log;
      
      @Asynchronous
      @Transactional
      public QuartzTriggerHandle schedulePaymentAsynchronously(Payment payment) 
      { 
          payment = entityManager.merge(payment);
          
          log.info("[#0] Processing cron payment #1", System.currentTimeMillis(), payment.getId());
  
          if (payment.getActive()) {
              BigDecimal balance = payment.getAccount().adjustBalance(payment.getAmount().negate());
              log.info(":: balance is now #0", balance);
              payment.setLastPaid(new Date());
  
          }
  
          return null;
      }
      
      @Observer("org.jboss.seam.example.quartz.test.scheduleAndSave")
      @Transactional
      public QuartzTriggerHandle schedulePayment(Payment payment) 
      { 
          payment = entityManager.merge(payment);
          
          log.error("[#0] Processing cron payment #1", System.currentTimeMillis(), payment.getId());
          if (payment.getActive()) {
              BigDecimal balance = payment.getAccount().adjustBalance(payment.getAmount().negate());
              log.error(":: balance is now #0", balance);
              payment.setLastPaid(new Date());
  
          }
  
          return null;
      }
      
      @Observer("org.jboss.seam.example.quartz.test.transactionSuccess")
      @Transactional
      public void observeTransactionSuccess(Payment payment)
      {
          TransactionStatus.instance().setTransactionSucceded(true);
          TransactionStatus.instance().setId(payment.getId());
      }
      
      @Observer("org.jboss.seam.example.quartz.test.transactionCompletion")
      @Transactional
      public void observeTransactionCompletion(Payment payment)
      {
          TransactionStatus.instance().setTransactionCompleted(true);
          TransactionStatus.instance().setId(payment.getId());
      }
  
  }
  
  
  
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/AccountTest.java
  
  Index: AccountTest.java
  ===================================================================
  package org.jboss.seam.example.quartz.test;
  
  import java.util.List;
  
  import org.jboss.seam.example.quartz.Account;
  import org.jboss.seam.example.quartz.Payment;
  import org.jboss.seam.mock.DBUnitSeamTest;
  import org.testng.annotations.Test;
  
  /**
   * 
   * @author Pete Muir
   *
   */
  public class AccountTest 
      extends DBUnitSeamTest 
  {
      
      @Override
      protected void prepareDBUnitOperations() {
          beforeTestOperations.add(
                  new DataSetOperation("org/jboss/seam/example/quartz/test/BaseData.xml")
          );
      }
      
      @Test
      public void listAccounts() throws Exception 
      {
          new FacesRequest("/search.xhtml") 
          {
              
              @Override
              @SuppressWarnings("unchecked")
              protected void renderResponse() throws Exception 
              {
                  List<Account> accounts = (List<Account>) getValue("#{accounts.resultList}");
                  
                  assert accounts.size() == 5;
              }
              
          }.run(); 
      }
      
      @Test
      public void selectAccount() throws Exception 
      {        
          String id = new FacesRequest("/search.xhtml") 
          {        
          
              @Override
              @SuppressWarnings("unchecked")
              protected void renderResponse() throws Exception 
              {
                  assert !((Boolean)getValue("#{accountHome.idDefined}"));
              }          
          }.run();
          
          new FacesRequest("/search.xhtml", id) 
          {
              
              @Override
              protected void beforeRequest() 
              {
                  setParameter("accountId", "1");
              }
  
              @Override
              protected void renderResponse() throws Exception 
              {
                  assert ((Boolean) getValue("#{accountHome.idDefined}"));
                  
                  Account account = (Account) getValue("#{selectedAccount}");
                  assert account !=null;
                  assert account.getId() == 1;
                  assert account.getPayments().size() == 0;
                 
                  Payment payment = (Payment) getValue("#{newPayment}");
                  assert payment.getPayee().equals("Somebody");
                  assert payment.getAccount() != null;
                  assert payment.getAccount().getId() == 1;
                  
              }            
          }.run();
          
          
          
      }
      
  }
  
  
  
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/OnceTest.java
  
  Index: OnceTest.java
  ===================================================================
  package org.jboss.seam.example.quartz.test;
  
  import static org.jboss.seam.example.quartz.Payment.Frequency.ONCE;
  
  import java.math.BigDecimal;
  
  import org.jboss.seam.async.QuartzTriggerHandle;
  import org.jboss.seam.example.quartz.Account;
  import org.jboss.seam.example.quartz.Payment;
  import org.jboss.seam.mock.DBUnitSeamTest;
  import org.testng.annotations.Test;
  /**
   * 
   * @author Pete Muir
   *
   */
  
  public class OnceTest extends DBUnitSeamTest 
  {
      private QuartzTriggerHandle quartzTriggerHandle;
      
      @Override
      protected void prepareDBUnitOperations() {
          beforeTestOperations.add(
                  new DataSetOperation("org/jboss/seam/example/quartz/test/BaseData.xml")
          );
      }
      
     
      
      @Test
      public void scheduleOnce() throws Exception
      {
          try
          {
              String id = new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("100.00"));
                      setValue("#{newPayment.paymentFrequency}", ONCE);
                  }
      
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      assert "persisted".equals(invokeMethod("#{paymentHome.saveAndSchedule}"));
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;               
                      
                      Payment payment = (Payment) getValue("#{newPayment}");
                      assert payment.getPayee().equals("IRS");
                      assert payment.getAmount().equals(new BigDecimal("100.00"));
                      assert payment.getAccount() != null;
                      assert payment.getAccount().getId() == 1;
                      quartzTriggerHandle = payment.getQuartzTriggerHandle();
                  }
                  
              }.run();
              
              // Wait, let quartz execute the job (async but straight away)
              pause(50);
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("100.00").equals(payment.getAmount());
                      assert !payment.getActive();
                      assert ONCE.equals(payment.getPaymentFrequency());
                      assert payment.getLastPaid() != null;
                      assert new BigDecimal("901.46").equals(account.getBalance());
                  }
                  
              }.run();
          }
          finally
          {
              // Always cancel the job
              if (quartzTriggerHandle != null)
              {
                  quartzTriggerHandle.cancel();
                  quartzTriggerHandle = null;
              }
          }
      }
      
      private void pause(long ms) {
          try {
              Thread.sleep(ms);
          } catch (InterruptedException e) {
              
          }                
      }
  
      
      
  }
  
  
  
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/BaseData.xml
  
  Index: BaseData.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <dataset>
  
    <ACCOUNT 
      id="1"
      accountNumber="23001"
      balance="1001.46"
      />
      
    <ACCOUNT 
      id="2"
      accountNumber="23002"
      balance="1002.46"
      />
    
    <ACCOUNT 
      id="3"
      accountNumber="23003"
      balance="1003.46"
      />
      
    <ACCOUNT 
      id="4"
      accountNumber="23004"
      balance="1004.46"
      />
     
    <ACCOUNT 
      id="5"
      accountNumber="23005"
      balance="1005.46"
      />
      
    <!-- This causes the payment table to be cleaned every time -->
    <PAYMENT />
      
  </dataset>
  
  
  1.1      date: 2007/10/15 13:32:14;  author: pmuir;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/test/RepeatingTest.java
  
  Index: RepeatingTest.java
  ===================================================================
  package org.jboss.seam.example.quartz.test;
  
  import static org.jboss.seam.example.quartz.Payment.Frequency.EVERY_SECOND;
  
  import java.math.BigDecimal;
  
  import org.jboss.seam.async.QuartzTriggerHandle;
  import org.jboss.seam.example.quartz.Account;
  import org.jboss.seam.example.quartz.Payment;
  import org.jboss.seam.example.quartz.Payment.Frequency;
  import org.jboss.seam.mock.DBUnitSeamTest;
  import org.testng.annotations.Test;
  
  /**
   * 
   * @author Pete Muir
   *
   */
  
  public class RepeatingTest 
      extends DBUnitSeamTest 
  {
      private QuartzTriggerHandle quartzTriggerHandle;
      private Long paymentId;
      
      private static final Frequency REPEATING = EVERY_SECOND;
  
      
      @Override
      protected void prepareDBUnitOperations() {
          beforeTestOperations.add(
                  new DataSetOperation("org/jboss/seam/example/quartz/test/BaseData.xml")
          );
      }
      
      
      @Test
      public void scheduleRepeating() throws Exception
      {
                          
          try
          {
              String id = new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("110.00"));
                      setValue("#{newPayment.paymentFrequency}", REPEATING );
                  }
                  
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      // schedule a the repeating job and immediately pause it
                      // this allows you to carefully control how long the timer
                      // runs for
                      assert "persisted".equals(invokeMethod("#{paymentHome.saveAndSchedule}"));
                      Payment payment = (Payment) getValue("#{newPayment}");
                      quartzTriggerHandle = payment.getQuartzTriggerHandle();
                      quartzTriggerHandle.pause();
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      // Check the job exists
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;            
                      
                      Payment payment = (Payment) getValue("#{newPayment}");
                      assert payment.getPayee().equals("IRS");
                      assert payment.getAmount().equals(new BigDecimal("110.00"));
                      assert payment.getAccount() != null;
                      assert payment.getAccount().getId() == 1;
                      assert payment.getActive();
                  }
                  
              }.run();
              
              // Start the triggerHandle, wait a lot shorter than the job takes
              // At this point the job should have executed once exactly
              quartzTriggerHandle.resume();
              pause((long) (REPEATING.getInterval() * 0.1));
              quartzTriggerHandle.pause();
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert payment.getActive();
                      assert REPEATING.equals(payment.getPaymentFrequency());
                      
                      assert new BigDecimal("891.46").equals(account.getBalance());
                  }
                  
              }.run();
              
              // Start the triggerHandle, wait until some short time after the 
              // job triggers once
              quartzTriggerHandle.resume();
              pause(REPEATING.getInterval());
              quartzTriggerHandle.pause();
              
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      // Job should have run twice
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert payment.getActive();
                      assert REPEATING.equals(payment.getPaymentFrequency());
                      assert payment.getLastPaid() != null;
                      assert new BigDecimal("781.46").equals(account.getBalance());
                      paymentId = payment.getId();
                  }
                  
              }.run();
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                      setParameter("paymentId", paymentId.toString());
                  }
                  
                  @Override
                  protected void invokeApplication() throws Exception
                  {
                      // Resume the job, then cancel it
                      quartzTriggerHandle.resume();
                      invokeMethod("#{paymentHome.cancel}");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert !payment.getActive();
                      assert payment.getLastPaid() != null;
                      assert new BigDecimal("781.46").equals(account.getBalance());
                  }
                  
              }.run();
              
              // Wait until some short time after another execution would
              // have occurred to check it really stops
              pause((long) (REPEATING.getInterval() * 1.05));
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert new BigDecimal("781.46").equals(account.getBalance());
                  }
                  
              }.run();
              
          }
          finally
          {
              if (quartzTriggerHandle != null)
              {
                  quartzTriggerHandle.cancel();
              }
          }
      }
      
      
      
      @Test
      public void scheduleRepeatingWithStartAndEndTime() throws Exception
      {
                          
          try
          {
              String id = new FacesRequest("/search.xhtml") 
              {
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void updateModelValues() throws Exception 
                  {
                      setValue("#{newPayment.payee}", "IRS"); 
                      setValue("#{newPayment.amount}", new BigDecimal("110.00"));
                      setValue("#{newPayment.paymentFrequency}", REPEATING );
                  }
                  
                  @Override
                  protected void invokeApplication() throws Exception 
                  {
                      // schedule a the repeating job and immediately pause it
                      // this allows you to carefully control how long the timer
                      // runs for
                      Payment payment = (Payment) getValue("#{newPayment}");
                      payment.setPaymentDate(new java.sql.Timestamp( System.currentTimeMillis() + REPEATING.getInterval()));
                      payment.setPaymentEndDate(new java.sql.Timestamp( (long) (System.currentTimeMillis() + (REPEATING.getInterval() * 2.5))));
                      assert "persisted".equals(invokeMethod("#{paymentHome.saveAndSchedule}")); 
                      quartzTriggerHandle = payment.getQuartzTriggerHandle();
                      quartzTriggerHandle.pause();
                  }
      
                  @Override
                  protected void renderResponse() throws Exception 
                  {
                      // Check the job exists
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;            
                      
                      Payment payment = (Payment) getValue("#{newPayment}");
                      assert payment.getPayee().equals("IRS");
                      assert payment.getAmount().equals(new BigDecimal("110.00"));
                      assert payment.getAccount() != null;
                      assert payment.getAccount().getId() == 1;
                      assert payment.getActive();
                  }
                  
              }.run();
              
              // Start the triggerHandle, wait a lot shorter than the job takes
              // At this point the job should have executed zero times
              quartzTriggerHandle.resume();
              pause((long) (REPEATING.getInterval() * 0.1));
              quartzTriggerHandle.pause();
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");                
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert payment.getActive();
                      assert new BigDecimal("1001.46").equals(account.getBalance());
                  }
                  
              }.run();
              
              // Start the triggerHandle, wait until some short time after the 
              // job triggers once
              quartzTriggerHandle.resume();
              pause(REPEATING.getInterval());
              quartzTriggerHandle.pause();
              
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      // Job should have run twice
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert payment.getActive();
                      assert new BigDecimal("891.46").equals(account.getBalance());
                      paymentId = payment.getId();
                  }
                  
              }.run();
              
              // Start the triggerHandle, wait until some short time after the 
              // job triggers once
              quartzTriggerHandle.resume();
              pause(REPEATING.getInterval());
              // Thats the last job so need to pause
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      // Job should have run twice
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert payment.getActive();
                      assert new BigDecimal("781.46").equals(account.getBalance());
                      paymentId = payment.getId();
                  }
                  
              }.run();
              
              // Start the triggerHandle, wait until some short time after the 
              // job would trigger again - we should be way beyond the expiry now 
              pause(REPEATING.getInterval());
              
              new FacesRequest("/search.xhtml", id)
              {
      
                  @Override
                  protected void beforeRequest() 
                  {
                      setParameter("accountId", "1");
                  }
                  
                  @Override
                  protected void renderResponse() throws Exception
                  {
  
                      assert ((Boolean)getValue("#{accountHome.idDefined}"));                
                      Account account = (Account) getValue("#{selectedAccount}");
  
                      assert account !=null;
                      assert account.getId() == 1;
                      assert account.getPayments().size() == 1;
                      Payment payment = account.getPayments().get(0);
                      assert new BigDecimal("110.00").equals(payment.getAmount());
                      assert payment.getActive();
                      assert payment.getLastPaid() != null;
                      assert new BigDecimal("781.46").equals(account.getBalance());
                  }
                  
              }.run();
              
          }
          finally
          {
              if (quartzTriggerHandle != null)
              {
                  quartzTriggerHandle.cancel();
              }
          }
      }
      
      private void pause(long ms) {
          try {
              Thread.sleep(ms);
          } catch (InterruptedException e) {
              
          }                
      }
  
      
      
  }
  
  
  



More information about the jboss-cvs-commits mailing list