# SPDX-License-Identifier: BSD-2-Clause
""" Unit tests for the rtemsspec.items module. """
# Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
import os
import pytest
from rtemsspec.items import EmptyItemCache, Item, ItemCache, Link
def test_to_abs_uid():
item = Item(EmptyItemCache(), "/x/y", {})
assert item.to_abs_uid(".") == "/x/y"
assert item.to_abs_uid("z") == "/x/z"
assert item.to_abs_uid("/z") == "/z"
assert item.to_abs_uid("../z") == "/z"
assert item.to_abs_uid("../../z") == "/z"
def test_eq():
a = Item(EmptyItemCache(), "a", {})
b = Item(EmptyItemCache(), "b", {})
assert a == a
assert a != b
assert a != 0
def test_lt():
a = Item(EmptyItemCache(), "a", {})
b = Item(EmptyItemCache(), "b", {})
assert a < b
with pytest.raises(TypeError):
b = a < 0
def test_hash():
a = Item(EmptyItemCache(), "a", {})
assert hash(a) == hash("a")
def test_uid():
item = Item(EmptyItemCache(), "x", {})
assert item.uid == "x"
def test_spec():
item = Item(EmptyItemCache(), "x", {})
assert item.spec == "spec:x"
def test_contains():
data = {}
data["x"] = "y"
item = Item(EmptyItemCache(), "z", data)
assert "x" in item
assert "a" not in item
def test_data():
data = {}
data["x"] = "y"
item = Item(EmptyItemCache(), "z", data)
assert item.data == {"x": "y"}
def test_cache():
item_cache = EmptyItemCache()
item = Item(item_cache, "i", {})
assert item.cache == item_cache
def test_get_key_path():
data = {}
data["a"] = {"b": "c", "d": [1, 2, 3]}
data["x"] = "y"
item = Item(EmptyItemCache(), "z", data)
assert item.get_by_key_path("x") == "y"
assert item.get_by_key_path("a/d[2]") == 3
assert item.get_by_key_path("a/b/../d[0]") == 1
assert item.get_by_key_path("/a/b/../d[0]") == 1
assert item.get_by_key_path("../d[0]", "a/b") == 1
with pytest.raises(KeyError):
assert item.get_by_key_path("y")
with pytest.raises(ValueError):
assert item.get_by_key_path("[")
with pytest.raises(ValueError):
assert item.get_by_key_path("x[y]")
def test_getitem():
data = {}
data["x"] = "y"
item = Item(EmptyItemCache(), "z", data)
assert item["x"] == "y"
def test_setitem():
data = {}
item = Item(EmptyItemCache(), "z", data)
with pytest.raises(KeyError):
item["a"]
item["a"] = "b"
assert item["a"] == "b"
def test_get():
data = {}
data["x"] = "y"
item = Item(EmptyItemCache(), "z", data)
assert item.get("x", "z") == "y"
assert item.get("z", "a") == "a"
def test_children():
child = Item(EmptyItemCache(), "c", {})
parent = Item(EmptyItemCache(), "p", {})
parent.add_link_to_child(Link(child, {"a": "b", "role": "c"}))
children = [item for item in parent.children()]
assert len(children) == 1
assert children[0] == child
children = [item for item in parent.children("c")]
assert len(children) == 1
assert children[0] == child
children = [item for item in parent.children(["c", "d"])]
assert len(children) == 1
assert children[0] == child
children = [item for item in parent.children([])]
assert len(children) == 0
children = [item for item in parent.children("d")]
assert len(children) == 0
links = [link for link in parent.links_to_children()]
assert len(links) == 1
assert links[0].item == child
assert links[0]["a"] == "b"
assert links[0].role == "c"
assert parent.child("c") == child
with pytest.raises(IndexError):
parent.child("c", 1)
def test_parents():
item_cache = EmptyItemCache()
child = Item(item_cache, "c",
{"links": [{
"a": "b",
"role": "c",
"uid": "p"
}]})
parent = Item(item_cache, "p", {"links": []})
item_cache._items["p"] = parent
child.init_parents(item_cache)
for link in child.links_to_parents():
link.item.add_link_to_child(Link.create(link, child))
link["foo"] = "bar"
assert child["links"][0]["foo"] == "bar"
parents = [item for item in child.parents()]
assert len(parents) == 1
assert parents[0] == parent
parents = [item for item in child.parents("c")]
assert len(parents) == 1
assert parents[0] == parent
parents = [item for item in child.parents(["c", "d"])]
assert len(parents) == 1
assert parents[0] == parent
parents = [item for item in child.parents([])]
assert len(parents) == 0
parents = [item for item in child.parents("d")]
assert len(parents) == 0
links = [link for link in child.links_to_parents()]
assert len(links) == 1
assert links[0].item == parent
assert links[0]["a"] == "b"
assert links[0].role == "c"
assert child.parent("c") == parent
with pytest.raises(IndexError):
child.parent("c", 1)
def _is_enabled(enabled, enabled_by):
item = Item(EmptyItemCache(), "i", {"enabled-by": enabled_by})
return item.is_enabled(enabled)
def test_is_enabled():
assert _is_enabled([], True)
assert not _is_enabled([], False)
assert not _is_enabled([], [])
assert not _is_enabled([], ["A"])
assert _is_enabled(["A"], "A")
assert not _is_enabled(["B"], "A")
assert _is_enabled(["A"], ["A"])
assert not _is_enabled(["B"], ["A"])
assert _is_enabled(["A"], ["A", "B"])
assert _is_enabled(["B"], ["A", "B"])
assert not _is_enabled(["C"], ["A", "B"])
assert not _is_enabled(["A"], {"not": "A"})
assert _is_enabled(["B"], {"not": "A"})
assert not _is_enabled(["A"], {"and": ["A", "B"]})
assert _is_enabled(["A", "B"], {"and": ["A", "B"]})
assert _is_enabled(["A", "B", "C"], {"and": ["A", "B"]})
assert _is_enabled(["A", "B"], {"and": ["A", "B", {"not": "C"}]})
assert not _is_enabled(["A", "B", "C"], {"and": ["A", "B", {"not": "C"}]})
with pytest.raises(KeyError):
_is_enabled(["A"], {"x": "A"})
assert _is_enabled([], {"not": {"and": ["A", {"not": "A"}]}})
def test_save_and_load(tmpdir):
item_file = os.path.join(tmpdir, "i.yml")
item = Item(EmptyItemCache(), "i", {"k": "v"})
item.file = item_file
assert item.file == item_file
item.save()
with open(item_file, "r") as src:
assert src.read() == "k: v\n"
assert item.file == item_file
item2 = Item(EmptyItemCache(), "i2", {})
item2.file = item_file
with pytest.raises(KeyError):
item2["k"]
item2.load()
assert item2["k"] == "v"
assert item.file == item_file