]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.testing/src/org/simantics/db/testing/base/ScriptTestBase.java
Added missing org.simantics.db.{tests,testing} plug-ins.
[simantics/platform.git] / bundles / org.simantics.db.testing / src / org / simantics / db / testing / base / ScriptTestBase.java
diff --git a/bundles/org.simantics.db.testing/src/org/simantics/db/testing/base/ScriptTestBase.java b/bundles/org.simantics.db.testing/src/org/simantics/db/testing/base/ScriptTestBase.java
new file mode 100644 (file)
index 0000000..9fa7241
--- /dev/null
@@ -0,0 +1,150 @@
+package org.simantics.db.testing.base;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.management.ManagementFactory;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osgi.service.datalocation.Location;
+import org.junit.Assert;
+import org.simantics.db.testing.cases.FreshWorkspaceTest;
+import org.simantics.scl.compiler.commands.CommandSession;
+import org.simantics.scl.compiler.commands.TestScriptExecutor;
+import org.simantics.scl.osgi.SCLOsgi;
+import org.simantics.utils.FileUtils;
+
+public class ScriptTestBase  extends FreshWorkspaceTest {
+    
+
+    String path;
+
+    public ScriptTestBase(String path) {
+        this.path = path;
+    }    
+
+    /**
+     * Runs a test case without a timeout
+     */
+    protected void test() {
+       
+       String testPath = getTestPath();
+       test(0, testPath);
+    }
+    
+    /**
+     * Runs a test case with given timeout as seconds.
+     * 
+     * @param allowedExecutionTime allowed execution time given in seconds.
+     */
+    protected void test(int allowedExecutionTime) {
+       
+       String testPath = getTestPath();
+       test(allowedExecutionTime, testPath);
+    }
+
+    /**
+     * Runs a test case with given timeout as seconds. When the time runs out, heapdump and threaddump of the java process is taken and stored to the current workspace.
+     * The workspace is being compressed to a Zip-file and then copied and stored to the current working directory. In the end the whole java process gets killed to prevent deadlocks.
+     * 
+     * @param allowedExecutionTime allowed execution time given in seconds.
+     */
+    protected void test(final int allowedExecutionTime, final String testPath) {
+       
+       if(allowedExecutionTime > 0) {
+               Timer timer = new Timer();
+               try {
+               timer.schedule(new TimerTask() {
+
+                               @Override
+                               public void run() {
+                                       
+                                       try {
+                                               String workingDir = System.getProperty("user.dir");
+                                               Location location = Platform.getInstanceLocation();
+                                               String workspacePath = location.getURL().getPath().substring(1);
+                                               String[] pathToWorkspace = workspacePath.split("/");
+//                                             String[] testName = testPath.split("/");
+                                               
+//                                             String hdumpFileName = workspacePath + testName[testName.length - 1] + ".hprof";
+//                                             GetHeapDump.dumpHeap(hdumpFileName, false);
+                                               
+//                                             String tdumpFileName = workspacePath + testName[testName.length - 1] + ".tdump";
+//                                             GetThreadDump.dumpThread(tdumpFileName);
+                                               
+                                               SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyy_HH.mm.ss");
+                                               String date = sdf.format(new Date());
+                                               String zipDir = workingDir + "/" + pathToWorkspace[pathToWorkspace.length - 1] + "_" + date +  ".zip";
+                                               FileUtils.compressZip(workspacePath, zipDir);
+                                               
+                                               String processName = ManagementFactory.getRuntimeMXBean().getName();
+                                               System.out.println("PID: " + processName);
+                                               String PID = processName.split("@")[0];
+                                               String command = "taskkill /F /PID " + PID;
+                                               System.out.println("Command: " + command);
+                                               Runtime.getRuntime().exec(command);
+
+                                       } catch (IOException ioe) {
+                                               ioe.printStackTrace();
+                                               System.err.println(ioe);
+                                       }
+                                       
+                               }
+               }, 1000*allowedExecutionTime);
+               testImpl(testPath);
+               } finally {
+                       timer.cancel(); 
+               }
+       } else {
+               testImpl(testPath);
+       }
+       
+    }
+
+    protected void testImpl(String testPath) {
+       
+       System.out.println("Testing script: " + testPath);
+
+        InputStream stream = getClass().getResourceAsStream(testPath);
+        if(stream == null)
+            Assert.fail("Didn't find " + testPath + " at " + getClass().getResource(""));
+        try {
+            CommandSession session = new CommandSession(SCLOsgi.MODULE_REPOSITORY, null);
+            TestScriptExecutor executor = new TestScriptExecutor(session,
+                    new BufferedReader(new InputStreamReader(stream)), null);
+            executor.execute();
+            //isDBLogClean();
+        } catch(IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            try {
+                stream.close();
+            } catch (IOException e) {
+            }
+        }
+    }
+    
+    public String getTestPath() {
+       
+       String methodName = new Exception().getStackTrace()[2].getMethodName();
+        String testPath = path + "/" + methodName + ".sts";
+       
+       return testPath;
+    }
+    
+    public void isDBLogClean() throws IOException {
+       
+       String workingDir = System.getProperty("user.dir");
+       try (BufferedReader br = new BufferedReader(new FileReader(workingDir + "/db-client.log"))) {
+               Assert.assertEquals(br.readLine(), null);
+       }
+       
+    }
+    
+}
\ No newline at end of file