Merge branch '12430-output-glob'
[arvados.git] / services / fuse / tests / test_exec.py
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.0
4
5 import arvados_fuse.command
6 import json
7 import multiprocessing
8 import os
9 import shlex
10 import tempfile
11 import unittest
12
13 from . import run_test_server
14 from .integration_test import workerPool
15
16 def try_exec(mnt, cmd):
17     try:
18         os.environ['KEEP_LOCAL_STORE'] = tempfile.mkdtemp()
19         arvados_fuse.command.Mount(
20             arvados_fuse.command.ArgumentParser().parse_args([
21                 '--read-write',
22                 '--mount-tmp=zzz',
23                 '--unmount-timeout=0.1',
24                 mnt,
25                 '--exec'] + cmd)).run()
26     except SystemExit:
27         pass
28     else:
29         raise AssertionError('should have exited')
30
31
32 class ExecMode(unittest.TestCase):
33     @classmethod
34     def setUpClass(cls):
35         run_test_server.run()
36         run_test_server.run_keep(blob_signing=True, num_servers=2)
37         run_test_server.authorize_with('active')
38
39     @classmethod
40     def tearDownClass(cls):
41         run_test_server.stop_keep(num_servers=2)
42
43     def setUp(self):
44         self.mnt = tempfile.mkdtemp()
45         _, self.okfile = tempfile.mkstemp()
46
47     def tearDown(self):
48         os.rmdir(self.mnt)
49         os.unlink(self.okfile)
50
51     def test_exec(self):
52         workerPool().apply(try_exec, (self.mnt, [
53             'sh', '-c', 'echo -n foo >{}; cp {} {}'.format(
54                 shlex.quote(os.path.join(self.mnt, 'zzz', 'foo.txt')),
55                 shlex.quote(os.path.join(self.mnt, 'zzz', '.arvados#collection')),
56                 shlex.quote(os.path.join(self.okfile)),
57             )]))
58         with open(self.okfile) as f:
59             self.assertRegex(json.load(f)['manifest_text'], r' 0:3:foo.txt\n')