[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