| /******************************************************************************* |
| * Copyright (c) 2013, 2014 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.addons.fileupload.internal; |
| |
| import static org.eclipse.rap.addons.fileupload.test.FileUploadTestUtil.fakeUploadRequest; |
| import static org.junit.Assert.assertEquals; |
| import static org.mockito.Matchers.any; |
| import static org.mockito.Mockito.doAnswer; |
| import static org.mockito.Mockito.doThrow; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.times; |
| import static org.mockito.Mockito.verify; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.util.List; |
| |
| import javax.servlet.http.HttpServletResponse; |
| |
| import org.eclipse.rap.addons.fileupload.FileDetails; |
| import org.eclipse.rap.addons.fileupload.FileUploadEvent; |
| import org.eclipse.rap.addons.fileupload.FileUploadHandler; |
| import org.eclipse.rap.addons.fileupload.FileUploadReceiver; |
| import org.eclipse.rap.addons.fileupload.test.FileUploadTestUtil.FileData; |
| import org.eclipse.rap.addons.fileupload.test.TestFileUploadListener; |
| import org.eclipse.rap.addons.fileupload.test.TestFileUploadReceiver; |
| import org.eclipse.rap.rwt.RWT; |
| import org.eclipse.rap.rwt.testfixture.internal.Fixture; |
| import org.eclipse.rap.rwt.testfixture.internal.TestResponse; |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.mockito.ArgumentCaptor; |
| import org.mockito.invocation.InvocationOnMock; |
| import org.mockito.stubbing.Answer; |
| |
| |
| @SuppressWarnings( "restriction" ) |
| public class FileUploadProcessor_Test { |
| |
| private TestFileUploadListener testListener; |
| private FileUploadReceiver receiver; |
| private FileUploadHandler uploadHandler; |
| private FileUploadProcessor uploadProcessor; |
| |
| @Before |
| public void setUp() { |
| Fixture.setUp(); |
| testListener = new TestFileUploadListener(); |
| receiver = mock( FileUploadReceiver.class ); |
| uploadHandler = new FileUploadHandler( receiver ); |
| uploadProcessor = new FileUploadProcessor( uploadHandler ); |
| } |
| |
| @After |
| public void tearDown() { |
| uploadHandler.dispose(); |
| Fixture.tearDown(); |
| } |
| |
| @Test |
| public void testHandleFileUpload_singleFile_notifiesListener() throws IOException { |
| uploadHandler.addUploadListener( testListener ); |
| |
| fakeUploadRequest( uploadHandler, "foo", "text/plain", "foo.txt" ); |
| uploadProcessor.handleFileUpload( RWT.getRequest(), RWT.getResponse() ); |
| |
| assertEquals( "progress.finished.", testListener.getLog() ); |
| } |
| |
| @Test |
| public void testHandleFileUpload_singleFile_setsFileUploadEvent() throws IOException { |
| uploadHandler.addUploadListener( testListener ); |
| |
| fakeUploadRequest( uploadHandler, "foo", "text/plain", "foo.txt" ); |
| uploadProcessor.handleFileUpload( RWT.getRequest(), RWT.getResponse() ); |
| |
| FileUploadEvent event = testListener.getLastEvent(); |
| FileDetails[] fileDetails = event.getFileDetails(); |
| assertEquals( "foo.txt", fileDetails[ 0 ].getFileName() ); |
| assertEquals( "text/plain", fileDetails[ 0 ].getContentType() ); |
| assertEquals( -1, fileDetails[ 0 ].getContentLength() ); |
| assertEquals( event.getContentLength(), event.getBytesRead() ); |
| } |
| |
| @Test |
| public void testHandleFileUpload_singleFile_callsReciever() throws IOException { |
| fakeUploadRequest( uploadHandler, "foo", "text/plain", "foo.txt" ); |
| uploadProcessor.handleFileUpload( RWT.getRequest(), RWT.getResponse() ); |
| |
| ArgumentCaptor<FileDetails> captor = ArgumentCaptor.forClass( FileDetails.class ); |
| verify( receiver ).receive( any( InputStream.class ), captor.capture() ); |
| FileDetails uploadDetails = captor.getValue(); |
| assertEquals( -1, uploadDetails.getContentLength() ); |
| assertEquals( "text/plain", uploadDetails.getContentType() ); |
| assertEquals( "foo.txt", uploadDetails.getFileName() ); |
| } |
| |
| @Test |
| public void testHandleFileUpload_multipleFiles_notifiesListener() throws IOException { |
| uploadHandler.addUploadListener( testListener ); |
| |
| FileData file1 = new FileData( "foo", "text/plain", "foo.txt" ); |
| FileData file2 = new FileData( "bar", "image/png", "bar.png" ); |
| fakeUploadRequest( uploadHandler, file1, file2 ); |
| uploadProcessor.handleFileUpload( RWT.getRequest(), RWT.getResponse() ); |
| |
| assertEquals( "progress.finished.", testListener.getLog() ); |
| } |
| |
| @Test |
| public void testHandleFileUpload_multipleFiles_setsFileUploadEvent() throws IOException { |
| uploadHandler.addUploadListener( testListener ); |
| |
| FileData file1 = new FileData( "foo", "text/plain", "foo.txt" ); |
| FileData file2 = new FileData( "bar", "image/png", "bar.png" ); |
| fakeUploadRequest( uploadHandler, file1, file2 ); |
| uploadProcessor.handleFileUpload( RWT.getRequest(), RWT.getResponse() ); |
| |
| FileUploadEvent event = testListener.getLastEvent(); |
| FileDetails[] fileDetails = event.getFileDetails(); |
| assertEquals( "foo.txt", fileDetails[ 0 ].getFileName() ); |
| assertEquals( "text/plain", fileDetails[ 0 ].getContentType() ); |
| assertEquals( -1, fileDetails[ 0 ].getContentLength() ); |
| assertEquals( "bar.png", fileDetails[ 1 ].getFileName() ); |
| assertEquals( "image/png", fileDetails[ 1 ].getContentType() ); |
| assertEquals( -1, fileDetails[ 1 ].getContentLength() ); |
| assertEquals( event.getContentLength(), event.getBytesRead() ); |
| } |
| |
| @Test |
| public void testHandleFileUpload_multipleFiles_callsReciever() throws IOException { |
| FileData file1 = new FileData( "foo", "text/plain", "foo.txt" ); |
| FileData file2 = new FileData( "bar", "image/png", "bar.png" ); |
| fakeUploadRequest( uploadHandler, file1, file2 ); |
| uploadProcessor.handleFileUpload( RWT.getRequest(), RWT.getResponse() ); |
| |
| ArgumentCaptor<FileDetails> captor = ArgumentCaptor.forClass( FileDetails.class ); |
| verify( receiver, times( 2 ) ).receive( any( InputStream.class ), captor.capture() ); |
| List<FileDetails> values = captor.getAllValues(); |
| assertEquals( -1, values.get( 0 ).getContentLength() ); |
| assertEquals( "text/plain", values.get( 0 ).getContentType() ); |
| assertEquals( "foo.txt", values.get( 0 ).getFileName() ); |
| assertEquals( -1, values.get( 1 ).getContentLength() ); |
| assertEquals( "image/png", values.get( 1 ).getContentType() ); |
| assertEquals( "bar.png", values.get( 1 ).getFileName() ); |
| } |
| |
| @Test |
| public void testHandleFileUpload_withoutData() throws IOException { |
| uploadHandler.addUploadListener( testListener ); |
| |
| fakeUploadRequest( uploadHandler ); |
| uploadProcessor.handleFileUpload( RWT.getRequest(), RWT.getResponse() ); |
| |
| assertEquals( "progress.failed.", testListener.getLog() ); |
| assertEquals( HttpServletResponse.SC_BAD_REQUEST, getResponseErrorStatus() ); |
| } |
| |
| @Test |
| public void testHandleFileUpload_fileExceedsMaxSize() throws IOException { |
| uploadHandler.setMaxFileSize( 5 ); |
| uploadHandler.addUploadListener( testListener ); |
| stubReceiveMethod( receiver ); |
| |
| FileData file1 = new FileData( "foo", "text/plain", "foo.txt" ); |
| FileData file2 = new FileData( "bar bar", "image/png", "bar.png" ); |
| fakeUploadRequest( uploadHandler, file1, file2 ); |
| uploadProcessor.handleFileUpload( RWT.getRequest(), RWT.getResponse() ); |
| |
| assertEquals( "progress.failed.", testListener.getLog() ); |
| assertEquals( HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE, getResponseErrorStatus() ); |
| } |
| |
| @Test |
| public void testHandleFileUpload_withExceptionInReciever() throws IOException { |
| doThrow( new IOException() ).when( receiver ).receive( any( InputStream.class ), |
| any( FileDetails.class ) ); |
| uploadHandler.addUploadListener( testListener ); |
| |
| fakeUploadRequest( uploadHandler, "foo", "text/plain", "foo.txt" ); |
| uploadProcessor.handleFileUpload( RWT.getRequest(), RWT.getResponse() ); |
| |
| assertEquals( "progress.failed.", testListener.getLog() ); |
| assertEquals( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, getResponseErrorStatus() ); |
| } |
| |
| private static void stubReceiveMethod( FileUploadReceiver receiver ) throws IOException { |
| Answer answer = new Answer() { |
| public Object answer( InvocationOnMock invocation ) throws Throwable { |
| new TestFileUploadReceiver().receive( ( InputStream )invocation.getArguments()[0], null ); |
| return null; |
| } |
| }; |
| doAnswer( answer ).when( receiver ).receive( any( InputStream.class ), any( FileDetails.class ) ); |
| } |
| |
| private static int getResponseErrorStatus() { |
| TestResponse response = ( TestResponse )RWT.getResponse(); |
| return response.getErrorStatus(); |
| } |
| |
| } |