def test_tx_forward_on_host(self): peers = make_intersecting_committees_on_host(5, 1) value = 999 submit_to = list(peers.keys())[0] target = None for port in peers: if peers[port].committee_id_a() != peers[submit_to].committee_id_a() \ and peers[port].committee_id_a() != peers[submit_to].committee_id_b() \ and peers[port].committee_id_b() != peers[submit_to].committee_id_a() \ and peers[port].committee_id_b() != peers[submit_to].committee_id_b(): target = port break committee_id = peers[target].committee_id_a() tx = Transaction(quorum=committee_id, key="test_{}".format(value), value=str(value)) url = "http://localhost:{port}/submit/".format(port=peers[submit_to].port) result = requests.post(url, json=tx.to_json()) self.assertEqual(ROUTE_EXECUTED_CORRECTLY, get_plain_text(result)) time.sleep(3) # wait for network to confirm # get peers in committee committee_members = {} for port in peers: if peers[port].committee_id_a() == committee_id or peers[port].committee_id_b() == committee_id: committee_members[port] = peers[port] for member in committee_members: tx = Transaction(quorum=committee_id, key="test_{}".format(value), value=str(value)) url = "http://localhost:{port}/get/".format(port=member) result = requests.post(url, json=tx.to_json()) self.assertEqual(str(value), get_plain_text(result))
def test_api_start(self): app = api.create_app() app.config['TESTING'] = True app.config['DEBUG'] = False client = app.test_client() # test that wrong url do nothing response = client.get('/start/') self.assertEqual(404, response.status_code) self.assertIsNone(app.config[PBFT_INSTANCES]) self.assertEqual({}, app.config[QUORUMS]) response = client.get('/start/a/') self.assertEqual(404, response.status_code) self.assertIsNone(app.config[PBFT_INSTANCES]) self.assertEqual({}, app.config[QUORUMS]) # test actual url works response = client.get('/start/a/b') self.assertEqual(200, response.status_code) self.assertIsNotNone(app.config[PBFT_INSTANCES]) self.assertEqual({'a': [], 'b': []}, app.config[QUORUMS]) docker = docker_api.from_env() self.assertEqual(2, len(docker.containers.list())) # get info on container a container_ip = docker.containers.list()[1].exec_run( "hostname -i").output.decode('utf-8').strip() container_val_key = docker.containers.list()[1].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \ .output.decode('utf-8').strip() container_user_key = docker.containers.list()[1].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \ .output.decode('utf-8').strip() self.assertEqual(get_plain_text(client.get('/ip/a')), container_ip) self.assertEqual(get_plain_text(client.get('/val+key/a')), container_val_key) self.assertEqual(get_plain_text(client.get('/user+key/a')), container_user_key) self.assertNotEqual(get_plain_text(client.get('/val+key/a')), get_plain_text(client.get('/user+key/a'))) # get info on container b container_ip = docker.containers.list()[0].exec_run( "hostname -i").output.decode('utf-8').strip() container_val_key = docker.containers.list()[0].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \ .output.decode('utf-8').strip() container_user_key = docker.containers.list()[0].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \ .output.decode('utf-8').strip() self.assertEqual(get_plain_text(client.get('/ip/b')), container_ip) self.assertEqual(get_plain_text(client.get('/val+key/b')), container_val_key) self.assertEqual(get_plain_text(client.get('/user+key/b')), container_user_key) self.assertNotEqual(get_plain_text(client.get('/val+key/b')), get_plain_text(client.get('/user+key/b')))
def test_start_committee(self): peer_api_one = api.create_app() peer_api_one.config['TESTING'] = True peer_api_one.config['DEBUG'] = False peer_api_two = api.create_app() peer_api_two.config['TESTING'] = True peer_api_two.config['DEBUG'] = False peer_api_three = api.create_app() peer_api_three.config['TESTING'] = True peer_api_three.config['DEBUG'] = False peer_api_four = api.create_app() peer_api_four.config['TESTING'] = True peer_api_four.config['DEBUG'] = False peers = [peer_api_one.test_client(), peer_api_two.test_client(), peer_api_three.test_client(), peer_api_four.test_client()] peers[0].get('/start/a/b') peers[1].get('/start/a/c') peers[2].get('/start/a/d') peers[3].get('/start/a/e') docker = docker_api.from_env() self.assertEqual(8, len(docker.containers.list())) val_keys = [get_plain_text(p.get('/val+key/a')) for p in peers] usr_keys = [get_plain_text(p.get('/user+key/a')) for p in peers] genesis_json = json.loads(json.dumps({ USER_KEY: usr_keys, VALIDATOR_KEY: val_keys })) peers[0].post('/make+genesis/a', json=genesis_json) join_request_data = {NEIGHBOURS: []} ip = 1 quorum = 'b' for p in peers: # use pretend API address and ports because app is not actually running join_request_data[NEIGHBOURS].append( {API_IP: "192.168.1.{}".format(ip), DOCKER_IP: get_plain_text(p.get('/ip/a')), PORT: "5000", QUORUM_ID: quorum}) ip += 1 quorum = chr(ord(quorum) + 1) data = json.loads(json.dumps(join_request_data)) for p in peers: p.post('/join/a', json=data) peers[0].post('/submit/', json=TRANSACTION_A_JSON) time.sleep(3) for p in peers: self.assertEqual('999', get_plain_text(p.post('/get/', json=TRANSACTION_A_JSON)))
def test_make_genesis(self): peer_api_one = api.create_app() peer_api_one.config['TESTING'] = True peer_api_one.config['DEBUG'] = False peer_api_two = api.create_app() peer_api_two.config['TESTING'] = True peer_api_two.config['DEBUG'] = False peer_api_three = api.create_app() peer_api_three.config['TESTING'] = True peer_api_three.config['DEBUG'] = False peer_api_four = api.create_app() peer_api_four.config['TESTING'] = True peer_api_four.config['DEBUG'] = False peers = [ peer_api_one.test_client(), peer_api_two.test_client(), peer_api_three.test_client(), peer_api_four.test_client() ] peers[0].get('/start/a/b') peers[1].get('/start/a/c') peers[2].get('/start/a/d') peers[3].get('/start/a/e') docker = docker_api.from_env() self.assertEqual(8, len(docker.containers.list())) val_keys = [get_plain_text(p.get('/val+key/a')) for p in peers] usr_keys = [get_plain_text(p.get('/user+key/a')) for p in peers] genesis_json = json.loads( json.dumps({ USER_KEY: usr_keys, VALIDATOR_KEY: val_keys })) peers[0].post('/make+genesis/a', json=genesis_json) pbft_settings = docker.containers.list()[-1].exec_run( "ls pbft-settings.batch").output.decode('utf-8').strip() config_consensus = docker.containers.list()[-1].exec_run( "ls config-consensus.batch").output.decode('utf-8').strip() config_genesis = docker.containers.list()[-1].exec_run( "ls config-genesis.batch").output.decode('utf-8').strip() self.assertEqual('pbft-settings.batch', pbft_settings) self.assertEqual('config-consensus.batch', config_consensus) self.assertEqual('config-genesis.batch', config_genesis)
def test_start_with_peer(self): a = SawtoothContainer() b = SawtoothContainer() id_a = 'a' id_b = 'b' p = Intersection(a, b, id_a, id_b) app = api.create_app(p) app.config['TESTING'] = True app.config['DEBUG'] = False client = app.test_client() docker = docker_api.from_env() # get info on container a container_ip = docker.containers.list()[1].exec_run( "hostname -i").output.decode('utf-8').strip() container_val_key = docker.containers.list()[1].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \ .output.decode('utf-8').strip() container_user_key = docker.containers.list()[1].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \ .output.decode('utf-8').strip() self.assertEqual(get_plain_text(client.get('/ip/a')), container_ip) self.assertEqual(get_plain_text(client.get('/val+key/a')), container_val_key) self.assertEqual(get_plain_text(client.get('/user+key/a')), container_user_key) self.assertNotEqual(get_plain_text(client.get('/val+key/a')), get_plain_text(client.get('/user+key/a'))) # get info on container b container_ip = docker.containers.list()[0].exec_run( "hostname -i").output.decode('utf-8').strip() container_val_key = docker.containers.list()[0].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \ .output.decode('utf-8').strip() container_user_key = docker.containers.list()[0].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \ .output.decode('utf-8').strip() self.assertEqual(get_plain_text(client.get('/ip/b')), container_ip) self.assertEqual(get_plain_text(client.get('/val+key/b')), container_val_key) self.assertEqual(get_plain_text(client.get('/user+key/b')), container_user_key) self.assertNotEqual(get_plain_text(client.get('/val+key/b')), get_plain_text(client.get('/user+key/b')))
def check_submitted_tx(waiting, sub, port): url = URL_HOST.format(ip=IP_ADDRESS, port=str(port) + "/get/") remove_from_sub = [] for tx in sub: if sub[tx].value == get_plain_text( requests.post(url, json=sub[tx].to_json())): waiting.append(time.time() - tx) remove_from_sub.append(tx) for r in remove_from_sub: del sub[r]
def test_setting_instances(self): a = SawtoothContainer() b = SawtoothContainer() inter = Intersection(a, b, 'a', 'b') peer = SmartShardPeer(inter) peer.start() client = peer.app.api.test_client() docker = docker_api.from_env() # get info on container a container_ip = docker.containers.list()[1].exec_run( "hostname -i").output.decode('utf-8').strip() container_val_key = docker.containers.list()[1].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \ .output.decode('utf-8').strip() container_user_key = docker.containers.list()[1].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \ .output.decode('utf-8').strip() self.assertEqual(get_plain_text(client.get('/ip/a')), container_ip) self.assertEqual(get_plain_text(client.get('/val+key/a')), container_val_key) self.assertEqual(get_plain_text(client.get('/user+key/a')), container_user_key) self.assertNotEqual(get_plain_text(client.get('/val+key/a')), get_plain_text(client.get('/user+key/a'))) # get info on container b container_ip = docker.containers.list()[0].exec_run( "hostname -i").output.decode('utf-8').strip() container_val_key = docker.containers.list()[0].exec_run("cat {val_pub}".format(val_pub=VKEY["pub"])) \ .output.decode('utf-8').strip() container_user_key = docker.containers.list()[0].exec_run("cat {user_pub}".format(user_pub=UKEY["pub"])) \ .output.decode('utf-8').strip() self.assertEqual(get_plain_text(client.get('/ip/b')), container_ip) self.assertEqual(get_plain_text(client.get('/val+key/b')), container_val_key) self.assertEqual(get_plain_text(client.get('/user+key/b')), container_user_key) self.assertNotEqual(get_plain_text(client.get('/val+key/b')), get_plain_text(client.get('/user+key/b')))
def check_from_peers(submitted, confirmed, peers): url = URL_HOST.format(ip=IP_ADDRESS, port=str(list(peers.keys())[0]) + "/get/") remove_from_sub = [] for tx in submitted: if tx[1].value == get_plain_text( requests.post(url, json=tx[1].to_json())): remove_from_sub.append(tx) txID = (tx[1].key.split('_'))[2] confirmed[int(txID)].append(floor(time.time())) for r in remove_from_sub: i = 0 for tx in submitted: if r[1].key == tx[1].key: del submitted[i] break i += 1
def getTxs(urlJsonList): return { urlJsonList[0]: get_plain_text(requests.post(urlJsonList[0], json=urlJsonList[1])) }