From a6ca088361479b0fb0b83ae310957ee087530a5c Mon Sep 17 00:00:00 2001
From: Andrea Franchini <hello@andreafranchini.com>
Date: Tue, 28 Feb 2023 11:50:50 +0100
Subject: [PATCH] Fix test support for DOML 2.2

---
 mc_openapi/__main__.py                      | 23 +++++++++-------
 mc_openapi/doml_mc/xmi_parser/doml_model.py |  2 +-
 mc_openapi/handlers.py                      | 29 ++++++++++++++++++++-
 tests/test_mc_openapi.py                    |  2 +-
 4 files changed, 43 insertions(+), 13 deletions(-)

diff --git a/mc_openapi/__main__.py b/mc_openapi/__main__.py
index 96c0fd2..3ce0690 100644
--- a/mc_openapi/__main__.py
+++ b/mc_openapi/__main__.py
@@ -22,7 +22,7 @@ from mc_openapi.doml_mc.xmi_parser.doml_model import get_pyecore_model
 parser = argparse.ArgumentParser()
 
 parser.add_argument("-d", "--doml", dest="doml", help="the DOMLX file to check")
-parser.add_argument("-V", "--doml-version", dest="doml_version", default="V2_0", help="(optional) the version used by the DOMLX file")
+parser.add_argument("-V", "--doml-version", dest="doml_version", help="(optional) the version used by the DOMLX file")
 parser.add_argument("-r", "--requirements", dest="requirements", help="the user-specified requirements file to check")
 parser.add_argument("-p", "--port", dest="port", type=int, default=8080, help="the port exposing the model checker REST API (default: 8080)")
 parser.add_argument("-v", "--verbose", dest="verbose", action='store_true', help="print a detailed human-readable output of everything going on. Helpful for debugging.")
@@ -52,14 +52,16 @@ else:
     reqs_path = args.requirements
 
     # Try using the user-provided DOML version
-    try:
-        doml_ver = DOMLVersion[args.doml_version]
-    except:
-        # Suggest valid DOML versions
-        print(f"Unknown DOML version '{args.doml_version}'")
-        versions = [ ver.name for ver in list(DOMLVersion)]
-        print(f"Available DOML versions = {versions}")
-        exit(1)
+    doml_ver = None
+    if args.doml_version is not None:
+        try:
+            doml_ver = DOMLVersion[args.doml_version]
+        except:
+            # Suggest valid DOML versions
+            print(f"Unknown DOML version '{args.doml_version}'")
+            versions = [ ver.name for ver in list(DOMLVersion)]
+            print(f"Available DOML versions = {versions}")
+            exit(1)
 
     with open(doml_path, "rb") as xmif:
         # Read DOML file from path
@@ -67,6 +69,7 @@ else:
 
     # Config the model checker (setup metamodels and intermediate models)
     dmc = ModelChecker(doml_xmi, doml_ver)
+    doml_ver = dmc.doml_version
 
     # Store of Requirements and unique string constants
     user_req_store = RequirementStore()
@@ -99,7 +102,7 @@ else:
             exit(-1)
 
     if doml_ver == DOMLVersion.V2_2:
-        model = get_pyecore_model(doml_xmi, DOMLVersion.V2_2)
+        model = get_pyecore_model(doml_xmi, doml_ver)
         func_reqs = model.functionalRequirements.items
         for req in func_reqs:
             req_name: str = req.name
diff --git a/mc_openapi/doml_mc/xmi_parser/doml_model.py b/mc_openapi/doml_mc/xmi_parser/doml_model.py
index 288fb98..0659bf6 100644
--- a/mc_openapi/doml_mc/xmi_parser/doml_model.py
+++ b/mc_openapi/doml_mc/xmi_parser/doml_model.py
@@ -114,7 +114,7 @@ def parse_doml_model(raw_model: bytes, doml_version: Optional[DOMLVersion]) -> T
 def get_pyecore_model(raw_model: bytes, doml_version: Optional[DOMLVersion]) -> EObject:
     if doml_version is None:
         doml_version = infer_domlx_version(raw_model)
-
+    # TODO: See if its better replaced by the get_model() in parse_doml_version() 
     return parse_xmi_model(raw_model, doml_version)
 
 from typing import Optional
diff --git a/mc_openapi/handlers.py b/mc_openapi/handlers.py
index a84048e..99b3d85 100644
--- a/mc_openapi/handlers.py
+++ b/mc_openapi/handlers.py
@@ -1,4 +1,9 @@
 import datetime
+from mc_openapi.doml_mc.domlr_parser.parser import DOMLRTransformer, Parser
+from mc_openapi.doml_mc.imc import RequirementStore
+
+from mc_openapi.doml_mc.intermediate_model.metamodel import DOMLVersion
+from mc_openapi.doml_mc.xmi_parser.doml_model import get_pyecore_model
 from .doml_mc import ModelChecker, MCResult
 
 
@@ -13,8 +18,30 @@ def make_error(user_msg, debug_msg=None):
 def post(body):
     doml_xmi = body
     try:
+
         dmc = ModelChecker(doml_xmi)
-        results = dmc.check_requirements(threads=2, consistency_checks=False, timeout=50)
+
+        user_req_store = None
+        user_req_str_consts = []
+
+        # Add support for Requirements in DOML
+        if dmc.doml_version == DOMLVersion.V2_2:
+                domlr_parser = Parser(DOMLRTransformer)
+                model = get_pyecore_model(doml_xmi, DOMLVersion.V2_2)
+                func_reqs = model.functionalRequirements.items
+
+                user_req_store = RequirementStore()
+
+                for req in func_reqs:
+                    req_name: str = req.name
+                    req_text: str = req.description
+                    req_text = req_text.replace("```", "")
+                    doml_req_store, doml_req_str_consts = domlr_parser.parse(req_text)
+                    user_req_store += doml_req_store
+                    user_req_str_consts += doml_req_str_consts
+
+
+        results = dmc.check_requirements(threads=2, user_requirements=user_req_store, user_str_values=user_req_str_consts, consistency_checks=False, timeout=50)
         res, msg = results.summarize()
 
         if res == MCResult.sat:
diff --git a/tests/test_mc_openapi.py b/tests/test_mc_openapi.py
index 7ab1ae0..506b33b 100644
--- a/tests/test_mc_openapi.py
+++ b/tests/test_mc_openapi.py
@@ -90,7 +90,7 @@ def test_post_faas_unsat_V2_2():
     payload = r.json()
     assert r.status_code == requests.codes.ok
     assert payload["result"] is not None
-    assert payload["result"] == "sat"
+    assert payload["result"] == "unsat"
 
 
 def test_post_nginx_with_func_reqs_unsat_V2_2():
-- 
GitLab