"""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()