/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed 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. * ******************************************************************************/ package org.pentaho.di.job.entries.http; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.apache.commons.io.FileUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.pentaho.di.core.KettleClientEnvironment; import org.pentaho.di.core.Result; import org.pentaho.di.core.RowMetaAndData; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.row.RowMeta; import org.pentaho.di.core.row.value.ValueMetaString; import org.pentaho.di.job.Job; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; public class JobEntryHTTP_PDI208_Test { public static final String HTTP_HOST = "localhost"; public static final int HTTP_PORT = 9998; public static final String HTTP_SERVER_BASEURL = "http://localhost:9998"; private static HttpServer httpServer; @BeforeClass public static void setupBeforeClass() throws KettleException, IOException { KettleClientEnvironment.init(); JobEntryHTTP_PDI208_Test.startHTTPServer(); } @AfterClass public static void tearDown() { JobEntryHTTP_PDI208_Test.stopHTTPServer(); } @Test public void testHTTPResultDefaultRows() throws IOException { File localFileForUpload = getInputFile( "existingFile1", ".tmp" ); File tempFileForDownload = File.createTempFile( "downloadedFile1", ".tmp" ); localFileForUpload.deleteOnExit(); tempFileForDownload.deleteOnExit(); Object[] r = new Object[] { HTTP_SERVER_BASEURL + "/uploadFile", localFileForUpload.getCanonicalPath(), tempFileForDownload.getCanonicalPath() }; RowMeta rowMetaDefault = new RowMeta(); rowMetaDefault.addValueMeta( new ValueMetaString( "URL" ) ); rowMetaDefault.addValueMeta( new ValueMetaString( "UPLOAD" ) ); rowMetaDefault.addValueMeta( new ValueMetaString( "DESTINATION" ) ); List<RowMetaAndData> rows = new ArrayList<RowMetaAndData>(); rows.add( new RowMetaAndData( rowMetaDefault, r ) ); Result previousResult = new Result(); previousResult.setRows( rows ); JobEntryHTTP http = new JobEntryHTTP(); http.setParentJob( new Job() ); http.setRunForEveryRow( true ); http.setAddFilenameToResult( false ); http.execute( previousResult, 0 ); assertTrue( FileUtils.contentEquals( localFileForUpload, tempFileForDownload ) ); } @Test public void testHTTPResultCustomRows() throws IOException { File localFileForUpload = getInputFile( "existingFile2", ".tmp" ); File tempFileForDownload = File.createTempFile( "downloadedFile2", ".tmp" ); localFileForUpload.deleteOnExit(); tempFileForDownload.deleteOnExit(); Object[] r = new Object[] { HTTP_SERVER_BASEURL + "/uploadFile", localFileForUpload.getCanonicalPath(), tempFileForDownload.getCanonicalPath() }; RowMeta rowMetaDefault = new RowMeta(); rowMetaDefault.addValueMeta( new ValueMetaString( "MyURL" ) ); rowMetaDefault.addValueMeta( new ValueMetaString( "MyUpload" ) ); rowMetaDefault.addValueMeta( new ValueMetaString( "MyDestination" ) ); List<RowMetaAndData> rows = new ArrayList<RowMetaAndData>(); rows.add( new RowMetaAndData( rowMetaDefault, r ) ); Result previousResult = new Result(); previousResult.setRows( rows ); JobEntryHTTP http = new JobEntryHTTP(); http.setParentJob( new Job() ); http.setRunForEveryRow( true ); http.setAddFilenameToResult( false ); http.setUrlFieldname( "MyURL" ); http.setUploadFieldname( "MyUpload" ); http.setDestinationFieldname( "MyDestination" ); http.execute( previousResult, 0 ); assertTrue( FileUtils.contentEquals( localFileForUpload, tempFileForDownload ) ); } private File getInputFile( String prefix, String suffix ) throws IOException { File inputFile = File.createTempFile( prefix, suffix ); FileUtils.writeStringToFile( inputFile, UUID.randomUUID().toString(), "UTF-8" ); return inputFile; } private static void startHTTPServer() throws IOException { httpServer = HttpServer.create( new InetSocketAddress( JobEntryHTTP_PDI208_Test.HTTP_HOST, JobEntryHTTP_PDI208_Test.HTTP_PORT ), 10 ); httpServer.createContext( "/uploadFile", new HttpHandler() { @Override public void handle( HttpExchange httpExchange ) throws IOException { Headers h = httpExchange.getResponseHeaders(); h.add( "Content-Type", "application/octet-stream" ); httpExchange.sendResponseHeaders( 200, 0 ); InputStream is = httpExchange.getRequestBody(); OutputStream os = httpExchange.getResponseBody(); int inputChar = -1; while ( ( inputChar = is.read() ) >= 0 ) { os.write( inputChar ); } is.close(); os.flush(); os.close(); httpExchange.close(); } } ); httpServer.start(); } private static void stopHTTPServer() { httpServer.stop( 2 ); } }