/*
* Copyright 2014 LinkedIn Corp.
*
* 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 azkaban.jobExecutor;
import java.io.IOException;
import java.util.Date;
import org.apache.log4j.Logger;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import azkaban.utils.Props;
public class PythonJobTest {
private PythonJob job = null;
// private JobDescriptor descriptor = null;
private Props props = null;
private Logger log = Logger.getLogger(PythonJob.class);
private static final String scriptContent =
"#!/usr/bin/python \n" +
"import re, string, sys \n" +
"# if no arguments were given, print a helpful message \n" +
"l=len(sys.argv) \n" +
"if l < 1: \n"+
"\tprint 'Usage: celsium --t temp' \n" +
"\tsys.exit(1) \n" +
"\n" +
"# Loop over the arguments \n" +
"i=1 \n" +
"while i < l-1 : \n" +
"\tname = sys.argv[i] \n" +
"\tvalue = sys.argv[i+1] \n" +
"\tif name == \"--t\": \n" +
"\t\ttry: \n" +
"\t\t\tfahrenheit = float(string.atoi(value)) \n" +
"\t\texcept string.atoi_error: \n" +
"\t\t\tprint repr(value), \" not a numeric value\" \n" +
"\t\telse: \n" +
"\t\t\tcelsius=(fahrenheit-32)*5.0/9.0 \n" +
"\t\t\tprint '%i F = %iC' % (int(fahrenheit), int(celsius+.5)) \n" +
"\t\t\tsys.exit(0) \n" +
"\t\ti=i+2\n";
private static String scriptFile;
@BeforeClass
public static void init() {
long time = (new Date()).getTime();
scriptFile = "/tmp/azkaban_python" + time + ".py";
// dump script file
try {
Utils.dumpFile(scriptFile, scriptContent);
} catch (IOException e) {
e.printStackTrace(System.err);
Assert.fail("error in creating script file:" + e.getLocalizedMessage());
}
}
@AfterClass
public static void cleanup() throws IOException {
// remove the input file and error input file
Utils.removeFile(scriptFile);
}
@Ignore("Test appears to hang.")
@Test
public void testPythonJob() {
/* initialize job */
// descriptor = EasyMock.createMock(JobDescriptor.class);
props = new Props();
props.put(AbstractProcessJob.WORKING_DIR, ".");
props.put("type", "python");
props.put("script", scriptFile);
props.put("t", "90");
props.put("type", "script");
props.put("fullPath", ".");
// EasyMock.expect(descriptor.getId()).andReturn("script").times(1);
// EasyMock.expect(descriptor.getProps()).andReturn(props).times(3);
// EasyMock.expect(descriptor.getFullPath()).andReturn(".").times(1);
// EasyMock.replay(descriptor);
job = new PythonJob("TestProcess", props, props, log);
// EasyMock.verify(descriptor);
try {
job.run();
} catch (Exception e) {
e.printStackTrace(System.err);
Assert.fail("Python job failed:" + e.getLocalizedMessage());
}
}
}