[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