コード例 #1
0
ファイル: test.py プロジェクト: bookchin/storjnode
    def __init__(self, wif, transfer, api, increasing_tests=1):
        # Binary wallet import key.
        self.wif = wif

        # A Node instance object (can also be pyp2p.dht_msg.DHT)
        self.api = api

        # A FileTransfer object.
        self.transfer = transfer

        # Boolean - whether to do successive tests if a test returns
        # too soon (i.e. increase size for fast connections.)
        self.increasing_tests = increasing_tests

        # The UNL of the remote node we're testing our bandwidth with.
        self.test_node_unl = None

        # A deferred representing the future result for the active test.
        self.active_test = defer.Deferred()

        # The data_id / hash of the current random file being transferred.
        self.data_id = None

        # Size in MB of current test - will increase if increasing_tests
        # is enabled.
        self.test_size = 1  # MB

        # Stored in BYTES per second.
        self.results = self.setup_results()

        # Record old handlers for cleanup purposes.
        self.handlers = {
            "start": set(),
            "complete": set(),
            "accept": set()
        }

        # Listen for bandwidth requests + responses.
        handle_requests = handle_requests_builder(self)
        handle_responses = handle_responses_builder(self)
        self.api.add_message_handler(handle_requests)
        self.api.add_message_handler(handle_responses)

        # Timeout bandwidth test after 5 minutes.
        self.start_time = time.time()

        # Handle timeouts.
        def handle_timeout():
            duration = time.time() - self.start_time
            if duration >= 300:
                if self.active_test is not None:
                    self.active_test.errback(Exception("Timed out"))

                self.reset_state()

        # Schedule timeout.
        def schedule_looping_call():
            d = LoopingCall(handle_timeout).start(1, now=True)
            d.addErrback(handle_errors)
            return d

        # Handle errors.
        def handle_errors(ret):
            print("An unknown error occurred in handle timeout")
            print(ret)
            self.reset_state()
            return schedule_looping_call()

        schedule_looping_call()
コード例 #2
0
ファイル: do_responses.py プロジェクト: welfeng2016/storjnode
    def test_handle_responses(self):
        handle_requests = handle_requests_builder(self.bob_test)
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        req = ordered_dict_to_list(req)
        self.req = handle_requests(
            self.alice_dht,
            req
        )
        print(req)
        print("-----------")

        # Handle responses.
        handle_responses = handle_responses_builder(self.alice_test)

        # Test invalid message type.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        req[u"type"] = "garbage"
        req = ordered_dict_to_list(req)
        res = handle_responses(
            self.bob_dht,
            req
        )
        self.assertTrue(res == -1)

        # Test transfer already active.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        req = ordered_dict_to_list(req)
        self.alice_test.test_node_unl = True
        res = handle_responses(
            self.bob_dht,
            req
        )
        self.assertTrue(res == -2)
        self.alice_test.test_node_unl = None

        # Check our sig is valid.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        req[u"request"][u"something"] = u"invalidate our sig"
        req = ordered_dict_to_list(req)
        res = handle_responses(
            self.bob_dht,
            req
        )
        self.assertTrue(res == -3)

        # Test node ides match.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        req[u"request"][u"test_node_unl"] = u"nope"
        req = ordered_dict_to_list(req)
        res = handle_responses(
            self.bob_dht,
            req
        )
        self.assertTrue(res == -4)

        # Their sig does not match.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        req[u"something"] = u"invalid"
        req = ordered_dict_to_list(req)
        res = handle_responses(
            self.bob_dht,
            req
        )
        self.assertTrue(res == -5)

        # This should pass.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        req = ordered_dict_to_list(req)
        res = handle_responses(
            self.bob_dht,
            req
        )
        self.assertTrue(res is None)

        """
        ----------------------
        Test accept handler.
        ----------------------
        """

        # Handler expired.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        accept_handler = self.alice_test.handlers["accept"].pop()
        self.assertTrue(accept_handler(
            "contract_id",
            self.bob_transfer.net.unl.value,
            req[u"request"][u"data_id"],
            ONE_MB
        ) == -1)
        self.alice_test.handlers["accept"].add(accept_handler)

        # Invalid data id.
        self.assertTrue(accept_handler(
            "contract_id",
            self.bob_transfer.net.unl.value,
            "test",
            ONE_MB
        ) == -2)

        # Invalid node id.
        self.assertTrue(accept_handler(
            "contract_id",
            self.alice_transfer.net.unl.value,
            req[u"request"][u"data_id"],
            ONE_MB
        ) == -3)

        # Invalid file size.
        self.alice_test.test_size = 0
        self.assertTrue(accept_handler(
            "contract_id",
            self.bob_transfer.net.unl.value,
            req[u"request"][u"data_id"],
            ONE_MB
        ) == -4)
        self.alice_test.test_size = 1

        # This should pass
        self.assertTrue(accept_handler(
            "contract_id",
            self.bob_transfer.net.unl.value,
            req[u"request"][u"data_id"],
            ONE_MB
        ) == 1)

        """
        ----------------------
        Test start handler.
        ----------------------
        """

        # Handler expired.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        start_handler = self.alice_test.handlers["start"].pop()
        self.assertTrue(start_handler(
            self.alice_transfer,
            None,
            "start_contract_id"
        ) == -1)
        self.alice_test.handlers["start"].add(start_handler)

        # This should pass.
        contract = {
            "host_unl": self.bob_transfer.net.unl.value,
            "dest_unl": self.alice_transfer.net.unl.value,
            "data_id": req["request"]["data_id"]
        }
        self.alice_transfer.contracts[req["request"]["data_id"]] = contract
        self.assertTrue(start_handler(
            self.alice_transfer,
            None,
            req["request"]["data_id"]
        ) == 1)

        # Invalid data id.
        contract = {
            "host_unl": self.bob_transfer.net.unl.value,
            "dest_unl": self.alice_transfer.net.unl.value,
            "data_id": "x"
        }
        self.alice_transfer.contracts[req["request"]["data_id"]] = contract
        self.assertTrue(start_handler(
            self.alice_transfer,
            None,
            req["request"]["data_id"]
        ) == -2)

        # Invalid dest unl for upload.
        contract = {
            "host_unl": self.bob_transfer.net.unl.value,
            "dest_unl": self.alice_transfer.net.unl.value,
            "data_id": req["request"]["data_id"]
        }
        self.alice_transfer.contracts[req["request"]["data_id"]] = contract

        def get_direction_wrapper(contract_id):
            return u"send"

        original_get_direction = self.alice_transfer.get_direction
        self.alice_transfer.get_direction = get_direction_wrapper

        self.assertTrue(start_handler(
            self.alice_transfer,
            None,
            req["request"]["data_id"]
        ) == -3)
        self.alice_transfer.get_direction = original_get_direction

        """
        ----------------------
        Test completion handler.
        ----------------------
        completion_handler(client, contract_id, con):
        """

        # Handler expired.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        complete_handler = self.alice_test.handlers["complete"].pop()
        contract_id = ""
        self.assertTrue(complete_handler(
            self.alice_transfer,
            contract_id,
            None
        ) == -1)
        self.alice_test.handlers["complete"].add(complete_handler)

        # Check data ID.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        contract_id = "test"
        contract = {
            "data_id": "yyy"
        }
        self.alice_transfer.contracts[contract_id] = contract
        self.assertTrue(complete_handler(
            self.alice_transfer,
            contract_id,
            None
        ) == -2)

        # Upload: invalid src unl.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        contract_id = "test"
        contract = {
            "data_id": req["request"]["data_id"],
            "dest_unl": self.alice_transfer.net.unl.value,
            "host_unl": self.alice_transfer.net.unl.value
        }
        self.alice_transfer.contracts[contract_id] = contract
        self.assertTrue(complete_handler(
            self.alice_transfer,
            contract_id,
            None
        ) == -3)

        # Upload: invalid src unl.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        contract_id = "test"
        contract = {
            "data_id": req["request"]["data_id"],
            "src_unl": self.alice_transfer.net.unl.value,
            "dest_unl": self.alice_transfer.net.unl.value,
            "host_unl": self.alice_transfer.net.unl.value
        }
        self.alice_transfer.contracts[contract_id] = contract

        def get_direction_wrapper(contract_id):
            return u"receive"

        original_get_direction = self.alice_transfer.get_direction
        self.alice_transfer.get_direction = get_direction_wrapper

        self.assertTrue(complete_handler(
            self.alice_transfer,
            contract_id,
            None
        ) == -4)

        self.alice_transfer.get_direction = original_get_direction

        # Check bad results.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        contract_id = "test"
        contract = {
            "data_id": req["request"]["data_id"],
            "src_unl": self.bob_transfer.net.unl.value,
            "dest_unl": self.alice_transfer.net.unl.value,
            "host_unl": self.alice_transfer.net.unl.value
        }
        self.alice_transfer.contracts[contract_id] = contract

        def get_direction_wrapper(contract_id):
            return u"receive"

        original_get_direction = self.alice_transfer.get_direction
        self.alice_transfer.get_direction = get_direction_wrapper

        self.assertTrue(complete_handler(
            self.alice_transfer,
            contract_id,
            None
        ) == -1)

        self.alice_transfer.get_direction = original_get_direction

        # Test schedule new transfer.
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        contract_id = "test"
        contract = {
            "data_id": req["request"]["data_id"],
            "src_unl": self.bob_transfer.net.unl.value,
            "dest_unl": self.alice_transfer.net.unl.value,
            "host_unl": self.alice_transfer.net.unl.value
        }
        self.alice_transfer.contracts[contract_id] = contract

        def get_direction_wrapper(contract_id):
            return u"receive"

        original_get_direction = self.alice_transfer.get_direction
        self.alice_transfer.get_direction = get_direction_wrapper

        start_time = time.time()
        end_time = start_time + 10
        self.alice_test.results = {
            "upload": {
                "transferred": int(1000),
                "start_time": int(start_time),
                "end_time": int(end_time)
            },
            "download": {
                "transferred": int(1000),
                "start_time": int(start_time),
                "end_time": int(end_time)
            }
        }

        self.alice_test.test_size = 1000

        self.assertTrue(complete_handler(
            self.alice_transfer,
            contract_id,
            None
        ) == -5)

        self.alice_transfer.get_direction = original_get_direction
        self.alice_test.test_size = 1

        # This should work:
        req = list_to_ordered_dict(copy.deepcopy(self.req))
        contract_id = "test"
        contract = {
            "data_id": req["request"]["data_id"],
            "src_unl": self.bob_transfer.net.unl.value,
            "dest_unl": self.alice_transfer.net.unl.value,
            "host_unl": self.alice_transfer.net.unl.value
        }
        self.alice_transfer.contracts[contract_id] = contract

        def get_direction_wrapper(contract_id):
            return u"receive"

        original_get_direction = self.alice_transfer.get_direction
        self.alice_transfer.get_direction = get_direction_wrapper

        start_time = time.time()
        end_time = start_time + 60
        self.alice_test.results = {
            "upload": {
                "transferred": int(1000),
                "start_time": int(start_time),
                "end_time": int(end_time)
            },
            "download": {
                "transferred": int(1000),
                "start_time": int(start_time),
                "end_time": int(end_time)
            }
        }

        self.assertTrue(complete_handler(
            self.alice_transfer,
            contract_id,
            None
        ))

        self.alice_transfer.get_direction = original_get_direction