|
@@ -0,0 +1,52 @@
|
|
|
+from unittest import TestCase
|
|
|
+from unittest.mock import patch, call
|
|
|
+
|
|
|
+from qubesagent.vmexec import main, decode, DecodeError
|
|
|
+
|
|
|
+
|
|
|
+class TestVmExec(TestCase):
|
|
|
+ def test_00_decode_simple(self):
|
|
|
+ self.assertEqual(decode('echo+Hello'), [b'echo', b'Hello'])
|
|
|
+
|
|
|
+ def test_01_decode_empty(self):
|
|
|
+ self.assertEqual(decode('echo+'), [b'echo', b''])
|
|
|
+
|
|
|
+ def test_02_decode_escaping(self):
|
|
|
+ self.assertEqual(decode('echo+Hello-20world'),
|
|
|
+ [b'echo', b'Hello world'])
|
|
|
+ self.assertEqual(decode('-0A-0D'),
|
|
|
+ [b'\n\r'])
|
|
|
+ self.assertEqual(decode('-2Fbin-2Fls'),
|
|
|
+ [b'/bin/ls'])
|
|
|
+ self.assertEqual(decode('ls+--la'),
|
|
|
+ [b'ls', b'-la'])
|
|
|
+ self.assertEqual(decode('ls+---61'),
|
|
|
+ [b'ls', b'-a'])
|
|
|
+ self.assertEqual(decode('ls+----help'),
|
|
|
+ [b'ls', b'--help'])
|
|
|
+
|
|
|
+ def test_03_decode_errors(self):
|
|
|
+ with self.assertRaises(DecodeError):
|
|
|
+ decode('illegal/slash')
|
|
|
+ with self.assertRaises(DecodeError):
|
|
|
+ decode('illegal-singledash')
|
|
|
+ with self.assertRaises(DecodeError):
|
|
|
+ decode('smalletters-0a-0d')
|
|
|
+ with self.assertRaises(DecodeError):
|
|
|
+ decode('incompletebyte-A')
|
|
|
+ with self.assertRaises(DecodeError):
|
|
|
+ decode('incomplete-Abyte')
|
|
|
+ with self.assertRaises(DecodeError):
|
|
|
+ decode('ls+---threeslashes')
|
|
|
+
|
|
|
+ def test_10_main_exec(self):
|
|
|
+ with patch('os.execvp') as mock_execvp:
|
|
|
+ main(['vmexec', 'ls+--la'])
|
|
|
+ self.assertEqual(mock_execvp.call_args_list, [
|
|
|
+ call(b'ls', [b'ls', b'-la'])])
|
|
|
+
|
|
|
+ def test_11_main_fail(self):
|
|
|
+ with self.assertRaises(SystemExit):
|
|
|
+ main(['vmexec'])
|
|
|
+ with self.assertRaises(SystemExit):
|
|
|
+ main(['vmexec', 'illegal/slash'])
|