def test_send_real_device_offline(monkeypatch): def mocked_requests_get(*args, **kwargs): class MockResponse: def __init__(self, json_data, status_code): self.json_data = json_data self.status_code = status_code def json(self): return self.json_data # Accessing status of device. Return online. status_url = 'Backends/ibmqx2/queue/status' if args[0] == urljoin(_api_url_status, status_url): return MockResponse({"state": False}, 200) monkeypatch.setattr("requests.get", mocked_requests_get) shots = 1 json_qasm = "my_json_qasm" name = 'projectq_test' with pytest.raises(_ibm_http_client.DeviceOfflineError): _ibm_http_client.send(json_qasm, device="ibmqx2", user=None, password=None, shots=shots, verbose=True)
def test_send_that_errors_are_caught3(monkeypatch): class MockResponse: def __init__(self, json_data, status_code): pass def mocked_requests_post(*args, **kwargs): # Test that this error gets caught raise KeyError monkeypatch.setattr("requests.sessions.Session.post", mocked_requests_post) # Patch login data token = '12345' def user_password_input(prompt): if prompt == "IBM QE token > ": return token monkeypatch.setattr("getpass.getpass", user_password_input) shots = 1 json_qasm = { 'qasms': [{ 'qasm': 'my qasm' }], 'shots': 1, 'json': 'instructions', 'maxCredits': 10, 'nq': 1 } name = 'projectq_test' _ibm_http_client.send(json_qasm, device="ibmqx4", token=None, shots=shots, verbose=True)
def test_no_password_given(monkeypatch): token = '' json_qasm = '' def user_password_input(prompt): if prompt == "IBM QE token > ": return token monkeypatch.setattr("getpass.getpass", user_password_input) with pytest.raises(Exception): _ibm_http_client.send(json_qasm, device="ibmqx4", token=None, shots=1, verbose=True)
def test_send_that_errors_are_caught3(monkeypatch): def mocked_requests_get(*args, **kwargs): class MockResponse: def __init__(self, json_data, status_code): self.json_data = json_data self.status_code = status_code def json(self): return self.json_data # Accessing status of device. Return online. status_url = 'Backends/ibmqx2/queue/status' if args[0] == urljoin(_api_url_status, status_url): return MockResponse({"state": True}, 200) def mocked_requests_post(*args, **kwargs): # Test that this error gets caught raise KeyError monkeypatch.setattr("requests.get", mocked_requests_get) monkeypatch.setattr("requests.post", mocked_requests_post) # Patch login data password = 12345 email = "*****@*****.**" monkeypatch.setitem(__builtins__, "input", lambda x: email) monkeypatch.setitem(__builtins__, "raw_input", lambda x: email) def user_password_input(prompt): if prompt == "IBM QE password > ": return password monkeypatch.setattr("getpass.getpass", user_password_input) shots = 1 json_qasm = "my_json_qasm" name = 'projectq_test' _ibm_http_client.send(json_qasm, device="ibmqx2", user=None, password=None, shots=shots, verbose=True)
def test_timeout_exception(monkeypatch): qasms = { 'qasms': [{ 'qasm': 'my qasm' }], 'shots': 1, 'json': 'instructions', 'maxCredits': 10, 'nq': 1 } json_qasm = qasms tries = [0] execution_id = '3' def mocked_requests_get(*args, **kwargs): class MockResponse: def __init__(self, json_data, status_code): self.json_data = json_data self.status_code = status_code def json(self): return self.json_data def raise_for_status(self): pass # Accessing status of device. Return device info. status_url = 'Network/ibm-q/Groups/open/Projects/main/devices/v/1' if args[1] == urljoin(_API_URL, status_url): connections = set([(0, 1), (1, 0), (1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 4), (4, 3)]) return MockResponse([{ 'backend_name': 'ibmqx4', 'coupling_map': connections, 'backend_version': '0.1.547', 'n_qubits': 32 }], 200) job_url = "Network/ibm-q/Groups/open/Projects/main/Jobs/{}".format( execution_id) if args[1] == urljoin(_API_URL, job_url): tries[0] += 1 return MockResponse({"status": "RUNNING"}, 200) #STEP2 elif (args[1] == "/" + execution_id + "/jobUploadUrl"): return MockResponse({"url": "s3_url"}, 200) #STEP5 elif (args[1] == urljoin( _API_URL, "Network/ibm-q/Groups/open/Projects/main/Jobs/{execution_id}". format(execution_id=execution_id))): return MockResponse({"status": "RUNNING"}, 200) def mocked_requests_post(*args, **kwargs): class MockRequest: def __init__(self, url=""): self.url = url class MockPostResponse: def __init__(self, json_data, text=" "): self.json_data = json_data self.text = text self.request = MockRequest() def json(self): return self.json_data def raise_for_status(self): pass jobs_url = 'Network/ibm-q/Groups/open/Projects/main/Jobs' if args[1] == _AUTH_API_URL: return MockPostResponse({"userId": "1", "id": "12"}) # STEP1 elif (args[1] == urljoin(_API_URL, jobs_url)): answer1 = { 'objectStorageInfo': { 'downloadQObjectUrlEndpoint': 'url_dld_endpoint', 'uploadQobjectUrlEndpoint': '/' + execution_id + '/jobUploadUrl', 'uploadUrl': 'url_upld' } } return MockPostResponse(answer1, 200) # STEP4 elif (args[1] == "/" + execution_id + "/jobDataUploaded"): return MockPostResponse({}, 200) def mocked_requests_put(*args, **kwargs): class MockRequest: def __init__(self, url=""): self.url = url class MockResponse: def __init__(self, json_data, status_code): self.json_data = json_data self.status_code = status_code self.request = MockRequest() self.text = "" def json(self): return self.json_data def raise_for_status(self): pass # STEP3 if (args[1] == "s3_url"): return MockResponse({}, 200) monkeypatch.setattr("requests.sessions.Session.get", mocked_requests_get) monkeypatch.setattr("requests.sessions.Session.post", mocked_requests_post) monkeypatch.setattr("requests.sessions.Session.put", mocked_requests_put) _ibm_http_client.time.sleep = lambda x: x with pytest.raises(Exception) as excinfo: _ibm_http_client.send(json_qasm, device="ibmqx4", token="test", shots=1, num_retries=10, verbose=False) assert execution_id in str( excinfo.value) # check that job id is in exception assert tries[0] > 0
def test_send_real_device_online_verbose(monkeypatch): json_qasm = { 'qasms': [{ 'qasm': 'my qasm' }], 'shots': 1, 'json': 'instructions', 'maxCredits': 10, 'nq': 1 } name = 'projectq_test' token = '12345' access_token = "access" user_id = 2016 code_id = 11 name_item = '"name":"{name}", "jsonQASM":'.format(name=name) json_body = ''.join([name_item, json.dumps(json_qasm)]) json_data = ''.join(['{', json_body, '}']) shots = 1 device = "ibmqx4" execution_id = '3' result_ready = [False] result = "my_result" request_num = [0] # To assert correct order of calls # Mock of IBM server: def mocked_requests_get(*args, **kwargs): class MockRequest: def __init__(self, url=""): self.url = url class MockResponse: def __init__(self, json_data, status_code): self.json_data = json_data self.status_code = status_code self.request = MockRequest() self.text = "" def json(self): return self.json_data def raise_for_status(self): pass # Accessing status of device. Return online. status_url = 'Network/ibm-q/Groups/open/Projects/main/devices/v/1' if (args[1] == urljoin(_API_URL, status_url) and (request_num[0] == 1 or request_num[0] == 7)): request_num[0] += 1 connections = set([(0, 1), (1, 0), (1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 4), (4, 3)]) return MockResponse([{ 'backend_name': 'ibmqx4', 'coupling_map': connections, 'backend_version': '0.1.547', 'n_qubits': 32 }], 200) #STEP2 elif (args[1] == "/" + execution_id + "/jobUploadUrl" and request_num[0] == 3): request_num[0] += 1 return MockResponse({"url": "s3_url"}, 200) #STEP5 elif (args[1] == urljoin( _API_URL, "Network/ibm-q/Groups/open/Projects/main/Jobs/{execution_id}". format(execution_id=execution_id)) and not result_ready[0] and request_num[0] == 6): result_ready[0] = True request_num[0] += 1 return MockResponse({"status": "RUNNING"}, 200) elif (args[1] == urljoin( _API_URL, "Network/ibm-q/Groups/open/Projects/main/Jobs/{execution_id}". format(execution_id=execution_id)) and result_ready[0] and request_num[0] == 8): request_num[0] += 1 return MockResponse({"status": "COMPLETED"}, 200) #STEP6 elif (args[1] == urljoin( _API_URL, "Network/ibm-q/Groups/open/Projects/main/Jobs/{execution_id}/resultDownloadUrl" .format(execution_id=execution_id)) and request_num[0] == 9): request_num[0] += 1 return MockResponse({"url": "result_download_url"}, 200) #STEP7 elif (args[1] == "result_download_url" and request_num[0] == 10): request_num[0] += 1 return MockResponse({"results": [result]}, 200) def mocked_requests_post(*args, **kwargs): class MockRequest: def __init__(self, body="", url=""): self.body = body self.url = url class MockPostResponse: def __init__(self, json_data, text=" "): self.json_data = json_data self.text = text self.request = MockRequest() def json(self): return self.json_data def raise_for_status(self): pass jobs_url = 'Network/ibm-q/Groups/open/Projects/main/Jobs' # Authentication if (args[1] == _AUTH_API_URL and kwargs["json"]["apiToken"] == token and request_num[0] == 0): request_num[0] += 1 return MockPostResponse({"userId": user_id, "id": access_token}) # STEP1 elif (args[1] == urljoin(_API_URL, jobs_url) and request_num[0] == 2): request_num[0] += 1 answer1 = { 'objectStorageInfo': { 'downloadQObjectUrlEndpoint': 'url_dld_endpoint', 'uploadQobjectUrlEndpoint': '/' + execution_id + '/jobUploadUrl', 'uploadUrl': 'url_upld' } } return MockPostResponse(answer1, 200) # STEP4 elif (args[1] == "/" + execution_id + "/jobDataUploaded" and request_num[0] == 5): request_num[0] += 1 return MockPostResponse({}, 200) #STEP8 elif (args[1] == urljoin( _API_URL, "Network/ibm-q/Groups/open/Projects/main/Jobs/{execution_id}/resultDownloaded" .format(execution_id=execution_id)) and request_num[0] == 11): request_num[0] += 1 return MockPostResponse({}, 200) def mocked_requests_put(*args, **kwargs): class MockRequest: def __init__(self, url=""): self.url = url class MockResponse: def __init__(self, json_data, status_code): self.json_data = json_data self.status_code = status_code self.request = MockRequest() self.text = "" def json(self): return self.json_data def raise_for_status(self): pass # STEP3 if (args[1] == "s3_url" and request_num[0] == 4): request_num[0] += 1 return MockResponse({}, 200) monkeypatch.setattr("requests.sessions.Session.get", mocked_requests_get) monkeypatch.setattr("requests.sessions.Session.post", mocked_requests_post) monkeypatch.setattr("requests.sessions.Session.put", mocked_requests_put) def user_password_input(prompt): if prompt == "IBM QE token > ": return token monkeypatch.setattr("getpass.getpass", user_password_input) # Code to test: res = _ibm_http_client.send(json_qasm, device="ibmqx4", token=None, shots=shots, verbose=True) assert res == result json_qasm['nq'] = 40 request_num[0] = 0 with pytest.raises(_ibm_http_client.DeviceTooSmall): res = _ibm_http_client.send(json_qasm, device="ibmqx4", token=None, shots=shots, verbose=True)
def test_send_real_device_offline(monkeypatch): token = '12345' access_token = "access" user_id = 2016 def mocked_requests_get(*args, **kwargs): class MockResponse: def __init__(self, json_data, status_code): self.json_data = json_data self.status_code = status_code def json(self): return self.json_data def raise_for_status(self): pass # Accessing status of device. Return offline. status_url = 'Network/ibm-q/Groups/open/Projects/main/devices/v/1' if args[1] == urljoin(_API_URL, status_url): return MockResponse({}, 200) def mocked_requests_post(*args, **kwargs): class MockRequest: def __init__(self, body="", url=""): self.body = body self.url = url class MockPostResponse: def __init__(self, json_data, text=" "): self.json_data = json_data self.text = text self.request = MockRequest() def json(self): return self.json_data def raise_for_status(self): pass # Authentication if (args[1] == _AUTH_API_URL and kwargs["json"]["apiToken"] == token): return MockPostResponse({"userId": user_id, "id": access_token}) monkeypatch.setattr("requests.sessions.Session.get", mocked_requests_get) monkeypatch.setattr("requests.sessions.Session.post", mocked_requests_post) shots = 1 token = '12345' json_qasm = { 'qasms': [{ 'qasm': 'my qasm' }], 'shots': 1, 'json': 'instructions', 'maxCredits': 10, 'nq': 1 } name = 'projectq_test' with pytest.raises(_ibm_http_client.DeviceOfflineError): _ibm_http_client.send(json_qasm, device="ibmqx4", token=token, shots=shots, verbose=True)
def test_timeout_exception(monkeypatch): qasms = { 'qasms': [{ 'qasm': 'my qasm' }], 'shots': 1, 'json': 'instructions', 'maxCredits': 10, 'nq': 1 } json_qasm = qasms tries = [0] def mocked_requests_get(*args, **kwargs): class MockResponse: def __init__(self, json_data, status_code): self.json_data = json_data self.status_code = status_code def json(self): return self.json_data def raise_for_status(self): pass # Accessing status of device. Return device info. status_url = 'Network/ibm-q/Groups/open/Projects/main/devices/v/1' if args[1] == urljoin(_API_URL, status_url): connections = set([(0, 1), (1, 0), (1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 4), (4, 3)]) return MockResponse([{ 'backend_name': 'ibmqx4', 'coupling_map': connections, 'backend_version': '0.1.547', 'n_qubits': 32 }], 200) job_url = "Network/ibm-q/Groups/open/Projects/main/Jobs/{}".format( "123e") if args[1] == urljoin(_API_URL, job_url): tries[0] += 1 return MockResponse({"status": "RUNNING"}, 200) def mocked_requests_post(*args, **kwargs): class MockRequest: def __init__(self, url=""): self.url = url class MockPostResponse: def __init__(self, json_data, text=" "): self.json_data = json_data self.text = text self.request = MockRequest() def json(self): return self.json_data def raise_for_status(self): pass jobs_url = 'Network/ibm-q/Groups/open/Projects/main/Jobs' if args[1] == _AUTH_API_URL: return MockPostResponse({"userId": "1", "id": "12"}) if args[1] == urljoin(_API_URL, jobs_url): return MockPostResponse({"id": "123e"}) monkeypatch.setattr("requests.sessions.Session.get", mocked_requests_get) monkeypatch.setattr("requests.sessions.Session.post", mocked_requests_post) _ibm_http_client.time.sleep = lambda x: x with pytest.raises(Exception) as excinfo: _ibm_http_client.send(json_qasm, device="ibmqx4", token="test", shots=1, num_retries=10, verbose=False) assert "123e" in str(excinfo.value) # check that job id is in exception assert tries[0] > 0
def test_send_real_device_online_verbose(monkeypatch): qasms = {'qasms': [{'qasm': 'my qasm'}]} json_qasm = json.dumps(qasms) name = 'projectq_test' access_token = "access" user_id = 2016 code_id = 11 name_item = '"name":"{name}", "jsonQASM":'.format(name=name) json_body = ''.join([name_item, json_qasm]) json_data = ''.join(['{', json_body, '}']) shots = 1 device = "real" json_data_run = ''.join(['{"qasm":', json_qasm, '}']) execution_id = 3 result_ready = [False] result = "my_result" request_num = [0] # To assert correct order of calls # Mock of IBM server: def mocked_requests_get(*args, **kwargs): class MockRequest: def __init__(self, url=""): self.url = url class MockResponse: def __init__(self, json_data, status_code): self.json_data = json_data self.status_code = status_code self.request = MockRequest() self.text = "" def json(self): return self.json_data def raise_for_status(self): pass # Accessing status of device. Return online. status_url = 'Backends/ibmqx2/queue/status' if (args[0] == urljoin(_api_url_status, status_url) and request_num[0] == 0): request_num[0] += 1 return MockResponse({"state": True}, 200) # Getting result elif (args[0] == urljoin( _api_url, "Jobs/{execution_id}".format(execution_id=execution_id)) and kwargs["params"]["access_token"] == access_token and not result_ready[0] and request_num[0] == 3): result_ready[0] = True return MockResponse({"status": {"id": "NotDone"}}, 200) elif (args[0] == urljoin( _api_url, "Jobs/{execution_id}".format(execution_id=execution_id)) and kwargs["params"]["access_token"] == access_token and result_ready[0] and request_num[0] == 3): return MockResponse({"qasms": [{"result": result}]}, 200) def mocked_requests_post(*args, **kwargs): class MockRequest: def __init__(self, body="", url=""): self.body = body self.url = url class MockPostResponse: def __init__(self, json_data, text=" "): self.json_data = json_data self.text = text self.request = MockRequest() def json(self): return self.json_data def raise_for_status(self): pass # Authentication if (args[0] == urljoin(_api_url, "users/login") and kwargs["data"]["email"] == email and kwargs["data"]["password"] == password and request_num[0] == 1): request_num[0] += 1 return MockPostResponse({"userId": user_id, "id": access_token}) # Run code elif (args[0] == urljoin(_api_url, "Jobs") and kwargs["data"] == json_qasm and kwargs["params"]["access_token"] == access_token and kwargs["params"]["deviceRunType"] == device and kwargs["params"]["fromCache"] == "false" and kwargs["params"]["shots"] == shots and kwargs["headers"]["Content-Type"] == "application/json" and request_num[0] == 2): request_num[0] += 1 return MockPostResponse({"id": execution_id}) monkeypatch.setattr("requests.get", mocked_requests_get) monkeypatch.setattr("requests.post", mocked_requests_post) # Patch login data password = 12345 email = "*****@*****.**" monkeypatch.setitem(__builtins__, "input", lambda x: email) monkeypatch.setitem(__builtins__, "raw_input", lambda x: email) def user_password_input(prompt): if prompt == "IBM QE password > ": return password monkeypatch.setattr("getpass.getpass", user_password_input) # Code to test: res = _ibm_http_client.send(json_qasm, device="ibmqx2", user=None, password=None, shots=shots, verbose=True) print(res) assert res == result
def test_timeout_exception(monkeypatch): qasms = {'qasms': [{'qasm': 'my qasm'}]} json_qasm = json.dumps(qasms) tries = [0] def mocked_requests_get(*args, **kwargs): class MockResponse: def __init__(self, json_data, status_code): self.json_data = json_data self.status_code = status_code def json(self): return self.json_data def raise_for_status(self): pass # Accessing status of device. Return online. status_url = 'Backends/ibmqx4/queue/status' if args[0] == urljoin(_api_url, status_url): return MockResponse({"state": True}, 200) job_url = 'Jobs/{}'.format("123e") if args[0] == urljoin(_api_url, job_url): tries[0] += 1 return MockResponse({"noqasms": "not done"}, 200) def mocked_requests_post(*args, **kwargs): class MockRequest: def __init__(self, url=""): self.url = url class MockPostResponse: def __init__(self, json_data, text=" "): self.json_data = json_data self.text = text self.request = MockRequest() def json(self): return self.json_data def raise_for_status(self): pass login_url = 'users/login' if args[0] == urljoin(_api_url, login_url): return MockPostResponse({"userId": "1", "id": "12"}) if args[0] == urljoin(_api_url, 'Jobs'): return MockPostResponse({"id": "123e"}) monkeypatch.setattr("requests.get", mocked_requests_get) monkeypatch.setattr("requests.post", mocked_requests_post) _ibm_http_client.time.sleep = lambda x: x with pytest.raises(Exception) as excinfo: _ibm_http_client.send(json_qasm, device="ibmqx4", user="******", password="******", shots=1, verbose=False) assert "123e" in str(excinfo.value) # check that job id is in exception assert tries[0] > 0