|
1 | 1 | import os |
| 2 | +import shutil |
| 3 | +import stat |
| 4 | +import tempfile |
2 | 5 | import unittest |
| 6 | +from unittest.mock import patch |
3 | 7 |
|
4 | | -from Orange.misc.utils.embedder_utils import get_proxies |
| 8 | +from Orange.misc.utils.embedder_utils import get_proxies, EmbedderCache |
5 | 9 |
|
6 | 10 |
|
7 | 11 | class TestProxies(unittest.TestCase): |
@@ -63,5 +67,69 @@ def test_none(self): |
63 | 67 | self.assertIsNone(get_proxies()) |
64 | 68 |
|
65 | 69 |
|
| 70 | +class TestEmbedderCache(unittest.TestCase): |
| 71 | + # pylint: disable=protected-access |
| 72 | + def setUp(self): |
| 73 | + self.temp_dir = tempfile.mkdtemp() |
| 74 | + patcher = patch( |
| 75 | + "Orange.misc.utils.embedder_utils.cache_dir", return_value=self.temp_dir |
| 76 | + ) |
| 77 | + patcher.start() |
| 78 | + self.addCleanup(patch.stopall) |
| 79 | + |
| 80 | + def tearDown(self): |
| 81 | + shutil.rmtree(self.temp_dir) |
| 82 | + |
| 83 | + def test_save_load_cache(self): |
| 84 | + # open when cache file doesn't exist yet |
| 85 | + cache = EmbedderCache("TestModel") |
| 86 | + self.assertDictEqual({}, cache._cache_dict) |
| 87 | + |
| 88 | + # add values and save to test opening with existing file |
| 89 | + cache.add("abc", [1, 2, 3]) |
| 90 | + cache.persist_cache() |
| 91 | + |
| 92 | + cache = EmbedderCache("TestModel") |
| 93 | + self.assertDictEqual({"abc": [1, 2, 3]}, cache._cache_dict) |
| 94 | + |
| 95 | + def test_save_cache_no_permission(self): |
| 96 | + # prepare a file |
| 97 | + cache = EmbedderCache("TestModel") |
| 98 | + self.assertDictEqual({}, cache._cache_dict) |
| 99 | + cache.add("abc", [1, 2, 3]) |
| 100 | + cache.persist_cache() |
| 101 | + |
| 102 | + # set file to read-only and try to write |
| 103 | + curr_permission = os.stat(cache._cache_file_path).st_mode |
| 104 | + os.chmod(cache._cache_file_path, stat.S_IRUSR) |
| 105 | + cache.add("abcd", [1, 2, 3]) |
| 106 | + # new values should be cached since file is readonly |
| 107 | + cache.persist_cache() |
| 108 | + cache = EmbedderCache("TestModel") |
| 109 | + self.assertDictEqual({"abc": [1, 2, 3]}, cache._cache_dict) |
| 110 | + os.chmod(cache._cache_file_path, curr_permission) |
| 111 | + |
| 112 | + def test_load_cache_no_permission(self): |
| 113 | + # prepare a file |
| 114 | + cache = EmbedderCache("TestModel") |
| 115 | + self.assertDictEqual({}, cache._cache_dict) |
| 116 | + cache.add("abc", [1, 2, 3]) |
| 117 | + cache.persist_cache() |
| 118 | + |
| 119 | + # no read permission - load no cache |
| 120 | + if os.name == "nt": |
| 121 | + with patch( |
| 122 | + "Orange.misc.utils.embedder_utils.pickle.load", |
| 123 | + side_effect=PermissionError, |
| 124 | + ): |
| 125 | + # it is difficult to change write permission on Windows using |
| 126 | + # patch instead |
| 127 | + cache = EmbedderCache("TestModel") |
| 128 | + else: |
| 129 | + os.chmod(cache._cache_file_path, stat.S_IWUSR) |
| 130 | + cache = EmbedderCache("TestModel") |
| 131 | + self.assertDictEqual({}, cache._cache_dict) |
| 132 | + |
| 133 | + |
66 | 134 | if __name__ == "__main__": |
67 | 135 | unittest.main() |
0 commit comments