summaryrefslogtreecommitdiff
path: root/rtemsspec
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2023-11-21 11:13:16 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2023-11-21 11:15:25 +0100
commit82d2dbe09683c898e1999e2314de6fac4ccad740 (patch)
tree07de2354a1e0de24222687cf39fe61800e520917 /rtemsspec
parent61a4f93ed2e6f8353cac2cbd43a52b39cb8ef1c9 (diff)
rtems: Add RTEMSItemCache
Diffstat (limited to 'rtemsspec')
-rw-r--r--rtemsspec/packagebuildfactory.py2
-rw-r--r--rtemsspec/rtems.py59
-rw-r--r--rtemsspec/tests/spec-packagebuild/glossary-general.yml12
-rw-r--r--rtemsspec/tests/spec-packagebuild/qdp/package-build.yml2
-rw-r--r--rtemsspec/tests/spec-packagebuild/qdp/steps/a.yml4
-rw-r--r--rtemsspec/tests/spec-packagebuild/qdp/steps/rtems-item-cache.yml11
-rw-r--r--rtemsspec/tests/spec-packagebuild/req/glossary.yml12
-rw-r--r--rtemsspec/tests/spec-packagebuild/req/root.yml12
-rw-r--r--rtemsspec/tests/spec-packagebuild/rtems/domain.yml13
-rw-r--r--rtemsspec/tests/spec-packagebuild/rtems/group-acfg.yml16
-rw-r--r--rtemsspec/tests/spec-packagebuild/rtems/group.yml19
-rw-r--r--rtemsspec/tests/spec-packagebuild/rtems/header.yml16
-rw-r--r--rtemsspec/tests/spec-packagebuild/rtems/if.yml36
-rw-r--r--rtemsspec/tests/spec-packagebuild/rtems/proxy.yml6
-rw-r--r--rtemsspec/tests/spec-packagebuild/rtems/req.yml14
-rw-r--r--rtemsspec/tests/spec-packagebuild/rtems/test-case.yml34
16 files changed, 268 insertions, 0 deletions
diff --git a/rtemsspec/packagebuildfactory.py b/rtemsspec/packagebuildfactory.py
index 9b3e7944..28e52fa3 100644
--- a/rtemsspec/packagebuildfactory.py
+++ b/rtemsspec/packagebuildfactory.py
@@ -28,6 +28,7 @@ from rtemsspec.archiver import Archiver
from rtemsspec.directorystate import DirectoryState
from rtemsspec.packagebuild import BuildItemFactory, PackageVariant
from rtemsspec.reposubset import RepositorySubset
+from rtemsspec.rtems import RTEMSItemCache
from rtemsspec.runactions import RunActions
from rtemsspec.runtests import RunTests, TestLog
from rtemsspec.testrunner import DummyTestRunner, GRMONManualTestRunner, \
@@ -40,6 +41,7 @@ def create_build_item_factory() -> BuildItemFactory:
factory.add_constructor("qdp/build-step/archive", Archiver)
factory.add_constructor("qdp/build-step/repository-subset",
RepositorySubset)
+ factory.add_constructor("qdp/build-step/rtems-item-cache", RTEMSItemCache)
factory.add_constructor("qdp/build-step/run-actions", RunActions)
factory.add_constructor("qdp/build-step/run-tests", RunTests)
factory.add_constructor("qdp/directory-state/generic", DirectoryState)
diff --git a/rtemsspec/rtems.py b/rtemsspec/rtems.py
index 6407de19..df0af3f5 100644
--- a/rtemsspec/rtems.py
+++ b/rtemsspec/rtems.py
@@ -24,10 +24,15 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
+import base64
+import hashlib
import itertools
from typing import Any, List, Tuple, Union
from rtemsspec.items import create_unique_link, Item, ItemCache, Link
+from rtemsspec.glossary import augment_glossary_terms
+from rtemsspec.packagebuild import BuildItem, PackageBuildDirector
+from rtemsspec.validation import augment_with_test_case_links
_NOT_PRE_QUALIFIED = set([
"/acfg/constraint/option-not-pre-qualified",
@@ -85,6 +90,19 @@ def augment_with_test_links(item_cache: ItemCache) -> None:
_add_link(item_cache, item, link)
+def _visit_domain(item: Item, domain: Item) -> None:
+ for item_2 in itertools.chain(item.children("interface-placement"),
+ item.parents("interface-enumerator")):
+ item_2["_interface_domain"] = domain
+ _visit_domain(item_2, domain)
+
+
+def _augment_with_interface_domains(item_cache: ItemCache) -> None:
+ """ Augments the interface items with their interface domain. """
+ for item in item_cache.items_by_type["interface/domain"]:
+ _visit_domain(item, item)
+
+
_SELF_VALIDATION = {
"memory-benchmark": "memory benchmark",
"requirement/functional/action": "validation by test",
@@ -220,3 +238,44 @@ def validate(item: Item) -> None:
["interface-ingroup", "interface-ingroup-hidden"])
_fixup_pre_qualified(item, ["interface/header-file"],
"interface-placement")
+
+
+def _is_proxy_link_enabled(link: Link) -> bool:
+ return link.item.is_enabled(link.item.cache.enabled)
+
+
+class RTEMSItemCache(BuildItem):
+ """
+ This build step augments the items with RTEMS-specific attributes and
+ links.
+ """
+
+ def __init__(self, director: PackageBuildDirector, item: Item):
+ super().__init__(director, item)
+ self.item_cache = self.item.cache
+
+ # It is crucial to resolve the proxies before we use the recursive
+ # enabled below since unresolved proxy items have no links.
+ self.item_cache.resolve_proxies(_is_proxy_link_enabled)
+ self.item_cache.set_enabled(self.enabled_set, recursive_is_enabled)
+
+ augment_with_test_links(self.item_cache)
+ augment_with_test_case_links(self.item_cache)
+ _augment_with_interface_domains(self.item_cache)
+ for glossary in ["/glossary-general", "/req/glossary"]:
+ augment_glossary_terms(self.item_cache[glossary], [])
+ validate(self.item_cache[self["spec-root-uid"]])
+
+ # Calculate the overall item cache hash. Ignore QDP configuration
+ # items and specification type changes.
+ state = hashlib.sha512()
+ for item_2 in sorted(self.item_cache.values()):
+ if not item_2.type.startswith(("qdp", "spec")):
+ state.update(item_2.digest.encode("ascii"))
+ self._hash = base64.urlsafe_b64encode(state.digest()).decode("ascii")
+
+ def has_changed(self, link: Link) -> bool:
+ return link["hash"] is None or self._hash != link["hash"]
+
+ def refresh_link(self, link: Link) -> None:
+ link["hash"] = self._hash
diff --git a/rtemsspec/tests/spec-packagebuild/glossary-general.yml b/rtemsspec/tests/spec-packagebuild/glossary-general.yml
new file mode 100644
index 00000000..df7d6499
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/glossary-general.yml
@@ -0,0 +1,12 @@
+SPDX-License-Identifier: CC-BY-SA-4.0
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
+enabled-by: true
+glossary-type: group
+links:
+- role: requirement-refinement
+ uid: /req/root
+name: General
+text: |
+ The system shall have a general glossary of terms.
+type: glossary
diff --git a/rtemsspec/tests/spec-packagebuild/qdp/package-build.yml b/rtemsspec/tests/spec-packagebuild/qdp/package-build.yml
index 2af718ef..b97ccd14 100644
--- a/rtemsspec/tests/spec-packagebuild/qdp/package-build.yml
+++ b/rtemsspec/tests/spec-packagebuild/qdp/package-build.yml
@@ -4,6 +4,8 @@ copyrights:
enabled-by: true
links:
- role: build-step
+ uid: steps/rtems-item-cache
+- role: build-step
uid: steps/a
- role: build-step
uid: steps/b
diff --git a/rtemsspec/tests/spec-packagebuild/qdp/steps/a.yml b/rtemsspec/tests/spec-packagebuild/qdp/steps/a.yml
index bf480a60..27ffb675 100644
--- a/rtemsspec/tests/spec-packagebuild/qdp/steps/a.yml
+++ b/rtemsspec/tests/spec-packagebuild/qdp/steps/a.yml
@@ -11,6 +11,10 @@ links:
role: input
uid: ../variant
- hash: null
+ name: spec
+ role: input
+ uid: rtems-item-cache
+- hash: null
name: bar
role: input-to
uid: c
diff --git a/rtemsspec/tests/spec-packagebuild/qdp/steps/rtems-item-cache.yml b/rtemsspec/tests/spec-packagebuild/qdp/steps/rtems-item-cache.yml
new file mode 100644
index 00000000..6d042940
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/qdp/steps/rtems-item-cache.yml
@@ -0,0 +1,11 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+build-step-type: rtems-item-cache
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+description: |
+ Augment items.
+enabled-by: true
+links: []
+qdp-type: build-step
+spec-root-uid: /req/root
+type: qdp
diff --git a/rtemsspec/tests/spec-packagebuild/req/glossary.yml b/rtemsspec/tests/spec-packagebuild/req/glossary.yml
new file mode 100644
index 00000000..b9881ec6
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/req/glossary.yml
@@ -0,0 +1,12 @@
+SPDX-License-Identifier: CC-BY-SA-4.0
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: true
+glossary-type: group
+links:
+- role: requirement-refinement
+ uid: root
+name: Specification
+text: |
+ The system shall have a glossary of specification-specific terms.
+type: glossary
diff --git a/rtemsspec/tests/spec-packagebuild/req/root.yml b/rtemsspec/tests/spec-packagebuild/req/root.yml
new file mode 100644
index 00000000..0cb3ba69
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/req/root.yml
@@ -0,0 +1,12 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH & Co. KG
+enabled-by: true
+links: []
+non-functional-type: design
+rationale: null
+references: []
+requirement-type: non-functional
+text: |
+ The software product shall be a real-time operating system.
+type: requirement
diff --git a/rtemsspec/tests/spec-packagebuild/rtems/domain.yml b/rtemsspec/tests/spec-packagebuild/rtems/domain.yml
new file mode 100644
index 00000000..908b51a0
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/rtems/domain.yml
@@ -0,0 +1,13 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+description: |
+ Description.
+enabled-by: true
+index-entries: []
+interface-type: domain
+links:
+- role: requirement-refinement
+ uid: ../req/root
+name: Domain
+type: interface
diff --git a/rtemsspec/tests/spec-packagebuild/rtems/group-acfg.yml b/rtemsspec/tests/spec-packagebuild/rtems/group-acfg.yml
new file mode 100644
index 00000000..80f2477f
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/rtems/group-acfg.yml
@@ -0,0 +1,16 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+description: |
+ Description.
+enabled-by: true
+index-entries: []
+interface-type: appl-config-group
+links:
+- role: interface-placement
+ uid: domain
+- role: requirement-refinement
+ uid: ../req/root
+name: Name
+text: ''
+type: interface
diff --git a/rtemsspec/tests/spec-packagebuild/rtems/group.yml b/rtemsspec/tests/spec-packagebuild/rtems/group.yml
new file mode 100644
index 00000000..7f7864b7
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/rtems/group.yml
@@ -0,0 +1,19 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+ Brief.
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+description: null
+enabled-by: true
+identifier: Group
+index-entries: []
+interface-type: group
+links:
+- role: interface-placement
+ uid: header
+- role: requirement-refinement
+ uid: ../req/root
+name: Name
+text: |
+ Text.
+type: interface
diff --git a/rtemsspec/tests/spec-packagebuild/rtems/header.yml b/rtemsspec/tests/spec-packagebuild/rtems/header.yml
new file mode 100644
index 00000000..503fdc03
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/rtems/header.yml
@@ -0,0 +1,16 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+ Brief.
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: true
+index-entries: []
+interface-type: header-file
+links:
+- role: interface-placement
+ uid: domain
+- role: interface-ingroup
+ uid: group
+path: header.h
+prefix: dir
+type: interface
diff --git a/rtemsspec/tests/spec-packagebuild/rtems/if.yml b/rtemsspec/tests/spec-packagebuild/rtems/if.yml
new file mode 100644
index 00000000..0e1d67fe
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/rtems/if.yml
@@ -0,0 +1,36 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+brief: |
+ Brief.
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+definition:
+ default:
+ attributes: null
+ body: |
+ return ${.:/params[0]/name};
+ params:
+ - int ${.:/params[0]/name}
+ return: int
+ variants: []
+description: null
+enabled-by: true
+index-entries: []
+interface-type: function
+links:
+- role: proxy-member
+ uid: proxy
+- role: interface-placement
+ uid: header
+- role: interface-ingroup
+ uid: group
+name: identity
+notes: null
+params:
+- description: Parameter.
+ dir: null
+ name: param
+return:
+ return: |
+ Returns.
+ return-values: []
+type: interface
diff --git a/rtemsspec/tests/spec-packagebuild/rtems/proxy.yml b/rtemsspec/tests/spec-packagebuild/rtems/proxy.yml
new file mode 100644
index 00000000..27c48bfb
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/rtems/proxy.yml
@@ -0,0 +1,6 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: true
+links: []
+type: proxy
diff --git a/rtemsspec/tests/spec-packagebuild/rtems/req.yml b/rtemsspec/tests/spec-packagebuild/rtems/req.yml
new file mode 100644
index 00000000..c27a4fb9
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/rtems/req.yml
@@ -0,0 +1,14 @@
+SPDX-License-Identifier: CC-BY-SA-4.0
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: true
+links:
+- role: interface-function
+ uid: proxy
+functional-type: function
+rationale: null
+references: []
+requirement-type: functional
+text: |
+ Text.
+type: requirement
diff --git a/rtemsspec/tests/spec-packagebuild/rtems/test-case.yml b/rtemsspec/tests/spec-packagebuild/rtems/test-case.yml
new file mode 100644
index 00000000..910a28a4
--- /dev/null
+++ b/rtemsspec/tests/spec-packagebuild/rtems/test-case.yml
@@ -0,0 +1,34 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2023 embedded brains GmbH & Co. KG
+enabled-by: true
+links: []
+test-actions:
+- action-brief: |
+ Brief.
+ action-code: |
+ int i;
+ checks:
+ - brief: |
+ Check.
+ code: |
+ T_eq_int( identity( i ), i );
+ links:
+ - role: validation
+ uid: req
+ links: []
+test-brief: |
+ Brief.
+test-context: []
+test-context-support: null
+test-description: null
+test-header: null
+test-includes:
+- header.h
+test-local-includes: []
+test-setup: null
+test-stop: null
+test-support: null
+test-target: testsuites/validation/tc-identity.c
+test-teardown: null
+type: test-case