65 lines
3.2 KiB
Python
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()
|