Index: javavenv/src/test/java/geniusweb/javavenv/PythonCallTest.java
===================================================================
--- javavenv/src/test/java/geniusweb/javavenv/PythonCallTest.java	(revision 1)
+++ javavenv/src/test/java/geniusweb/javavenv/PythonCallTest.java	(revision 1)
@@ -0,0 +1,121 @@
+package geniusweb.javavenv;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.junit.Test;
+
+public class PythonCallTest {
+	@Test(expected = IllegalArgumentException.class)
+	public void testSmokeNullPython() {
+		new Call(null, Arrays.asList("troep"), 1000);
+	}
+
+	@Test
+	public void testSmokeNoSuchPython() {
+		new Call("/a/c/e", Arrays.asList("troep"), 1000);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testSmokeEmptyArg() {
+		new Call("/usr/local/bin/python3", null, 1000);
+	}
+
+	@Test
+	public void testSmoke() {
+		new Call("/usr/local/bin/python3", Arrays.asList("troep"), 1000);
+	}
+
+	@Test
+	public void testNonsenseCall()
+			throws InterruptedException, IOException, PythonError {
+		try {
+			Call c = new Call("/usr/local/bin/python3",
+					Arrays.asList("troep"), 1000);
+			c.run();
+		} catch (PythonError e) {
+			System.out.println("Correctly received Pythonerror:" + e);
+			return;
+		}
+		throw new IllegalStateException("Expected error did not occur");
+	}
+
+	@Test
+	public void testPrint()
+			throws InterruptedException, IOException, PythonError {
+		Call c = new Call("/usr/local/bin/python3",
+				Arrays.asList("src/test/resources/print.py"), 1000);
+		assertEquals("hello\n", c.run());
+	}
+
+	@Test
+	public void testPrintNoNewline()
+			throws InterruptedException, IOException, PythonError {
+		Call c = new Call("/usr/local/bin/python3",
+				Arrays.asList("src/test/resources/printnonewline.py"), 1000);
+		assertEquals("hello", c.run());
+	}
+
+	@Test
+	public void testPrint3xNoNewline()
+			throws InterruptedException, IOException, PythonError {
+		Call c = new Call("/usr/local/bin/python3",
+				Arrays.asList("src/test/resources/print3xnonewline.py"), 1000);
+		// the call collects till the connection closes, also if it's multi
+		// lines
+		assertEquals("hellothis is another messageAnd another", c.run());
+	}
+
+	@Test
+	public void testWait5Sec()
+			throws InterruptedException, IOException, PythonError {
+		Call c = new Call("/usr/local/bin/python3",
+				Arrays.asList("src/test/resources/wait5sec.py"), 10000);
+		assertEquals("hello world\n", c.run());
+	}
+
+	@Test
+	public void testWait5SecInHurry()
+			throws InterruptedException, IOException, PythonError {
+		try {
+			Call c = new Call("/usr/local/bin/python3",
+					Arrays.asList("src/test/resources/wait5sec.py"), 1000);
+			c.run();
+		} catch (InterruptedException e) {
+			System.out.println("Correctly received InterruptedException:" + e);
+			return;
+		}
+		throw new IllegalStateException("Expected error did not occur");
+	}
+
+	@Test
+	public void testPrintErr()
+			throws InterruptedException, IOException, PythonError {
+		try {
+			Call c = new Call("/usr/local/bin/python3",
+					Arrays.asList("src/test/resources/printerr.py"), 1000);
+			c.run();
+		} catch (PythonError e) {
+			System.out.println("Correctly received Pythonerror:" + e);
+			return;
+		}
+		throw new IllegalStateException("Expected error did not occur");
+	}
+
+	@Test
+	public void testThrow()
+			throws InterruptedException, IOException, PythonError {
+		try {
+			Call c = new Call("/usr/local/bin/python3",
+					Arrays.asList("src/test/resources/throw.py"), 1000);
+			c.run();
+		} catch (PythonError e) {
+			System.out.println("Correctly received Pythonerror:" + e);
+			return;
+		}
+		throw new IllegalStateException("Expected error did not occur");
+	}
+
+}
Index: javavenv/src/test/java/geniusweb/javavenv/PythonPartyFactoryE2E.java
===================================================================
--- javavenv/src/test/java/geniusweb/javavenv/PythonPartyFactoryE2E.java	(revision 15)
+++ javavenv/src/test/java/geniusweb/javavenv/PythonPartyFactoryE2E.java	(revision 1)
@@ -30,13 +30,10 @@
 import geniusweb.references.Reference;
 import tudelft.utilities.listener.DefaultListenable;
-import tudelft.utilities.pyrunner.PythonError;
 
 public class PythonPartyFactoryE2E {
-	private static final String STUPIDPARTY = "src/test/resources/stupidparty-1.1.0.tar.gz";
-
 	@Test
 	public void test() throws IOException, InterruptedException, PythonError {
 		PythonPartyFactory factory = new PythonPartyFactory(
-				new File(STUPIDPARTY));
+				new File("src/test/resources/stupidparty-1.0.0.tar.gz"));
 		System.out.println(factory.getCapabilites());
 		factory.close();
@@ -48,5 +45,5 @@
 			throws IOException, InterruptedException, PythonError {
 		PythonPartyFactory factory = new PythonPartyFactory(
-				new File(STUPIDPARTY));
+				new File("src/test/resources/stupidparty-1.0.0.tar.gz"));
 		System.out.println("\nGetting a party instance");
 		PartyProxy proxy = factory.getInstance();
@@ -64,5 +61,5 @@
 			throws IOException, InterruptedException, PythonError {
 		PythonPartyFactory factory = new PythonPartyFactory(
-				new File(STUPIDPARTY));
+				new File("src/test/resources/stupidparty-1.0.0.tar.gz"));
 		System.out.println("\nGetting a party instance");
 		PartyProxy proxy = factory.getInstance();
@@ -89,5 +86,5 @@
 
 		PythonPartyFactory factory = new PythonPartyFactory(
-				new File(STUPIDPARTY));
+				new File("src/test/resources/stupidparty-1.0.0.tar.gz"));
 		System.out.println("\nGetting a party instance");
 		PartyProxy proxy = factory.getInstance();
@@ -125,5 +122,5 @@
 
 		PythonPartyFactory factory = new PythonPartyFactory(
-				new File(STUPIDPARTY));
+				new File("src/test/resources/stupidparty-1.0.0.tar.gz"));
 		PartyProxy proxy = factory.getInstance();
 		MyConnEnd conn = new MyConnEnd();
Index: javavenv/src/test/java/geniusweb/javavenv/PythonVenvTest.java
===================================================================
--- javavenv/src/test/java/geniusweb/javavenv/PythonVenvTest.java	(revision 1)
+++ javavenv/src/test/java/geniusweb/javavenv/PythonVenvTest.java	(revision 1)
@@ -0,0 +1,47 @@
+package geniusweb.javavenv;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import tudelft.utilities.logging.ReportToLogger;
+import tudelft.utilities.logging.Reporter;
+
+/**
+ * Contains a Python Venv for a specific python tar.gz file.
+ *
+ */
+public class PythonVenvTest {
+	private final Reporter logger = new ReportToLogger("test");
+
+	// "." and "-" not allowed in the name, only _
+	@Test(expected = IllegalArgumentException.class)
+	public void badNameTest()
+			throws IOException, InterruptedException, PythonError {
+		PythonVenv env = new PythonVenv("stupidparty-1.0.0", logger);
+		env.remove();
+	}
+
+	@Test
+	public void test() throws IOException, InterruptedException, PythonError {
+		PythonVenv env = new PythonVenv("python3party100", logger);
+		env.remove();
+	}
+
+	/**
+	 * One test for both pip list and pip install, because user may have to give
+	 * permission for each venv separately
+	 */
+	@Test
+	public void testPipInstallNumpy()
+			throws IOException, InterruptedException, PythonError {
+		PythonVenv env = new PythonVenv("python3party100", logger);
+		env.call("-m pip install --upgrade pip", 20000);
+		String res = env.call("-m pip list", 10000);
+		System.out.println("pip list gave " + res);
+		res = env.call("-m pip install numpy", 30000);
+		System.out.println("pip install numpy gave " + res);
+		env.remove();
+	}
+
+}
Index: javavenv/src/test/resources/print.py
===================================================================
--- javavenv/src/test/resources/print.py	(revision 1)
+++ javavenv/src/test/resources/print.py	(revision 1)
@@ -0,0 +1,1 @@
+print("hello")
Index: javavenv/src/test/resources/print3xnonewline.py
===================================================================
--- javavenv/src/test/resources/print3xnonewline.py	(revision 1)
+++ javavenv/src/test/resources/print3xnonewline.py	(revision 1)
@@ -0,0 +1,3 @@
+print("hello", end="")
+print("this is another message", end="")
+print("And another", end="")
Index: javavenv/src/test/resources/printerr.py
===================================================================
--- javavenv/src/test/resources/printerr.py	(revision 1)
+++ javavenv/src/test/resources/printerr.py	(revision 1)
@@ -0,0 +1,2 @@
+import sys
+sys.stderr.write("this was bad")
Index: javavenv/src/test/resources/printnonewline.py
===================================================================
--- javavenv/src/test/resources/printnonewline.py	(revision 1)
+++ javavenv/src/test/resources/printnonewline.py	(revision 1)
@@ -0,0 +1,1 @@
+print("hello", end="")
Index: javavenv/src/test/resources/throw.py
===================================================================
--- javavenv/src/test/resources/throw.py	(revision 1)
+++ javavenv/src/test/resources/throw.py	(revision 1)
@@ -0,0 +1,7 @@
+
+def deeperror(n):
+    if n>0:
+        deeperror(n-1)
+    raise ValueError("yes this is bad")
+
+deeperror(4)
Index: javavenv/src/test/resources/wait5sec.py
===================================================================
--- javavenv/src/test/resources/wait5sec.py	(revision 1)
+++ javavenv/src/test/resources/wait5sec.py	(revision 1)
@@ -0,0 +1,3 @@
+from time import sleep
+sleep(2)   
+print("hello world")
