test_extraction_consistency.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #!/usr/bin/env python3
  2. """
  3. Test script to verify extraction consistency between autusm and USM acquire script.
  4. This script tests that both autusm's initial extraction and the acquire script
  5. produce the same directory structure (flattened to the output directory).
  6. """
  7. import os
  8. import sys
  9. import tempfile
  10. import shutil
  11. from pathlib import Path
  12. # Add src to path to import autusm modules
  13. sys.path.insert(0, str(Path(__file__).parent / "src"))
  14. from autusm.extractor import ArchiveExtractor
  15. from autusm.generator import ScriptGenerator
  16. from autusm.models import PackageInfo, BuildSystem, BuildSystemType
  17. def test_extraction_consistency():
  18. """Test that extraction behavior is consistent between autusm and acquire script."""
  19. # Test URL for hello-2.12.tar.gz
  20. test_url = "https://mirror.freedif.org/GNU/hello/hello-2.12.tar.gz"
  21. package_name = "hello"
  22. print("Testing extraction consistency...")
  23. print(f"Test URL: {test_url}")
  24. print(f"Package: {package_name}")
  25. print()
  26. # Create test directories
  27. with tempfile.TemporaryDirectory() as temp_dir:
  28. temp_path = Path(temp_dir)
  29. # Create output directories for both tests
  30. autusm_output = temp_path / "autusm_output"
  31. usm_output = temp_path / "usm_output"
  32. autusm_output.mkdir()
  33. usm_output.mkdir()
  34. # Download the test archive
  35. print("Downloading test archive...")
  36. from autusm.download import DownloadManager
  37. download_manager = DownloadManager()
  38. archive_path = download_manager.download(test_url, temp_path)
  39. print(f"Downloaded to: {archive_path}")
  40. print()
  41. # Test 1: autusm extraction
  42. print("Test 1: autusm extraction")
  43. extractor = ArchiveExtractor()
  44. autusm_source_dir = extractor.extract(archive_path, autusm_output)
  45. print(f"autusm extracted to: {autusm_source_dir}")
  46. # List the structure
  47. print("autusm directory structure:")
  48. for item in autusm_output.rglob("*"):
  49. if item.is_file():
  50. rel_path = item.relative_to(autusm_output)
  51. print(f" {rel_path}")
  52. print()
  53. # Test 2: Simulate USM acquire script extraction
  54. print("Test 2: Simulating USM acquire script extraction")
  55. # Create a test package info
  56. package_info = PackageInfo(
  57. name=package_name,
  58. version="2.12",
  59. summary="Test package",
  60. url=test_url
  61. )
  62. # Create a test build system
  63. build_system = BuildSystem(
  64. type=BuildSystemType.AUTOTOOLS,
  65. config_files=[],
  66. build_files=[],
  67. detected_commands=[],
  68. custom_args={}
  69. )
  70. # Generate the acquire script
  71. script_generator = ScriptGenerator()
  72. acquire_script = script_generator._common_acquire_template(package_info, build_system)
  73. # Write the acquire script to a file
  74. acquire_script_path = usm_output / "acquire"
  75. with open(acquire_script_path, "w") as f:
  76. f.write(acquire_script)
  77. os.chmod(acquire_script_path, 0o755)
  78. # Run the acquire script
  79. import subprocess
  80. result = subprocess.run(
  81. ["./acquire"],
  82. cwd=usm_output,
  83. capture_output=True,
  84. text=True
  85. )
  86. if result.returncode != 0:
  87. print(f"Error running acquire script: {result.stderr}")
  88. return False
  89. print("USM acquire script executed successfully")
  90. # List the structure
  91. print("USM directory structure:")
  92. for item in usm_output.rglob("*"):
  93. if item.is_file() and item.name != "acquire":
  94. rel_path = item.relative_to(usm_output)
  95. print(f" {rel_path}")
  96. print()
  97. # Compare the directory structures
  98. print("Comparing directory structures...")
  99. # Get file lists (excluding the acquire script)
  100. autusm_files = set()
  101. for item in autusm_output.rglob("*"):
  102. if item.is_file():
  103. rel_path = item.relative_to(autusm_output)
  104. autusm_files.add(str(rel_path))
  105. usm_files = set()
  106. for item in usm_output.rglob("*"):
  107. if item.is_file() and item.name != "acquire":
  108. rel_path = item.relative_to(usm_output)
  109. usm_files.add(str(rel_path))
  110. # Check if they match
  111. if autusm_files == usm_files:
  112. print("✓ SUCCESS: Directory structures match!")
  113. print(f"Both contain {len(autusm_files)} files")
  114. return True
  115. else:
  116. print("✗ FAILURE: Directory structures differ!")
  117. print("Files only in autusm:")
  118. for f in sorted(autusm_files - usm_files):
  119. print(f" {f}")
  120. print("Files only in USM:")
  121. for f in sorted(usm_files - autusm_files):
  122. print(f" {f}")
  123. return False
  124. if __name__ == "__main__":
  125. success = test_extraction_consistency()
  126. sys.exit(0 if success else 1)