def scenario(wallets, **kw): global wallet_keys, wallet_keys_2, key_names, error testlib.ysi_namespace_preorder("test", wallets[1].addr, wallets[0].privkey) testlib.next_block(**kw) testlib.ysi_namespace_reveal( "test", wallets[1].addr, 52595, 250, 4, [6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 10, 10, wallets[0].privkey) testlib.next_block(**kw) testlib.ysi_namespace_ready("test", wallets[1].privkey) testlib.next_block(**kw) testlib.ysi_name_preorder("foo.test", wallets[2].privkey, wallets[3].addr) testlib.next_block(**kw) testlib.ysi_name_register("foo.test", wallets[2].privkey, wallets[3].addr) testlib.next_block(**kw) test_proxy = testlib.TestAPIProxy() ysi_client.set_default_proxy(test_proxy) wallet_keys = ysi_client.make_wallet_keys( owner_privkey=wallets[3].privkey, data_privkey=wallets[4].privkey, payment_privkey=wallets[5].privkey) # migrate profiles res = testlib.migrate_profile("foo.test", proxy=test_proxy, wallet_keys=wallet_keys) if 'error' in res: res['test'] = 'Failed to initialize foo.test profile' print json.dumps(res, indent=4, sort_keys=True) error = True return # tell serialization-checker that value_hash can be ignored in this block print "BLOCKSTACK_SERIALIZATION_CHECK_IGNORE value_hash" sys.stdout.flush() testlib.next_block(**kw) # make an account res = testlib.ysi_cli_put_account("foo.test", "serviceFoo", "serviceFooID", "foo://bar.com", None, extra_data='foofield=foo!', wallet_keys=wallet_keys) if 'error' in res: res['test'] = 'Failed to create foo.test account' print json.dumps(res, indent=4, sort_keys=True) error = True return res = testlib.ysi_cli_put_account("foo.test", "deletedService", "deletedServiceID", "foo://deleted", None, extra_data='barfield=bar!', wallet_keys=wallet_keys) if 'error' in res: res['test'] = 'Failed to create foo.test deletedService account' print json.dumps(res, indent=4, sort_keys=True) error = True return # delete an account res = testlib.ysi_cli_delete_account("foo.test", "deletedService", "deletedServiceID", None, wallet_keys=wallet_keys) if 'error' in res: res['test'] = 'Failed to delete foo.test deletedService' print json.dumps(res, indent=4, sort_keys=True) error = True return testlib.next_block(**kw)
def scenario(wallets, **kw): global put_result, wallet_keys, wallet_keys_2, datasets, zonefile_hash, dataset_change # set up a second client config_path = os.environ.get("BLOCKSTACK_CLIENT_CONFIG", None) assert config_path config_dir_2 = os.path.dirname(config_path) + '.2' os.makedirs(config_dir_2) config_path_2 = os.path.join(config_dir_2, 'client.ini') res = testlib.peer_make_config(16300, config_dir_2) if 'error' in res: print "failed to set up {}".format(config_dir_2) return False wallet_keys_2 = testlib.ysi_client_initialize_wallet( "0123456789abcdef", wallets[5].privkey, wallets[6].privkey, wallets[7].privkey) wallet_keys = testlib.ysi_client_initialize_wallet("0123456789abcdef", wallets[2].privkey, wallets[3].privkey, wallets[4].privkey) test_proxy = testlib.TestAPIProxy() ysi_client.set_default_proxy(test_proxy) testlib.ysi_namespace_preorder("test", wallets[1].addr, wallets[0].privkey) testlib.next_block(**kw) testlib.ysi_namespace_reveal( "test", wallets[1].addr, 52595, 250, 4, [6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 10, 10, wallets[0].privkey) testlib.next_block(**kw) testlib.ysi_namespace_ready("test", wallets[1].privkey) testlib.next_block(**kw) resp = testlib.ysi_cli_register("foo.test", "0123456789abcdef") if 'error' in resp: print >> sys.stderr, json.dumps(resp, indent=4, sort_keys=True) return False # wait for the preorder to get confirmed for i in xrange(0, 12): testlib.next_block(**kw) # wait for the poller to pick it up print >> sys.stderr, "Waiting for the backend to submit the register" time.sleep(10) # wait for the register to get confirmed for i in xrange(0, 12): testlib.next_block(**kw) print >> sys.stderr, "Waiting for the backend to acknowledge registration" time.sleep(10) # wait for initial update to get confirmed for i in xrange(0, 12): # tell serialization-checker that value_hash can be ignored here print "BLOCKSTACK_SERIALIZATION_CHECK_IGNORE value_hash" sys.stdout.flush() testlib.next_block(**kw) print >> sys.stderr, "Waiting for the backend to acknowledge update" time.sleep(10) # wait for zonefile/profile replication for i in xrange(0, 12): testlib.next_block(**kw) print >> sys.stderr, "Waiting for the backend to replicate zonefile and profile" time.sleep(10) # make a few accounts res = testlib.ysi_cli_put_account("foo.test", "serviceFoo", "serviceFooID", "foo://bar.com", "0123456789abcdef", extra_data='foofield=foo!', wallet_keys=wallet_keys) if 'error' in res: res['test'] = 'Failed to create foo.test serviceFoo account' print json.dumps(res, indent=4, sort_keys=True) error = True return time.sleep(2) res = testlib.ysi_cli_put_account("foo.test", "serviceBar", "serviceBarID", "bar://baz.com", "0123456789abcdef", extra_data='barfield=bar!', wallet_keys=wallet_keys) if 'error' in res: res['test'] = 'Failed to create foo.test serviceBar account' print json.dumps(res, indent=4, sort_keys=True) error = True return time.sleep(2) # put some data put_result = testlib.ysi_cli_put_mutable("foo.test", "hello_world_1", json.dumps(datasets[0]), password="******") if 'error' in put_result: print json.dumps(put_result, indent=4, sort_keys=True) return False time.sleep(2) put_result = testlib.ysi_cli_put_mutable("foo.test", "hello_world_2", json.dumps(datasets[1]), password="******") if 'error' in put_result: print json.dumps(put_result, indent=4, sort_keys=True) return False time.sleep(2) put_result = testlib.ysi_cli_put_mutable("foo.test", "hello_world_3", json.dumps(datasets[2]), password="******") if 'error' in put_result: print json.dumps(put_result, indent=4, sort_keys=True) return False time.sleep(2) # increment data version too datasets[0]['buf'] = [] for i in xrange(0, 5): datasets[0]["dataset_change"] = dataset_change datasets[0]['buf'].append(i) put_result = testlib.ysi_cli_put_mutable("foo.test", "hello_world_1", json.dumps(datasets[0]), password="******") if 'error' in put_result: print json.dumps(put_result, indent=4, sort_keys=True) return False time.sleep(2) testlib.next_block(**kw)
def scenario(wallets, **kw): global put_result, wallet_keys, wallet_keys_2, datasets, zonefile_hash, dataset_change # make a storage gateway (will be port 16300) res = testlib.peer_setup(0) if 'error' in res: return res storage_gateway_working_dir = res['working_dir'] storage_gateway_config_path = res['config_path'] # make sure the storage gateway saves to disk # ysi_client.config. res = peer_start(storage_gateway_wd, args=['--foreground', '--no-indexer']) # start storage gateway # res = testlib.peer_start( # set up client wallet_keys = testlib.ysi_client_initialize_wallet("0123456789abcdef", wallets[2].privkey, wallets[3].privkey, wallets[4].privkey) test_proxy = testlib.TestAPIProxy() ysi_client.set_default_proxy(test_proxy) testlib.ysi_namespace_preorder("test", wallets[1].addr, wallets[0].privkey) testlib.next_block(**kw) testlib.ysi_namespace_reveal( "test", wallets[1].addr, 52595, 250, 4, [6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 10, 10, wallets[0].privkey) testlib.next_block(**kw) testlib.ysi_namespace_ready("test", wallets[1].privkey) testlib.next_block(**kw) resp = testlib.ysi_cli_register("foo.test", "0123456789abcdef") if 'error' in resp: print >> sys.stderr, json.dumps(resp, indent=4, sort_keys=True) return False # wait for the preorder to get confirmed for i in xrange(0, 12): testlib.next_block(**kw) # wait for the poller to pick it up print >> sys.stderr, "Waiting for the backend to submit the register" time.sleep(10) # wait for the register to get confirmed for i in xrange(0, 12): testlib.next_block(**kw) print >> sys.stderr, "Waiting for the backend to acknowledge registration" time.sleep(10) # wait for initial update to get confirmed for i in xrange(0, 12): # tell serialization-checker that value_hash can be ignored here print "BLOCKSTACK_SERIALIZATION_CHECK_IGNORE value_hash" sys.stdout.flush() testlib.next_block(**kw) print >> sys.stderr, "Waiting for the backend to acknowledge update" time.sleep(10) # wait for zonefile/profile replication for i in xrange(0, 12): testlib.next_block(**kw) print >> sys.stderr, "Waiting for the backend to replicate zonefile and profile" time.sleep(10) # make a few accounts res = testlib.ysi_cli_put_account("foo.test", "serviceFoo", "serviceFooID", "foo://bar.com", "0123456789abcdef", extra_data='foofield=foo!', wallet_keys=wallet_keys) if 'error' in res: res['test'] = 'Failed to create foo.test serviceFoo account' print json.dumps(res, indent=4, sort_keys=True) error = True return time.sleep(2) res = testlib.ysi_cli_put_account("foo.test", "serviceBar", "serviceBarID", "bar://baz.com", "0123456789abcdef", extra_data='barfield=bar!', wallet_keys=wallet_keys) if 'error' in res: res['test'] = 'Failed to create foo.test serviceBar account' print json.dumps(res, indent=4, sort_keys=True) error = True return time.sleep(2) # put some data put_result = testlib.ysi_cli_put_mutable("foo.test", "hello_world_1", json.dumps(datasets[0]), password="******") if 'error' in put_result: print json.dumps(put_result, indent=4, sort_keys=True) return False time.sleep(2) put_result = testlib.ysi_cli_put_mutable("foo.test", "hello_world_2", json.dumps(datasets[1]), password="******") if 'error' in put_result: print json.dumps(put_result, indent=4, sort_keys=True) return False time.sleep(2) put_result = testlib.ysi_cli_put_mutable("foo.test", "hello_world_3", json.dumps(datasets[2]), password="******") if 'error' in put_result: print json.dumps(put_result, indent=4, sort_keys=True) return False time.sleep(2) # increment data version too datasets[0]['buf'] = [] for i in xrange(0, 5): datasets[0]["dataset_change"] = dataset_change datasets[0]['buf'].append(i) put_result = testlib.ysi_cli_put_mutable("foo.test", "hello_world_1", json.dumps(datasets[0]), password="******") if 'error' in put_result: print json.dumps(put_result, indent=4, sort_keys=True) return False time.sleep(2) testlib.next_block(**kw)
def scenario( wallets, **kw ): global wallet_keys, wallet_keys_2, wallet_keychain, error, index_file_data, resource_data, sessions test_proxy = testlib.TestAPIProxy() ysi_client.set_default_proxy( test_proxy ) wallet_keys_2 = ysi_client.make_wallet_keys( owner_privkey=wallets[4].privkey, data_privkey=wallets[5].privkey, payment_privkey=wallets[3].privkey ) wallet_keys = ysi_client.make_wallet_keys( owner_privkey=wallets[3].privkey, data_privkey=wallets[4].privkey, payment_privkey=wallets[5].privkey ) wallet_keychain = { 'foo.test': wallet_keys, 'bar.test': wallet_keys_2, } # install wallet_keys testlib.ysi_client_set_wallet( "0123456789abcdef", wallet_keys['payment_privkey'], wallet_keys['owner_privkey'], wallet_keys['data_privkey'] ) testlib.ysi_namespace_preorder( "test", wallets[1].addr, wallets[0].privkey ) testlib.next_block( **kw ) testlib.ysi_namespace_reveal( "test", wallets[1].addr, 52595, 250, 4, [6,5,4,3,2,1,0,0,0,0,0,0,0,0,0,0], 10, 10, wallets[0].privkey ) testlib.next_block( **kw ) testlib.ysi_namespace_ready( "test", wallets[1].privkey ) testlib.next_block( **kw ) testlib.ysi_name_preorder( "foo.test", wallets[2].privkey, wallets[3].addr ) testlib.ysi_name_preorder( "bar.test", wallets[3].privkey, wallets[4].addr ) testlib.next_block( **kw ) testlib.ysi_name_register( "foo.test", wallets[2].privkey, wallets[3].addr ) testlib.ysi_name_register( "bar.test", wallets[3].privkey, wallets[4].addr ) testlib.next_block( **kw ) setup_storage_dirs(['foo.test', 'bar.test']) # migrate profiles # BUT! make sure we store the profile for foo.test into both foo.test's and bar.test's storage directories! os.environ['TEST_BLOCKSTACK_TEST_DISK_ROOT'] = '/tmp/ysi-integration-test-storage-foo.test' res = testlib.migrate_profile( "foo.test", proxy=test_proxy, wallet_keys=wallet_keys ) if 'error' in res: res['test'] = 'Failed to initialize foo.test profile' print json.dumps(res, indent=4, sort_keys=True) return False shutil.copy("/tmp/ysi-integration-test-storage-foo.test/mutable/foo.test", "/tmp/ysi-integration-test-storage-bar.test/mutable/foo.test") # tell serialization-checker that value_hash can be ignored here print "BLOCKSTACK_SERIALIZATION_CHECK_IGNORE value_hash" sys.stdout.flush() testlib.next_block(**kw) # store zonefile res = ysi_client.proxy.put_zonefiles("localhost:16264", [base64.b64encode(res['zonefile_txt'])]) if 'error' in res: print 'failed to store zonefile for foo.test: {}'.format(res) return False # BUT! make sure we store the profile for bar.test into both foo.test's and bar.test's storage directories! os.environ['TEST_BLOCKSTACK_TEST_DISK_ROOT'] = '/tmp/ysi-integration-test-storage-bar.test' res = testlib.migrate_profile( "bar.test", proxy=test_proxy, wallet_keys=wallet_keys_2 ) if 'error' in res: res['test'] = 'Failed to initialize bar.test profile' print json.dumps(res, indent=4, sort_keys=True) return False shutil.copy("/tmp/ysi-integration-test-storage-bar.test/mutable/bar.test", "/tmp/ysi-integration-test-storage-foo.test/mutable/bar.test") # tell serialization-checker that value_hash can be ignored here print "BLOCKSTACK_SERIALIZATION_CHECK_IGNORE value_hash" sys.stdout.flush() testlib.next_block(**kw) # store zonefile res = ysi_client.proxy.put_zonefiles("localhost:16264", [base64.b64encode(res['zonefile_txt'])]) if 'error' in res: print 'failed to store zonefile for bar.test: {}'.format(res) return False res = testlib.start_api("0123456789abcdef") if 'error' in res: print 'failed to start API for foo.test: {}'.format(res) return False target_datastore('foo.test') # instantiate foo.test's test driver res = testlib.ysi_REST_call('POST', '/v1/node/drivers/storage/test?index=1&force=1', None, api_pass='******') if 'error' in res or res['http_status'] != 200: print json.dumps(res, indent=4, sort_keys=True) return False res = testlib.ysi_cli_put_account("foo.test", "test", 'storage', "test:///index/index.manifest?diskroot=/tmp/ysi-integration-test-storage-foo.test", None, wallet_keys=wallet_keys ) if 'error' in res: res['test'] = 'Failed to create foo.test account' print json.dumps(res, indent=4, sort_keys=True) return False os.makedirs('/tmp/ysi-integration-test-storage/mutable') os.makedirs('/tmp/ysi-integration-test-storage/immutable') shutil.copy("/tmp/ysi-integration-test-storage-foo.test/mutable/foo.test", "/tmp/ysi-integration-test-storage-bar.test/mutable/foo.test") shutil.copy("/tmp/ysi-integration-test-storage-foo.test/mutable/foo.test", "/tmp/ysi-integration-test-storage/mutable/foo.test") # link test account for bar.test # BUT! make sure we store the profile for bar.test into foo.test's and bar.test's storage directories! target_datastore('bar.test') # instantiate bar.test's test driver res = testlib.ysi_REST_call('POST', '/v1/node/drivers/storage/test?index=1&force=1', None, api_pass='******') if 'error' in res or res['http_status'] != 200: print json.dumps(res, indent=4, sort_keys=True) return False res = testlib.ysi_cli_put_account("bar.test", "test", 'storage', "test:///index/index.manifest?diskroot=/tmp/ysi-integration-test-storage-bar.test", None, wallet_keys=wallet_keys_2 ) if 'error' in res: res['test'] = 'Failed to create bar.test account' print json.dumps(res, indent=4, sort_keys=True) return False shutil.copy("/tmp/ysi-integration-test-storage-bar.test/mutable/bar.test", "/tmp/ysi-integration-test-storage-foo.test/mutable/bar.test") shutil.copy("/tmp/ysi-integration-test-storage-bar.test/mutable/bar.test", "/tmp/ysi-integration-test-storage/mutable/bar.test") # restore...we'll set up foo.test next res = testlib.ysi_test_setenv("TEST_BLOCKSTACK_TEST_DISK_ROOT", "/tmp/ysi-integration-test-storage-foo.test") if 'error' in res: print json.dumps(res, indent=4, sort_keys=True) return False # get datastore keys... foo_datastore_pk = keylib.ECPrivateKey(wallets[-1].privkey).to_hex() datastore_id_res = testlib.ysi_cli_datastore_get_id( foo_datastore_pk ) foo_datastore_id = datastore_id_res['datastore_id'] bar_datastore_pk = keylib.ECPrivateKey(wallets[-2].privkey).to_hex() datastore_id_res = testlib.ysi_cli_datastore_get_id( bar_datastore_pk ) bar_datastore_id = datastore_id_res['datastore_id'] # activate foo.test res = activate_account("foo.test", foo_datastore_pk) if not res: print 'failed to start API for bar.test: {}'.format(res) return False # set up foo.test's datastore res = setup_datastore(wallets[-1].privkey, "foo.test", 1) if not res: print 'failed to setup foo.test datastore' return False # activate bar.test res = activate_account("bar.test", bar_datastore_pk) if not res: print 'failed to start API for bar.test: {}'.format(res) return False # make *absolutely certain* that the test driver does not load data from # foo.test's or bar.test's storage directories. We want to verify that we can look up # the index manifest URLs from the profile target_datastore(None) print "\n\nbar.test tries to read foo.test's datastore {}\n\n".format(foo_datastore_id) res = read_datastore(foo_datastore_id, "foo.test", 1) if not res: print 'failed to read foo.test datastore {}'.format(foo_datastore_id) return False # set up bar.test's files res = setup_datastore(wallets[-2].privkey, 'bar.test', 2) if not res: print 'failed to setup bar.test datastore' return False # activate foo.test res = activate_account("foo.test", foo_datastore_pk) if not res: print 'failed to start API for foo.test: {}'.format(res) return False # make *absolutely certain* that the test driver does not load data from # foo.test's or bar.test's storage directories. We want to verify that we can look up # the index manifest URLs from the profile target_datastore(None) # try to read all of bar.test's files print "\n\nfoo.test tries to read bar.test's datastore {}\n\n".format(bar_datastore_id) res = read_datastore(bar_datastore_id, 'bar.test', 2) if not res: print 'failed to read bar.test datastore {}'.format(bar_datastore_id) return False # re-target foo.test's datastore target_datastore('foo.test') # have foo.test write new files print '\n\nupdate foo.test datastore\n\n' res = write_datastore('foo.test', foo_datastore_pk, 3) if not res: print 'failed to update foo.test datastore {}'.format(foo_datastore_id) return False # activate bar.test res = activate_account("bar.test", bar_datastore_pk) if not res: print 'failed to start API for bar.test: {}'.format(res) return False # make *absolutely certain* that the test driver does not load data from # foo.test's or bar.test's storage directories. We want to verify that we can look up # the index manifest URLs from the profile target_datastore(None) # get foo.test's new files res = read_datastore(foo_datastore_id, 'foo.test', 3) if not res: print 'failed to read new files from foo.test' return False # re-target bar.test's datastore target_datastore('bar.test') # have bar write some new files print '\n\nupdate bar.test datastore\n\n' res = write_datastore('bar.test', bar_datastore_pk, 4) if not res: print 'failed ot update bar.test datastore {}'.format(bar_datastore_id) return False # activate foo.test res = activate_account("foo.test", foo_datastore_pk) if not res: print 'failed to start API for foo.test: {}'.format(res) return False # delete foo's files print '\n\ndelete foo.test files\n\n' res = clear_datastore_files('foo.test', foo_datastore_pk) if not res: print 'failed to clear datastore {} for foo.test'.format(foo_datastore_id) return False # activate bar.test res = activate_account("bar.test", bar_datastore_pk) if not res: print 'failed to start API for bar.test: {}'.format(res) return False # make *absolutely certain* that the test driver does not load data from # foo.test's or bar.test's storage directories. We want to verify that we can look up # the index manifest URLs from the profile target_datastore(None) # verify that foo's files are gone res = check_datastore_files_absent(foo_datastore_id, 'foo.test') if not res: print 'failed to verify that foo.test datastore {} is devoid of files'.format(foo_datastore_id) return False # re-target bar.test's datastore target_datastore('bar.test') # clear bar.test's files print '\n\ndelete bar.test files\n\n' res = clear_datastore_files('bar.test', bar_datastore_pk) if not res: print 'failed to clear datastore {} for bar.test'.format(bar_datastore_id) return False # activate foo.test res = activate_account("foo.test", foo_datastore_pk) if not res: print 'failed to start API for foo.test: {}'.format(res) return False # make *absolutely certain* that the test driver does not load data from # foo.test's or bar.test's storage directories. We want to verify that we can look up # the index manifest URLs from the profile target_datastore(None) # verify that bar's files are gone res = check_datastore_files_absent(bar_datastore_id, 'bar.test') if not res: print 'failed to verify that bar.test datastore {} is devoid of files'.format(bar_datastore_id) return False # re-target foo.test's datastore target_datastore("foo.test") # clear foo's directories res = clear_datastore_directories('foo.test', foo_datastore_pk) if not res: print 'failed to clear foo.test datastore {} of directories'.format(foo_datastore_id) return False # activate bar.test res = activate_account("bar.test", bar_datastore_pk) if not res: print 'failed to start API for bar.test: {}'.format(res) return False # make *absolutely certain* that the test driver does not load data from # foo.test's or bar.test's storage directories. We want to verify that we can look up # the index manifest URLs from the profile target_datastore(None) # verify that foo's directories are gone res = check_datastore_directories_absent(foo_datastore_id, "foo.test") if not res: print 'failed to verify that foo.test datastore {} is devoid of directories'.format(foo_datastore_id) return False # re-target bar.test's datastore target_datastore('bar.test') # clear bar's directories res = clear_datastore_directories('bar.test', bar_datastore_pk) if not res: print 'failed to clear bar.test datastore {} of directories'.format(bar_datastore_id) return False # activate foo.test res = activate_account('foo.test', foo_datastore_pk) if not res: print 'failed to start API for foo.test: {}'.format(res) return False # make *absolutely certain* that the test driver does not load data from # foo.test's or bar.test's storage directories. We want to verify that we can look up # the index manifest URLs from the profile target_datastore(None) # verify that bar's directories are gone res = check_datastore_directories_absent(bar_datastore_id, "bar.test") if not res: print 'failed to verify that bar.test datastore {} is devoid of directories'.format(bar_datastore_id) return False # root should be empty in both cases print 'listdir {} (bar.test)'.format('/') res = testlib.ysi_cli_datastore_listdir( 'bar.test', bar_datastore_id, '/', data_pubkeys=get_data_pubkeys('bar.test')) if 'error' in res: print 'failed to listdir / on bar.test: {}'.format(res['error']) return False if len(res['children'].keys()) > 0: print 'root still has children: {}'.format(res['children'].keys()) return False # activate bar.test res = activate_account('bar.test', bar_datastore_pk) if not res: print 'failed to start API for foo.test: {}'.format(res) return False print 'listdir {} (foo.test)'.format('/') res = testlib.ysi_cli_datastore_listdir( 'foo.test', foo_datastore_id, '/', data_pubkeys=get_data_pubkeys('foo.test')) if 'error' in res: print 'failed to listdir / on foo.test: {}'.format(res['error']) return False if len(res['children'].keys()) > 0: print 'root still has children: {}'.format(res['children'].keys()) return False testlib.next_block( **kw )