-
Notifications
You must be signed in to change notification settings - Fork 143
/
Copy pathtest_recipes.py
106 lines (83 loc) · 2.16 KB
/
test_recipes.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""Test diskcache.recipes."""
import shutil
import threading
import time
import pytest
import diskcache as dc
@pytest.fixture
def cache():
with dc.Cache() as cache:
yield cache
shutil.rmtree(cache.directory, ignore_errors=True)
def test_averager(cache):
nums = dc.Averager(cache, 'nums')
for i in range(10):
nums.add(i)
assert nums.get() == 4.5
assert nums.pop() == 4.5
for i in range(20):
nums.add(i)
assert nums.get() == 9.5
assert nums.pop() == 9.5
def test_lock(cache):
state = {'num': 0}
lock = dc.Lock(cache, 'demo')
def worker():
state['num'] += 1
with lock:
assert lock.locked()
state['num'] += 1
time.sleep(0.1)
with lock:
thread = threading.Thread(target=worker)
thread.start()
time.sleep(0.1)
assert state['num'] == 1
thread.join()
assert state['num'] == 2
def test_rlock(cache):
state = {'num': 0}
rlock = dc.RLock(cache, 'demo')
def worker():
state['num'] += 1
with rlock:
with rlock:
state['num'] += 1
time.sleep(0.1)
with rlock:
thread = threading.Thread(target=worker)
thread.start()
time.sleep(0.1)
assert state['num'] == 1
thread.join()
assert state['num'] == 2
def test_semaphore(cache):
state = {'num': 0}
semaphore = dc.BoundedSemaphore(cache, 'demo', value=3)
def worker():
state['num'] += 1
with semaphore:
state['num'] += 1
time.sleep(0.1)
semaphore.acquire()
semaphore.acquire()
with semaphore:
thread = threading.Thread(target=worker)
thread.start()
time.sleep(0.1)
assert state['num'] == 1
thread.join()
assert state['num'] == 2
semaphore.release()
semaphore.release()
def test_memoize_stampede(cache):
state = {'num': 0}
@dc.memoize_stampede(cache, 0.1)
def worker(num):
time.sleep(0.01)
state['num'] += 1
return num
start = time.time()
while (time.time() - start) < 1:
worker(100)
assert state['num'] > 0