Merge branch '3198-inode-cache' into 3198-writable-fuse, fix tests.
[arvados.git] / services / fuse / tests / test_inodes.py
1 import arvados_fuse
2 import mock
3 import unittest
4
5 class InodeTests(unittest.TestCase):
6     def test_inodes(self):
7         cache = arvados_fuse.InodeCache(1000, 4)
8         inodes = arvados_fuse.Inodes(cache)
9
10         # Check that ent1 gets added to inodes
11         ent1 = mock.MagicMock()
12         ent1.return_value.in_use = False
13         ent1.persisted.return_value = True
14         ent1.clear.return_value = True
15         ent1.objsize.return_value = 500
16         inodes.add_entry(ent1)
17         self.assertIn(ent1.inode, inodes)
18         self.assertIs(inodes[ent1.inode], ent1)
19         self.assertEqual(500, cache.total())
20
21         # ent2 is not persisted, so it doesn't
22         # affect the cache total
23         ent2 = mock.MagicMock()
24         ent2.return_value.in_use = False
25         ent2.persisted.return_value = False
26         ent2.objsize.return_value = 600
27         inodes.add_entry(ent2)
28         self.assertEqual(500, cache.total())
29
30         # ent3 is persisted, adding it should cause ent1 to get cleared
31         ent3 = mock.MagicMock()
32         ent3.return_value.in_use = False
33         ent3.persisted.return_value = True
34         ent3.objsize.return_value = 600
35         ent3.clear.return_value = True
36
37         self.assertFalse(ent1.clear.called)
38         inodes.add_entry(ent3)
39
40         # Won't clear anything because min_entries = 4
41         self.assertEqual(2, len(cache._entries))
42         self.assertFalse(ent1.clear.called)
43         self.assertEqual(1100, cache.total())
44
45         # Change min_entries
46         cache.min_entries = 1
47         cache.cap_cache()
48         self.assertEqual(600, cache.total())
49         self.assertTrue(ent1.clear.called)
50
51         # Touching ent1 should cause ent3 to get cleared
52         self.assertFalse(ent3.clear.called)
53         cache.touch(ent1)
54         self.assertTrue(ent3.clear.called)
55         self.assertEqual(500, cache.total())
56
57         # ent1, ent3 clear return false, can't be cleared
58         ent1.clear.return_value = False
59         ent3.clear.return_value = False
60         ent1.clear.called = False
61         ent3.clear.called = False
62         self.assertFalse(ent1.clear.called)
63         self.assertFalse(ent3.clear.called)
64         cache.touch(ent3)
65         self.assertTrue(ent1.clear.called)
66         self.assertTrue(ent3.clear.called)
67         self.assertEqual(1100, cache.total())
68
69         # ent1 clear return false, so ent3
70         # gets cleared
71         ent1.clear.return_value = False
72         ent3.clear.return_value = True
73         ent1.clear.called = False
74         ent3.clear.called = False
75         self.assertFalse(ent1.clear.called)
76         self.assertFalse(ent3.clear.called)
77         cache.touch(ent3)
78         self.assertTrue(ent1.clear.called)
79         self.assertTrue(ent3.clear.called)
80         self.assertEqual(500, cache.total())
81
82         # Delete ent1
83         ent1.clear.return_value = True
84         ent1.ref_count = 0
85         inodes.del_entry(ent1)
86         self.assertEqual(0, cache.total())
87         cache.touch(ent3)
88         self.assertEqual(600, cache.total())