#!/usr/bin/env python3
"""
VM Test Simulation - Validates ARM64 browser setup from scratch
Simulates what would happen in a fresh VM environment
"""
import subprocess
import os
import sys
import tempfile
import shutil
from pathlib import Path
def run_command(cmd, description, check_output=True):
"""Run command and capture result"""
print(f"\nπ {description}")
print(f"π Command: {cmd}")
try:
if isinstance(cmd, str):
result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=30)
else:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
print(f"β
Exit code: {result.returncode}")
if result.stdout:
print(f"π€ STDOUT: {result.stdout[:200]}...")
if result.stderr:
print(f"β οΈ STDERR: {result.stderr[:200]}...")
if check_output and result.returncode != 0:
return False, f"Command failed with exit code {result.returncode}"
return True, result.stdout + result.stderr
except subprocess.TimeoutExpired:
return False, "Command timed out"
except Exception as e:
return False, f"Exception: {e}"
def check_prerequisites():
"""Check if all prerequisites are available"""
print("\nπ§ CHECKING PREREQUISITES")
print("=" * 50)
issues = []
# Check Node.js
success, output = run_command("node --version", "Check Node.js version")
if not success:
issues.append("β Node.js not found - run: sudo apt install nodejs")
else:
print(f"β
Node.js: {output.strip()}")
# Check npm
success, output = run_command("npm --version", "Check npm version")
if not success:
issues.append("β npm not found - run: sudo apt install npm")
else:
print(f"β
npm: {output.strip()}")
# Check Python3
success, output = run_command("python3 --version", "Check Python3 version")
if not success:
issues.append("β Python3 not found - run: sudo apt install python3")
else:
print(f"β
Python3: {output.strip()}")
# Check Chromium
success, output = run_command("chromium-browser --version", "Check Chromium version")
if not success:
issues.append("β Chromium not found - run: sudo apt install chromium-browser")
else:
print(f"β
Chromium: {output.strip()}")
return issues
def simulate_fresh_install():
"""Simulate what happens in a fresh VM"""
print("\nπ SIMULATING FRESH VM INSTALL")
print("=" * 50)
issues = []
# Create a temp directory to simulate fresh clone
with tempfile.TemporaryDirectory() as temp_dir:
test_dir = Path(temp_dir) / "claude-arm64-browser"
test_dir.mkdir()
print(f"π Created test directory: {test_dir}")
# Copy essential files to simulate git clone
current_dir = Path(__file__).parent
essential_files = [
"index.js",
"package.json",
"arm64_browser.py",
"simple_browser.py",
"README.md"
]
for file in essential_files:
src = current_dir / file
if src.exists():
shutil.copy2(src, test_dir / file)
print(f"β
Copied {file}")
else:
issues.append(f"β Missing essential file: {file}")
# Change to test directory
os.chdir(test_dir)
print(f"π Changed to: {os.getcwd()}")
# Test npm install
if (test_dir / "package.json").exists():
success, output = run_command("npm install", "Install npm dependencies")
if not success:
issues.append(f"β npm install failed: {output}")
else:
issues.append("β package.json missing - cannot run npm install")
# Test the one-liner
one_liner = "python3 -c \"import sys; sys.path.append('.'); import arm64_browser; print('β
ARM64 Browser Works!' if 'error' not in arm64_browser.navigate('https://example.com').lower() else 'β Failed')\""
print(f"\nπ§ͺ Testing one-liner from: {os.getcwd()}")
success, output = run_command(one_liner, "Test one-liner verification", check_output=False)
if "β
ARM64 Browser Works!" in output:
print("π ONE-LINER TEST PASSED!")
elif "β Failed" in output:
issues.append("β One-liner test failed - browser automation not working")
else:
issues.append(f"β One-liner unexpected output: {output}")
# Test cross-session usage simulation
cross_session_test = f"""
import sys
sys.path.append('{test_dir}')
import arm64_browser
result = arm64_browser.navigate('https://httpbin.org/get')
print('Cross-session test:', 'SUCCESS' if 'error' not in result.lower() else 'FAILED')
"""
success, output = run_command(f"python3 -c \"{cross_session_test}\"", "Test cross-session usage")
if "SUCCESS" not in output:
issues.append(f"β Cross-session test failed: {output}")
return issues
def validate_documentation():
"""Check if documentation matches reality"""
print("\nπ VALIDATING DOCUMENTATION")
print("=" * 50)
issues = []
# Check if README.md exists and has required sections
readme_path = Path("README.md")
if not readme_path.exists():
issues.append("β README.md missing")
return issues
readme_content = readme_path.read_text()
required_sections = [
"### Installation",
"### β‘ Quick Test (One-Liner)",
"git clone https://github.com/nfodor/claude-arm64-browser",
"npm install",
"arm64_browser.navigate"
]
for section in required_sections:
if section not in readme_content:
issues.append(f"β README missing: {section}")
else:
print(f"β
README contains: {section}")
return issues
def main():
"""Run complete VM simulation test"""
print("π₯οΈ VM INSTALLATION TEST SIMULATION")
print("=" * 60)
print("This simulates what would happen in a fresh VM environment")
all_issues = []
# Check prerequisites
prereq_issues = check_prerequisites()
all_issues.extend(prereq_issues)
# Validate documentation
doc_issues = validate_documentation()
all_issues.extend(doc_issues)
# Simulate fresh install
install_issues = simulate_fresh_install()
all_issues.extend(install_issues)
# Summary
print("\nπ TEST SUMMARY")
print("=" * 50)
if not all_issues:
print("π ALL TESTS PASSED! Ready for VM deployment")
print("β
Prerequisites available")
print("β
Documentation complete")
print("β
Installation process works")
print("β
One-liner verification works")
print("β
Cross-session usage works")
else:
print(f"β οΈ FOUND {len(all_issues)} ISSUES:")
for i, issue in enumerate(all_issues, 1):
print(f"{i}. {issue}")
print("\nπ§ RECOMMENDED FIXES:")
if any("Node.js" in issue for issue in all_issues):
print("- sudo apt update && sudo apt install nodejs npm")
if any("Chromium" in issue for issue in all_issues):
print("- sudo apt install chromium-browser")
if any("Python3" in issue for issue in all_issues):
print("- sudo apt install python3")
return len(all_issues) == 0
if __name__ == "__main__":
success = main()
sys.exit(0 if success else 1)