Skip to content

Commit d3e055b

Browse files
bonzinidcbaker
authored andcommitted
unittests/cargotests: add tests for Cargo.toml parsing
Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 4e058cc commit d3e055b

File tree

2 files changed

+185
-0
lines changed

2 files changed

+185
-0
lines changed

mesonbuild/cargo/interpreter.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ def _create_dependencies(self, pkg: PackageState, build: builder.Builder) -> T.L
262262
return ast
263263

264264
def _create_system_dependency(self, name: str, dep: SystemDependency, build: builder.Builder) -> T.List[mparser.BaseNode]:
265+
# TODO: handle feature_overrides
265266
kw = {
266267
'version': build.array([build.string(s) for s in dep.version]),
267268
'required': build.bool(not dep.optional),

unittests/cargotests.py

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
from mesonbuild.cargo import cfg, load_wraps
1212
from mesonbuild.cargo.cfg import TokenType
13+
from mesonbuild.cargo.manifest import Manifest
14+
from mesonbuild.cargo.toml import load_toml
1315
from mesonbuild.cargo.version import convert
1416

1517

@@ -206,3 +208,185 @@ def test_cargo_lock(self) -> None:
206208
self.assertEqual(wraps[1].get('method'), 'cargo')
207209
self.assertEqual(wraps[1].get('url'), 'https://github.com/gtk-rs/gtk-rs-core')
208210
self.assertEqual(wraps[1].get('revision'), '23c5599424cc75ec66618891c915d9f490f6e4c2')
211+
212+
class CargoTomlTest(unittest.TestCase):
213+
CARGO_TOML_1 = textwrap.dedent('''\
214+
[package]
215+
name = "mandelbrot"
216+
version = "0.1.0"
217+
authors = ["Sebastian Dröge <[email protected]>"]
218+
edition = "2018"
219+
license = "GPL-3.0"
220+
221+
[package.metadata.docs.rs]
222+
all-features = true
223+
rustc-args = [
224+
"--cfg",
225+
"docsrs",
226+
]
227+
rustdoc-args = [
228+
"--cfg",
229+
"docsrs",
230+
"--generate-link-to-definition",
231+
]
232+
233+
[dependencies]
234+
gtk = { package = "gtk4", version = "0.9" }
235+
num-complex = "0.4"
236+
rayon = "1.0"
237+
once_cell = "1"
238+
async-channel = "2.0"
239+
zerocopy = { version = "0.7", features = ["derive"] }
240+
241+
[dev-dependencies.gir-format-check]
242+
version = "^0.1"
243+
''')
244+
245+
CARGO_TOML_2 = textwrap.dedent('''\
246+
[package]
247+
name = "pango"
248+
edition = "2021"
249+
rust-version = "1.70"
250+
version = "0.20.4"
251+
authors = ["The gtk-rs Project Developers"]
252+
253+
[package.metadata.system-deps.pango]
254+
name = "pango"
255+
version = "1.40"
256+
257+
[package.metadata.system-deps.pango.v1_42]
258+
version = "1.42"
259+
260+
[lib]
261+
name = "pango"
262+
263+
[[test]]
264+
name = "check_gir"
265+
path = "tests/check_gir.rs"
266+
267+
[features]
268+
v1_42 = ["pango-sys/v1_42"]
269+
v1_44 = [
270+
"v1_42",
271+
"pango-sys/v1_44",
272+
]
273+
''')
274+
275+
def test_cargo_toml_package(self) -> None:
276+
with tempfile.TemporaryDirectory() as tmpdir:
277+
fname = os.path.join(tmpdir, 'Cargo.toml')
278+
with open(fname, 'w', encoding='utf-8') as f:
279+
f.write(self.CARGO_TOML_1)
280+
manifest_toml = load_toml(fname)
281+
manifest = Manifest.from_raw(manifest_toml, 'Cargo.toml')
282+
283+
self.assertEqual(manifest.package.name, 'mandelbrot')
284+
self.assertEqual(manifest.package.version, '0.1.0')
285+
self.assertEqual(manifest.package.authors[0], 'Sebastian Dröge <[email protected]>')
286+
self.assertEqual(manifest.package.edition, '2018')
287+
self.assertEqual(manifest.package.license, 'GPL-3.0')
288+
289+
print(manifest.package.metadata)
290+
self.assertEqual(len(manifest.package.metadata), 1)
291+
292+
def test_cargo_toml_dependencies(self) -> None:
293+
with tempfile.TemporaryDirectory() as tmpdir:
294+
fname = os.path.join(tmpdir, 'Cargo.toml')
295+
with open(fname, 'w', encoding='utf-8') as f:
296+
f.write(self.CARGO_TOML_1)
297+
manifest_toml = load_toml(fname)
298+
manifest = Manifest.from_raw(manifest_toml, 'Cargo.toml')
299+
300+
self.assertEqual(len(manifest.dependencies), 6)
301+
self.assertEqual(manifest.dependencies['gtk'].package, 'gtk4')
302+
self.assertEqual(manifest.dependencies['gtk'].version, ['>= 0.9', '< 0.10'])
303+
self.assertEqual(manifest.dependencies['gtk'].api, '0.9')
304+
self.assertEqual(manifest.dependencies['num-complex'].package, 'num-complex')
305+
self.assertEqual(manifest.dependencies['num-complex'].version, ['>= 0.4', '< 0.5'])
306+
self.assertEqual(manifest.dependencies['num-complex'].api, '0.4')
307+
self.assertEqual(manifest.dependencies['rayon'].package, 'rayon')
308+
self.assertEqual(manifest.dependencies['rayon'].version, ['>= 1.0', '< 2'])
309+
self.assertEqual(manifest.dependencies['rayon'].api, '1')
310+
self.assertEqual(manifest.dependencies['once_cell'].package, 'once_cell')
311+
self.assertEqual(manifest.dependencies['once_cell'].version, ['>= 1', '< 2'])
312+
self.assertEqual(manifest.dependencies['once_cell'].api, '1')
313+
self.assertEqual(manifest.dependencies['async-channel'].package, 'async-channel')
314+
self.assertEqual(manifest.dependencies['async-channel'].version, ['>= 2.0', '< 3'])
315+
self.assertEqual(manifest.dependencies['async-channel'].api, '2')
316+
self.assertEqual(manifest.dependencies['zerocopy'].package, 'zerocopy')
317+
self.assertEqual(manifest.dependencies['zerocopy'].version, ['>= 0.7', '< 0.8'])
318+
self.assertEqual(manifest.dependencies['zerocopy'].features, ['derive'])
319+
self.assertEqual(manifest.dependencies['zerocopy'].api, '0.7')
320+
321+
self.assertEqual(len(manifest.dev_dependencies), 1)
322+
self.assertEqual(manifest.dev_dependencies['gir-format-check'].package, 'gir-format-check')
323+
self.assertEqual(manifest.dev_dependencies['gir-format-check'].version, ['>= 0.1', '< 0.2'])
324+
self.assertEqual(manifest.dev_dependencies['gir-format-check'].api, '0.1')
325+
326+
def test_cargo_toml_targets(self) -> None:
327+
with tempfile.TemporaryDirectory() as tmpdir:
328+
fname = os.path.join(tmpdir, 'Cargo.toml')
329+
with open(fname, 'w', encoding='utf-8') as f:
330+
f.write(self.CARGO_TOML_2)
331+
manifest_toml = load_toml(fname)
332+
manifest = Manifest.from_raw(manifest_toml, 'Cargo.toml')
333+
334+
self.assertEqual(manifest.lib.name, 'pango')
335+
self.assertEqual(manifest.lib.crate_type, ['lib'])
336+
self.assertEqual(manifest.lib.path, os.path.join('src', 'lib.rs'))
337+
self.assertEqual(manifest.lib.test, True)
338+
self.assertEqual(manifest.lib.doctest, True)
339+
self.assertEqual(manifest.lib.bench, True)
340+
self.assertEqual(manifest.lib.doc, True)
341+
self.assertEqual(manifest.lib.harness, True)
342+
self.assertEqual(manifest.lib.edition, '2015')
343+
self.assertEqual(manifest.lib.required_features, [])
344+
self.assertEqual(manifest.lib.plugin, False)
345+
self.assertEqual(manifest.lib.proc_macro, False)
346+
self.assertEqual(manifest.lib.doc_scrape_examples, True)
347+
348+
self.assertEqual(len(manifest.test), 1)
349+
self.assertEqual(manifest.test[0].name, 'check_gir')
350+
self.assertEqual(manifest.test[0].crate_type, ['bin'])
351+
self.assertEqual(manifest.test[0].path, 'tests/check_gir.rs')
352+
self.assertEqual(manifest.lib.path, os.path.join('src', 'lib.rs'))
353+
self.assertEqual(manifest.test[0].test, True)
354+
self.assertEqual(manifest.test[0].doctest, False)
355+
self.assertEqual(manifest.test[0].bench, True)
356+
self.assertEqual(manifest.test[0].doc, False)
357+
self.assertEqual(manifest.test[0].harness, True)
358+
self.assertEqual(manifest.test[0].edition, '2015')
359+
self.assertEqual(manifest.test[0].required_features, [])
360+
self.assertEqual(manifest.test[0].plugin, False)
361+
362+
def test_cargo_toml_system_deps(self) -> None:
363+
with tempfile.TemporaryDirectory() as tmpdir:
364+
fname = os.path.join(tmpdir, 'Cargo.toml')
365+
with open(fname, 'w', encoding='utf-8') as f:
366+
f.write(self.CARGO_TOML_2)
367+
manifest_toml = load_toml(fname)
368+
manifest = Manifest.from_raw(manifest_toml, 'Cargo.toml')
369+
370+
self.assertIn('system-deps', manifest.package.metadata)
371+
372+
self.assertEqual(len(manifest.system_dependencies), 1)
373+
self.assertEqual(manifest.system_dependencies['pango'].name, 'pango')
374+
self.assertEqual(manifest.system_dependencies['pango'].version, ['>=1.40'])
375+
self.assertEqual(manifest.system_dependencies['pango'].optional, False)
376+
self.assertEqual(manifest.system_dependencies['pango'].feature, None)
377+
378+
self.assertEqual(len(manifest.system_dependencies['pango'].feature_overrides), 1)
379+
self.assertEqual(manifest.system_dependencies['pango'].feature_overrides['v1_42'], {'version': '1.42'})
380+
381+
def test_cargo_toml_features(self) -> None:
382+
with tempfile.TemporaryDirectory() as tmpdir:
383+
fname = os.path.join(tmpdir, 'Cargo.toml')
384+
with open(fname, 'w', encoding='utf-8') as f:
385+
f.write(self.CARGO_TOML_2)
386+
manifest_toml = load_toml(fname)
387+
manifest = Manifest.from_raw(manifest_toml, 'Cargo.toml')
388+
389+
self.assertEqual(len(manifest.features), 3)
390+
self.assertEqual(manifest.features['v1_42'], ['pango-sys/v1_42'])
391+
self.assertEqual(manifest.features['v1_44'], ['v1_42', 'pango-sys/v1_44'])
392+
self.assertEqual(manifest.features['default'], [])

0 commit comments

Comments
 (0)