From a5d2cb51719771213a9b04d9e4cfc60a923ac47c Mon Sep 17 00:00:00 2001
From: dblouin <dominique.blouin@telecom-paristech.fr>
Date: Thu, 2 Feb 2017 17:29:23 +0100
Subject: [PATCH] Issue #18: Added tests for RSHClient

---
 tests/util/fr.tpt.ttool.tests.util/.classpath |   8 +
 tests/util/fr.tpt.ttool.tests.util/.project   |  17 +
 .../.settings/org.eclipse.jdt.core.prefs      |  11 +
 .../fr.tpt.ttool.tests.util/bin/.gitignore    |   1 +
 .../launch/TestRshClient.launch               |  16 +
 .../resources/helloWorld                      | Bin 0 -> 9112 bytes
 .../resources/helloWorldNonStop               | Bin 0 -> 9320 bytes
 .../tests/util/remote/TestRshClient.java      | 324 ++++++++++++++++++
 8 files changed, 377 insertions(+)
 create mode 100644 tests/util/fr.tpt.ttool.tests.util/.classpath
 create mode 100644 tests/util/fr.tpt.ttool.tests.util/.project
 create mode 100644 tests/util/fr.tpt.ttool.tests.util/.settings/org.eclipse.jdt.core.prefs
 create mode 100644 tests/util/fr.tpt.ttool.tests.util/bin/.gitignore
 create mode 100644 tests/util/fr.tpt.ttool.tests.util/launch/TestRshClient.launch
 create mode 100755 tests/util/fr.tpt.ttool.tests.util/resources/helloWorld
 create mode 100755 tests/util/fr.tpt.ttool.tests.util/resources/helloWorldNonStop
 create mode 100644 tests/util/fr.tpt.ttool.tests.util/src/fr/tpt/ttool/tests/util/remote/TestRshClient.java

diff --git a/tests/util/fr.tpt.ttool.tests.util/.classpath b/tests/util/fr.tpt.ttool.tests.util/.classpath
new file mode 100644
index 0000000000..ac3a9c3963
--- /dev/null
+++ b/tests/util/fr.tpt.ttool.tests.util/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/util/fr.tpt.ttool.tests.util/.project b/tests/util/fr.tpt.ttool.tests.util/.project
new file mode 100644
index 0000000000..7a3d164b32
--- /dev/null
+++ b/tests/util/fr.tpt.ttool.tests.util/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>fr.tpt.ttool.tests.util</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/tests/util/fr.tpt.ttool.tests.util/.settings/org.eclipse.jdt.core.prefs b/tests/util/fr.tpt.ttool.tests.util/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..3a21537071
--- /dev/null
+++ b/tests/util/fr.tpt.ttool.tests.util/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/tests/util/fr.tpt.ttool.tests.util/bin/.gitignore b/tests/util/fr.tpt.ttool.tests.util/bin/.gitignore
new file mode 100644
index 0000000000..44fde9027b
--- /dev/null
+++ b/tests/util/fr.tpt.ttool.tests.util/bin/.gitignore
@@ -0,0 +1 @@
+/fr/
diff --git a/tests/util/fr.tpt.ttool.tests.util/launch/TestRshClient.launch b/tests/util/fr.tpt.ttool.tests.util/launch/TestRshClient.launch
new file mode 100644
index 0000000000..be994b1055
--- /dev/null
+++ b/tests/util/fr.tpt.ttool.tests.util/launch/TestRshClient.launch
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/fr.tpt.ttool.tests.util/src/fr/tpt/ttool/tests/util/remote/TestRshClient.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="fr.tpt.ttool.tests.util.remote.TestRshClient"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="fr.tpt.ttool.tests.util"/>
+</launchConfiguration>
diff --git a/tests/util/fr.tpt.ttool.tests.util/resources/helloWorld b/tests/util/fr.tpt.ttool.tests.util/resources/helloWorld
new file mode 100755
index 0000000000000000000000000000000000000000..4a59186b2ba9badf0ac77be4561e72ba237d8917
GIT binary patch
literal 9112
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
N03AqlN0UUi9{?ZJK(_z@

literal 0
HcmV?d00001

diff --git a/tests/util/fr.tpt.ttool.tests.util/resources/helloWorldNonStop b/tests/util/fr.tpt.ttool.tests.util/resources/helloWorldNonStop
new file mode 100755
index 0000000000000000000000000000000000000000..82cc5e028dbc9d54b72a0f6bc1a8b590d7b11c52
GIT binary patch
literal 9320
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

literal 0
HcmV?d00001

diff --git a/tests/util/fr.tpt.ttool.tests.util/src/fr/tpt/ttool/tests/util/remote/TestRshClient.java b/tests/util/fr.tpt.ttool.tests.util/src/fr/tpt/ttool/tests/util/remote/TestRshClient.java
new file mode 100644
index 0000000000..77eade0ebe
--- /dev/null
+++ b/tests/util/fr.tpt.ttool.tests.util/src/fr/tpt/ttool/tests/util/remote/TestRshClient.java
@@ -0,0 +1,324 @@
+package fr.tpt.ttool.tests.util.remote;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.StringWriter;
+import java.io.Writer;
+
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import launcher.LauncherException;
+import launcher.RshClient;
+import launcher.RshServer;
+import myutil.FileException;
+import myutil.FileUtils;
+
+public class TestRshClient {
+	
+	private static final String EXPECTED_COMMAND_OUTPUT = "!!!Hello World!!!" + System.lineSeparator();
+	private static final String TEST_PROGRAM_NAME = "helloWorld";
+	private static final String TEST_COMMAND = "./resources/" + TEST_PROGRAM_NAME;
+	private static final String TEST_COMMAND_NON_STOP = "./resources/helloWorldNonStop";
+	private static final String TEST_FILE_NAME = "./resources/test.txt";
+	private static final String TEST_FILE_DATA = "testDatafhkenomrcg ,jgh o";
+
+	
+	private RshClient client = null;
+	private static Thread serverThread = null;
+
+	@BeforeClass
+	public static void setUpBeforeClass()
+	throws Exception {
+        RshClient.PORT_NUMBER = 8080;
+        RshServer.PORT_NUMBER = RshClient.PORT_NUMBER;
+
+        final Runnable runnable = new Runnable() {
+			
+			@Override
+			public void run() {
+				new RshServer( null ).startServer();
+			}
+		};
+		
+		serverThread = new Thread( runnable );
+		serverThread.start();
+		Thread.sleep( 500 );
+	}
+
+	@Before
+	public void setUp()
+	throws Exception {
+		client = new RshClient( "localhost" );
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass()
+	throws Exception {
+		serverThread.interrupt();
+	}
+	
+	private void handleException( final Throwable th ) {
+		th.printStackTrace();
+		fail( th.getLocalizedMessage() );
+	}
+
+	@Test
+	public void testStopCommand() {
+        final Runnable runnable = new Runnable() {
+			
+			@Override
+			public void run() {
+				try {
+					client.setCmd( TEST_COMMAND_NON_STOP );
+					client.sendExecuteCommandRequest();
+					final Writer writer = new StringWriter();
+					client.writeCommandMessages( writer );
+				}
+				catch (LauncherException e) {
+					handleException( e );
+				}
+			}
+		};
+		
+		final Thread thread = new Thread( runnable );
+		thread.start();
+		
+		try {
+			
+			// Ensure the remote process has enough time to start
+			Thread.sleep( 200 );
+			client.stopCommand();
+
+			// Ensure the stop command has been processed on the server
+			Thread.sleep( 200 );
+			assertTrue( killUnexistentProcess() );
+		}
+		catch ( LauncherException ex ) {
+			handleException( ex );
+		}
+		catch ( InterruptedException ex ) {
+			handleException( ex );
+		}
+	}
+
+	private boolean killUnexistentProcess() {
+		try {
+			client.sendKillProcessRequest();
+			
+			return false;
+		}
+		catch ( LauncherException ex ) {
+			return RshClient.FAILED.equals( ex.getMessage() );
+		}
+	}
+
+	@Test
+	public void testGetId() {
+		try {
+			final int id = client.getId();
+			assertTrue( id == 1 );
+		}
+		catch ( LauncherException ex ) {
+			handleException( ex );
+		}
+	}
+
+	@Test
+	public void testFreeId() {
+		try {
+			client.freeId( 1 );
+		}
+		catch ( LauncherException ex ) {
+			handleException( ex );
+		}
+	}
+
+	@Test
+	public void testSendExecuteCommandRequest() {
+		client.setCmd( TEST_COMMAND );
+		
+		try {
+			client.sendExecuteCommandRequest();
+			final Writer writer = new StringWriter();
+			client.writeCommandMessages( writer );
+			assertTrue( ( EXPECTED_COMMAND_OUTPUT + System.lineSeparator() ).equals( writer.toString() ) );
+		}
+		catch ( LauncherException ex ) {
+			handleException( ex );
+		}
+	}
+
+	@Test
+	public void testSendExecuteCommandRequestBoolean() {
+		client.setCmd( TEST_COMMAND );
+		
+		try {
+			client.sendExecuteCommandRequest( true );
+			final Writer writer = new StringWriter();
+			client.writeCommandMessages( writer );
+			assertTrue( writer.toString().startsWith( EXPECTED_COMMAND_OUTPUT ) );
+
+			final Integer retCode = client.getProcessReturnCode();
+			assertTrue( retCode != null && retCode == 0  );
+		}
+		catch ( LauncherException ex ) {
+			handleException( ex );
+		}
+	}
+
+	@Test
+	public void testSendExecutePipedCommandsRequest() {
+		final String testFileName = "./resources/test_piped_commands.txt";
+		final String expectedData = "Test Passed!" + System.lineSeparator();
+		
+		try {
+			FileUtils.saveFile( testFileName, expectedData );
+			client.sendExecutePipedCommandsRequest( "echo " + testFileName, "xargs cat" );
+			final String data = client.getDataFromProcess();
+			
+			assertTrue( "Piped commands returned " + data, expectedData.equals( data ) );
+		}
+		catch ( LauncherException ex ) {
+			handleException( ex );
+		}
+		catch ( FileException ex ) {
+			handleException( ex );
+		}
+		finally {
+			new File( testFileName ).delete();
+		}
+	}
+
+	private boolean deleteTestFile() {
+		final File testFile = new File( TEST_FILE_NAME );
+		
+		if ( testFile.exists() ) {
+			assertTrue(  "Test file could not be deleted!", testFile.delete() );
+		}
+		
+		return true;
+	}
+
+	@Test
+	public void testSendFileData() {
+		deleteTestFile();
+		
+		try {
+			client.sendFileData( TEST_FILE_NAME, TEST_FILE_DATA );
+			
+			try {
+				final String readData = FileUtils.loadFile( TEST_FILE_NAME );
+				
+				assertTrue( ( TEST_FILE_DATA + System.lineSeparator() ).equals( readData ) );
+			}
+			catch ( FileException ex ) {
+				handleException( ex );
+			}
+		}
+		catch( LauncherException ex ) {
+			handleException( ex );
+		}
+	}
+
+	@Test
+	public void testGetFileData() {
+		deleteTestFile();
+
+		try {
+			FileUtils.saveFile( TEST_FILE_NAME, TEST_FILE_DATA );
+
+			final String readData = client.getFileData( TEST_FILE_NAME );
+			
+			assertTrue( TEST_FILE_DATA.equals( readData ) );
+		} 
+		catch ( FileException ex ) {
+			handleException( ex );
+		}
+		catch ( LauncherException ex ) {
+			handleException( ex );
+		}
+	}
+
+	@Test
+	public void testDeleteFile() {
+		deleteTestFile();
+
+		try {
+			FileUtils.saveFile( TEST_FILE_NAME, TEST_FILE_DATA );
+
+			client.deleteFile( TEST_FILE_NAME );
+			
+			assertFalse( new File( TEST_FILE_NAME ).exists() );
+		} 
+		catch ( FileException ex ) {
+			handleException( ex );
+		}
+		catch ( LauncherException ex ) {
+			handleException( ex );
+		}
+	}
+
+	@Test
+	public void testSendKillProcessRequest() {
+		client.setCmd( TEST_COMMAND_NON_STOP );
+		
+		try {
+			client.sendExecuteCommandRequest();
+			Thread.sleep( 200 );
+			client.sendKillProcessRequest();
+
+			Thread.sleep( 200 );
+			assertTrue( killUnexistentProcess() );
+		}
+		catch ( LauncherException ex ) {
+			handleException( ex );
+		}
+		catch ( InterruptedException ex ) {
+			handleException( ex );
+		}
+	}
+
+	@Test
+	public void testSendKillAllProcessRequest() {
+		client.setCmd( TEST_COMMAND_NON_STOP );
+		
+		try {
+			for ( int index = 0; index < 4; index++ ) {
+				client.sendExecuteCommandRequest();
+				Thread.sleep( 200 );
+			}
+			
+			client.sendKillAllProcessRequest();
+
+			Thread.sleep( 200 );
+			assertTrue( killUnexistentProcess() );
+		}
+		catch ( LauncherException ex ) {
+			handleException( ex );
+		}
+		catch ( InterruptedException ex ) {
+			handleException( ex );
+		}
+	}
+
+	@Test
+	public void testGetDataFromProcess() {
+		client.setCmd( TEST_COMMAND );
+		
+		try {
+			client.sendExecuteCommandRequest();
+			final String messageFromProcess = client.getDataFromProcess();
+			
+			assertTrue( ( EXPECTED_COMMAND_OUTPUT ).equals( messageFromProcess ) );
+		}
+		catch ( LauncherException ex ) {
+			handleException( ex );
+		}
+	}
+}
-- 
GitLab