def test_default_http_client_topup(doggo_proxy, default_http_client: DefaultHTTPClient, receiver_privkey): # Create a channel that has just enough capacity for one transfer. default_http_client.initial_deposit = lambda x: 0 check_response(default_http_client.run('doggo.jpg')) client = default_http_client.client open_channels = client.get_open_channels() assert len(open_channels) == 1 channel1 = open_channels[0] assert channel1 == default_http_client.channel assert channel1.balance_sig assert channel1.balance == channel1.deposit # Do another payment. Topup should occur. check_response(default_http_client.run('doggo.jpg')) open_channels = client.get_open_channels() assert len(open_channels) == 1 channel2 = open_channels[0] assert channel2 == default_http_client.channel assert channel2.balance_sig assert channel2.balance < channel2.deposit assert channel1 == channel2 close_channel_cooperatively(channel1, receiver_privkey, client.channel_manager_address)
def test_default_http_client_topup( doggo_proxy, default_http_client: DefaultHTTPClient, http_doggo_url: str ): # Create a channel that has just enough capacity for one transfer. default_http_client.initial_deposit = lambda x: 0 check_response(default_http_client.get(http_doggo_url)) client = default_http_client.client open_channels = client.get_open_channels() assert len(open_channels) == 1 channel1 = open_channels[0] assert channel1 == default_http_client.get_channel(http_doggo_url) assert channel1.balance_sig assert channel1.balance == channel1.deposit # Do another payment. Topup should occur. check_response(default_http_client.get(http_doggo_url)) open_channels = client.get_open_channels() assert len(open_channels) == 1 channel2 = open_channels[0] assert channel2 == default_http_client.get_channel(http_doggo_url) assert channel2.balance_sig assert channel2.balance < channel2.deposit assert channel1 == channel2
def test_full_cycle_error_500( default_http_client: DefaultHTTPClient, api_endpoint_address: str, token_contract_address, channel_manager_contract_address, receiver_address ): default_http_client.initial_deposit = lambda x: x with requests_mock.mock() as server_mock: headers1 = Munch() headers1.token_address = token_contract_address headers1.contract_address = channel_manager_contract_address headers1.receiver_address = receiver_address headers1.price = '3' headers2 = Munch() headers2.cost = '3' headers1 = HTTPHeaders.serialize(headers1) headers2 = HTTPHeaders.serialize(headers2) url = 'http://{}/something'.format(api_endpoint_address) server_mock.get(url, [ {'status_code': 402, 'headers': headers1}, {'status_code': 500, 'headers': {}}, {'status_code': 200, 'headers': headers2, 'text': 'success'} ]) response = default_http_client.get(url) # First cycle, request price. request = server_mock.request_history[0] assert request.path == '/something' assert request.method == 'GET' assert request.headers['RDN-Contract-Address'] == channel_manager_contract_address # Second cycle, pay price but receive error. request = server_mock.request_history[1] assert request.path == '/something' assert request.method == 'GET' assert request.headers['RDN-Contract-Address'] == channel_manager_contract_address assert request.headers['RDN-Balance'] == '3' channel = default_http_client.get_channel(url) assert channel.balance == 3 balance_sig_hex = encode_hex(channel.balance_sig) assert request.headers['RDN-Balance-Signature'] == balance_sig_hex # Third cycle, retry naively. request = server_mock.request_history[2] assert request.path == '/something' assert request.method == 'GET' assert request.headers['RDN-Contract-Address'] == channel_manager_contract_address assert request.headers['RDN-Balance'] == '3' assert channel.balance == 3 assert request.headers['RDN-Balance-Signature'] == balance_sig_hex assert channel.balance_sig assert response.text == 'success'
def test_custom_headers(default_http_client: DefaultHTTPClient, api_endpoint_address: str, token_address: str, channel_manager_address: str, receiver_address: str): default_http_client.initial_deposit = lambda x: x with requests_mock.mock() as server_mock: headers1 = Munch() headers1.token_address = token_address headers1.contract_address = channel_manager_address headers1.receiver_address = receiver_address headers1.price = '7' headers2 = Munch() headers2.cost = '7' headers1 = HTTPHeaders.serialize(headers1) headers2 = HTTPHeaders.serialize(headers2) url = 'http://{}/something'.format(api_endpoint_address) server_mock.get(url, [{ 'status_code': 402, 'headers': headers1 }, { 'status_code': 200, 'headers': headers2, 'text': 'success' }]) response = default_http_client.get( url, headers={ 'someheader': 'somevalue', # This should override the actual balance but doesn't actually make sense. 'RDN-Balance': '5' }) # First cycle, request price. request = server_mock.request_history[0] assert request.path == '/something' assert request.method == 'GET' assert request.headers['RDN-Contract-Address'] == channel_manager_address assert request.headers['RDN-Balance'] == '5' assert request.headers['someheader'] == 'somevalue' # Second cycle, pay price. request = server_mock.request_history[1] assert request.path == '/something' assert request.method == 'GET' assert request.headers['RDN-Contract-Address'] == channel_manager_address assert request.headers['RDN-Balance'] == '5' assert request.headers['someheader'] == 'somevalue' channel = default_http_client.get_channel(url) assert channel.balance == 7 balance_sig_hex = encode_hex(channel.balance_sig) assert request.headers['RDN-Balance-Signature'] == balance_sig_hex assert channel.balance_sig assert response.text == 'success'
def test_resource_request(doggo_proxy, default_http_client: DefaultHTTPClient): requests = 1000 default_http_client.initial_deposit = lambda x: (requests + 1) * x # First transfer creates channel on-chain => exclude from profiling. response = default_http_client.run('doggo.jpg') assert response.decode().strip() == '"HI I AM A DOGGO"' t_start = time.time() for i in range(requests): log.debug('Transfer {}'.format(i)) response = default_http_client.run('doggo.jpg') assert response.decode().strip() == '"HI I AM A DOGGO"' t_diff = time.time() - t_start log.info("{} requests in {} ({} rps)".format( requests, datetime.timedelta(seconds=t_diff), requests / t_diff))