[jboss-cvs] JBossCache/tests/functional/org/jboss/cache/pojo/notification ...

Jason Thomas Greene jgreene at jboss.com
Mon Jul 2 21:46:33 EDT 2007


  User: jgreene 
  Date: 07/07/02 21:46:33

  Added:       tests/functional/org/jboss/cache/pojo/notification  
                        TxGauranteedListener.java TxObjectTest.java
  Log:
  Add TX notification test
  
  Revision  Changes    Path
  1.1      date: 2007/07/03 01:46:32;  author: jgreene;  state: Exp;JBossCache/tests/functional/org/jboss/cache/pojo/notification/TxGauranteedListener.java
  
  Index: TxGauranteedListener.java
  ===================================================================
  /*
  * JBoss, Home of Professional Open Source
  * Copyright 2005, JBoss Inc., and individual contributors as indicated
  * by the @authors tag. See the copyright.txt 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 org.jboss.cache.pojo.notification;
  
  import java.util.Queue;
  import java.util.concurrent.ConcurrentHashMap;
  import java.util.concurrent.ConcurrentLinkedQueue;
  import java.util.concurrent.ConcurrentMap;
  
  import javax.transaction.Transaction;
  
  import org.jboss.cache.pojo.notification.annotation.Attached;
  import org.jboss.cache.pojo.notification.annotation.Detached;
  import org.jboss.cache.pojo.notification.annotation.FieldModified;
  import org.jboss.cache.pojo.notification.annotation.ListModified;
  import org.jboss.cache.pojo.notification.annotation.MapModified;
  import org.jboss.cache.pojo.notification.annotation.PojoCacheListener;
  import org.jboss.cache.pojo.notification.annotation.SetModified;
  import org.jboss.cache.pojo.notification.annotation.TransactionCompleted;
  import org.jboss.cache.pojo.notification.event.Event;
  import org.jboss.cache.pojo.notification.event.TransactionCompletedEvent;
  
  // $Id: TxGauranteedListener.java,v 1.1 2007/07/03 01:46:32 jgreene Exp $
  
  /**
   * A recoding Listener for notification test package.
   *
   * @author Jason T. Greene
   */
  @PojoCacheListener
  public class TxGauranteedListener
  {
     private class TxEventQueue
     {
        private ConcurrentMap<Transaction, Queue<Event>> map = new ConcurrentHashMap<Transaction, Queue<Event>>();
  
        public void offer(Event event)
        {
           Queue<Event> queue = getQueue(event.getContext().getTransaction());
           queue.offer(event);
        }
  
        private Queue<Event> getQueue(Transaction transaction)
        {
           Queue<Event> queue = map.get(transaction);
           if (queue == null)
           {
              queue = new ConcurrentLinkedQueue<Event>();
              map.putIfAbsent(transaction, queue);
           }
  
           return queue;
        }
  
        public Queue<Event> takeAll(Transaction transaction)
        {
           return map.remove(transaction);
        }
     }
  
     private TxEventQueue events = new TxEventQueue();
     private Queue<Event> committed = new ConcurrentLinkedQueue<Event>();
  
     @SuppressWarnings("unchecked")
     public <T extends Event> T take(Class<T> t)
     {
        Event notification = committed.remove();
        if (!t.isInstance(notification))
           throw new IllegalStateException("Expected notification type: " + t.getSimpleName() + " but was: " + notification.getClass().getSimpleName());
  
        return (T) notification;
     }
  
     @Attached
     @Detached
     @FieldModified
     @ListModified
     @SetModified
     @MapModified
     public void handle(Event event)
     {
        events.offer(event);
     }
  
     @TransactionCompleted
     public void handleTx(TransactionCompletedEvent event)
     {
        Queue<Event> completed = events.takeAll(event.getContext().getTransaction());
        if (completed != null && event.isSuccessful())
           committed.addAll(completed);
     }
  }
  
  
  1.1      date: 2007/07/03 01:46:32;  author: jgreene;  state: Exp;JBossCache/tests/functional/org/jboss/cache/pojo/notification/TxObjectTest.java
  
  Index: TxObjectTest.java
  ===================================================================
  /*
   * JBoss, Home of Professional Open Source
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  
  package org.jboss.cache.pojo.notification;
  
  import java.util.Properties;
  
  import javax.naming.Context;
  import javax.naming.InitialContext;
  import javax.naming.NamingException;
  import javax.transaction.NotSupportedException;
  import javax.transaction.SystemException;
  import javax.transaction.UserTransaction;
  
  import junit.framework.Test;
  import junit.framework.TestCase;
  import junit.framework.TestSuite;
  
  import org.jboss.cache.pojo.PojoCache;
  import org.jboss.cache.pojo.PojoCacheFactory;
  import org.jboss.cache.pojo.notification.event.AttachedEvent;
  import org.jboss.cache.pojo.notification.event.DetachedEvent;
  import org.jboss.cache.pojo.notification.event.FieldModifiedEvent;
  import org.jboss.cache.pojo.notification.event.Event;
  import org.jboss.cache.pojo.test.Address;
  import org.jboss.cache.pojo.test.Person;
  import org.jboss.cache.transaction.DummyTransactionManager;
  
  // $Id: TxObjectTest.java,v 1.1 2007/07/03 01:46:32 jgreene Exp $
  
  /**
   * Tests attach, detach, field modify and tx notifications
   *
   * @author Jason T. Greene
   */
  public class TxObjectTest extends TestCase
  {
     private PojoCache cache;
     private TxGauranteedListener listener;
  
     public TxObjectTest(String name)
     {
        super(name);
     }
  
     private UserTransaction getTransaction() throws SystemException, NotSupportedException, NamingException
     {
        Properties prop = new Properties();
        prop.put(Context.INITIAL_CONTEXT_FACTORY,
                "org.jboss.cache.transaction.DummyContextFactory");
        return (UserTransaction) new InitialContext(prop).lookup("UserTransaction");
     }
  
  
     protected void setUp() throws Exception
     {
        super.setUp();
        String configFile = "META-INF/local-service.xml";
        boolean toStart = false;
        cache = PojoCacheFactory.createCache(configFile, toStart);
        cache.start();
  
        listener = new TxGauranteedListener();
        cache.addListener(listener);
  
        DummyTransactionManager.getInstance();
     }
  
     private <T extends Event> T takeNotification(Class<T> clazz)
     {
        T notification = listener.take(clazz);
        verifyNotification(notification);
  
        return notification;
     }
  
     protected void verifyNotification(Event notification)
     {
        assertSame(cache, notification.getContext().getPojoCache());
        assertEquals(true, notification.isLocal());
     }
  
     public static Test suite() throws Exception
     {
        return new TestSuite(TxObjectTest.class);
     }
  
     public static void main(String[] args) throws Exception
     {
        junit.textui.TestRunner.run(TxObjectTest.suite());
     }
  
     protected void tearDown() throws Exception
     {
        super.tearDown();
        cache.stop();
     }
  
     public void testAttachNotification() throws Exception
     {
        Person test = new Person();
        test.setName("Ben");
        test.setAge(10);
        cache.attach("/a", test);
        AttachedEvent attach = takeNotification(AttachedEvent.class);
        assertEquals(test, attach.getSource());
     }
  
     public void testAttachNotification2() throws Exception
     {
        Person test = new Person();
        test.setName("Ben");
        test.setAge(10);
        Address addr = new Address();
        test.setAddress(addr);
        cache.attach("/a", test);
  
        // Address Attach
        AttachedEvent attach = takeNotification(AttachedEvent.class);
        assertEquals(addr, attach.getSource());
  
        // Person Attach
        attach = takeNotification(AttachedEvent.class);
        assertEquals(test, attach.getSource());
     }
  
     public void testDetachNotification() throws Exception
     {
        Person test = new Person();
        test.setName("Ben");
        test.setAge(10);
        cache.attach("/a", test);
  
        // Person Attach
        AttachedEvent attach = takeNotification(AttachedEvent.class);
        assertEquals(test, attach.getSource());
  
        cache.detach("/a");
  
        // Person Detach
        DetachedEvent detach = takeNotification(DetachedEvent.class);
        assertEquals(test, detach.getSource());
     }
  
     public void testFieldNotification() throws Exception
     {
        UserTransaction tx = getTransaction();
        tx.begin();
        Person test = new Person();
        test.setName("Ben");
        test.setAge(10);
        cache.attach("/a", test);
        test.setAge(20);
        Address addr = new Address();
        addr.setCity("Madison");
        addr.setStreet("State St.");
        addr.setZip(53703);
        test.setAddress(addr);
        tx.commit();
  
        // Person Attach
        AttachedEvent attach = takeNotification(AttachedEvent.class);
        assertEquals(test, attach.getSource());
  
        // Field modification
        FieldModifiedEvent modify = takeNotification(FieldModifiedEvent.class);
        assertEquals(test, modify.getSource());
        assertEquals(test.getClass().getDeclaredField("age"), modify.getField());
        assertEquals(20, modify.getValue());
  
        // First Attach
        attach = takeNotification(AttachedEvent.class);
        assertEquals(addr, attach.getSource());
  
        // Then Modify
        modify = takeNotification(FieldModifiedEvent.class);
        assertEquals(test, modify.getSource());
        assertEquals(test.getClass().getDeclaredField("address"), modify.getField());
        assertEquals(addr, modify.getValue());
     }
  }
  
  



More information about the jboss-cvs-commits mailing list