/*******************************************************************************
* Copyright (c) 2011, 2015 EclipseSource and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* EclipseSource - initial API and implementation
******************************************************************************/
package org.eclipse.rap.rwt;
import static org.eclipse.rap.rwt.test.util.AttributeStoreTestUtil.mockApplicationContextWithAttributeStore;
import static org.eclipse.rap.rwt.test.util.AttributeStoreTestUtil.mockUISessionWithAttributeStore;
import static org.eclipse.rap.rwt.testfixture.internal.ConcurrencyTestUtil.runInThread;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.mock;
import java.util.concurrent.atomic.AtomicReference;
import javax.servlet.http.HttpSession;
import org.eclipse.rap.rwt.internal.SingletonManager;
import org.eclipse.rap.rwt.internal.application.ApplicationContextImpl;
import org.eclipse.rap.rwt.internal.service.ContextProvider;
import org.eclipse.rap.rwt.internal.service.ServiceContext;
import org.eclipse.rap.rwt.internal.service.UISessionImpl;
import org.eclipse.rap.rwt.service.ApplicationContext;
import org.eclipse.rap.rwt.service.UISession;
import org.eclipse.rap.rwt.testfixture.internal.Fixture;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class SingletonUtil_Test {
@Before
public void setUp() {
Fixture.createApplicationContext();
Fixture.createServiceContext();
createUISession();
SingletonManager.install( ContextProvider.getUISession() );
}
@After
public void tearDown() {
if( ContextProvider.hasContext() ) {
Fixture.disposeOfServiceContext();
}
Fixture.disposeOfApplicationContext();
}
@Test( expected = NullPointerException.class )
public void testGetUniqueInstance_uiSession_failsWithNullType() {
SingletonUtil.getUniqueInstance( null, mock( UISession.class ) );
}
@Test( expected = NullPointerException.class )
public void testGetUniqueInstance_applicationContext_failsWithNullType() {
SingletonUtil.getUniqueInstance( null, mock( ApplicationContext.class ) );
}
@Test( expected = NullPointerException.class )
public void testGetUniqueInstance_uiSession_failsWithNullUISession() {
SingletonUtil.getUniqueInstance( TestSingleton.class, (UISession)null );
}
@Test( expected = NullPointerException.class )
public void testGetUniqueInstance_applicationContext_failsWithNullApplicationContext() {
SingletonUtil.getUniqueInstance( TestSingleton.class, (ApplicationContext)null );
}
@Test
public void testGetUniqueInstance_uiSession_returnsInstanceOfGivenClass() {
UISession uiSession = mockUISessionWithAttributeStore();
SingletonManager.install( uiSession );
Object instance = SingletonUtil.getUniqueInstance( TestSingleton.class, uiSession );
assertNotNull( instance );
assertSame( TestSingleton.class, instance.getClass() );
}
@Test
public void testGetUniqueInstance_applicationContext_returnsInstanceOfGivenClass() {
ApplicationContext applicationContext = mockApplicationContextWithAttributeStore();
SingletonManager.install( applicationContext );
Object instance = SingletonUtil.getUniqueInstance( TestSingleton.class, applicationContext );
assertNotNull( instance );
assertSame( TestSingleton.class, instance.getClass() );
}
@Test
public void testGetUniqueInstance_uiSession_returnsSameInstanceInSameScope() {
UISession uiSession = mockUISessionWithAttributeStore();
SingletonManager.install( uiSession );
Object instance1 = SingletonUtil.getUniqueInstance( TestSingleton.class, uiSession );
Object instance2 = SingletonUtil.getUniqueInstance( TestSingleton.class, uiSession );
assertSame( instance1, instance2 );
}
@Test
public void testGetUniqueInstance_applicationContext_returnsSameInstanceInSameScope() {
ApplicationContext applicationContext = mockApplicationContextWithAttributeStore();
SingletonManager.install( applicationContext );
Object instance1 = SingletonUtil.getUniqueInstance( TestSingleton.class, applicationContext );
Object instance2 = SingletonUtil.getUniqueInstance( TestSingleton.class, applicationContext );
assertSame( instance1, instance2 );
}
@Test
public void testGetUniqueInstance_uiSession_returnsNewInstanceInOtherScope() {
UISession uiSession1 = mockUISessionWithAttributeStore();
UISession uiSession2 = mockUISessionWithAttributeStore();
SingletonManager.install( uiSession1 );
SingletonManager.install( uiSession2 );
Object instance1 = SingletonUtil.getUniqueInstance( TestSingleton.class, uiSession1 );
Object instance2 = SingletonUtil.getUniqueInstance( TestSingleton.class, uiSession2 );
assertNotSame( instance1, instance2 );
}
@Test
public void testGetUniqueInstance_applicationContext_returnsNewInstanceInOtherScope() {
ApplicationContext applicationContext1 = mockApplicationContextWithAttributeStore();
ApplicationContext applicationContext2 = mockApplicationContextWithAttributeStore();
SingletonManager.install( applicationContext1 );
SingletonManager.install( applicationContext2 );
Object instance1 = SingletonUtil.getUniqueInstance( TestSingleton.class, applicationContext1 );
Object instance2 = SingletonUtil.getUniqueInstance( TestSingleton.class, applicationContext2 );
assertNotSame( instance1, instance2 );
}
@Test( expected = NullPointerException.class )
public void testGetSessionInstance_failsWithNullType() {
SingletonUtil.getSessionInstance( null );
}
@Test
public void testGetSessionInstance_returnsInstanceOfGivenClass() {
Object instance = SingletonUtil.getSessionInstance( TestSingleton.class );
assertNotNull( instance );
assertSame( TestSingleton.class, instance.getClass() );
}
@Test
public void testGetSessionInstance_returnsSameInstanceInSameSession() {
Object instance1 = SingletonUtil.getSessionInstance( TestSingleton.class );
Object instance2 = SingletonUtil.getSessionInstance( TestSingleton.class );
assertSame( instance1, instance2 );
}
@Test
public void testGetSessionInstance_returnsNewInstanceInAnotherSession() throws Throwable {
Object instance1 = SingletonUtil.getSessionInstance( TestSingleton.class );
final AtomicReference<Object> instance2 = new AtomicReference<Object>();
runInThread( new Runnable() {
@Override
public void run() {
Fixture.createServiceContext();
instance2.set( SingletonUtil.getSessionInstance( TestSingleton.class ) );
}
} );
assertNotSame( instance1, instance2.get() );
}
@Test
public void testGetSessionInstance_returnsInstanceWithFakeContext() throws Throwable {
final ServiceContext serviceContext = ContextProvider.getContext();
final AtomicReference<Object> instance = new AtomicReference<>();
runInThread( new Runnable() {
@Override
public void run() {
ContextProvider.setContext( serviceContext );
instance.set( SingletonUtil.getSessionInstance( TestSingleton.class ) );
}
} );
assertNotNull( instance.get() );
}
@Test( expected = IllegalStateException.class )
public void testGetSessionInstance_failsWithoutContext() {
ContextProvider.disposeContext();
SingletonUtil.getSessionInstance( TestSingleton.class );
}
private static void createUISession() {
ServiceContext serviceContext = ContextProvider.getContext();
HttpSession session = serviceContext.getRequest().getSession();
ApplicationContextImpl applicationContext = serviceContext.getApplicationContext();
serviceContext.setUISession( new UISessionImpl( applicationContext, session ) );
}
private static class TestSingleton {
}
}