blob: 611d7dc9d1febd986f20d1388b2d1250f45f5701 (
plain)
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
|
__test__ = False
if __name__ == '__main__':
import eventlet
eventlet.monkey_patch(all=True)
import socket
import time
import dns.message
import dns.query
import dns.flags
n = 10
delay = 0.01
addr_map = {'test-host{0}.'.format(i): '0.0.1.{0}'.format(i) for i in range(n)}
def slow_udp(q, *a, **kw):
qname = q.question[0].name
addr = addr_map[qname.to_text()]
r = dns.message.make_response(q)
r.index = None
r.flags = dns.flags.QR | dns.flags.RD
r.answer.append(dns.rrset.from_text(str(qname), 60, 'IN', 'A', addr))
r.time = 0.001
eventlet.sleep(delay)
return r
dns.query.tcp = lambda: eventlet.Timeout(0)
dns.query.udp = slow_udp
results = {}
def fun(name):
try:
results[name] = socket.gethostbyname(name)
except socket.error as e:
print('name: {0} error: {1}'.format(name, e))
pool = eventlet.GreenPool(size=n + 1)
# FIXME: For unknown reason, first GreenPool.spawn() takes ~250ms on some platforms.
# Spawned function executes for normal expected time, it's the GreenPool who needs warmup.
pool.spawn(eventlet.sleep)
t1 = time.time()
for name in addr_map:
pool.spawn(fun, name)
pool.waitall()
td = time.time() - t1
fail_msg = 'Resolve time expected: ~{0:.3f}s, real: {1:.3f}'.format(delay, td)
assert delay <= td < delay * n, fail_msg
assert addr_map == results
print('pass')
|