/* * Copyright 1999-2006 University of Chicago * * 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.globus.gram.tests; import java.io.File; import java.io.ByteArrayOutputStream; import org.globus.gram.GramJob; import org.globus.gram.Gram; import org.globus.gram.GramException; import org.globus.gram.GramJobListener; import org.globus.gram.WaitingForCommitException; import org.globus.gram.util.TestUtil; import org.globus.io.gass.server.GassServer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import junit.framework.TestCase; import junit.framework.TestSuite; import junit.framework.Test; public class GramTest extends TestCase { private static final int TIMEOUT = 1000*60*2; private static Log logger = LogFactory.getLog(GramTest.class.getName()); private static final String CONFIG = "test.properties"; private static TestUtil util; static { try { System.out.println("Current directory = "+ System.getProperty("user.dir")); util = new TestUtil(CONFIG); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } } public GramTest(String name) { super(name); } public static void main (String[] args) { junit.textui.TestRunner.run (suite()); Gram.deactivateAllCallbackHandlers(); } public static Test suite() { return new TestSuite(GramTest.class); } public void testPing() throws Exception { System.out.println("CONTACT = "+ util.get("job.long.contact")); if ((util.get("job.long.contact"))==null) System.out.println("NULL VALUE FROM UTIL"); Gram.ping(util.get("job.long.contact")); } public void testActiveJobs() throws Exception { GramJob job1 = new GramJob(util.get("job.long")); job1.request(util.get("job.long.contact")); GramJob job2 = new GramJob(util.get("job.long")); job2.request(util.get("job.long.contact")); assertEquals(2, Gram.getActiveJobs()); int i = 0; while ( Gram.getActiveJobs() != 0 ) { Thread.sleep(2000); i++; if (i == 40) { fail("getActiveJob() did not reported 0 jobs"); } } } public void testJobStatusPoll() throws Exception { GramJob job = new GramJob(util.get("job.long")); logger.debug("submitting job in batch mode..."); job.request(util.get("job.long.contact"), true); logger.debug("job submitted: " + job.getIDAsString()); String status = null; do { try { Thread.sleep(5000); } catch(Exception e) {} logger.debug("querying status on job..."); try { Gram.jobStatus(job); } catch(GramException e) { if (e.getErrorCode() == GramException.ERROR_CONTACTING_JOB_MANAGER) { if (status == null) { fail("Error contacting job manager - could not get job status"); } else { logger.debug("error contacting job manager - assuming job is finished."); break; } } else { fail("Failed to get job status: " + e.getMessage()); } } status = job.getStatusAsString(); logger.debug("status: " + status); } while (!status.equals("DONE")); } public void testBind() throws Exception { GramJob job = new GramJob(util.get("job.long")); logger.debug("submitting job in batch mode..."); job.request(util.get("job.long.contact"), true); logger.debug("job submitted: " + job.getIDAsString()); DoneStatusListener listener = new DoneStatusListener(); job.addListener(listener); job.bind(); if (!listener.waitFor(TIMEOUT)) { fail("Did not get DONE notification"); } } public void testCancel() throws Exception { GramJob job = new GramJob(util.get("job.long")); FailedStatusListener listener = new FailedStatusListener(); job.addListener(listener); logger.debug("submitting job in interactive mode..."); job.request(util.get("job.long.contact")); logger.debug("job submitted: " + job.getIDAsString()); Thread.sleep(5000); job.cancel(); if (!listener.waitFor(TIMEOUT)) { fail("Did not get FAILED notification"); } } public void testUnbind() throws Exception { GramJob job = new GramJob(util.get("job.long")); ActiveStatusListener listener = new ActiveStatusListener(); job.addListener(listener); logger.debug("submitting job in interactive mode..."); job.request(util.get("job.long.contact")); logger.debug("job submitted: " + job.getIDAsString()); if (!listener.waitFor(TIMEOUT)) { fail("Did not get ACTIVE notification"); } job.unbind(); listener.reset(); Thread.sleep(2000); job.cancel(); if (listener.getNotified()) { fail("Unconnected listener received unexpected notification."); } } public void testBadParameter() throws Exception { GramJob job = new GramJob("&(argument=12)"); try { job.request(util.get("job.long.contact")); } catch (GramException e) { if (e.getErrorCode() != GramException.PARAMETER_NOT_SUPPORTED) { e.printStackTrace(); fail("Unexpected error returned: " + e.getMessage()); } } } public void testBadExecutable() throws Exception { GramJob job = new GramJob("&(executable=/bin/thisexecdoesnotexist)"); FailedStatusListener listener = new FailedStatusListener(); job.addListener(listener); try { job.request(util.get("job.long.contact")); } catch (GramException e) { if (e.getErrorCode() != GramException.EXECUTABLE_NOT_FOUND) { e.printStackTrace(); fail("Unexpected error returned: " + e.getMessage()); } logger.debug("Error returned on request()"); return; } if (!listener.waitFor(TIMEOUT)) { fail("Did not get FAILED notification"); } if (job.getError() != GramException.EXECUTABLE_NOT_FOUND) { fail("Unexpected error returned: " + job.getError()); } } public void testRedirect() throws Exception { DoneStatusListener listener = new DoneStatusListener(); GassServer server = null; try { server = new GassServer(); String url = server.getURL(); ByteArrayOutputStream stdout = new ByteArrayOutputStream(); StringBuffer rsl = new StringBuffer(); rsl.append("&(executable=") .append(util.get("stdin.exe")) .append(")"); rsl.append("(rsl_substitution=(GLOBUSRUN_GASS_URL ") .append(url) .append("))"); rsl.append("(stdin=$(GLOBUSRUN_GASS_URL)/") .append(util.get("stdin.file")) .append(")"); rsl.append("(stdout=$(GLOBUSRUN_GASS_URL)/dev/stdout-rgs)"); server.registerJobOutputStream("out-rgs", stdout); System.out.println(rsl); GramJob job = new GramJob(rsl.toString()); job.addListener(listener); job.request(util.get("job.long.contact")); if (!listener.waitFor(TIMEOUT)) { fail("Did not get DONE notification"); } File f = new File(util.get("stdin.file")); byte[] stdoutData = stdout.toByteArray(); assertEquals("stdout size", f.length(), stdoutData.length); } finally { if (server != null) { server.shutdown(); } } } class DoneStatusListener implements GramJobListener { boolean notified = false; public synchronized void statusChanged(GramJob job) { if (job.getStatus() == GramJob.STATUS_DONE) { notified = true; notify(); } } public synchronized boolean waitFor(int timeout) throws Exception { wait(timeout); return notified; } } class FailedStatusListener implements GramJobListener { boolean notified = false; public synchronized void statusChanged(GramJob job) { if (job.getStatus() == GramJob.STATUS_FAILED) { notified = true; notify(); } } public synchronized boolean waitFor(int timeout) throws Exception { wait(timeout); return notified; } } class ActiveStatusListener implements GramJobListener { boolean notified = false; public synchronized void statusChanged(GramJob job) { if (job.getStatus() == GramJob.STATUS_ACTIVE) { notified = true; notify(); } } public synchronized boolean waitFor(int timeout) throws Exception { wait(timeout); return notified; } public void reset() { notified = false; } public boolean getNotified() { return notified; } } // These are 1.5 gram tests public void testTwoPhaseSignalCancel() throws Exception { twoPhaseSubmit(false); } public void testTwoPhaseCancel() throws Exception { twoPhaseSubmit(true); } private void twoPhaseSubmit(boolean cancelCall) throws Exception { GramJob job = new GramJob(util.get("job.long") + "(twoPhase=yes)"); try { job.request(util.get("job.long.contact")); fail("Did not throw expected exception"); } catch(WaitingForCommitException e) { logger.debug("Two phase commit: sending COMMIT_REQUEST signal"); job.signal(GramJob.SIGNAL_COMMIT_REQUEST); } logger.debug("job submited: " + job.getIDAsString()); Thread.sleep(5000); // this is little weird... cancel() and signal_cancel() should // behave in the same exact way but they do not if (cancelCall) { logger.debug("Canceling job... (cancel call)"); job.cancel(); // XXX: this should be common to both ways logger.debug("Two phase commit: sending COMMIT_END signal"); job.signal(GramJob.SIGNAL_COMMIT_END); } else { logger.debug("Canceling job... (cancel signal)"); job.signal(GramJob.SIGNAL_CANCEL, " "); } } public void testTwoPhaseExtend() throws Exception { GramJob job = new GramJob(util.get("job.long") + "(twoPhase=yes)"); try { job.request(util.get("job.long.contact")); } catch(WaitingForCommitException e) { logger.debug("Two phase commit: sending COMMIT_EXTEND signal"); job.signal(GramJob.SIGNAL_COMMIT_EXTEND, "30"); } logger.debug("job submited: " + job.getIDAsString()); Thread.sleep(75000); if (job.getStatus() == job.STATUS_FAILED) { fail("Timeout expired!"); } } }