package org.ourgrid.common.spec.main; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import javax.naming.directory.InvalidAttributeValueException; import org.junit.Test; import org.ourgrid.common.specification.main.CompilerException; import org.ourgrid.common.specification.main.JDF2JDL; /** * Unit tests for JDF to JDL translator. * */ public class JDF2JDLTest { private static final String $JOB = "$JOB"; private final String ECHO_JOB_AD = "[ nodes = { [ Executable = \"echo\"; Arguments = \"Hello World\" ], [ Executable = \"echo\"; Arguments = \"Hello World\" ], [ Executable = \"echo\"; Arguments = \"Hello World\" ], [ Executable = \"echo\"; Arguments = \"Hello World\" ] }; Name = \"EchoJob\"]"; private final String FACTORING_JOB_AD = "[ nodes = { [ Executable = \"nice\"; Arguments = \"java -cp . Fat 3 261147332 6819792792357414911 output-$JOB.0\"; InputSandbox = { \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/resources/Fat.class\" }; OutputSandbox = { \"output-$JOB.0\" }; OutputSandboxDestURI = { \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/resources/output-$JOB.0\" } ], [ Executable = \"nice\"; Arguments = \"java -cp . Fat 261147332 522294661 6819792792357414911 output-$JOB.1\"; InputSandbox = { \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/resources/Fat.class\" }; OutputSandbox = { \"output-$JOB.1\" }; OutputSandboxDestURI = { \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/resources/output-$JOB.1\" } ], [ Executable = \"nice\"; Arguments = \"java -cp . Fat 522294661 783441990 6819792792357414911 output-$JOB.2\"; InputSandbox = { \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/resources/Fat.class\" }; OutputSandbox = { \"output-$JOB.2\" }; OutputSandboxDestURI = { \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/resources/output-$JOB.2\" } ] }; Name = \"FatoraJob\"]"; private final String SDT_JOB_AD = "[ nodes = { [ Executable = \"Fat.class\"; StdInput = \"input.dat\"; StdOutput = \"out.dat\"; StdError = \"err.dat\"; InputSandbox = { \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/jdl/Fat.class\", \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/jdl/input.dat\" }; OutputSandbox = { \"out.dat\" }; OutputSandboxDestURI = { \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/jdl/out.dat\" } ] }; Name = \"myjob2\"]"; private final String SDT_JOB_AD_APPEND = "[ nodes = { [ Executable = \"Fat.class\"; StdInput = \"input.dat\"; Arguments = \">> out.dat 2>> err.dat\"; InputSandbox = { \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/jdl/Fat.class\", \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/jdl/input.dat\" }; OutputSandbox = { \"out.dat\" }; OutputSandboxDestURI = { \"/local/david/workspace_intevol/Ourgrid-NewArchitecture/test/jdl/out.dat\" } ] }; Name = \"myjob2\"]"; private static int jobID = 0; //------ Used to change error stream ------ private static PrintStream systemErr; private static PrintStream previousStream; protected static StringBuilder errBuilder = new StringBuilder(); private void changeErrStream(){ previousStream = System.err; systemErr = new PrintStream( new OutputStream() { @Override public void write( int b ) throws IOException { errBuilder.append( (char)b ); } }); System.setErr(systemErr); } private static void resetSystemErr() { System.setErr(previousStream); errBuilder = new StringBuilder(); } @Test public void testInvalidJDFFilePath(){ changeErrStream(); JDF2JDL.main(new String[]{"e"}); assertTrue(errBuilder.toString().length() > 0); resetSystemErr(); changeErrStream(); JDF2JDL.main(new String[]{""}); assertTrue(errBuilder.toString().length() > 0); resetSystemErr(); //File without permission changeErrStream(); JDF2JDL.main(new String[]{"test"+File.separator+"jdl"+File.separator+"job_without_permission.jdf"}); assertTrue(errBuilder.toString().length() > 0); resetSystemErr(); changeErrStream(); JDF2JDL.main(new String[]{null}); assertTrue(errBuilder.toString().length() > 0); resetSystemErr(); } @Test public void testJDFWithInvalidSyntax(){ changeErrStream(); JDF2JDL.main(new String[]{"test"+File.separator+"jdl"+File.separator+"job_with_invalid_syntax.jdf"}); assertTrue(errBuilder.toString().length() > 0); resetSystemErr(); } @Test public void testJDFWithMultipleCommands(){ changeErrStream(); JDF2JDL.main(new String[]{"test"+File.separator+"jdl"+File.separator+"job_with_multiple_commands.jdf"}); System.out.println(errBuilder.toString()); assertTrue(errBuilder.toString().contains("more than one executable command")); resetSystemErr(); } @Test public void testEchoJob() throws CompilerException, InvalidAttributeValueException, IOException{ String jdlOutputFile = "test_out.jdl"; changeErrStream(); JDF2JDL.main(new String[]{"test"+File.separator+"resources"+File.separator+"EchoJob.jdf", jdlOutputFile}); File file = new File(jdlOutputFile); assertTrue(file.exists()); assertTrue(file.canRead()); FileReader reader = new FileReader(file); BufferedReader r = new BufferedReader(reader); StringBuilder out = new StringBuilder(); while(r.ready()){ out.append(r.readLine()); } assertEquals(0, errBuilder.toString().length()); resetSystemErr(); assertEquals(ECHO_JOB_AD, out.toString()); file.delete(); reader.close(); jobID++; } @Test public void testJobWithMultipleArguments() throws CompilerException, InvalidAttributeValueException, IOException{ String jdlOutputFile = "test_out.jdl"; changeErrStream(); JDF2JDL.main(new String[]{"test"+File.separator+"resources"+File.separator+"FatoraJob.jdf", jdlOutputFile}); File file = new File(jdlOutputFile); assertTrue(file.exists()); assertTrue(file.canRead()); FileReader reader = new FileReader(file); BufferedReader r = new BufferedReader(reader); StringBuilder out = new StringBuilder(); while(r.ready()){ out.append(r.readLine()); } assertEquals(0, errBuilder.toString().length()); resetSystemErr(); assertEquals(FACTORING_JOB_AD.replace($JOB, jobID+""), out.toString()); jobID++; file.delete(); reader.close(); } @Test public void testJobWithStdInOutAndErr() throws CompilerException, InvalidAttributeValueException, IOException{ String jdlOutputFile = "test_out.jdl"; changeErrStream(); JDF2JDL.main(new String[]{"test"+File.separator+"jdl"+File.separator+"job_with_std_devices.jdf", jdlOutputFile}); File file = new File(jdlOutputFile); assertTrue(file.exists()); assertTrue(file.canRead()); FileReader reader = new FileReader(file); BufferedReader r = new BufferedReader(reader); StringBuilder out = new StringBuilder(); while(r.ready()){ out.append(r.readLine()); } assertEquals(0, errBuilder.toString().length()); resetSystemErr(); assertEquals(SDT_JOB_AD, out.toString()); jobID++; file.delete(); reader.close(); } @Test public void testJobWithStdInOutErrAppended() throws CompilerException, InvalidAttributeValueException, IOException{ String jdlOutputFile = "test_out.jdl"; changeErrStream(); JDF2JDL.main(new String[]{"test"+File.separator+"jdl"+File.separator+"job_with_std_devices_append.jdf", jdlOutputFile}); File file = new File(jdlOutputFile); assertTrue(file.exists()); assertTrue(file.canRead()); FileReader reader = new FileReader(file); BufferedReader r = new BufferedReader(reader); StringBuilder out = new StringBuilder(); while(r.ready()){ out.append(r.readLine()); } assertEquals(0, errBuilder.toString().length()); resetSystemErr(); assertEquals(SDT_JOB_AD_APPEND, out.toString()); jobID++; file.delete(); reader.close(); } }