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