def test_session_topup( doggo_proxy, session: Session, http_doggo_url: str ): # Create a channel that has just enough capacity for one transfer. session.initial_deposit = lambda x: 0 check_response(session.get(http_doggo_url)) client = session.client open_channels = client.get_open_channels() assert len(open_channels) == 1 channel1 = open_channels[0] assert channel1 == session.channel assert channel1.balance_sig assert channel1.balance == channel1.deposit # Do another payment. Topup should occur. check_response(session.get(http_doggo_url)) open_channels = client.get_open_channels() assert len(open_channels) == 1 channel2 = open_channels[0] assert channel2 == session.channel assert channel2.balance_sig assert channel2.balance < channel2.deposit assert channel1 == channel2
def test_full_cycle_error_500(session: Session, api_endpoint_address: str, token_address: str, channel_manager_address: str, receiver_address: str): session.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 = '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 = session.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_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_address assert request.headers['RDN-Balance'] == '3' assert session.channel.balance == 3 balance_sig_hex = encode_hex(session.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_address assert request.headers['RDN-Balance'] == '3' assert session.channel.balance == 3 assert request.headers['RDN-Balance-Signature'] == balance_sig_hex assert session.channel.balance_sig assert response.text == 'success'
def test_custom_headers( session: Session, api_endpoint_address: str, token_address: str, channel_manager_address: str, receiver_address: str ): session.initial_deposit = lambda x: x with requests_mock.mock(real_http=True) 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 = session.get(url, headers={ 'someheader': 'somevalue', # This should override the actual balance but doesn't actually make sense. 'RDN-Balance': '5' }) # Filter out any requests made to the ethereum node. request_history = [request for request in server_mock.request_history if request.port == 5000] # First cycle, request price. request = 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 = 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' assert session.channel.balance == 7 balance_sig_hex = encode_hex(session.channel.balance_sig) assert request.headers['RDN-Balance-Signature'] == balance_sig_hex assert session.channel.balance_sig assert response.text == 'success'
def test_full_cycle_error_500(session: Session, api_endpoint_address: str, token_address: str, channel_manager_address: str, receiver_address: str): session.initial_deposit = lambda x: x with requests_mock.mock(real_http=True) as server_mock: headers1 = Munch() headers1.token_address = token_address headers1.contract_address = channel_manager_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': {} }]) response = session.get(url) # Filter out any requests made to the ethereum node. request_history = [ request for request in server_mock.request_history if request.port == 5000 ] # First cycle, request price. request = request_history[0] assert request.path == '/something' assert request.method == 'GET' assert request.headers['RDN-Contract-Address'] == channel_manager_address # Second cycle, pay price but receive error. request = 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'] == '3' assert session.channel.balance == 3 balance_sig_hex = encode_hex(session.channel.balance_sig) assert request.headers['RDN-Balance-Signature'] == balance_sig_hex assert response.status_code == 500
def test_full_cycle_success_post(session: Session, api_endpoint_address: str, token_address: str, channel_manager_address: str, receiver_address: str): session.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.post(url, [{ 'status_code': 402, 'headers': headers1 }, { 'status_code': 200, 'headers': headers2, 'text': 'success' }]) response = session.post(url, json={'somefield': 'somevalue'}) # First cycle, request price. request = server_mock.request_history[0] assert request.path == '/something' assert request.method == 'POST' assert request.headers['RDN-Contract-Address'] == channel_manager_address assert request.json()['somefield'] == 'somevalue' # Second cycle, pay price. request = server_mock.request_history[1] assert request.path == '/something' assert request.method == 'POST' assert request.headers['RDN-Contract-Address'] == channel_manager_address assert request.headers['RDN-Balance'] == '7' assert request.json()['somefield'] == 'somevalue' assert session.channel.balance == 7 balance_sig_hex = encode_hex(session.channel.balance_sig) assert request.headers['RDN-Balance-Signature'] == balance_sig_hex assert session.channel.balance_sig assert response.text == 'success'
def test_full_cycle_error_500( session: Session, api_endpoint_address: str, token_address: str, channel_manager_address: str, receiver_address: str ): session.initial_deposit = lambda x: x with requests_mock.mock(real_http=True) as server_mock: headers1 = Munch() headers1.token_address = token_address headers1.contract_address = channel_manager_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': {}} ]) response = session.get(url) # Filter out any requests made to the ethereum node. request_history = [request for request in server_mock.request_history if request.port == 5000] # First cycle, request price. request = request_history[0] assert request.path == '/something' assert request.method == 'GET' assert request.headers['RDN-Contract-Address'] == channel_manager_address # Second cycle, pay price but receive error. request = 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'] == '3' assert session.channel.balance == 3 balance_sig_hex = encode_hex(session.channel.balance_sig) assert request.headers['RDN-Balance-Signature'] == balance_sig_hex assert response.status_code == 500
def test_resource_request(doggo_proxy, http_doggo_url: str, session: Session): n_requests = 10 session.initial_deposit = lambda x: (n_requests + 1) * x # First transfer creates channel on-chain => exclude from profiling. response = session.get(http_doggo_url) assert response.text == 'HI I AM A DOGGO' t_start = time.time() for i in range(n_requests): log.debug('Transfer {}'.format(i)) response = session.get(http_doggo_url) assert response.text == 'HI I AM A DOGGO' t_diff = time.time() - t_start log.info("{} requests in {} ({} rps)".format( n_requests, datetime.timedelta(seconds=t_diff), n_requests / t_diff))
def test_resource_request(doggo_proxy, http_doggo_url: str, session: Session): n_requests = 10 session.initial_deposit = lambda x: (n_requests + 1) * x # First transfer creates channel on-chain => exclude from profiling. response = session.get(http_doggo_url) assert response.text == 'HI I AM A DOGGO' t_start = time.time() for i in range(n_requests): log.debug('Transfer {}'.format(i)) response = session.get(http_doggo_url) assert response.text == 'HI I AM A DOGGO' t_diff = time.time() - t_start log.info("{} requests in {} ({} rps)".format( n_requests, datetime.timedelta(seconds=t_diff), n_requests / t_diff) )