1 # Copyright (C) The Arvados Authors. All rights reserved.
3 # SPDX-License-Identifier: AGPL-3.0
10 import multiprocessing
17 from .integration_test import IntegrationTest
19 logger = logging.getLogger('arvados.arv-mount')
21 class TokenExpiryTest(IntegrationTest):
23 super(TokenExpiryTest, self).setUp()
24 self.test_start_time = time.time()
25 self.time_now = int(time.time())+1
31 orig_open = arvados_fuse.Operations.open
32 def fake_open(self, operations, *args, **kwargs):
33 self.time_now += 86400*13
34 logger.debug('opening file at time=%f', self.time_now)
35 return self.orig_open(operations, *args, **kwargs)
37 @mock.patch.object(arvados_fuse.Operations, 'open', autospec=True)
38 @mock.patch('time.time')
39 @mock.patch('arvados.keep.KeepClient.get')
40 @IntegrationTest.mount(argv=['--mount-by-id', 'zzz'])
41 def test_refresh_old_manifest(self, mocked_get, mocked_time, mocked_open):
42 # This test (and associated behavior) is still not strong
43 # enough. We should ensure old tokens are never used even if
44 # blobSignatureTtl seconds elapse between open() and
45 # read(). See https://dev.arvados.org/issues/10008
47 mocked_get.return_value = 'fake data'
48 mocked_time.side_effect = self.fake_time
49 mocked_open.side_effect = self.fake_open
51 with mock.patch.object(self.mount.api, 'collections', wraps=self.mount.api.collections) as mocked_collections:
52 mocked_collections.return_value = mocked_collections()
53 with mock.patch.object(self.mount.api.collections(), 'get', wraps=self.mount.api.collections().get) as mocked_get:
54 self.pool_test(os.path.join(self.mnt, 'zzz'))
56 # open() several times here to make sure we don't reach our
57 # quota of mocked_get.call_count dishonestly (e.g., the first
58 # open causes 5 mocked_get, and the rest cause none).
59 self.assertEqual(8, mocked_open.call_count)
60 self.assertGreaterEqual(
61 mocked_get.call_count, 8,
62 'Not enough calls to collections().get(): expected 8, got {!r}'.format(
63 mocked_get.mock_calls))
66 def _test_refresh_old_manifest(self, zzz):
67 uuid = 'zzzzz-4zz18-op4e2lbej01tcvu'
68 fnm = 'zzzzz-8i9sb-0vsrcqi7whchuil.log.txt'
69 os.listdir(os.path.join(zzz, uuid))
71 with open(os.path.join(zzz, uuid, fnm)) as f: