blob: 537e88139917824bb7e0f008fd062b8d399cc422 (
about) (
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
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
107
108
109
110
111
112
113
|
from chutney.Testing import *
from chutney.TorNet import *
from twisted.internet import reactor
from stem.control import EventType
def hs_fail_test(network, failures=1):
hs_nodes = network.get("h")
initial_nodes = network.get("a") + network.get("r") + network.get("c") + hs_nodes[:1]
if not all([ n.getController().start() for n in initial_nodes ]):
return False
logging.info("All initial nodes running")
thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0})
nodes_by_fingerprint = get_node_fingerprints(network.get("a") + network.get("r"))
track_introduction_points(hs_nodes[0])
node_0_published_descriptor = threading.Event()
def hs_node_0_listener(logevent):
if "Successfully uploaded v2 rend descriptors" in logevent.message:
node_0_published_descriptor.set()
hs_nodes[0].getStemController().add_event_listener(hs_node_0_listener, EventType.INFO)
node_0_published_descriptor.wait()
hs_nodes[0].getStemController().remove_event_listener(hs_node_0_listener)
# list to cope with scope problems
node_counter = [len(hs_nodes) - 1]
node_counter_lock = threading.RLock()
nodes_published_descriptors = threading.Event()
def hs_node_listener(logevent):
if "Successfully uploaded v2 rend descriptors" in logevent.message:
with node_counter_lock:
node_counter[0] -= 1
if node_counter[0] == 0:
nodes_published_descriptors.set()
for node in hs_nodes[1:]:
node.getController().start()
track_introduction_points(node)
node.getStemController().add_event_listener(hs_node_listener, EventType.INFO)
nodes_published_descriptors.wait()
for node in hs_nodes[1:]:
node.getStemController().remove_event_listener(hs_node_listener)
# Now begin testing
connection_test(network.get("c"), len(hs_nodes))
time.sleep(5)
logging.info("About to stop %d introduction points" % failures)
fingerprints = set()
while len(fingerprints) != failures:
# Select a random node that is being used as an introduction point
nodenum = random.choice(node_intro_circuits.keys())
fingerprint = random.choice(node_intro_circuits[nodenum].values())
fingerprints.add(fingerprint)
for fingerprint in fingerprints:
node = nodes_by_fingerprint[fingerprint]
logging.info("stopping " + node._env["nick"] + " (" + fingerprint + ")")
node.getStemController().close()
node.getController().stop()
logging.info("begining to watch for the establishment of new introduction points")
changed = [False for n in hs_nodes]
intro_points_before = [set(node_intro_circuits[n._env["nodenum"]].values()) for n in hs_nodes]
time.sleep(60)
intro_points_after = [set(node_intro_circuits[n._env["nodenum"]].values()) for n in hs_nodes]
for i, node in enumerate(hs_nodes):
before = intro_points_before[i]
after = intro_points_after[i]
if before != after:
changed[i] = True
if all(changed):
logging.info("All changed")
else:
logging.info("All did not change")
check_same_intro_points()
connection_test(network.get("c"), len(hs_nodes))
reactor.stop()
|