/******************************************************************************* * Copyright (c) 2015 IBM Corporation. * 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: * Wainer dos Santos Moschetta (IBM Corporation) - initial implementation *******************************************************************************/ package org.eclipse.linuxtools.rdt.proxy.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Map.Entry; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.linuxtools.internal.profiling.launch.LocalLauncher; import org.eclipse.linuxtools.internal.rdt.proxy.RDTCommandLauncher; import org.eclipse.linuxtools.profiling.launch.IRemoteCommandLauncher; import org.eclipse.linuxtools.remote.proxy.tests.AbstractProxyTest; import org.eclipse.remote.core.IRemoteConnection; import org.junit.Test; @SuppressWarnings("restriction") public class CommandLauncherProxyTest extends AbstractProxyTest { @Test public void testRemoteCommandLauncher() { IRemoteCommandLauncher cl = null; Process p = null; IPath commandPath, changeToDirectory; String[] args, env; try { cl = proxyManager.getLauncher(syncProject.getProject()); assertTrue("Should have returned a remote launcher", cl instanceof RDTCommandLauncher); } catch (CoreException e) { fail("Should have returned a launcher: " + e.getCause()); } commandPath = new Path("uptime"); args = new String[]{"-s"}; env = new String[]{"PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin"}; changeToDirectory = new Path("/tmp"); try { p = cl.execute(commandPath, args, env, changeToDirectory, new NullProgressMonitor()); assertNotNull(p); p.waitFor(); assertEquals("Process exited with failure", 0, p.exitValue()); } catch (Exception e) { fail("Unable to execute " + commandPath + " on remote machine: " + e.getMessage()); } InputStream actualIS = p.getInputStream(); int v = -1; try { v = actualIS.read(); } catch (IOException e) { fail("Failed to read output of command executed remotely: " + e.getMessage()); } // Ensure something can be read assertTrue(v != -1); /* * Test it opens connection before execute. */ IRemoteConnection conn = getConnection(); conn.close(); assertFalse(conn.isOpen()); try { p = cl.execute(new Path("ls"), new String[]{}, new String[]{}, null, new NullProgressMonitor()); assertNotNull(p); p.waitFor(); assertEquals("Process exited with failure", 0, p.exitValue()); } catch (CoreException | InterruptedException e) { fail("Failed to open connection to execute a command: " + e.getMessage()); } } @Test public void testLocalCommandLauncher() { IRemoteCommandLauncher cl = null; Process p = null; InputStream actualIS = null, expectedIS = null; IPath commandPath, changeToDirectory; String[] args, env; try { cl = proxyManager.getLauncher(localProject.getProject()); assertTrue("Should have returned a local launcher", cl instanceof LocalLauncher); } catch (CoreException e) { fail("Should have returned a launcher: " + e.getCause()); } /* * Prepare arguments for the test */ commandPath = new Path("/bin/uptime"); args = new String[]{"-s"}; StringBuilder fullCmd = new StringBuilder(); fullCmd.append(commandPath.toOSString()); for(String s: args) { fullCmd.append(" " + s); } // Use local env variables ArrayList<String> envList = new ArrayList<>(); for(Entry<String, String> entry : System.getenv().entrySet()) { envList.add(entry.getKey()+"="+entry.getValue()); } env = envList.toArray(new String[]{}); changeToDirectory = new Path("/tmp"); /* * Run and get results using the proxy */ try { p = cl.execute(commandPath, args, env, changeToDirectory, new NullProgressMonitor()); assertNotNull(p); while(p.isAlive()){} // Call to waitFor() will drive to empty result //p.waitFor(); assertEquals("Process exited with failure", 0, p.exitValue()); } catch (Exception e) { fail("Unable to execute " + fullCmd.toString() + " on local machine: " + e.getMessage()); } actualIS = p.getInputStream(); assertNotNull(actualIS); /* * Run and get results using java Runtime */ try { Process expectedProcess = Runtime.getRuntime().exec(fullCmd.toString()); expectedProcess.waitFor(); expectedIS = expectedProcess.getInputStream(); assertNotNull(expectedIS); } catch (Exception e) { fail("Unable to execute " + fullCmd.toString() + " on local using Runtime.exec: " + e.getMessage()); } /* * Finally compare results obtained */ int va=0, ve=0; do { try { va = actualIS.read(); ve = expectedIS.read(); } catch (IOException e) { fail("Unable to read from Input Stream: " + e.getMessage()); } assertEquals("Local proxy command output differs from Runtime.exec", ve, va); } while(va != -1); } }