Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mikf
GitHub Repository: mikf/gallery-dl
Path: blob/master/test/test_cache.py
5457 views
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
4
# Copyright 2020 Mike Fährmann
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License version 2 as
8
# published by the Free Software Foundation.
9
10
import os
11
import sys
12
import unittest
13
from unittest.mock import patch
14
15
import tempfile
16
17
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
18
from gallery_dl import config, util # noqa E402
19
20
dbpath = tempfile.mkstemp()[1]
21
config.set(("cache",), "file", dbpath)
22
from gallery_dl import cache # noqa E402
23
cache._init()
24
25
26
# def tearDownModule():
27
# util.remove_file(dbpath)
28
29
30
class TestCache(unittest.TestCase):
31
32
def test_decorator(self):
33
34
@cache.memcache()
35
def mc1():
36
pass
37
38
@cache.memcache(maxage=10)
39
def mc2():
40
pass
41
42
@cache.cache()
43
def dbc():
44
pass
45
46
self.assertIsInstance(mc1, cache.CacheDecorator)
47
self.assertIsInstance(mc2, cache.MemoryCacheDecorator)
48
self.assertIsInstance(dbc, cache.DatabaseCacheDecorator)
49
50
def test_keyarg_mem_simple(self):
51
@cache.memcache(keyarg=2)
52
def ka(a, b, c):
53
return a+b+c
54
55
self.assertEqual(ka(1, 1, 1), 3)
56
self.assertEqual(ka(2, 2, 2), 6)
57
58
self.assertEqual(ka(0, 0, 1), 3)
59
self.assertEqual(ka(9, 9, 1), 3)
60
self.assertEqual(ka(0, 0, 2), 6)
61
self.assertEqual(ka(9, 9, 2), 6)
62
63
def test_keyarg_mem(self):
64
@cache.memcache(keyarg=2, maxage=10)
65
def ka(a, b, c):
66
return a+b+c
67
68
self.assertEqual(ka(1, 1, 1), 3)
69
self.assertEqual(ka(2, 2, 2), 6)
70
71
self.assertEqual(ka(0, 0, 1), 3)
72
self.assertEqual(ka(9, 9, 1), 3)
73
self.assertEqual(ka(0, 0, 2), 6)
74
self.assertEqual(ka(9, 9, 2), 6)
75
76
def test_keyarg_db(self):
77
@cache.cache(keyarg=2, maxage=10)
78
def ka(a, b, c):
79
return a+b+c
80
81
self.assertEqual(ka(1, 1, 1), 3)
82
self.assertEqual(ka(2, 2, 2), 6)
83
84
self.assertEqual(ka(0, 0, 1), 3)
85
self.assertEqual(ka(9, 9, 1), 3)
86
self.assertEqual(ka(0, 0, 2), 6)
87
self.assertEqual(ka(9, 9, 2), 6)
88
89
def test_expires_mem(self):
90
@cache.memcache(maxage=2)
91
def ex(a, b, c):
92
return a+b+c
93
94
with patch("time.time") as tmock:
95
tmock.return_value = 0.001
96
self.assertEqual(ex(1, 1, 1), 3)
97
self.assertEqual(ex(2, 2, 2), 3)
98
self.assertEqual(ex(3, 3, 3), 3)
99
100
# value is still cached after 1 second
101
tmock.return_value += 1.0
102
self.assertEqual(ex(3, 3, 3), 3)
103
self.assertEqual(ex(2, 2, 2), 3)
104
self.assertEqual(ex(1, 1, 1), 3)
105
106
# new value after 'maxage' seconds
107
tmock.return_value += 1.0
108
self.assertEqual(ex(3, 3, 3), 9)
109
self.assertEqual(ex(2, 2, 2), 9)
110
self.assertEqual(ex(1, 1, 1), 9)
111
112
def test_expires_db(self):
113
@cache.cache(maxage=2)
114
def ex(a, b, c):
115
return a+b+c
116
117
with patch("time.time") as tmock:
118
tmock.return_value = 0.999
119
self.assertEqual(ex(1, 1, 1), 3)
120
self.assertEqual(ex(2, 2, 2), 3)
121
self.assertEqual(ex(3, 3, 3), 3)
122
123
# value is still cached after 1 second
124
tmock.return_value += 1.0
125
self.assertEqual(ex(3, 3, 3), 3)
126
self.assertEqual(ex(2, 2, 2), 3)
127
self.assertEqual(ex(1, 1, 1), 3)
128
129
# new value after 'maxage' seconds
130
tmock.return_value += 1.0
131
self.assertEqual(ex(3, 3, 3), 9)
132
self.assertEqual(ex(2, 2, 2), 9)
133
self.assertEqual(ex(1, 1, 1), 9)
134
135
def test_update_mem_simple(self):
136
@cache.memcache(keyarg=0)
137
def up(a, b, c):
138
return a+b+c
139
140
self.assertEqual(up(1, 1, 1), 3)
141
up.update(1, 0)
142
up.update(2, 9)
143
self.assertEqual(up(1, 0, 0), 0)
144
self.assertEqual(up(2, 0, 0), 9)
145
146
def test_update_mem(self):
147
@cache.memcache(keyarg=0, maxage=10)
148
def up(a, b, c):
149
return a+b+c
150
151
self.assertEqual(up(1, 1, 1), 3)
152
up.update(1, 0)
153
up.update(2, 9)
154
self.assertEqual(up(1, 0, 0), 0)
155
self.assertEqual(up(2, 0, 0), 9)
156
157
def test_update_db(self):
158
@cache.cache(keyarg=0, maxage=10)
159
def up(a, b, c):
160
return a+b+c
161
162
self.assertEqual(up(1, 1, 1), 3)
163
up.update(1, 0)
164
up.update(2, 9)
165
self.assertEqual(up(1, 0, 0), 0)
166
self.assertEqual(up(2, 0, 0), 9)
167
168
def test_invalidate_mem_simple(self):
169
@cache.memcache(keyarg=0)
170
def inv(a, b, c):
171
return a+b+c
172
173
self.assertEqual(inv(1, 1, 1), 3)
174
inv.invalidate(1)
175
inv.invalidate(2)
176
self.assertEqual(inv(1, 0, 0), 1)
177
self.assertEqual(inv(2, 0, 0), 2)
178
179
def test_invalidate_mem(self):
180
@cache.memcache(keyarg=0, maxage=10)
181
def inv(a, b, c):
182
return a+b+c
183
184
self.assertEqual(inv(1, 1, 1), 3)
185
inv.invalidate(1)
186
inv.invalidate(2)
187
self.assertEqual(inv(1, 0, 0), 1)
188
self.assertEqual(inv(2, 0, 0), 2)
189
190
def test_invalidate_db(self):
191
@cache.cache(keyarg=0, maxage=10)
192
def inv(a, b, c):
193
return a+b+c
194
195
self.assertEqual(inv(1, 1, 1), 3)
196
inv.invalidate(1)
197
inv.invalidate(2)
198
self.assertEqual(inv(1, 0, 0), 1)
199
self.assertEqual(inv(2, 0, 0), 2)
200
201
def test_database_read(self):
202
@cache.cache(keyarg=0, maxage=10)
203
def db(a, b, c):
204
return a+b+c
205
206
# initialize cache
207
self.assertEqual(db(1, 1, 1), 3)
208
db.update(2, 6)
209
210
# check and clear the in-memory portion of said cache
211
self.assertEqual(db.cache[1][0], 3)
212
self.assertEqual(db.cache[2][0], 6)
213
db.cache.clear()
214
self.assertEqual(db.cache, {})
215
216
# fetch results from database
217
self.assertEqual(db(1, 0, 0), 3)
218
self.assertEqual(db(2, 0, 0), 6)
219
220
# check in-memory cache updates
221
self.assertEqual(db.cache[1][0], 3)
222
self.assertEqual(db.cache[2][0], 6)
223
224
225
if __name__ == "__main__":
226
unittest.main()
227
228