Advance standalone admission, finite artillery and native validation
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/env python3
|
||||
import contextlib
|
||||
import importlib.util
|
||||
import io
|
||||
from pathlib import Path
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
spec = importlib.util.spec_from_file_location('dedicated_native', Path(__file__).parents[1] / 'tools/dedicated_native.py')
|
||||
runner = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(runner)
|
||||
|
||||
class DedicatedNativeTests(unittest.TestCase):
|
||||
def probe(self, namespace='isolated', interfaces=None, routes=None, ipv6=''):
|
||||
interfaces = interfaces if interfaces is not None else [(1, 'lo')]
|
||||
routes = routes if routes is not None else 'Iface Destination Gateway\n'
|
||||
def content(path, *args):
|
||||
return io.StringIO(ipv6 if path.endswith('ipv6_route') else routes)
|
||||
with patch('os.readlink', return_value=namespace), patch('socket.if_nameindex', return_value=interfaces), patch('builtins.open', side_effect=content), patch.object(sys, 'argv', ['probe', 'host', '/server']), patch('os.execv') as launch, contextlib.redirect_stdout(io.StringIO()):
|
||||
try:
|
||||
exec(runner.PROBE, {})
|
||||
except AssertionError:
|
||||
self.assertFalse(launch.called)
|
||||
return False
|
||||
launch.assert_called_once_with('/server', ['/server'])
|
||||
return True
|
||||
|
||||
def test_isolation_gate_executes_only_private_loopback(self):
|
||||
self.assertTrue(self.probe())
|
||||
self.assertFalse(self.probe(namespace='host'))
|
||||
self.assertFalse(self.probe(interfaces=[(1, 'lo'), (2, 'eth0')]))
|
||||
self.assertFalse(self.probe(routes='Iface Destination\neth0 00000000\n'))
|
||||
self.assertFalse(self.probe(ipv6='0000 eth0\n'))
|
||||
self.assertTrue(self.probe(ipv6='0000 lo\n'))
|
||||
|
||||
def test_vanilla_control_has_no_successor_or_custom_systems(self):
|
||||
args=runner.engine_args('vanilla-everon')
|
||||
self.assertNotIn('-addons',args)
|
||||
self.assertNotIn('-addonsDir',args)
|
||||
self.assertNotIn('-worldSystemsConfig',args)
|
||||
self.assertEqual(args[-2:],['-server','Missions/21_GM_Eden.conf'])
|
||||
self.assertEqual(args[0],'/tmp/runtime/ArmaReforgerServer')
|
||||
|
||||
def test_manifest_detects_mutation_and_refuses_links(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root=Path(directory); target=root/'a.c'; target.write_text('first')
|
||||
old=runner.manifest(root); target.write_text('second')
|
||||
self.assertNotEqual(old,runner.manifest(root))
|
||||
(root/'linked').symlink_to(target)
|
||||
with self.assertRaises(ValueError): runner.manifest(root)
|
||||
|
||||
def test_routes_do_not_mix_public_config_or_client_flags(self):
|
||||
for route in ['header','diag-world','vanilla-everon']:
|
||||
args=runner.engine_args(route)
|
||||
self.assertNotIn('-config',args)
|
||||
self.assertNotIn('-client',args)
|
||||
self.assertIn('-noBackend',args)
|
||||
self.assertNotIn('-rpl-validation-rdb-disable',args)
|
||||
normal=runner.engine_args('header')
|
||||
self.assertEqual(normal[0],'/tmp/runtime/ArmaReforgerServer')
|
||||
self.assertTrue(normal[normal.index('-server')+1].endswith('ERR_Everon_Base.conf'))
|
||||
self.assertNotIn('-worldSystemsConfig',normal)
|
||||
self.assertIn('-worldSystemsConfig',runner.engine_args('diag-world'))
|
||||
|
||||
if __name__ == '__main__': unittest.main()
|
||||
Reference in New Issue
Block a user