Skip to content

Commit 749602a

Browse files
Add source provenance attribute tests
1 parent 01e55e8 commit 749602a

4 files changed

Lines changed: 126 additions & 1 deletion

File tree

tests/sources/source_provenance_attributes.py

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
from buildstream._testing import generate_project, load_yaml
2222
from buildstream._testing import cli # pylint: disable=unused-import
23-
from buildstream.exceptions import ErrorDomain
23+
from buildstream.exceptions import ErrorDomain, LoadErrorReason
2424

2525

2626
DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "source_provenance_attributes")
@@ -40,6 +40,9 @@ def test_source_provenance_disallow_top_level(cli, datafiles):
4040
aliases = project_config.get_mapping("aliases")
4141
aliases["project_dir"] = "file://{}".format(project)
4242

43+
source_provenance_attrs = project_config.get_mapping("source-provenance-attributes")
44+
source_provenance_attrs["homepage"] = "Testing"
45+
4346
generate_project(project, project_config)
4447

4548
# Make sure disallowed usage of top-level source proveance fails
@@ -49,3 +52,108 @@ def test_source_provenance_disallow_top_level(cli, datafiles):
4952
)
5053

5154
result.assert_main_error(ErrorDomain.SOURCE, "top-level-provenance-on-custom-implementation")
55+
56+
57+
@pytest.mark.datafiles(DATA_DIR)
58+
def test_source_provenance_no_defined_attributes(cli, datafiles):
59+
project = str(datafiles)
60+
61+
# Set the project_dir alias in project.conf to the path to the tested project
62+
project_config_path = os.path.join(project, "project.conf")
63+
project_config = load_yaml(project_config_path)
64+
aliases = project_config.get_mapping("aliases")
65+
aliases["project_dir"] = "file://{}".format(project)
66+
67+
generate_project(project, project_config)
68+
69+
# Make sure a non-default attribute fails
70+
result = cli.run(
71+
project=project,
72+
args=["show", "--format", "%{source-info}", "target_a.bst"],
73+
)
74+
result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.UNDEFINED_SOURCE_PROVENANCE_ATTRIBUTE)
75+
76+
# Make sure a default attribute fails
77+
result = cli.run(
78+
project=project,
79+
args=["show", "--format", "%{source-info}", "target_b.bst"],
80+
)
81+
result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.UNDEFINED_SOURCE_PROVENANCE_ATTRIBUTE)
82+
83+
84+
# Test that no defined source provenance attributes blocks all source provenance data
85+
@pytest.mark.datafiles(DATA_DIR)
86+
def test_source_provenance_default_attributes(cli, datafiles):
87+
project = str(datafiles)
88+
89+
# Set the project_dir alias in project.conf to the path to the tested project
90+
project_config_path = os.path.join(project, "project.conf")
91+
project_config = load_yaml(project_config_path)
92+
aliases = project_config.get_mapping("aliases")
93+
aliases["project_dir"] = "file://{}".format(project)
94+
95+
# Edit config to fallback to default source provenance attributes
96+
project_config.safe_del("source-provenance-attributes")
97+
98+
generate_project(project, project_config)
99+
100+
# Make sure defined attributes are available
101+
result = cli.run(
102+
project=project,
103+
args=["show", "--format", "%{source-info}", "target_b.bst"],
104+
)
105+
result.assert_success()
106+
107+
provenance_result = ""
108+
for line in result.output.split("\n"):
109+
if "provenance:" in line or " " in line:
110+
provenance_result += line
111+
112+
assert provenance_result == " provenance: homepage: foo"
113+
114+
# Make sure undefined attributes fail
115+
result = cli.run(
116+
project=project,
117+
args=["show", "--format", "%{source-info}", "target_a.bst"],
118+
)
119+
result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.UNDEFINED_SOURCE_PROVENANCE_ATTRIBUTE)
120+
121+
122+
# Test that no defined source provenance attributes blocks all source provenance data
123+
@pytest.mark.datafiles(DATA_DIR)
124+
def test_source_provenance_project_defined_attributes(cli, datafiles):
125+
project = str(datafiles)
126+
127+
# Set the project_dir alias in project.conf to the path to the tested project
128+
project_config_path = os.path.join(project, "project.conf")
129+
project_config = load_yaml(project_config_path)
130+
aliases = project_config.get_mapping("aliases")
131+
aliases["project_dir"] = "file://{}".format(project)
132+
133+
# Edit config to only use project specified source provenance attributes
134+
135+
source_provenance_attrs = project_config.get_mapping("source-provenance-attributes")
136+
source_provenance_attrs["originator"] = "Testing"
137+
138+
generate_project(project, project_config)
139+
140+
# Make sure defined attributes are available
141+
result = cli.run(
142+
project=project,
143+
args=["show", "--format", "%{source-info}", "target_a.bst"],
144+
)
145+
result.assert_success()
146+
147+
provenance_result = ""
148+
for line in result.output.split("\n"):
149+
if "provenance:" in line or " " in line:
150+
provenance_result += line
151+
152+
assert provenance_result == " provenance: originator: bar"
153+
154+
# Make sure undefined attributes fail
155+
result = cli.run(
156+
project=project,
157+
args=["show", "--format", "%{source-info}", "target_b.bst"],
158+
)
159+
result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.UNDEFINED_SOURCE_PROVENANCE_ATTRIBUTE)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
kind: import
2+
3+
sources:
4+
- kind: remote
5+
url: project_dir:/files/file
6+
provenance:
7+
originator: bar
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
kind: import
2+
3+
sources:
4+
- kind: remote
5+
url: project_dir:/files/file
6+
provenance:
7+
homepage: foo

tests/sources/source_provenance_attributes/project.conf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,6 @@ plugins:
1212
path: plugins
1313
sources:
1414
- multisource-plugin
15+
16+
# Don't allow any provenance
17+
source-provenance-attributes: {}

0 commit comments

Comments
 (0)