From 8c8d7f3ea845b01a9fc3a574374a942e4fa6a3ba Mon Sep 17 00:00:00 2001
From: Andrea Franchini <hello@andreafranchini.com>
Date: Tue, 30 May 2023 12:51:42 +0200
Subject: [PATCH] Add new test cases

---
 mc_openapi/doml_mc/main.py |  2 ++
 requirements.txt           |  3 +-
 tests/test_modelchecker.py | 67 ++++++++++++++++++++++++++++++++++++--
 3 files changed, 69 insertions(+), 3 deletions(-)

diff --git a/mc_openapi/doml_mc/main.py b/mc_openapi/doml_mc/main.py
index dce6d80..1a9caa2 100644
--- a/mc_openapi/doml_mc/main.py
+++ b/mc_openapi/doml_mc/main.py
@@ -92,6 +92,8 @@ def verify_model(
 
     res = results.summarize()
 
+    res['doml_version'] = dmc.doml_version.name
+
     logging.info(res)
 
     return res
diff --git a/requirements.txt b/requirements.txt
index f742a1c..d03d7da 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -53,4 +53,5 @@ uvicorn==0.20.0
 Werkzeug==2.2.2
 z3-solver==4.11.2.0
 tabulate==0.9.0
-pytest-xdist==3.3.1
\ No newline at end of file
+pytest-xdist==3.3.1
+subtests==0.11.0
\ No newline at end of file
diff --git a/tests/test_modelchecker.py b/tests/test_modelchecker.py
index 1881918..df51edc 100644
--- a/tests/test_modelchecker.py
+++ b/tests/test_modelchecker.py
@@ -1,6 +1,69 @@
+from importlib.resources import files
 from mc_openapi.doml_mc import init_model, verify_model
+from pathlib import Path
 
-def setup(src, ver):
+from mc_openapi.doml_mc.intermediate_model.metamodel import DOMLVersion
+
+doml_test_dir = files(package='tests') / 'doml'
+
+def run(src, ver):
     dmc = init_model(src, ver)
-    verify_model(dmc)
+    return verify_model(dmc)
+
+def test_domlx_models_by_version(subtests):
+    i = 0
+    for doml_ver_dir in [ver for ver in doml_test_dir.iterdir() if ver.name != 'CaseStudies']:
+        doml_ver = doml_ver_dir.name
+        domlx_files = [f for f in doml_ver_dir.iterdir() if f.is_file() and f.name.endswith('.domlx')]
+        for domlx in domlx_files:
+            with open(domlx, "rb") as f:
+                domlx_file = f.read()
+                assert_ver = DOMLVersion.get(doml_ver)
+                res = run(domlx_file, assert_ver)
+                try:
+                    assert_result = OUTPUT[doml_ver][domlx.name]
+                    i += 1
+                except:
+                    pass
+            if assert_result:
+                with subtests.test(msg=f"{doml_ver}/{domlx.name}", i=i):
+                        assert assert_result == res['result'].name
+                        assert assert_ver.name == res['doml_version']
+
+OUTPUT = {
+    'v2.0': {
+        'faas.domlx': 'unsat',
+        'nginx-openstack_v2.0.domlx': 'sat',
+        'nginx-openstack_v2.0_wrong_all_concrete_map_something.domlx': 'unsat',
+        'nginx-openstack_v2.0_wrong_all_infrastructure_elements_deployed.domlx': 'unsat',
+        'nginx-openstack_v2.0_wrong_iface_uniq.domlx': 'unsat',
+        'nginx-openstack_v2.0_wrong_software_package_iface_net.domlx': 'unsat',
+        'nginx-openstack_v2.0_valid_mem_req.domlx': 'sat',
+        'nginx-openstack_v2.0_wrong_nginx_source_code.domlx': 'sat',
+        'openstack_template.domlx': 'unsat',
+        'saas.domlx': 'sat',
+        'saas_https_no_attrs.domlx': 'sat',
+        'saas_no_https_rule.domlx': 'sat',
+        'saas_wrong_no_iface_sg.domlx': 'sat',
+        'nginx-openstack_v2.0_wrong_vm_has_iface.domlx': 'unsat',
+        'nginx-openstack_v2.0_wrong_all_software_components_deployed.domlx': 'unsat'
+    },
+    'v2.1': {
+        'faas.domlx': 'unsat',
+        'nginx-aws-ec2.domlx': 'sat'
+    },
+    'v2.2': {
+        'faas.domlx': 'unsat',
+        'iot_simple_app.domlx': 'unsat',
+        'nginx-aws-ec2.domlx': 'sat',
+        'nginx_func_req2_unsat.domlx': 'unsat',
+        'nginx_func_req2_unsat_neg.domlx': 'unsat',
+        'nginx_func_req_neg.domlx': 'sat',
+        'nginx-csp-compatibility-test.domlx': 'sat',
+        'nginx_func_req.domlx': 'sat',
+        'nginx_flags.domlx': 'sat'
+    },
+    'v2.3': {
 
+    },
+}
\ No newline at end of file
-- 
GitLab