/*******************************************************************************
* 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.swt.graphics;
import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.CONNECTION_ID;
import static org.eclipse.rap.rwt.testfixture.internal.SerializationTestUtil.serialize;
import static org.eclipse.rap.rwt.testfixture.internal.SerializationTestUtil.serializeAndDeserialize;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import java.io.InputStream;
import java.io.NotSerializableException;
import java.util.Arrays;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.rap.rwt.internal.engine.RWTClusterSupport;
import org.eclipse.rap.rwt.internal.service.ContextProvider;
import org.eclipse.rap.rwt.internal.service.UISessionImpl;
import org.eclipse.rap.rwt.service.UISession;
import org.eclipse.rap.rwt.testfixture.internal.Fixture;
import org.eclipse.rap.rwt.testfixture.internal.TestHttpSession;
import org.eclipse.rap.rwt.testfixture.internal.TestRequest;
import org.eclipse.swt.internal.graphics.Graphics;
import org.eclipse.swt.internal.widgets.IDisplayAdapter;
import org.eclipse.swt.widgets.Display;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@SuppressWarnings( "deprecation" )
public class ImageSerialzation_Test {
private Display display;
@Before
public void setUp() {
Fixture.createApplicationContext( true );
Fixture.createServiceContext();
display = new Display();
}
@After
public void tearDown() {
Fixture.disposeOfServiceContext();
Fixture.disposeOfApplicationContext();
}
@Test
public void testSerializedSharedImage() throws Exception {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream( Fixture.IMAGE1 );
Image image = Graphics.getImage( "image", inputStream );
inputStream.close();
try {
serialize( image );
fail();
} catch( NotSerializableException expected ) {
}
}
@Test
public void testSerializeSessionImage() throws Exception {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream( Fixture.IMAGE1 );
Image image = new Image( display, inputStream );
inputStream.close();
ImageData imageData = image.getImageData();
ContextProvider.disposeContext();
Image deserializedImage = serializeAndDeserialize( image );
createServiceContext( deserializedImage.getDevice() );
runClusterSupportFilter();
assertTrue( image.isDisposed() == deserializedImage.isDisposed() );
ImageData deserializedImageData = deserializedImage.getImageData();
assertEquals( imageData, deserializedImageData );
}
private void createServiceContext( Device device ) {
Fixture.createServiceContext();
UISessionImpl uiSession = ( UISessionImpl )getUISession( device );
TestRequest request = ( TestRequest )ContextProvider.getRequest();
request.setParameter( CONNECTION_ID, uiSession.getConnectionId() );
TestHttpSession session = ( TestHttpSession )request.getSession();
uiSession.setHttpSession( session );
uiSession.attachToHttpSession();
}
private static UISession getUISession( Device device ) {
Display display = ( Display )device;
return display.getAdapter( IDisplayAdapter.class ).getUISession();
}
private void runClusterSupportFilter() throws Exception {
HttpServletRequest request = ContextProvider.getRequest();
HttpServletResponse response = ContextProvider.getResponse();
FilterChain filterChain = mock( FilterChain.class );
new RWTClusterSupport().doFilter( request, response, filterChain );
}
private static void assertEquals( ImageData actual, ImageData expected ) {
assertTrue( actual.width == expected.width );
assertTrue( actual.height == expected.height );
assertTrue( Arrays.equals( actual.data, expected.data ) );
}
}