Files
archy/scripts/tests/test_companion_cargo_adapter.py

65 lines
3.2 KiB
Python

"""Exercise the real executable adapter, including cargo-ndk's CC environment."""
import json
import os
from pathlib import Path
import subprocess
import sys
import tempfile
import unittest
ADAPTER = Path(__file__).resolve().parents[2] / 'Android/scripts/cargo-locked-offline.py'
class CargoAdapterTests(unittest.TestCase):
def setUp(self):
temporary = tempfile.TemporaryDirectory()
self.addCleanup(temporary.cleanup)
self.root = Path(temporary.name)
(self.root / 'Cargo.lock').write_text('version = 4\n')
(self.root / 'Cargo.toml').write_text('[package]\nname="fixture"\n')
self.cargo = self.root / 'real-cargo'
self.cargo.write_text(f'#!{sys.executable}\nimport json,os,sys\n'
'print(json.dumps({"args":sys.argv[1:],"env":dict(os.environ)}))\n')
self.cargo.chmod(0o700)
def run_adapter(self, args, **extra):
env = dict(os.environ, ANDROID_REAL_CARGO=str(self.cargo), CARGO=str(ADAPTER),
CARGO_NET_OFFLINE='false', **extra)
env['CC_aarch64-linux-android'] = '/fixture/ndk/bin/clang'
env['CXX_aarch64-linux-android'] = '/fixture/ndk/bin/clang++'
return subprocess.run([str(ADAPTER), *args], cwd=self.root, env=env, capture_output=True, text=True, timeout=5)
def test_metadata_is_locked_offline_and_ndk_keys_survive(self):
result = self.run_adapter(['metadata', '--format-version', '1', '--no-deps'])
self.assertEqual(result.returncode, 0, result.stderr)
value = json.loads(result.stdout)
self.assertEqual(value['args'], ['metadata', '--format-version', '1', '--no-deps', '--locked', '--offline'])
self.assertEqual(value['env']['CC_aarch64-linux-android'], '/fixture/ndk/bin/clang')
self.assertEqual(value['env']['CXX_aarch64-linux-android'], '/fixture/ndk/bin/clang++')
self.assertEqual(value['env']['CARGO'], str(self.cargo))
self.assertEqual(value['env']['CARGO_NET_OFFLINE'], 'true')
def test_exact_build_retains_manifest_target_and_lock_flags(self):
args = ['build', '--release', '--locked', '--offline', '--manifest-path',
str(self.root / 'Cargo.toml'), '--target', 'aarch64-linux-android',
'--message-format', 'json-render-diagnostics']
result = self.run_adapter(args)
self.assertEqual(result.returncode, 0, result.stderr)
self.assertEqual(json.loads(result.stdout)['args'], args)
for index, replacement in [(2, '--frozen'), (5, '/other/Cargo.toml'), (7, 'x86_64-unknown-linux-gnu')]:
bad = args.copy(); bad[index] = replacement
self.assertEqual(self.run_adapter(bad).returncode, 64)
def test_unknown_commands_and_missing_lock_never_run_cargo(self):
for args in ([], ['update'], ['metadata'], ['build', '--release'],
['metadata', '--format-version', '1', '--no-deps', '--locked']):
result = self.run_adapter(args)
self.assertEqual(result.returncode, 64)
self.assertEqual(result.stdout, '')
(self.root / 'Cargo.lock').unlink()
self.assertEqual(self.run_adapter(['metadata', '--format-version', '1', '--no-deps']).returncode, 64)
if __name__ == '__main__':
unittest.main()