Coverage for tests/e2e/mock.py : 94%
Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# -*- coding: utf-8 -*-
2from __future__ import annotations
4# -- stdlib --
5import logging
6import random
8# -- third party --
9from gevent.pool import Pool
10import gevent
12# -- own --
13from core import CoreRunner
14from server.parts.backend import MockBackend
15from server.parts.connect import MockConnect
16import client.core
17import server.core
18from utils.events import EventHub
21# -- code --
22log = logging.getLogger('mock')
25def enable_endpoint_logging():
26 import endpoint
27 endpoint.log.setLevel(logging.DEBUG)
30class EventTap(object):
32 def __init__(self):
33 self._taps = {}
35 def tap(self, *cores):
36 for core in cores:
37 for k in dir(core.events):
38 if k.startswith('__'):
39 continue
41 hub = getattr(core.events, k)
42 if not isinstance(hub, EventHub):
43 continue
45 def tapper(ev, hub=hub):
46 self._taps[hub] = ev
47 return ev
49 hub += tapper
51 def take(self, hub):
52 v = self._taps[hub]
53 del self._taps[hub]
54 return v
56 def clear(self):
57 self._taps.clear()
59 def __getitem__(self, k):
60 return self._taps[k]
62 def __contains__(self, k):
63 return k in self._taps
66class Environ(object):
67 def __init__(self):
68 self.pool = Pool(32)
69 p = random.randint(10000, 30000)
70 ip = random.randint(1, 16777215)
71 self.rendezvous = f'tcp://127.{ip}:{p}'
72 self.parent = gevent.getcurrent()
74 def _run(self, runner):
75 try:
76 g = gevent.getcurrent()
77 g.gr_name = f'Environ.init({runner})'
78 runner.run()
79 except Exception as e:
80 gevent.kill(self.parent, e)
82 def client_core(self) -> client.core.Core:
83 core = client.core.Core(disables=['warpgate'], testing=True)
84 runner = CoreRunner(core, paranoid=True)
85 self.pool.spawn(self._run, runner)
86 runner.ready.wait()
87 core.server.connect(self.rendezvous)
88 return core
90 def server_core(self) -> server.core.Core:
91 core = server.core.Core(disables=[
92 'connect', 'stats', 'backend'
93 ], listen=self.rendezvous, testing=True)
94 core.backend = MockBackend(core)
95 core.connect = MockConnect(core)
96 runner = CoreRunner(core, paranoid=True)
97 self.pool.spawn(self._run, runner)
98 gevent.sleep(0.05)
99 return core
101 def shutdown(self):
102 self.pool.kill()