You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@onami.apache.org by sc...@apache.org on 2014/04/07 16:12:21 UTC

svn commit: r1585487 [3/5] - in /onami/sandbox/persist: ./ src/main/java/org/apache/onami/persist/ src/sandbox/ src/test/java/org/apache/onami/persist/ src/test/java/org/apache/onami/persist/test/ src/test/java/org/apache/onami/persist/test/transaction...

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/AggregatedExceptionTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/AggregatedExceptionTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/AggregatedExceptionTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/AggregatedExceptionTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,93 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.sameInstance;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+/**
+ * Test for {@link AggregatedException}.
+ */
+public class AggregatedExceptionTest
+{
+    private AggregatedException.Builder sut;
+
+    @Before
+    public void setUp()
+        throws Exception
+    {
+        sut = new AggregatedException.Builder();
+    }
+
+    @Test
+    public void shouldNotThrowAnythingWhenEmpty()
+    {
+        sut.throwRuntimeExceptionIfHasCauses( "test msg" );
+    }
+
+    @Test
+    public void shouldThrowAggregatedExceptionWithAllCollectedExceptions()
+    {
+        final Exception e0 = new Exception();
+        final Exception e1 = new Exception();
+
+        try
+        {
+            sut.add( e0 );
+            sut.add( e1 );
+            sut.throwRuntimeExceptionIfHasCauses( "test msg" );
+        }
+
+        catch ( AggregatedException e )
+        {
+            assertThat( e.getNumCauses(), is( 2 ) );
+            assertThat( e.getCauses()[0], sameInstance( (Throwable) e0 ) );
+            assertThat( e.getCauses()[1], sameInstance( (Throwable) e1 ) );
+            return;
+        }
+
+        fail( "must throw AggregatedException" );
+    }
+
+    @Test
+    public void shouldThrowOriginalExceptionWhenOnlyOne()
+    {
+        Exception e0 = new RuntimeException(  );
+
+        try
+        {
+            sut.add( e0 );
+            sut.throwRuntimeExceptionIfHasCauses( "test msg" );
+        }
+
+        catch ( RuntimeException e )
+        {
+            assertThat( e, sameInstance( (Throwable) e0 ) );
+            return;
+        }
+
+        fail( "must throw RuntimeException" );
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/AggregatedExceptionTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/AggregatedExceptionTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/AggregatedExceptionTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ApplicationManagedEntityManagerFactoryProviderTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/ApplicationManagedEntityManagerFactoryProviderTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/ApplicationManagedEntityManagerFactoryProviderTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/ApplicationManagedEntityManagerFactoryProviderTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,146 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.persistence.EntityManagerFactory;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.sameInstance;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.*;
+
+/**
+ * Test for {@link ApplicationManagedEntityManagerFactoryProviderTest}.
+ */
+public class ApplicationManagedEntityManagerFactoryProviderTest
+{
+    private ApplicationManagedEntityManagerFactoryProvider sut;
+
+    private EntityManagerFactory emf;
+
+    private EntityManagerFactoryFactory emfFactory;
+
+    @Before
+    public void setup()
+    {
+        // input
+        emfFactory = mock( EntityManagerFactoryFactory.class );
+
+        // subject under test
+        sut = new ApplicationManagedEntityManagerFactoryProvider( emfFactory );
+
+        // helpers
+        emf = mock( EntityManagerFactory.class );
+        doReturn( emf ).when( emfFactory ).createApplicationManagedEntityManagerFactory();
+    }
+
+    @Test
+    public void isRunningShouldReturnFalseBeforeStarting()
+    {
+        assertThat( sut.isRunning(), is( false ) );
+    }
+
+    @Test
+    public void stoppingWhenNotRunningShouldDoNothing()
+    {
+        sut.stop();
+
+        assertThat( sut.isRunning(), is( false ) );
+    }
+
+    @Test
+    public void isRunningShouldReturnTrueAfterStarting()
+    {
+        sut.start();
+
+        assertThat( sut.isRunning(), is( true ) );
+        verify( emfFactory ).createApplicationManagedEntityManagerFactory();
+    }
+
+    @Test( expected = IllegalStateException.class )
+    public void startingAfterAlreadyStartedShouldThrowException()
+    {
+        sut.start();
+        sut.start();
+    }
+
+    @Test
+    public void isRunningShouldReturnFalseAfterStartingAndStopping()
+    {
+        sut.start();
+        sut.stop();
+
+        assertThat( sut.isRunning(), is( false ) );
+        verify( emf ).close();
+    }
+
+    @Test
+    public void restartingShouldWork()
+    {
+        sut.start();
+        sut.stop();
+        sut.start();
+
+        assertThat( sut.isRunning(), is( true ) );
+        verify( emfFactory, times( 2 ) ).createApplicationManagedEntityManagerFactory();
+        verify( emf ).close();
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void stopShouldWorkEvenInCaseOfException()
+    {
+        doThrow( new RuntimeException() ).when( emf ).close();
+
+        sut.start();
+        try
+        {
+            sut.stop();
+        }
+        finally
+        {
+
+            assertThat( sut.isRunning(), is( false ) );
+            verify( emf ).close();
+        }
+    }
+
+    @Test( expected = IllegalStateException.class )
+    public void getShouldThrowExceptionWhenNotStarted()
+    {
+        sut.get();
+    }
+
+    @Test
+    public void getShouldReturnEmf()
+    {
+        sut.start();
+
+        assertThat( sut.get(), sameInstance( emf ) );
+    }
+
+    @Test( expected = NullPointerException.class )
+    public void emfFactoryIsMandatory()
+    {
+        new ApplicationManagedEntityManagerFactoryProvider( null );
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ApplicationManagedEntityManagerFactoryProviderTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ApplicationManagedEntityManagerFactoryProviderTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ApplicationManagedEntityManagerFactoryProviderTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ContainerManagedEntityManagerFactoryProviderTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/ContainerManagedEntityManagerFactoryProviderTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/ContainerManagedEntityManagerFactoryProviderTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/ContainerManagedEntityManagerFactoryProviderTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,128 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.persistence.EntityManagerFactory;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.sameInstance;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.*;
+
+/**
+ * Test for {@link ContainerManagedEntityManagerFactoryProvider}.
+ */
+public class ContainerManagedEntityManagerFactoryProviderTest
+{
+    private ContainerManagedEntityManagerFactoryProvider sut;
+
+    private EntityManagerFactory emf;
+
+    private EntityManagerFactorySource emfSource;
+
+    @Before
+    public void setup()
+    {
+        // input
+        emfSource = mock( EntityManagerFactorySource.class );
+
+        // subject under test
+        sut = new ContainerManagedEntityManagerFactoryProvider( emfSource );
+
+        // helpers
+        emf = mock( EntityManagerFactory.class );
+        doReturn( emf ).when( emfSource ).getEntityManagerFactory();
+    }
+
+    @Test
+    public void isRunningShouldReturnFalseBeforeStarting()
+    {
+        assertThat( sut.isRunning(), is( false ) );
+    }
+
+    @Test
+    public void stoppingWhenNotRunningShouldDoNothing()
+    {
+        sut.stop();
+
+        assertThat( sut.isRunning(), is( false ) );
+    }
+
+    @Test
+    public void isRunningShouldReturnTrueAfterStarting()
+    {
+        sut.start();
+
+        assertThat( sut.isRunning(), is( true ) );
+        verify( emfSource ).getEntityManagerFactory();
+    }
+
+    @Test( expected = IllegalStateException.class )
+    public void startingAfterAlreadyStartedShouldThrowException()
+    {
+        sut.start();
+        sut.start();
+    }
+
+    @Test
+    public void isRunningShouldReturnFalseAfterStartingAndStopping()
+    {
+        sut.start();
+        sut.stop();
+
+        assertThat( sut.isRunning(), is( false ) );
+        verify( emf, never() ).close();
+    }
+
+    @Test
+    public void restartingShouldWork()
+    {
+        sut.start();
+        sut.stop();
+        sut.start();
+
+        assertThat( sut.isRunning(), is( true ) );
+        verify( emfSource, times( 2 ) ).getEntityManagerFactory();
+        verify( emf, never() ).close();
+    }
+
+    @Test( expected = IllegalStateException.class )
+    public void getShouldThrowExceptionWhenNotStarted()
+    {
+        sut.get();
+    }
+
+    @Test
+    public void getShouldReturnEmf()
+    {
+        sut.start();
+
+        assertThat( sut.get(), sameInstance( emf ) );
+    }
+
+    @Test( expected = NullPointerException.class )
+    public void emfSourceIsMandatory()
+    {
+        new ContainerManagedEntityManagerFactoryProvider( null );
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ContainerManagedEntityManagerFactoryProviderTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ContainerManagedEntityManagerFactoryProviderTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ContainerManagedEntityManagerFactoryProviderTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactoryFactoryTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactoryFactoryTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactoryFactoryTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactoryFactoryTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,68 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.persistence.EntityManagerFactory;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Test for {@link EntityManagerFactoryFactory}.
+ */
+public class EntityManagerFactoryFactoryTest
+{
+
+    private static final String TEST_KEY = "testKey";
+
+    private static final String TEST_VALUE = "testValue";
+
+    private static final String PU_NAME = "testUnit";
+
+    private static final String PU_KEY = "hibernate.ejb.persistenceUnitName";
+
+    private EntityManagerFactoryFactory sut;
+
+    private Properties properties;
+
+    @Before
+    public void setUp()
+        throws Exception
+    {
+        properties = new Properties(  );
+        sut = new EntityManagerFactoryFactory( PU_NAME, properties );
+    }
+
+    @Test
+    public void shouldCreateAnInstanceWithThePassedValues()
+    {
+        // given
+        properties.setProperty( TEST_KEY, TEST_VALUE );
+        // when
+        final EntityManagerFactory result = sut.createApplicationManagedEntityManagerFactory();
+        // then
+        assertThat( result.getProperties().get( PU_KEY ), is( (Object) PU_NAME ) );
+        assertThat( result.getProperties().get( TEST_KEY ), is( (Object) TEST_VALUE ) );
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactoryFactoryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactoryFactoryTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactoryFactoryTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceByJndiLookupTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceByJndiLookupTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceByJndiLookupTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceByJndiLookupTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,56 @@
+package org.apache.onami.persist;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.persistence.EntityManagerFactory;
+
+import static org.hamcrest.CoreMatchers.sameInstance;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+public class EntityManagerFactorySourceByJndiLookupTest
+{
+
+    public static final String JNDI_NAME = "jndiName";
+
+    private EntityManagerFactorySourceByJndiLookup sut;
+
+    private JndiLookupHelper jndiLookupHelper;
+
+    @Before
+    public void setUp()
+        throws Exception
+    {
+        jndiLookupHelper = mock( JndiLookupHelper.class );
+        sut = new EntityManagerFactorySourceByJndiLookup( JNDI_NAME, jndiLookupHelper );
+    }
+
+
+    @Test
+    public void shouldLookupEmfByJndiName()
+        throws Exception
+    {
+        // given
+        final EntityManagerFactory emf = mock( EntityManagerFactory.class );
+        doReturn( emf ).when( jndiLookupHelper ).doJndiLookup( EntityManagerFactory.class, JNDI_NAME );
+        // when
+        final EntityManagerFactory result = sut.getEntityManagerFactory();
+        // then
+        assertThat( result, sameInstance( emf ) );
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void jndiNameIsMandatory()
+    {
+        new EntityManagerFactorySourceByJndiLookup( null, jndiLookupHelper );
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void jndiLookupHelperIsMandatory()
+    {
+        new EntityManagerFactorySourceByJndiLookup( JNDI_NAME, null );
+    }
+
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceByJndiLookupTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceByJndiLookupTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceByJndiLookupTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceViaProviderTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceViaProviderTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceViaProviderTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceViaProviderTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,39 @@
+package org.apache.onami.persist;
+
+import com.google.inject.Provider;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.persistence.EntityManagerFactory;
+
+import static org.hamcrest.CoreMatchers.sameInstance;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+public class EntityManagerFactorySourceViaProviderTest
+{
+    private EntityManagerFactorySourceViaProvider sut;
+
+    private Provider<EntityManagerFactory> emfProvider;
+
+    @Before
+    @SuppressWarnings( "unchecked" )
+    public void setUp()
+        throws Exception
+    {
+        emfProvider = mock(Provider.class);
+        sut = new EntityManagerFactorySourceViaProvider( emfProvider );
+    }
+
+    @Test
+    public void shouldReturnValueFromProvider() {
+        // given
+        EntityManagerFactory emfDummy = mock(EntityManagerFactory.class);
+        doReturn( emfDummy ).when( emfProvider ).get();
+        // when
+        final EntityManagerFactory result = sut.getEntityManagerFactory();
+        // then
+        assertThat(result, sameInstance(emfDummy));
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceViaProviderTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceViaProviderTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerFactorySourceViaProviderTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,179 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.sameInstance;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.*;
+
+/**
+ * Test for {@link EntityManagerProviderImpl}.
+ */
+public class EntityManagerProviderImplTest
+{
+    private EntityManagerProviderImpl sut;
+
+    private EntityManagerFactoryProvider emfProvider;
+
+    private EntityManager em;
+
+    private Properties properties;
+
+    private EntityManagerFactory emf;
+
+    @Before
+    public void setUp()
+    {
+        // input
+        emfProvider = mock( EntityManagerFactoryProvider.class );
+        properties = new Properties();
+
+        // subject under test
+        sut = new EntityManagerProviderImpl( emfProvider, properties );
+
+        // helpers
+        emf = mock( EntityManagerFactory.class );
+        doReturn( emf ).when( emfProvider ).get();
+
+        em = mock( EntityManager.class );
+        doReturn( em ).when( emf ).createEntityManager( properties );
+    }
+
+    @Test
+    public void newInstanceShouldNotBeActive()
+    {
+        assertThat( sut.isActive(), is( false ) );
+    }
+
+    @Test
+    public void stoppingShouldDoNothingIfNotActive()
+    {
+        sut.end();
+
+        assertThat( sut.isActive(), is( false ) );
+    }
+
+    @Test
+    public void shouldBeActiveAfterStarting()
+    {
+        sut.begin();
+
+        verify( emf ).createEntityManager( properties );
+        assertThat( sut.isActive(), is( true ) );
+    }
+
+    @Test
+    public void shouldNotBeActiveAfterStartingAndStopping()
+    {
+        sut.begin();
+        sut.end();
+
+        verify( emf ).createEntityManager( properties );
+        verify( em ).close();
+        assertThat( sut.isActive(), is( false ) );
+    }
+
+    @Test
+    public void shouldNotBeActiveAfterStartingAndStoppingEvenWhenExceptionThrown()
+    {
+        doThrow( new RuntimeException() ).when( em ).close();
+
+        try
+        {
+            sut.begin();
+            sut.end();
+        }
+
+        catch ( RuntimeException e )
+        {
+            verify( emf ).createEntityManager( properties );
+            verify( em ).close();
+            assertThat( sut.isActive(), is( false ) );
+            return;
+        }
+        fail( "expected RuntimeException to be thrown" );
+    }
+
+    @Test
+    public void restartingShouldWork()
+    {
+        sut.begin();
+        sut.end();
+        sut.begin();
+
+        verify( emf, times( 2 ) ).createEntityManager( properties );
+        verify( em ).close();
+        assertThat( sut.isActive(), is( true ) );
+    }
+
+    @Test( expected = IllegalStateException.class )
+    public void startingWhenActiveShouldThrowException()
+    {
+        sut.begin();
+        sut.begin();
+    }
+
+    @Test
+    public void shouldReturnTheEntityManager()
+    {
+        sut.begin();
+        final EntityManager result = sut.get();
+
+        assertThat( result, sameInstance( em ) );
+    }
+
+    @Test( expected = IllegalStateException.class )
+    public void shouldThrowExceptionWhenGettingEntityManagerAndUnitOfWorkIsNotActive()
+    {
+        sut.get();
+    }
+
+    @Test( expected = NullPointerException.class )
+    public void entityManagerFactoryProviderIsMandatory()
+    {
+        new EntityManagerProviderImpl( null, properties );
+    }
+
+    @Test
+    public void propertiesAreOptional()
+    {
+        new EntityManagerProviderImpl( emfProvider, null );
+    }
+
+    @Test
+    public void shouldCreateEntityManagerWithoutPropertiesIfNull()
+    {
+        doReturn( em ).when( emf ).createEntityManager();
+        sut = new EntityManagerProviderImpl( emfProvider, null );
+
+        sut.begin();
+
+        verify( emf ).createEntityManager();
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplThreadingTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplThreadingTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplThreadingTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplThreadingTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,119 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import java.util.concurrent.CountDownLatch;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.*;
+
+/**
+ * Test for {@link org.apache.onami.persist.EntityManagerProviderImpl}.
+ * This class tests the behavior of the impl in the context of multiple threads.
+ */
+public class EntityManagerProviderImplThreadingTest
+{
+    private EntityManagerProviderImpl sut;
+
+    private EntityManagerFactory emf;
+
+    @Before
+    public void setUp()
+    {
+        // input
+        final EntityManagerFactoryProvider emfProvider = mock( EntityManagerFactoryProvider.class );
+
+        // subject under test
+        sut = new EntityManagerProviderImpl( emfProvider, null );
+
+        // helpers
+        emf = mock( EntityManagerFactory.class );
+        doReturn( emf ).when( emfProvider ).get();
+
+        doAnswer( new Answer()
+        {
+            public Object answer( InvocationOnMock invocation )
+                throws Throwable
+            {
+                return mock( EntityManager.class );
+            }
+        } ).when( emf ).createEntityManager();
+    }
+
+    @Test
+    public void beginShouldBeCallableFromMultipleThreads()
+    {
+        for ( int i = 0; i < 5; i++ )
+        {
+            new Thread( new Runnable()
+            {
+                public void run()
+                {
+                    assertThat( sut.isActive(), is( false ) );
+
+                    sut.begin();
+
+                    assertThat( sut.isActive(), is( true ) );
+                }
+            } ).start();
+        }
+    }
+
+    @Test
+    public void getShouldReturnTheSameInstanceInTheSameThread()
+        throws Exception
+    {
+        final int numThreads = 5;
+        final CountDownLatch latch = new CountDownLatch( numThreads );
+        for ( int i = 0; i < numThreads; i++ )
+        {
+            new Thread( new Runnable()
+            {
+                public void run()
+                {
+                    sut.begin();
+
+                    final EntityManager em1 = sut.get();
+                    final EntityManager em2 = sut.get();
+                    final EntityManager em3 = sut.get();
+                    final EntityManager em4 = sut.get();
+
+                    latch.countDown();
+
+                    assertTrue( em1 == em2 );
+                    assertTrue( em1 == em3 );
+                    assertTrue( em1 == em4 );
+                }
+            } ).start();
+        }
+
+        latch.await();
+        verify( emf, times( numThreads ) ).createEntityManager();
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplThreadingTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplThreadingTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/EntityManagerProviderImplThreadingTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/InitialContextFactoryStub.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/InitialContextFactoryStub.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/InitialContextFactoryStub.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/InitialContextFactoryStub.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,64 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.spi.InitialContextFactory;
+import java.util.Hashtable;
+
+/**
+ * JNDI Context Factory for test.
+ */
+public class InitialContextFactoryStub
+    implements InitialContextFactory
+{
+
+    private static final ThreadLocal<Context> THREAD_LOCAL_CONTEXT = new ThreadLocal<Context>();
+
+    static
+    {
+        System.setProperty( Context.INITIAL_CONTEXT_FACTORY, InitialContextFactoryStub.class.getName() );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Context getInitialContext( Hashtable<?, ?> environment )
+        throws NamingException
+    {
+        final Context context = THREAD_LOCAL_CONTEXT.get();
+        if ( context == null )
+        {
+            throw new NamingException( "No context registered" );
+        }
+        return context;
+    }
+
+    /**
+     * Registers a context which will be returned when a lookup in the same thread is done.
+     *
+     * @param context the context to return for lookups made by the same thread.
+     */
+    public static void registerContext( Context context )
+    {
+        THREAD_LOCAL_CONTEXT.set( context );
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/InitialContextFactoryStub.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/InitialContextFactoryStub.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/InitialContextFactoryStub.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/JndiLookupHelperTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/JndiLookupHelperTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/JndiLookupHelperTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/JndiLookupHelperTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,70 @@
+package org.apache.onami.persist;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.persistence.EntityManagerFactory;
+
+import static org.hamcrest.CoreMatchers.sameInstance;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+
+public class JndiLookupHelperTest
+{
+
+    public static final String JNDI_NAME = "jndiName";
+
+    private JndiLookupHelper sut;
+
+    @Before
+    public void setUp()
+        throws Exception
+    {
+        sut = new JndiLookupHelper();
+    }
+
+
+    @Test
+    public void shouldLookupEmfByJndiName()
+        throws Exception
+    {
+        // given
+        final Context context = mock( Context.class );
+        final EntityManagerFactory emf = mock( EntityManagerFactory.class );
+        doReturn( emf ).when( context ).lookup( JNDI_NAME );
+        InitialContextFactoryStub.registerContext( context );
+        // when
+        final EntityManagerFactory result = sut.doJndiLookup( EntityManagerFactory.class, JNDI_NAME );
+        // then
+        assertThat( result, sameInstance( emf ) );
+    }
+
+    @Test( expected = NullPointerException.class )
+    public void shouldThrowExceptionIfContextReturnsNull()
+        throws Exception
+    {
+        // given
+        final Context context = mock( Context.class );
+        doReturn( null ).when( context ).lookup( JNDI_NAME );
+        InitialContextFactoryStub.registerContext( context );
+        // when
+        sut.doJndiLookup( EntityManagerFactory.class, JNDI_NAME );
+    }
+
+    @Test( expected = RuntimeException.class )
+    public void shouldWrapNamingException()
+        throws Exception
+    {
+        // given
+        final Context context = mock( Context.class );
+        doThrow( new NamingException() ).when( context ).lookup( JNDI_NAME );
+        InitialContextFactoryStub.registerContext( context );
+        // when
+        sut.doJndiLookup( EntityManagerFactory.class, JNDI_NAME );
+    }
+
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/JndiLookupHelperTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/JndiLookupHelperTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/JndiLookupHelperTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/JtaTransactionFacadeProviderTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/JtaTransactionFacadeProviderTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/JtaTransactionFacadeProviderTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/JtaTransactionFacadeProviderTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,145 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import de.bechte.junit.runners.context.HierarchicalContextRunner;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.persistence.EntityManager;
+
+import static org.mockito.Mockito.*;
+
+/**
+ * Test for {@link JtaTransactionFacadeFactory}.
+ */
+@RunWith( HierarchicalContextRunner.class )
+public class JtaTransactionFacadeProviderTest
+{
+    private JtaTransactionFacadeFactory sut;
+
+    private UserTransactionFacade utFacade;
+
+    private EntityManagerProvider emProvider;
+
+    private EntityManager em;
+
+    @Before
+    public void setUp()
+    {
+        // input
+        utFacade = mock( UserTransactionFacade.class );
+        emProvider = mock( EntityManagerProvider.class );
+
+        // subject under test
+        sut = new JtaTransactionFacadeFactory( utFacade, emProvider );
+
+        // environment
+        em = mock( EntityManager.class );
+        doReturn( em ).when( emProvider ).get();
+    }
+
+    public class InnerTransactionTest
+    {
+
+        private TransactionFacade sut;
+
+        @Before
+        public void setUp()
+        {
+            doReturn( true ).when( utFacade ).isActive();
+            sut = JtaTransactionFacadeProviderTest.this.sut.createTransactionFacade();
+        }
+
+        @Test
+        public void beginShouldDoNothing()
+        {
+            sut.begin();
+
+            verify( utFacade, never() ).begin();
+            verify( em ).joinTransaction();
+        }
+
+        @Test
+        public void commitShouldDoNothing()
+        {
+            sut.commit();
+
+            verify( utFacade, never() ).commit();
+        }
+
+        @Test
+        public void rollbackShouldSetRollbackOnlyFlag()
+        {
+            sut.rollback();
+
+            verify( utFacade ).setRollbackOnly();
+        }
+    }
+
+    public class OuterTransactionTest
+    {
+
+        private TransactionFacade sut;
+
+        @Before
+        public void setUp()
+        {
+            doReturn( false ).when( utFacade ).isActive();
+            sut = JtaTransactionFacadeProviderTest.this.sut.createTransactionFacade();
+        }
+
+        @Test
+        public void beginShouldBeginTransaction()
+        {
+            sut.begin();
+
+            verify( utFacade ).begin();
+            verify( em ).joinTransaction();
+        }
+
+        @Test
+        public void commitShouldCommitTransaction()
+        {
+            sut.commit();
+
+            verify( utFacade ).commit();
+        }
+
+        @Test
+        public void commitShouldRollbackTransactionIfMarkedAsRollbackOnly()
+        {
+            doReturn( true ).when( utFacade ).getRollbackOnly();
+
+            sut.commit();
+
+            verify( utFacade ).rollback();
+        }
+
+        @Test
+        public void rollbackShouldRollbackTransaction()
+        {
+            sut.rollback();
+
+            verify( utFacade ).rollback();
+        }
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/JtaTransactionFacadeProviderTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/JtaTransactionFacadeProviderTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/JtaTransactionFacadeProviderTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/OtherPersistenceUnit.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/OtherPersistenceUnit.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/OtherPersistenceUnit.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/OtherPersistenceUnit.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,34 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation for unit tests.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
+public @interface OtherPersistenceUnit
+{
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/OtherPersistenceUnit.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/OtherPersistenceUnit.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/OtherPersistenceUnit.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceFilterTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceFilterTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceFilterTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceFilterTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,111 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InOrder;
+
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import static org.mockito.Mockito.*;
+
+/**
+ * Test for {@link PersistenceFilter}.
+ */
+public class PersistenceFilterTest
+{
+    private PersistenceFilter sut;
+
+    private PersistenceUnitContainer persistenceUnitsContainer;
+
+    @Before
+    public void setUp()
+        throws Exception
+    {
+        persistenceUnitsContainer = mock( PersistenceUnitContainer.class );
+        sut = new PersistenceFilter( persistenceUnitsContainer );
+    }
+
+    @Test
+    public void initShouldStartService()
+        throws Exception
+    {
+        sut.init( mock( FilterConfig.class ) );
+        verify( persistenceUnitsContainer ).startAllStoppedPersistenceServices();
+    }
+
+    @Test
+    public void destroyShouldStopService()
+    {
+        sut.destroy();
+        verify( persistenceUnitsContainer ).stopAllRunningPersistenceServices();
+    }
+
+    @Test
+    public void doFilterShouldSpanUnitOfWork()
+        throws Exception
+    {
+        // given
+        final FilterChain chain = mock( FilterChain.class );
+        final InOrder inOrder = inOrder( persistenceUnitsContainer, chain );
+
+        final ServletRequest request = mock( ServletRequest.class );
+        final ServletResponse response = mock( ServletResponse.class );
+
+        // when
+        sut.doFilter( request, response, chain );
+
+        // then
+        inOrder.verify( persistenceUnitsContainer ).beginAllInactiveUnitsOfWork();
+        inOrder.verify( chain ).doFilter( request, response );
+        inOrder.verify( persistenceUnitsContainer ).endAllUnitsOfWork();
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void doFilterShouldEndUnitOfWorkInCaseOfException()
+        throws Exception
+    {
+        // given
+        final FilterChain chain = mock( FilterChain.class );
+        final InOrder inOrder = inOrder( persistenceUnitsContainer, chain );
+
+        final ServletRequest request = mock( ServletRequest.class );
+        final ServletResponse response = mock( ServletResponse.class );
+
+        doThrow( new RuntimeException() ).when( chain ).doFilter( request, response );
+
+        // when
+        try
+        {
+            sut.doFilter( request, response, chain );
+        }
+        // then
+        finally
+        {
+            inOrder.verify( persistenceUnitsContainer ).beginAllInactiveUnitsOfWork();
+            inOrder.verify( chain ).doFilter( request, response );
+            inOrder.verify( persistenceUnitsContainer ).endAllUnitsOfWork();
+        }
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceFilterTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceFilterTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceFilterTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceUnitContainerTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceUnitContainerTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceUnitContainerTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceUnitContainerTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,244 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.*;
+
+/**
+ * Test for {@link PersistenceUnitContainer}.
+ */
+public class PersistenceUnitContainerTest
+{
+    private PersistenceUnitContainer sut;
+
+    private PersistenceService ps1;
+
+    private PersistenceService ps2;
+
+    private UnitOfWork uow1;
+
+    private UnitOfWork uow2;
+
+    @Before
+    public void setUp()
+        throws Exception
+    {
+        sut = new PersistenceUnitContainer();
+
+        ps1 = mock( PersistenceService.class );
+        ps2 = mock( PersistenceService.class );
+
+        uow1 = mock( UnitOfWork.class );
+        uow2 = mock( UnitOfWork.class );
+
+        sut.add( ps1, uow1 );
+        sut.add( ps2, uow2 );
+    }
+
+    @Test
+    public void shouldStartOnAllPersistenceServices()
+        throws Exception
+    {
+        // when
+        sut.startAllStoppedPersistenceServices();
+
+        // then
+        verify( ps1 ).start();
+        verify( ps2 ).start();
+    }
+
+    @Test
+    public void shouldStartOnRunningPersistenceServices()
+        throws Exception
+    {
+        // given
+        doReturn( true ).when( ps1 ).isRunning();
+        doReturn( true ).when( ps2 ).isRunning();
+
+        // when
+        sut.startAllStoppedPersistenceServices();
+
+        // then
+        verify( ps1, never() ).start();
+        verify( ps2, never() ).start();
+    }
+
+    @Test
+    public void shouldStartOnAllPersistenceServicesEvenInCaseOfException()
+        throws Exception
+    {
+        // given
+        doThrow( new RuntimeException() ).when( ps1 ).start();
+        doThrow( new RuntimeException() ).when( ps2 ).start();
+
+        // when
+        try
+        {
+            sut.startAllStoppedPersistenceServices();
+        }
+
+        // then
+        catch ( AggregatedException e )
+        {
+            verify( ps1 ).start();
+            verify( ps2 ).start();
+            assertThat( e.getNumCauses(), is( 2 ) );
+            return;
+        }
+
+        fail( "must throw AggregatedException" );
+    }
+
+    @Test
+    public void shouldStopOnAllPersistenceServices()
+        throws Exception
+    {
+        // when
+        sut.stopAllRunningPersistenceServices();
+
+        // then
+        verify( ps1 ).stop();
+        verify( ps2 ).stop();
+    }
+
+    @Test
+    public void shouldStopOnAllPersistenceServicesEvenInCaseOfException()
+        throws Exception
+    {
+        // given
+        doThrow( new RuntimeException() ).when( ps1 ).stop();
+        doThrow( new RuntimeException() ).when( ps2 ).stop();
+
+        // when
+        try
+        {
+            sut.stopAllRunningPersistenceServices();
+        }
+
+        // then
+        catch ( AggregatedException e )
+        {
+            verify( ps1 ).stop();
+            verify( ps2 ).stop();
+            assertThat( e.getNumCauses(), is( 2 ) );
+            return;
+        }
+
+        fail( "must throw AggregatedException" );
+    }
+
+    @Test
+    public void shouldBeginOnAllUnitsOfWork()
+        throws Exception
+    {
+        // when
+        sut.beginAllInactiveUnitsOfWork();
+
+        // then
+        verify( uow1 ).begin();
+        verify( uow2 ).begin();
+    }
+
+    @Test
+    public void shouldNotBeginOnActiveUnitsOfWork()
+        throws Exception
+    {
+        // given
+        doReturn( true ).when( uow1 ).isActive();
+        doReturn( true ).when( uow2 ).isActive();
+
+        // when
+        sut.beginAllInactiveUnitsOfWork();
+
+        // then
+        verify( uow1, never() ).begin();
+        verify( uow2, never() ).begin();
+    }
+
+    @Test
+    public void shouldBeginOnAllUnitsOfWorkEvenInCaseOfException()
+        throws Exception
+    {
+        // given
+        doThrow( new RuntimeException() ).when( uow1 ).begin();
+        doThrow( new RuntimeException() ).when( uow2 ).begin();
+
+        // when
+        try
+        {
+            sut.beginAllInactiveUnitsOfWork();
+        }
+
+        // then
+        catch ( AggregatedException e )
+        {
+            verify( uow1 ).begin();
+            verify( uow2 ).begin();
+            assertThat( e.getNumCauses(), is( 2 ) );
+            return;
+        }
+
+        fail( "must throw AggregatedException" );
+    }
+
+    @Test
+    public void shouldEndOnAllUnitsOfWork()
+        throws Exception
+    {
+        // when
+        sut.endAllUnitsOfWork();
+
+        // then
+        verify( uow1 ).end();
+        verify( uow2 ).end();
+    }
+
+    @Test
+    public void shouldEndOnAllUnitsOfWorkEvenInCaseOfException()
+        throws Exception
+    {
+        // given
+        doThrow( new RuntimeException() ).when( uow1 ).end();
+        doThrow( new RuntimeException() ).when( uow2 ).end();
+
+        // when
+        try
+        {
+            sut.endAllUnitsOfWork();
+        }
+
+        // then
+        catch ( AggregatedException e )
+        {
+            verify( uow1 ).end();
+            verify( uow2 ).end();
+            assertThat( e.getNumCauses(), is( 2 ) );
+            return;
+        }
+
+        fail( "must throw AggregatedException" );
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceUnitContainerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceUnitContainerTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PersistenceUnitContainerTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PreconditionsTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/PreconditionsTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/PreconditionsTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/PreconditionsTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,89 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+/**
+ * Test for {@link Preconditions}.
+ */
+public class PreconditionsTest
+{
+
+    private static final String MESSAGE = "test message";
+
+    @Test
+    public void throwing()
+        throws Exception
+    {
+        try
+        {
+            Preconditions.checkNotNull( null );
+        }
+        catch ( NullPointerException e )
+        {
+            assertThat( e.getMessage(), is( nullValue() ) );
+            return;
+        }
+        fail( "expected NullPointerException to be thrown" );
+    }
+
+    @Test
+    public void notThrowing()
+    {
+        final Object input = new Object();
+        final Object result = Preconditions.checkNotNull( input );
+        assertThat( result, sameInstance( input ) );
+    }
+
+    @Test
+    public void throwingWithMessage()
+        throws Exception
+    {
+        try
+        {
+            Preconditions.checkNotNull( null, MESSAGE );
+        }
+        catch ( NullPointerException e )
+        {
+            assertThat( e.getMessage(), is( MESSAGE ) );
+            return;
+        }
+        fail( "expected NullPointerException to be thrown" );
+    }
+
+    @Test
+    public void notThrowingWithMessage()
+    {
+        final Object input = new Object();
+        final Object result = Preconditions.checkNotNull( input, MESSAGE );
+        assertThat( result, sameInstance( input ) );
+    }
+
+    @Test
+    public void canBeCreated()
+    {
+        new Preconditions();
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PreconditionsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PreconditionsTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/PreconditionsTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ResourceLocalTransactionFacadeProviderTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/ResourceLocalTransactionFacadeProviderTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/ResourceLocalTransactionFacadeProviderTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/ResourceLocalTransactionFacadeProviderTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,146 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import de.bechte.junit.runners.context.HierarchicalContextRunner;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityTransaction;
+
+import static org.mockito.Mockito.*;
+
+/**
+ * Test for {@link ResourceLocalTransactionFacadeFactory}.
+ */
+@RunWith( HierarchicalContextRunner.class )
+public class ResourceLocalTransactionFacadeProviderTest
+{
+    private ResourceLocalTransactionFacadeFactory sut;
+
+    private EntityManagerProvider emProvider;
+
+    private EntityManager em;
+
+    private EntityTransaction txn;
+
+    @Before
+    public void setUp()
+    {
+        // input
+        emProvider = mock( EntityManagerProvider.class );
+
+        // subject under test
+        sut = new ResourceLocalTransactionFacadeFactory( emProvider );
+
+        // environment
+        em = mock( EntityManager.class );
+        doReturn( em ).when( emProvider ).get();
+
+        txn = mock( EntityTransaction.class );
+        doReturn( txn ).when( em ).getTransaction();
+    }
+
+    public class InnerTransactionTest
+    {
+
+        private TransactionFacade sut;
+
+        @Before
+        public void setUp()
+        {
+            doReturn( true ).when( txn ).isActive();
+            sut = ResourceLocalTransactionFacadeProviderTest.this.sut.createTransactionFacade();
+        }
+
+        @Test
+        public void beginShouldDoNothing()
+        {
+            sut.begin();
+
+            verify( txn, never() ).begin();
+        }
+
+        @Test
+        public void commitShouldDoNothing()
+        {
+            sut.commit();
+
+            verify( txn, never() ).commit();
+        }
+
+        @Test
+        public void rollbackShouldSetRollbackOnlyFlag()
+        {
+            sut.rollback();
+
+            verify( txn ).setRollbackOnly();
+        }
+    }
+
+    public class OuterTransactionTest
+    {
+
+        private TransactionFacade sut;
+
+        @Before
+        public void setUp()
+        {
+            doReturn( false ).when( txn ).isActive();
+            sut = ResourceLocalTransactionFacadeProviderTest.this.sut.createTransactionFacade();
+        }
+
+        @Test
+        public void beginShouldBeginTransaction()
+        {
+            sut.begin();
+
+            verify( txn ).begin();
+        }
+
+        @Test
+        public void commitShouldCommitTransaction()
+        {
+            sut.commit();
+
+            verify( txn ).commit();
+        }
+
+        @Test
+        public void commitShouldRollbackTransactionIfMarkedAsRollbackOnly()
+        {
+            doReturn( true ).when( txn ).getRollbackOnly();
+
+            sut.commit();
+
+            verify( txn ).rollback();
+        }
+
+        @Test
+        public void rollbackShouldRollbackTransaction()
+        {
+            sut.rollback();
+
+            verify( txn ).rollback();
+        }
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ResourceLocalTransactionFacadeProviderTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ResourceLocalTransactionFacadeProviderTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/ResourceLocalTransactionFacadeProviderTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TestPersistenceUnit.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/TestPersistenceUnit.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/TestPersistenceUnit.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/TestPersistenceUnit.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,34 @@
+package org.apache.onami.persist;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation for unit tests.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
+public @interface TestPersistenceUnit
+{
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TestPersistenceUnit.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TestPersistenceUnit.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TestPersistenceUnit.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationHelperTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationHelperTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationHelperTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationHelperTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,210 @@
+package org.apache.onami.persist;
+
+import de.bechte.junit.runners.context.HierarchicalContextRunner;
+import org.aopalliance.intercept.MethodInvocation;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.lang.annotation.Annotation;
+import java.security.InvalidParameterException;
+import java.util.IllegalFormatException;
+import java.util.MissingFormatArgumentException;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+/**
+ * Test for {@link TransactionalAnnotationHelper}.
+ */
+@RunWith( HierarchicalContextRunner.class )
+public class TransactionalAnnotationHelperTest
+{
+
+    private TransactionalAnnotationHelper sut;
+
+    private TransactionalAnnotationReader txnAnnoReader;
+
+    Class<? extends Annotation> puAnntoation;
+
+    private MethodInvocation invocation;
+
+    private Transactional txnal;
+
+    @Before
+    public void setUp()
+        throws Exception
+    {
+        // input
+        txnAnnoReader = mock( TransactionalAnnotationReader.class );
+
+        // environment
+        invocation = mock( MethodInvocation.class );
+        txnal = mock( Transactional.class );
+
+        doReturn( txnal ).when( txnAnnoReader ).readAnnotationFrom( invocation );
+    }
+
+    public class WithoutPuAnnotation
+    {
+        @Before
+        public void setUp()
+            throws Exception
+        {
+            // input
+            puAnntoation = null;
+
+            // subject under test
+            sut = new TransactionalAnnotationHelper( new AnnotationHolder( puAnntoation ), txnAnnoReader );
+        }
+
+        @Test
+        public void participatesInTxnWhenUnitsIsNull()
+        {
+            doReturn( null ).when( txnal ).onUnits();
+            final boolean result = sut.persistenceUnitParticipatesInTransactionFor( invocation );
+            assertThat( result, is( true ) );
+        }
+
+        @Test
+        public void participatesInTxnWhenUnitsIsEmpty()
+        {
+            doReturn( new Class[]{ } ).when( txnal ).onUnits();
+            final boolean result = sut.persistenceUnitParticipatesInTransactionFor( invocation );
+            assertThat( result, is( true ) );
+        }
+
+        @Test
+        public void participatesInTxnWhenUnitsContainsPuAnnotation()
+        {
+            doReturn( new Class[]{ TestPersistenceUnit.class } ).when( txnal ).onUnits();
+            final boolean result = sut.persistenceUnitParticipatesInTransactionFor( invocation );
+            assertThat( result, is( true ) );
+        }
+
+        @Test
+        public void participatesInTxnWhenUnitsContainsNotPuAnnotation()
+        {
+            doReturn( new Class[]{ OtherPersistenceUnit.class } ).when( txnal ).onUnits();
+            final boolean result = sut.persistenceUnitParticipatesInTransactionFor( invocation );
+            assertThat( result, is( true ) );
+        }
+    }
+
+    public class WithPuAnnotation
+    {
+        @Before
+        public void setUp()
+            throws Exception
+        {
+            // input
+            puAnntoation = TestPersistenceUnit.class;
+
+            // subject under test
+            sut = new TransactionalAnnotationHelper( new AnnotationHolder( puAnntoation ), txnAnnoReader );
+        }
+
+        @Test
+        public void participatesInTxnWhenUnitsIsNull()
+        {
+            doReturn( null ).when( txnal ).onUnits();
+            final boolean result = sut.persistenceUnitParticipatesInTransactionFor( invocation );
+            assertThat( result, is( true ) );
+        }
+
+        @Test
+        public void participatesInTxnWhenUnitsIsEmpty()
+        {
+            doReturn( new Class[]{ } ).when( txnal ).onUnits();
+            final boolean result = sut.persistenceUnitParticipatesInTransactionFor( invocation );
+            assertThat( result, is( true ) );
+        }
+
+        @Test
+        public void participatesInTxnWhenUnitsContainsPuAnnotation()
+        {
+            doReturn( new Class[]{ TestPersistenceUnit.class } ).when( txnal ).onUnits();
+            final boolean result = sut.persistenceUnitParticipatesInTransactionFor( invocation );
+            assertThat( result, is( true ) );
+        }
+
+        @Test
+        public void participatesNotInTxnWhenUnitsContainsNotPuAnnotation()
+        {
+            doReturn( new Class[]{ OtherPersistenceUnit.class } ).when( txnal ).onUnits();
+            final boolean result = sut.persistenceUnitParticipatesInTransactionFor( invocation );
+            assertThat( result, is( false ) );
+        }
+    }
+
+    public class RollbackOnIllegalArgumentExceptionIgnoreIllegalFormatException
+    {
+        @Before
+        public void setUp()
+            throws Exception
+        {
+            // input
+            puAnntoation = null;
+
+            // subject under test
+            sut = new TransactionalAnnotationHelper( new AnnotationHolder( puAnntoation ), txnAnnoReader );
+
+            doReturn( new Class[]{ IllegalArgumentException.class, IllegalStateException.class } )
+                .when( txnal ).rollbackOn();
+            doReturn( new Class[]{ IllegalFormatException.class, NumberFormatException.class } ).when( txnal ).ignore();
+        }
+
+        @Test
+        public void shouldRollbackOnIllegalArgumentException()
+        {
+            Throwable exc = new IllegalArgumentException();
+            final boolean result = sut.isRollbackNecessaryFor( invocation, exc );
+            assertThat( result, is( true ) );
+        }
+
+        @Test
+        public void shouldRollbackOnIllegalStateException()
+        {
+            Throwable exc = new IllegalStateException();
+            final boolean result = sut.isRollbackNecessaryFor( invocation, exc );
+            assertThat( result, is( true ) );
+        }
+
+        @Test
+        public void shouldRollbackOnInvalidParameterException()
+        {
+            Throwable exc = new InvalidParameterException();
+            final boolean result = sut.isRollbackNecessaryFor( invocation, exc );
+            assertThat( result, is( true ) );
+        }
+
+        @Test
+        public void shouldNotRollbackOnNumberFormatException()
+        {
+            Throwable exc = new NumberFormatException();
+            final boolean result = sut.isRollbackNecessaryFor( invocation, exc );
+            assertThat( result, is( false ) );
+        }
+
+        @Test
+        public void shouldNotRollbackOnMissingFormatArgumentException()
+        {
+            Throwable exc = new MissingFormatArgumentException( "" );
+            final boolean result = sut.isRollbackNecessaryFor( invocation, exc );
+            assertThat( result, is( false ) );
+        }
+
+        @Test
+        public void shouldNotRollbackOnRuntimeException()
+        {
+            Throwable exc = new RuntimeException();
+            final boolean result = sut.isRollbackNecessaryFor( invocation, exc );
+            assertThat( result, is( false ) );
+        }
+
+
+    }
+
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationHelperTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationHelperTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationHelperTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationMatcher.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationMatcher.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationMatcher.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationMatcher.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,67 @@
+package org.apache.onami.persist;
+
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class TransactionalAnnotationMatcher
+    extends BaseMatcher<Transactional>
+{
+    public static TransactionalAnnotationMatcher transactionalAnnotation( Class[] expectedUnits,
+                                                                          Class[] expectedRollback,
+                                                                          Class[] expectedIgnore )
+    {
+        return new TransactionalAnnotationMatcher( expectedUnits, expectedRollback, expectedIgnore );
+    }
+
+    private final Set<Class> expectedUnits;
+
+    private final Set<Class> expectedRollback;
+
+    private final Set<Class> expectedIgnore;
+
+    private TransactionalAnnotationMatcher( Class[] expectedUnits, Class[] expectedRollback, Class[] expectedIgnore )
+    {
+        this.expectedUnits = asSet( expectedUnits );
+        this.expectedRollback = asSet( expectedRollback );
+        this.expectedIgnore = asSet( expectedIgnore );
+    }
+
+    public boolean matches( Object item )
+    {
+        if ( item instanceof Transactional )
+        {
+            Transactional transactional = (Transactional) item;
+            final Set<Class<? extends Annotation>> actualUnits = asSet( transactional.onUnits() );
+            final Set<Class<? extends Exception>> actualRollback = asSet( transactional.rollbackOn() );
+            final Set<Class<? extends Exception>> actualIgnore = asSet( transactional.ignore() );
+
+            return actualUnits.equals( expectedUnits ) && actualRollback.equals( expectedRollback )
+                && actualIgnore.equals( expectedIgnore );
+        }
+        return false;
+    }
+
+    private <T> Set<T> asSet( T... elements )
+    {
+        if ( elements == null )
+        {
+            return new HashSet<T>();
+        }
+        return new HashSet<T>( Arrays.asList( elements ) );
+    }
+
+    public void describeTo( Description description )
+    {
+        description
+            .appendText( "<@org.apache.onami.persist.Transactional(")
+            .appendText( "onUnits=" ).appendValueList( "[", ", ", "]", expectedUnits )
+            .appendText( ", rollbackOn=" ).appendValueList( "[", ", ", "]", expectedRollback )
+            .appendText( ", ignore=" ).appendValueList( "[", ", ", "]", expectedIgnore )
+            .appendText( ")>" );
+    }
+}

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationMatcher.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationMatcher.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationMatcher.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationReaderTest.java
URL: http://svn.apache.org/viewvc/onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationReaderTest.java?rev=1585487&view=auto
==============================================================================
--- onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationReaderTest.java (added)
+++ onami/sandbox/persist/src/test/java/org/apache/onami/persist/TransactionalAnnotationReaderTest.java Mon Apr  7 14:12:18 2014
@@ -0,0 +1,148 @@
+package org.apache.onami.persist;
+
+import org.aopalliance.intercept.MethodInvocation;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Method;
+
+/**
+ * Test for {@link TransactionalAnnotationReader}.
+ */
+public class TransactionalAnnotationReaderTest
+{
+    private TransactionalAnnotationReader sut;
+
+    @Before
+    public void setUp()
+        throws Exception
+    {
+        sut = new TransactionalAnnotationReader();
+    }
+
+    @Test
+    public void shouldReadFromMethodWithAnnotation()
+        throws Exception
+    {
+        final MethodInvocation invocation = methodInvocation( new WithMethodAnnotations(), "withAnno" );
+        final Transactional result = sut.readAnnotationFrom( invocation );
+
+        Assert.assertThat( result, TransactionalAnnotationMatcher.transactionalAnnotation(
+            new Class[]{ OtherPersistenceUnit.class }, new Class[]{ NullPointerException.class }, new Class[]{ } ) );
+    }
+
+    @Test
+    public void shouldReadFromClassWithAnnotation()
+        throws Exception
+    {
+        final MethodInvocation invocation = methodInvocation( new WithClassAnnotations(), "noAnno" );
+        final Transactional result = sut.readAnnotationFrom( invocation );
+
+        Assert.assertThat( result, TransactionalAnnotationMatcher.transactionalAnnotation(
+            new Class[]{ TestPersistenceUnit.class }, new Class[]{ IllegalArgumentException.class }, new Class[]{ } ) );
+    }
+
+    @Test
+    public void shouldReadFromDefaultsClassAndMethodWithoutAnnotation()
+        throws Exception
+    {
+        final MethodInvocation invocation = methodInvocation( new WithoutAnyAnnotations(), "noAnno" );
+        final Transactional result = sut.readAnnotationFrom( invocation );
+
+        Assert.assertThat( result, TransactionalAnnotationMatcher.transactionalAnnotation( new Class[]{ }, new Class[]{
+            RuntimeException.class }, new Class[]{ } ) );
+    }
+
+    @Test
+    public void shouldReadFromMethodWithAnnotationWhenBothClassAndMethodAnnotationAreGiven()
+        throws Exception
+    {
+        final MethodInvocation invocation = methodInvocation( new WithClassAndMethodAnnotations(), "withAnno" );
+        final Transactional result = sut.readAnnotationFrom( invocation );
+
+        Assert.assertThat( result, TransactionalAnnotationMatcher.transactionalAnnotation(
+            new Class[]{ OtherPersistenceUnit.class }, new Class[]{ NullPointerException.class }, new Class[]{ } ) );
+    }
+
+    // classes and methods to pass to the TransactionalAnnotationReader for testing
+
+    private static class WithoutAnyAnnotations
+    {
+        public void noAnno()
+        {
+            // nop
+        }
+    }
+
+    @Transactional( onUnits = TestPersistenceUnit.class, rollbackOn = IllegalArgumentException.class )
+    private static class WithClassAnnotations
+    {
+        public void noAnno()
+        {
+            // nop
+        }
+    }
+
+    private static class WithMethodAnnotations
+    {
+        @Transactional( onUnits = OtherPersistenceUnit.class, rollbackOn = NullPointerException.class )
+        public void withAnno()
+        {
+            // nop
+        }
+    }
+
+    @Transactional( onUnits = TestPersistenceUnit.class, rollbackOn = IllegalArgumentException.class )
+    private static class WithClassAndMethodAnnotations
+    {
+        @Transactional( onUnits = OtherPersistenceUnit.class, rollbackOn = NullPointerException.class )
+        public void withAnno()
+        {
+            // nop
+        }
+    }
+
+
+    private static MethodInvocation methodInvocation( final Object instance, String name )
+    {
+        try
+        {
+            final Method method = instance.getClass().getDeclaredMethod( name );
+            return new MethodInvocation()
+            {
+                public Method getMethod()
+                {
+                    return method;
+                }
+
+                public Object[] getArguments()
+                {
+                    throw new RuntimeException( "not implemented in mock" );
+                }
+
+                public Object proceed()
+                    throws Throwable
+                {
+                    throw new RuntimeException( "not implemented in mock" );
+                }
+
+                public Object getThis()
+                {
+                    return instance;
+                }
+
+                public AccessibleObject getStaticPart()
+                {
+                    throw new RuntimeException( "not implemented in mock" );
+                }
+            };
+        }
+        catch ( Exception e )
+        {
+            e.printStackTrace();
+            throw new RuntimeException( e );
+        }
+    }
+}