Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

105 lines
3.6KB

  1. import pytest
  2. from pathlib import Path
  3. from typing import Tuple
  4. import subprocess
  5. import platform
  6. from dds_ci import proc
  7. from dds_ci.dds import DDSWrapper
  8. from dds_ci.testing import ProjectOpener, Project, error
  9. @pytest.fixture()
  10. def test_project(project_opener: ProjectOpener) -> Project:
  11. return project_opener.open('projects/simple')
  12. def test_create_pkg(test_project: Project, tmp_path: Path) -> None:
  13. # Create in the default location
  14. test_project.pkg_create()
  15. sd_dir = test_project.build_root / 'foo@1.2.3.tar.gz'
  16. assert sd_dir.is_file(), 'Did not create an sdist in the default location'
  17. # Create in a different location
  18. dest = tmp_path / 'dummy.tar.gz'
  19. test_project.pkg_create(dest=dest)
  20. assert dest.is_file(), 'Did not create an sdist in the new location'
  21. @pytest.fixture()
  22. def _test_pkg(test_project: Project) -> Tuple[Path, Project]:
  23. repo_content_path = test_project.dds.repo_dir / 'foo@1.2.3'
  24. assert not repo_content_path.is_dir()
  25. test_project.pkg_create()
  26. assert not repo_content_path.is_dir()
  27. return test_project.build_root / 'foo@1.2.3.tar.gz', test_project
  28. def test_import_sdist_archive(_test_pkg: Tuple[Path, Project]) -> None:
  29. sdist, project = _test_pkg
  30. repo_content_path = project.dds.repo_dir / 'foo@1.2.3'
  31. project.dds.pkg_import(sdist)
  32. assert repo_content_path.is_dir(), \
  33. 'The package did not appear in the local cache'
  34. assert repo_content_path.joinpath('library.jsonc').is_file(), \
  35. 'The package\'s library.jsonc did not get imported'
  36. # Excluded file will not be in the sdist:
  37. assert not repo_content_path.joinpath('other-file.txt').is_file(), \
  38. 'Non-package content appeared in the package cache'
  39. def test_import_sdist_stdin(_test_pkg: Tuple[Path, Project]) -> None:
  40. sdist, project = _test_pkg
  41. pipe = subprocess.Popen(
  42. list(proc.flatten_cmd([
  43. project.dds.path,
  44. project.dds.repo_dir_arg,
  45. 'pkg',
  46. 'import',
  47. '--stdin',
  48. ])),
  49. stdin=subprocess.PIPE,
  50. )
  51. assert pipe.stdin
  52. with sdist.open('rb') as sdist_bin:
  53. buf = sdist_bin.read(1024)
  54. while buf:
  55. pipe.stdin.write(buf)
  56. buf = sdist_bin.read(1024)
  57. pipe.stdin.close()
  58. rc = pipe.wait()
  59. assert rc == 0, 'Subprocess failed'
  60. _check_import(project.dds.repo_dir / 'foo@1.2.3')
  61. def test_import_sdist_dir(test_project: Project) -> None:
  62. test_project.dds.run(['pkg', 'import', test_project.dds.repo_dir_arg, test_project.root])
  63. _check_import(test_project.dds.repo_dir / 'foo@1.2.3')
  64. def _check_import(repo_content_path: Path) -> None:
  65. assert repo_content_path.is_dir(), \
  66. 'The package did not appear in the local cache'
  67. assert repo_content_path.joinpath('library.jsonc').is_file(), \
  68. 'The package\'s library.jsonc did not get imported'
  69. # Excluded file will not be in the sdist:
  70. assert not repo_content_path.joinpath('other-file.txt').is_file(), \
  71. 'Non-package content appeared in the package cache'
  72. def test_sdist_invalid_project(tmp_project: Project) -> None:
  73. with error.expect_error_marker('no-package-json5'):
  74. tmp_project.pkg_create()
  75. @pytest.mark.skipif(platform.system() != 'Linux', reason='We know this fails on Linux')
  76. def test_sdist_unreadable_dir(dds: DDSWrapper) -> None:
  77. with error.expect_error_marker('failed-package-json5-scan'):
  78. dds.run(['pkg', 'create', '--project=/root'])
  79. def test_sdist_invalid_json5(tmp_project: Project) -> None:
  80. tmp_project.write('package.json5', 'bogus json5')
  81. with error.expect_error_marker('package-json5-parse-error'):
  82. tmp_project.pkg_create()