GGUF-Splitter / tests /test_integration.py
Felladrin's picture
Initial commit
2de2584
Raw
History Blame Contribute Delete
4.78 kB
"""Integration tests for the full GGUF splitting workflow"""
import os
import subprocess
import pathlib
import pytest
from src.gguf_utils import (
get_llama_gguf_split_path,
calculate_optimal_split_size,
split_gguf_file,
)
from src.hf_utils import get_gguf_files_from_repo
class TestFullSplitWorkflow:
"""Integration tests for the complete splitting workflow"""
def test_full_split_workflow_smollm2(self, temp_dir, test_gguf_url, test_gguf_filename):
llama_path = get_llama_gguf_split_path()
assert os.path.isfile(llama_path), f"llama-gguf-split not found at {llama_path}"
gguf_path = temp_dir / test_gguf_filename
print(f"\nDownloading {test_gguf_url}...")
result = subprocess.run(
["curl", "-L", "-o", str(gguf_path), test_gguf_url],
capture_output=True,
text=True,
)
assert result.returncode == 0, f"Download failed: {result.stderr}"
assert gguf_path.exists(), "Downloaded file does not exist"
file_size_mb = gguf_path.stat().st_size / (1024 * 1024)
print(f"Downloaded file size: {file_size_mb:.1f} MB")
assert file_size_mb > 50, "Downloaded file is too small, might be corrupted"
output_prefix = temp_dir / "gguf_split"
max_size_mb = calculate_optimal_split_size(str(gguf_path), str(output_prefix))
print(f"Calculated optimal split size: {max_size_mb} MB")
assert max_size_mb > 0, "Split size should be positive"
output_pattern = temp_dir / "gguf_split-"
success = split_gguf_file(str(gguf_path), str(output_pattern), max_size_mb)
assert success, "Splitting failed"
split_files = sorted(temp_dir.glob("gguf_split-*.gguf"))
print(f"Generated {len(split_files)} split files:")
total_split_size = 0
for f in split_files:
size_mb = f.stat().st_size / (1024 * 1024)
total_split_size += f.stat().st_size
print(f" - {f.name}: {size_mb:.1f} MB")
assert len(split_files) >= 2, "Should have at least 2 split files"
assert len(split_files) <= 10, "Should not have more than 10 split files for a 100MB model"
for f in split_files:
size_mb = f.stat().st_size / (1024 * 1024)
assert size_mb <= max_size_mb * 1.1, f"Split file {f.name} exceeds max size"
original_size = gguf_path.stat().st_size
assert total_split_size >= original_size * 0.9, "Total split size is too small"
assert total_split_size <= original_size * 1.5, "Total split size is too large"
print(f"\nSplit verification passed!")
print(f" Original size: {original_size / (1024 * 1024):.1f} MB")
print(f" Total split size: {total_split_size / (1024 * 1024):.1f} MB")
print(f" Number of parts: {len(split_files)}")
class TestHuggingFaceIntegration:
"""Integration tests for Hugging Face API interactions"""
def test_list_gguf_files_from_real_repo(self, test_repo_id):
from huggingface_hub import HfApi
api = HfApi()
gguf_files = get_gguf_files_from_repo(test_repo_id, api)
print(f"\nFound {len(gguf_files)} GGUF files in {test_repo_id}:")
for f in gguf_files[:5]:
print(f" - {f}")
assert len(gguf_files) > 0, f"No GGUF files found in {test_repo_id}"
assert any("Q4_K_M" in f for f in gguf_files), "Test file Q4_K_M not found in repo"
class TestEnvironmentSetup:
"""Tests to verify the test environment is correctly set up"""
def test_llama_gguf_split_available(self):
path = get_llama_gguf_split_path()
assert os.path.isfile(path), f"Binary not found at {path}"
assert os.access(path, os.X_OK), f"Binary not executable at {path}"
result = subprocess.run([path, "--help"], capture_output=True, text=True)
assert result.returncode == 0, f"Binary failed to run: {result.stderr}"
print(f"\nllama-gguf-split found at: {path}")
print(f"Version info from --help (first 3 lines):")
for line in result.stdout.split('\n')[:3]:
print(f" {line}")
def test_curl_available(self):
result = subprocess.run(["curl", "--version"], capture_output=True, text=True)
assert result.returncode == 0, "curl not available"
print(f"\ncurl version: {result.stdout.split(chr(10))[0]}")
def test_python_dependencies(self):
import gradio
import huggingface_hub
print(f"\ngradio version: {gradio.__version__}")
print(f"huggingface_hub version: {huggingface_hub.__version__}")