Просмотр исходного кода

Revamp the utilities such that a new MvC implementation for testing
becomes possible, using the Python wrapper

Yentl Van Tendeloo 8 лет назад
Родитель
Сommit
c4a970e066
3 измененных файлов с 57 добавлено и 40 удалено
  1. 31 32
      integration/test_mvc.py
  2. 14 2
      integration/utils.py
  3. 12 6
      scripts/run_MvC_server.py

+ 31 - 32
integration/test_mvc.py

@@ -1,43 +1,42 @@
 import unittest
 
 from utils import *
+import sys
 
-model_list = set(["  SimpleClassDiagrams : SimpleClassDiagrams",
-                  "  CoreFormalism : SimpleClassDiagrams",
-                  "  ManualOperation : SimpleClassDiagrams",
-                  "  ActionLanguage : SimpleClassDiagrams",
-                  "  ProcessModel : SimpleClassDiagrams",
-                  "  Tracability : SimpleClassDiagrams",
-                  "  core : CoreFormalism"])
+sys.path.append("wrappers")
+from modelverse import *
 
-model_full_list = set(["  221 root admin SimpleClassDiagrams : SimpleClassDiagrams",
-                       "  221 root admin CoreFormalism : SimpleClassDiagrams",
-                       "  221 root admin ActionLanguage : SimpleClassDiagrams",
-                       "  221 root admin ManualOperation : SimpleClassDiagrams",
-                       "  221 root admin ProcessModel : SimpleClassDiagrams",
-                       "  221 root admin Tracability : SimpleClassDiagrams",
-                       "  200 root admin core : CoreFormalism"])
+expected_model_list = set(["  SimpleClassDiagrams : SimpleClassDiagrams",
+                           "  CoreFormalism : SimpleClassDiagrams",
+                           "  ManualOperation : SimpleClassDiagrams",
+                           "  ActionLanguage : SimpleClassDiagrams",
+                           "  ProcessModel : SimpleClassDiagrams",
+                           "  Tracability : SimpleClassDiagrams",
+                           "  core : CoreFormalism"])
 
-all_files = [   "core/mini_modify.alc",
-                "core/core_formalism.mvc",
-                "core/core_algorithm.alc",
-                "core/pm.mvc",
-                "core/tracability.mvc",
-                "primitives.alc",
-                "object_operations.alc",
-                "conformance_scd.alc",
-                "library.alc",
-                "transform.alc",
-                "model_management.alc",
-                "ramify.alc",
-                "metamodels.alc",
-                "random.alc",
-                "constructors.alc",
-                "modelling.alc",
-                "compilation_manager.alc",
-            ]
+expected_model_full_list = set(["  221 root admin SimpleClassDiagrams : SimpleClassDiagrams",
+                                "  221 root admin CoreFormalism : SimpleClassDiagrams",
+                                "  221 root admin ActionLanguage : SimpleClassDiagrams",
+                                "  221 root admin ManualOperation : SimpleClassDiagrams",
+                                "  221 root admin ProcessModel : SimpleClassDiagrams",
+                                "  221 root admin Tracability : SimpleClassDiagrams",
+                                "  200 root admin core : CoreFormalism"])
 
 class TestModelverseCore(unittest.TestCase):
+    @classmethod
+    def setup_class(self):
+        self.proc, self.address = start_mvc()
+
+    @classmethod
+    def teardown_class(self):
+        kill(self.proc)
+
+    def test_list_NEW(self):
+        print("Open connection to " + str(self.address))
+        init(self.address)
+        login("admin", "admin")
+        print(model_list())
+        
     def test_list(self):
         self.assertTrue(run_file(all_files,
             [ "root", "root", "root", 

+ 14 - 2
integration/utils.py

@@ -47,18 +47,21 @@ def execute(scriptname, parameters=[], wait=False):
         # Stop now, as we would have no clue on how to kill its subtree
         raise Exception("Unknown OS version: " + str(os.name))
 
-    command = [sys.executable, "scripts/%s.py" % scriptname] + parameters
+    command = [sys.executable, "-u", "scripts/%s.py" % scriptname] + parameters
 
     if wait:
         return subprocess.call(command, shell=False)
     else:
-        return subprocess.Popen(command, shell=False)
+        return subprocess.Popen(command, shell=False, stdout=subprocess.PIPE)
 
 def kill(process):
     if os.name == "nt":
         subprocess.call(["taskkill", "/F", "/T", "/PID", "%i" % process.pid])
     elif os.name == "posix":
+        # Kill parents
         subprocess.call(["pkill", "-P", "%i" % process.pid])
+        # Kill self
+        subprocess.call(["kill", "%i" % process.pid])
 
 def flush_data(address, data):
     if data:
@@ -102,6 +105,15 @@ def compile_file(address, mod_filename, filename, mode, proc):
         except UnboundLocalError:
             pass
 
+def start_mvc():
+    address = "http://127.0.0.1:%s" % getFreePort()
+    proc = execute("run_MvC_server", [address], wait=False)
+    # TODO Return only when everything is fine! (i.e., parse the output of proc and wait until it contains "MvC is ready"
+    while 1:
+        l = proc.stdout.readline()
+        if "MvC is ready" in l:
+            return proc, address
+
 def run_file(files, parameters, expected, wait=False):
     # Resolve file
     import os.path

+ 12 - 6
scripts/run_MvC_server.py

@@ -6,20 +6,26 @@ import random
 import urllib
 import urllib2
 
-MVK_PORT = 8001
-MVK_ADDRESS = "http://127.0.0.1"
+import sys
+
+if len(sys.argv) > 1:
+    address = sys.argv[1]
+    MVK_ADDRESS, MVK_PORT = address.rsplit(":", 1)
+else:
+    MVK_PORT = 8001
+    MVK_ADDRESS = "http://127.0.0.1"
+    address = "%s:%s" % (MVK_ADDRESS, MVK_PORT)
+
 ADMIN_USER = "admin"
 ADMIN_PASSWORD = "admin"
 SETUP_USER = "setup_task"
 
-address = "%s:%s" % (MVK_ADDRESS, MVK_PORT)
-
 # Compile the Statechart first
 subprocess.check_call([sys.executable, "-m", "sccd.compiler.sccdc", "-p", "threads", "server.xml"], cwd="hybrid_server")
 
 # Start up the MvK as a subprocess
 try:
-    obj = subprocess.Popen([sys.executable, "run_mvk_server.py", str(MVK_PORT)], cwd="hybrid_server")
+    obj = subprocess.Popen([sys.executable, "-u", "run_mvk_server.py", str(MVK_PORT)], cwd="hybrid_server", stdout=subprocess.PIPE)
     #obj = subprocess.Popen([sys.executable, "run_mvk_server.py", str(MVK_PORT), "--kernel=legacy-interpreter"], cwd="hybrid_server")
 
     # Compile all MvC code
@@ -32,7 +38,7 @@ try:
     urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"exit"', "taskname": SETUP_USER}))).read()
 
     while 1:
-        time.sleep(1)
+        print(obj.stdout.readline().strip())
 finally:
     try:
         obj.terminate()