[rtems-central commit] validation: Support for runtime performance reqs

Sebastian Huber sebh at rtems.org
Fri Nov 13 10:09:47 UTC 2020


Module:    rtems-central
Branch:    master
Commit:    180d41362d45cebd4d2427a33e8781d3fafcb133
Changeset: http://git.rtems.org/rtems-central/commit/?id=180d41362d45cebd4d2427a33e8781d3fafcb133

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Nov 12 15:07:41 2020 +0100

validation: Support for runtime performance reqs

---

 rtemsspec/tests/spec-validation/rpr.yml      | 39 ++++++++++++++
 rtemsspec/tests/spec/non-functional-more.yml | 21 ++++++++
 rtemsspec/tests/spec/non-functional.yml      | 24 +++++++++
 rtemsspec/tests/test_validation.py           | 66 +++++++++++++++++++++++
 rtemsspec/validation.py                      | 78 +++++++++++++++++++++++++---
 5 files changed, 220 insertions(+), 8 deletions(-)

diff --git a/rtemsspec/tests/spec-validation/rpr.yml b/rtemsspec/tests/spec-validation/rpr.yml
new file mode 100644
index 0000000..edaa129
--- /dev/null
+++ b/rtemsspec/tests/spec-validation/rpr.yml
@@ -0,0 +1,39 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: runtime-measurement-request
+  uid: rtm
+limits: {}
+params: {}
+rationale: null
+references: []
+test-body:
+  brief: |
+    Body brief.
+  code: |
+    /* Body code */
+  description: |
+    Body description.
+test-cleanup:
+  brief: |
+    Cleanup brief.
+  code: |
+    /* Cleanup code */
+  description: |
+    Cleanup description.
+test-prepare: null
+test-setup: null
+test-teardown:
+  brief: |
+    Teardown brief.
+  code: |
+    /* Teardown code */
+  description: |
+    Teardown description.
+non-functional-type: performance-runtime
+requirement-type: non-functional
+text: |
+  Text.
+type: requirement
diff --git a/rtemsspec/tests/spec/non-functional-more.yml b/rtemsspec/tests/spec/non-functional-more.yml
new file mode 100644
index 0000000..ba081e3
--- /dev/null
+++ b/rtemsspec/tests/spec/non-functional-more.yml
@@ -0,0 +1,21 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+  uid: root
+- role: spec-refinement
+  spec-key: non-functional-type
+  spec-value: performance-runtime
+  uid: non-functional
+spec-description: null
+spec-example: null
+spec-info:
+  dict:
+    attributes: {}
+    description: null
+    mandatory-attributes: all
+spec-name: None-Functional More
+spec-type: non-functional-more
+type: spec
diff --git a/rtemsspec/tests/spec/non-functional.yml b/rtemsspec/tests/spec/non-functional.yml
new file mode 100644
index 0000000..32d1a54
--- /dev/null
+++ b/rtemsspec/tests/spec/non-functional.yml
@@ -0,0 +1,24 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: spec-member
+  uid: root
+- role: spec-refinement
+  spec-key: requirement-type
+  spec-value: non-functional
+  uid: requirement
+spec-description: null
+spec-example: null
+spec-info:
+  dict:
+    attributes:
+      non-functional-type:
+        description: null
+        spec-type: name
+    description: null
+    mandatory-attributes: all
+spec-name: None-Functional
+spec-type: non-functional
+type: spec
diff --git a/rtemsspec/tests/test_validation.py b/rtemsspec/tests/test_validation.py
index ed17189..3123434 100644
--- a/rtemsspec/tests/test_validation.py
+++ b/rtemsspec/tests/test_validation.py
@@ -1088,6 +1088,64 @@ static void Rtm_Cleanup( Rtm_Context *ctx )
 }
 
 /**
+ * @brief Body brief.
+ *
+ * Body description.
+ */
+static void Rpr_Body( Rtm_Context *ctx )
+{
+  /* Body code */
+}
+
+static void Rpr_Body_Wrap( void *arg )
+{
+  Rtm_Context *ctx;
+
+  ctx = arg;
+  Rpr_Body( ctx );
+}
+
+/**
+ * @brief Teardown brief.
+ *
+ * Teardown description.
+ */
+static bool Rpr_Teardown(
+  Rtm_Context *ctx,
+  T_ticks     *delta,
+  uint32_t     tic,
+  uint32_t     toc,
+  unsigned int retry
+)
+{
+  /* Teardown code */
+}
+
+static bool Rpr_Teardown_Wrap(
+  void        *arg,
+  T_ticks     *delta,
+  uint32_t     tic,
+  uint32_t     toc,
+  unsigned int retry
+)
+{
+  Rtm_Context *ctx;
+
+  ctx = arg;
+  return Rpr_Teardown( ctx, delta, tic, toc, retry );
+}
+
+/**
+ * @brief Cleanup brief.
+ *
+ * Cleanup description.
+ */
+static void Rpr_Cleanup( Rtm_Context *ctx )
+{
+  /* Cleanup code */
+}
+
+/**
  * @fn void T_case_body_Rtm( void )
  */
 T_TEST_CASE_FIXTURE( Rtm, &Rtm_Fixture )
@@ -1095,6 +1153,14 @@ T_TEST_CASE_FIXTURE( Rtm, &Rtm_Fixture )
   Rtm_Context *ctx;
 
   ctx = T_fixture_context();
+
+  ctx->request.name = "Rpr";
+  ctx->request.setup = NULL;
+  ctx->request.body = Rpr_Body_Wrap;
+  ctx->request.teardown = Rpr_Teardown_Wrap;
+  T_measure_runtime( ctx->context, &ctx->request );
+  Rpr_Cleanup( ctx );
+  Rtm_Cleanup( ctx );
 }
 
 /** @} */
diff --git a/rtemsspec/validation.py b/rtemsspec/validation.py
index 1bef560..289b6a6 100644
--- a/rtemsspec/validation.py
+++ b/rtemsspec/validation.py
@@ -24,6 +24,8 @@
 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 # POSSIBILITY OF SUCH DAMAGE.
 
+# pylint: disable=too-many-lines
+
 import itertools
 import math
 import os
@@ -757,6 +759,23 @@ class _ActionRequirementTestItem(_TestItem):
         content.add("/** @} */")
 
 
+class _RuntimeMeasurementRequestItem(_TestItem):
+    """ A runtime measurement request item. """
+    def __init__(self, item: Item, context: str):
+        super().__init__(item)
+        self._context = context
+
+    @property
+    def context(self) -> str:
+        return self._context
+
+
+def _add_call_method(content: CContent, name: str) -> None:
+    if name != "NULL":
+        content.gap = False
+        content.call_function(None, name, ["ctx"])
+
+
 class _RuntimeMeasurementTestItem(_TestItem):
     """ A runtime measurement test item. """
     def add_test_case_action_description(self, _content: CContent) -> None:
@@ -770,6 +789,55 @@ class _RuntimeMeasurementTestItem(_TestItem):
             "This member provides the measure runtime request.", None)
         content.add("T_measure_runtime_request request;")
 
+    def _add_requests(self, content: CContent) -> CContent:
+        requests = CContent()
+        prepare = self.add_support_method(content,
+                                          "test-prepare",
+                                          "Prepare",
+                                          do_wrap=False)
+        cleanup = self.add_support_method(content,
+                                          "test-cleanup",
+                                          "Cleanup",
+                                          do_wrap=False)
+        for item in self.item.children("runtime-measurement-request"):
+            req = _RuntimeMeasurementRequestItem(item, self.context)
+            requests.add_blank_line()
+            _add_call_method(requests, prepare)
+            name = req.add_support_method(content,
+                                          "test-prepare",
+                                          "Prepare",
+                                          do_wrap=False)
+            _add_call_method(requests, name)
+            name = req.add_support_method(content, "test-setup", "Setup")
+            requests.append([
+                f"ctx->request.name = \"{req.ident}\";",
+                f"ctx->request.setup = {name};"
+            ])
+            name = req.add_support_method(content, "test-body", "Body")
+            requests.append([f"ctx->request.body = {name};"])
+            extra_params = [
+                "T_ticks *delta", "uint32_t tic", "uint32_t toc",
+                "unsigned int retry"
+            ]
+            extra_args = ["delta", "tic", "toc", "retry"]
+            name = req.add_support_method(content,
+                                          "test-teardown",
+                                          "Teardown",
+                                          ret="bool",
+                                          extra_params=extra_params,
+                                          extra_args=extra_args)
+            requests.append([f"ctx->request.teardown = {name};"])
+            requests.gap = False
+            requests.call_function(None, "T_measure_runtime",
+                                   ["ctx->context", "&ctx->request"])
+            name = req.add_support_method(content,
+                                          "test-cleanup",
+                                          "Cleanup",
+                                          do_wrap=False)
+            _add_call_method(requests, name)
+            _add_call_method(requests, cleanup)
+        return requests
+
     def generate(self, content: CContent, base_directory: str,
                  test_case_to_suites: Dict[str, List[_TestItem]]) -> None:
         self.add_test_case_description(content, test_case_to_suites)
@@ -799,14 +867,7 @@ class _RuntimeMeasurementTestItem(_TestItem):
             f"  .teardown = {teardown},", "  .scope = NULL,",
             f"  .initial_context = &{self.ident}_Instance", "};"
         ])
-        self.add_support_method(content,
-                                "test-prepare",
-                                "Prepare",
-                                do_wrap=False)
-        self.add_support_method(content,
-                                "test-cleanup",
-                                "Cleanup",
-                                do_wrap=False)
+        requests = self._add_requests(content)
         with content.function_block(f"void T_case_body_{self.ident}( void )"):
             pass
         content.gap = False
@@ -819,6 +880,7 @@ class _RuntimeMeasurementTestItem(_TestItem):
                 "",
                 "ctx = T_fixture_context();",
             ])
+            content.append(requests)
         content.add("/** @} */")
 
 



More information about the vc mailing list