2020
2121from buildstream ._testing import generate_project , load_yaml
2222from buildstream ._testing import cli # pylint: disable=unused-import
23- from buildstream .exceptions import ErrorDomain
23+ from buildstream .exceptions import ErrorDomain , LoadErrorReason
2424
2525
2626DATA_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 )
0 commit comments