aboutsummaryrefslogtreecommitdiff
path: root/networks/hs_intro_fail.py
blob: 90c7f48bf63318489a062c778122c4bd4817e346 (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
from chutney.Testing import *
from chutney.TorNet import *

from stem.control import EventType

def hs_fail_test(network, failures=1):
    result = True

    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")

    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")

    result &= check_same_intro_points()

    connection_test(network.get("c"), len(hs_nodes))

    return result