def test(testfilter): global datadir _lib.StartTestGroup("SQL Proxy basic") _lib.CleanTestFolders() datadir = _lib.CreateTestFolder() pub_key, pri_key = _lib.MakeWallet() startnode.StartNodeWithoutBlockchain(datadir) address = startnode.InitBockchain(datadir) _complex.AddProxyToConfig(datadir, "localhost:40041") startnode.StartNode(datadir, address, '30000') _lib.StartTestGroup("Do transactions") transactions.GetUnapprovedTransactionsEmpty(datadir) _sql.ExecuteSQLOnProxySign( datadir, "CREATE TABLE test (a INT auto_increment PRIMARY KEY, b VARCHAR(20))", pub_key, pri_key) # check new table exists tables = _lib.DBGetRows(datadir, "SHOW TABLES") found = False for table in tables: if table[0] == "test": found = True break _lib.FatalAssert(found, "Table not found in the DB") blocks = _blocks.WaitBlocks(datadir, 2) time.sleep(1) _sql.ExecuteSQLOnProxySign(datadir, "INSERT INTO test SET b='row1'", pub_key, pri_key) _sql.ExecuteSQLOnProxySign(datadir, "INSERT INTO test SET a=2,b='row2'", pub_key, pri_key) time.sleep(1) _sql.ExecuteSQLOnProxySign(datadir, "INSERT INTO test (b) VALUES ('row3')", pub_key, pri_key) rows = _lib.DBGetRows(datadir, "SELECT * FROM test") _lib.FatalAssert(len(rows) == 3, "Must be 3 rows in a table") blocks = _blocks.WaitBlocks(datadir, 3) time.sleep(1) # while all caches are cleaned txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 1, "Should be 1 unapproved transaction") for row in rows: if row[0] == "1": _lib.FatalAssert(row[1] == "row1", "Wrong value for row1") if row[0] == "2": _lib.FatalAssert(row[1] == "row2", "Wrong value for row2") if row[0] == "3": _lib.FatalAssert(row[1] == "row3", "Wrong value for row3") # update data _sql.ExecuteSQLOnProxySign( datadir, " update test SET b=\"row3 updated\" where a=3", pub_key, pri_key) _sql.ExecuteSQLOnProxySign( datadir, " update test SET b=\"row2 updated\" where a = '2'", pub_key, pri_key) blocks = _blocks.WaitBlocks(datadir, 4) time.sleep(2) # while all caches are cleaned rows = _lib.DBGetRows(datadir, "SELECT * FROM test", True) for row in rows: if row[0] == "1": _lib.FatalAssert(row[1] == "row1", "Row 1 value is wrong. Got: " + row[1]) if row[0] == "2": _lib.FatalAssert(row[1] == "row2 updated", "Row 2 value is wrong. Got: " + row[1]) if row[0] == "3": _lib.FatalAssert(row[1] == "row3 updated", "Row 3 value is wrong. Got: " + row[1]) _sql.ExecuteSQLOnProxySignFail(datadir, "INSERT INTO test SET a=2,b='row2'", pub_key, pri_key) _sql.ExecuteSQLOnProxySign(datadir, " DELETE from test where a=3", pub_key, pri_key) rows = _lib.DBGetRows(datadir, "SELECT * FROM test", True) _lib.FatalAssert(len(rows) == 2, "Must be 2 rows in a table") txlist = transactions.GetUnapprovedTransactions(datadir) #cancel transaction. rollback should affect transactions.CancelTransaction(datadir, txlist.keys()[0]) # should be 0 unapproved transactions transactions.GetUnapprovedTransactionsEmpty(datadir) # should be 3 rows again rows = _lib.DBGetRows(datadir, "SELECT * FROM test", True) _lib.FatalAssert(len(rows) == 3, "Must be 3 rows in a table") startnode.StopNode(datadir) datadir = "" #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()
def test(testfilter): global datadir _lib.StartTestGroup("Blocks making") nodeport = '30010' _lib.CleanTestFolders() datadir = _lib.CreateTestFolder() startnode.StartNodeWithoutBlockchain(datadir) address = startnode.InitBockchain(datadir) startnode.StartNode(datadir, address, nodeport) startnode.StopNode(datadir) # create another 3 addresses address2 = transactions.CreateWallet(datadir) address3 = transactions.CreateWallet(datadir) startnode.StartNode(datadir, address, nodeport) _lib.StartTestGroup("Do transactions") transactions.GetUnapprovedTransactionsEmpty(datadir) amount1 = '1' amount2 = '2' amount3 = '3' txid1 = _transfers.Send(datadir, address, address2, amount1) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 1, "Should be 1 unapproved transaction") #block making will be started now time.sleep(5) txid2 = _transfers.Send(datadir, address, address3, amount2) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 1, "Should be 1 unapproved transaction") txid3 = _transfers.Send(datadir, address, address3, amount3) # node needs some time to make a block, so transaction still will be in list of unapproved txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 2, "Should be 2 unapproved transaction") if txid2 not in txlist.keys(): _lib.Fatal("Transaction 2 is not in the list of transactions") if txid3 not in txlist.keys(): _lib.Fatal("Transaction 3 is not in the list of transactions") _lib.FatalAssertFloat(amount2, txlist[txid2][3], "Amount of transaction 2 is wrong") _lib.FatalAssertFloat(amount3, txlist[txid3][3], "Amount of transaction 3 is wrong") time.sleep(5) transactions.GetUnapprovedTransactionsEmpty(datadir) startnode.StopNode(datadir) datadir = "" #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()
def MakeBlockchainWithBlocks(port): datadir = _lib.CreateTestFolder("_1_") r = blocksbasic.PrepareBlockchain(datadir, port) address = r[0] # create another 3 addresses address2 = transactions.CreateWallet(datadir) address3 = transactions.CreateWallet(datadir) _lib.StartTestGroup("Do _transfers") transactions.GetUnapprovedTransactionsEmpty(datadir) amount1 = '1' amount2 = '2' amount3 = '3' txid1 = _transfers.Send(datadir, address, address2, amount1) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 1, "Should be 1 unapproved transaction") txid2 = _transfers.Send(datadir, address, address3, amount2) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 2, "Should be 2 unapproved transaction") txid3 = _transfers.Send(datadir, address, address3, amount3) # node needs some time to make a block, so transaction still will be in list of unapproved txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 3, "Should be 3 unapproved transaction") txid4 = _transfers.Send(datadir, address3, address2, amount1) # node needs some time to make a block, so transaction still will be in list of unapproved txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 4, "Should be 4 unapproved transaction") if txid1 not in txlist.keys(): _lib.Fatal("Transaction 1 is not in the list of transactions") if txid2 not in txlist.keys(): _lib.Fatal("Transaction 2 is not in the list of transactions") if txid3 not in txlist.keys(): _lib.Fatal("Transaction 3 is not in the list of transactions") if txid4 not in txlist.keys(): _lib.Fatal("Transaction 4 is not in the list of transactions") _lib.FatalAssertFloat(amount1, txlist[txid1][3], "Amount of transaction 1 is wrong") _lib.FatalAssertFloat(amount2, txlist[txid2][3], "Amount of transaction 2 is wrong") _lib.FatalAssertFloat(amount3, txlist[txid3][3], "Amount of transaction 3 is wrong") _lib.FatalAssertFloat(amount1, txlist[txid4][3], "Amount of transaction 4 is wrong") blockchash = _blocks.MintBlock(datadir, address) transactions.GetUnapprovedTransactionsEmpty(datadir) blockshashes = _blocks.GetBlocks(datadir) _lib.FatalAssert( len(blockshashes) == 2, "Should be 2 blocks in blockchain") _lib.StartTestGroup("Send 3 transactions") microamount = 0.01 txid1 = _transfers.Send(datadir, address, address2, microamount) txid2 = _transfers.Send(datadir, address2, address3, microamount) txid3 = _transfers.Send(datadir, address3, address, microamount) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 3, "Should be 3 unapproved transaction") if txid1 not in txlist.keys(): _lib.Fatal( "Transaction 1 is not in the list of transactions after iteration " + str(i)) if txid2 not in txlist.keys(): _lib.Fatal( "Transaction 2 is not in the list of transactions after iteration " + str(i)) if txid3 not in txlist.keys(): _lib.Fatal( "Transaction 3 is not in the list of transactions after iteration " + str(i)) blockchash = _blocks.MintBlock(datadir, address) transactions.GetUnapprovedTransactionsEmpty(datadir) blockshashes = _blocks.GetBlocks(datadir) _lib.FatalAssert( len(blockshashes) == 3, "Should be 3 blocks in blockchain") _lib.StartTestGroup("Send 3 transactions. Random value") microamountmax = 0.01 microamountmin = 0.0095 a1 = round(random.uniform(microamountmin, microamountmax), 8) a2 = round(random.uniform(microamountmin, microamountmax), 8) a3 = round(random.uniform(microamountmin, microamountmax), 8) txid1 = _transfers.Send(datadir, address, address2, a1) txid2 = _transfers.Send(datadir, address2, address3, a2) txid3 = _transfers.Send(datadir, address3, address, a3) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 3, "Should be 3 unapproved transaction") if txid1 not in txlist.keys(): _lib.Fatal( "Transaction 1 is not in the list of transactions after iteration " + str(i)) if txid2 not in txlist.keys(): _lib.Fatal( "Transaction 2 is not in the list of transactions after iteration " + str(i)) if txid3 not in txlist.keys(): _lib.Fatal( "Transaction 3 is not in the list of transactions after iteration " + str(i)) blockchash = _blocks.MintBlock(datadir, address) transactions.GetUnapprovedTransactionsEmpty(datadir) blockshashes = _blocks.GetBlocks(datadir) _lib.FatalAssert( len(blockshashes) == 4, "Should be 4 blocks in blockchain") return [datadir, address, address2, address3]
def test(testfilter): _lib.StartTestGroup("SQL basic") _lib.CleanTestFolders() datadir = _lib.CreateTestFolder() address = startnode.InitBockchain(datadir) _lib.StartTestGroup("Do transactions") transactions.GetUnapprovedTransactionsEmpty(datadir) tx1 = _sql.ExecuteSQL(datadir,address,"CREATE TABLE test (a INT auto_increment PRIMARY KEY, b VARCHAR(20))") # check new table exists tables = _lib.DBGetRows(datadir,"SHOW TABLES") found = False for table in tables: if table[0] == "test": found = True break _lib.FatalAssert(found, "Table not found in the DB") # now add data and make a block _sql.ExecuteSQL(datadir,address,"INSERT INTO test SET b='row1'") _sql.ExecuteSQL(datadir,address,"INSERT INTO test SET b='row2', a=2") _sql.ExecuteSQL(datadir,address,"INSERT INTO test (b) values ('row3')") _sql.ExecuteSQL(datadir,address,"INSERT INTO test (a, b) values (4, 'row4')") _sql.ExecuteSQL(datadir,address,"INSERT INTO test (a, b) values (8, 'row5')") _sql.ExecuteSQL(datadir,address,"UPDATE test SET b='row1_u1' where a=1") _sql.ExecuteSQL(datadir,address,"UPDATE test SET b='row2_u1' where a = '2'") _sql.ExecuteSQL(datadir,address,"UPDATE test SET b='row1_u2' where a= 1") _sql.ExecuteSQL(datadir,address,"delete from test where a=3") rows = _lib.DBGetRows(datadir,"SELECT * FROM test") _lib.FatalAssert(len(rows) == 4, "Must be 4 rows in a table") blockchash = _blocks.MintBlock(datadir,address) transactions.GetUnapprovedTransactionsEmpty(datadir) # test execution when transactions are already in a block _sql.ExecuteSQLFailure(datadir,address,"INSERT INTO test SET b='row2', a=2") _sql.ExecuteSQLFailure(datadir,address,"delete from test where a=3") _sql.ExecuteSQLFailure(datadir,address,"UPDATE test SET b='upd' where a= 3") _sql.ExecuteSQLFailure(datadir,address,"UPDATE test SET b='upd2', a=3 where a= 2")# we don't allow to change key value _sql.ExecuteSQL(datadir,address,"INSERT INTO test (a, b) values (6, 'row6')") _sql.ExecuteSQL(datadir,address,"UPDATE test SET b='row8_u1' where a=8") _sql.ExecuteSQL(datadir,address,"delete from test where a=2") _sql.ExecuteSQL(datadir,address,"UPDATE test SET b='row8_u2' where a=8") _sql.ExecuteSQL(datadir,address,"UPDATE test SET b='row6_u1' where a=6") #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()
def test(testfilter): _lib.StartTestGroup("Blocks making") _lib.CleanTestFolders() datadir = _lib.CreateTestFolder() r = PrepareBlockchain(datadir, '30000') address = r[0] # create another 3 addresses address2 = transactions.CreateWallet(datadir) address3 = transactions.CreateWallet(datadir) _lib.StartTestGroup("Do transactions") transactions.GetUnapprovedTransactionsEmpty(datadir) amount1 = '1' amount2 = '2' amount3 = '3' txid1 = _transfers.Send(datadir, address, address2, amount1) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 1, "Should be 1 unapproved transaction") time.sleep(1) txid2 = _transfers.Send(datadir, address, address3, amount2) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 2, "Should be 2 unapproved transaction") time.sleep(1) txid3 = _transfers.Send(datadir, address, address3, amount3) # node needs some time to make a block, so transaction still will be in list of unapproved txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 3, "Should be 3 unapproved transaction") time.sleep(1) txid4 = _transfers.Send(datadir, address3, address2, amount1) # node needs some time to make a block, so transaction still will be in list of unapproved txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 4, "Should be 4 unapproved transaction") if txid1 not in txlist.keys(): _lib.Fatal("Transaction 1 is not in the list of transactions") if txid2 not in txlist.keys(): _lib.Fatal("Transaction 2 is not in the list of transactions") if txid3 not in txlist.keys(): _lib.Fatal("Transaction 3 is not in the list of transactions") if txid4 not in txlist.keys(): _lib.Fatal("Transaction 4 is not in the list of transactions") _lib.FatalAssertFloat(amount1, txlist[txid1][2], "Amount of transaction 1 is wrong") _lib.FatalAssertFloat(amount2, txlist[txid2][2], "Amount of transaction 2 is wrong") _lib.FatalAssertFloat(amount3, txlist[txid3][2], "Amount of transaction 3 is wrong") _lib.FatalAssertFloat(amount1, txlist[txid4][2], "Amount of transaction 4 is wrong") blockchash = MintBlock(datadir, address) transactions.GetUnapprovedTransactionsEmpty(datadir) blockshashes = _blocks.GetBlocks(datadir) _lib.FatalAssert( len(blockshashes) == 2, "Should be 2 blocks in blockchain") _lib.StartTestGroup("Send 30 transactions") microamount = 0.01 # send many transactions for i in range(1, 10): _lib.StartTest("Iteration " + str(i)) txid1 = _transfers.Send(datadir, address, address2, microamount) txid2 = _transfers.Send(datadir, address2, address3, microamount) txid3 = _transfers.Send(datadir, address3, address, microamount) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert( len(txlist) == i * 3, "Should be " + str(i * 3) + " unapproved transaction") if txid1 not in txlist.keys(): _lib.Fatal( "Transaction 1 is not in the list of transactions after iteration " + str(i)) if txid2 not in txlist.keys(): _lib.Fatal( "Transaction 2 is not in the list of transactions after iteration " + str(i)) if txid3 not in txlist.keys(): _lib.Fatal( "Transaction 3 is not in the list of transactions after iteration " + str(i)) time.sleep(1) blockchash = MintBlock(datadir, address) transactions.GetUnapprovedTransactionsEmpty(datadir) blockshashes = _blocks.GetBlocks(datadir) _lib.FatalAssert( len(blockshashes) == 3, "Should be 3 blocks in blockchain") _lib.StartTestGroup("Send 30 transactions. Random value") microamountmax = 0.01 microamountmin = 0.0095 # send many transactions for i in range(1, 11): _lib.StartTest("Iteration " + str(i)) a1 = random.uniform(microamountmin, microamountmax) a2 = random.uniform(microamountmin, microamountmax) a3 = random.uniform(microamountmin, microamountmax) txid1 = _transfers.Send(datadir, address, address2, a1) txid2 = _transfers.Send(datadir, address2, address3, a2) txid3 = _transfers.Send(datadir, address3, address, a3) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert( len(txlist) == i * 3, "Should be " + str(i * 3) + " unapproved transaction") if txid1 not in txlist.keys(): _lib.Fatal( "Transaction 1 is not in the list of transactions after iteration " + str(i)) if txid2 not in txlist.keys(): _lib.Fatal( "Transaction 2 is not in the list of transactions after iteration " + str(i)) if txid3 not in txlist.keys(): _lib.Fatal( "Transaction 3 is not in the list of transactions after iteration " + str(i)) time.sleep(1) blockchash = MintBlock(datadir, address) transactions.GetUnapprovedTransactionsEmpty(datadir) blockshashes = _blocks.GetBlocks(datadir) _lib.FatalAssert( len(blockshashes) == 4, "Should be 4 blocks in blockchain") #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()
def test(testfilter): global datadir _lib.StartTestGroup("SQL Proxy basic") _lib.CleanTestFolders() datadir = _lib.CreateTestFolder() startnode.StartNodeWithoutBlockchain(datadir) address2 = transactions.CreateWallet(datadir) address3 = transactions.CreateWallet(datadir) _lib.CopyTestConsensusConfig(datadir,"customnumbers", address2) address = startnode.InitBockchain(datadir) _complex.AddProxyToConfig(datadir, "localhost:40041") _complex.AddInternalKeyToConfig(datadir, address3) # init internal signing startnode.StartNode(datadir, address, '30000') _lib.StartTestGroup("Do transactions") transactions.GetUnapprovedTransactionsEmpty(datadir) # address3 signs proxy transactions. it doesn't have money yet _transfers.Send(datadir,address, address3 ,5) # needs this to create table blocks = _blocks.WaitBlocks(datadir, 2) time.sleep(1) _sql.ExecuteSQLOnProxy(datadir, "CREATE TABLE test (a INT auto_increment PRIMARY KEY, b VARCHAR(20))") tables = _lib.DBGetRows(datadir,"SHOW TABLES") found = False for table in tables: if table[0] == "test": found = True break _lib.FatalAssert(found, "Table test not found in the DB") _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test SET b='row1'") blocks = _blocks.WaitBlocks(datadir, 3) time.sleep(1) # now try to create paid table. it should fail because no money _sql.ExecuteSQLOnProxyFail(datadir, "CREATE TABLE members (id INT auto_increment PRIMARY KEY, name VARCHAR(20))") # send money _transfers.Send(datadir,address, address3 ,10) # this table creation costs 10 _sql.ExecuteSQLOnProxy(datadir, "CREATE TABLE members (id INT auto_increment PRIMARY KEY, name VARCHAR(20))") tables = _lib.DBGetRows(datadir,"SHOW TABLES") found = False for table in tables: if table[0] == "members": found = True break _lib.FatalAssert(found, "Table not found in the DB") _sql.ExecuteSQLOnProxyFail(datadir, "INSERT INTO members SET name='user1'") # but should be abe to isert to free table _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test SET b='row2'") blocks = _blocks.WaitBlocks(datadir, 4) time.sleep(2) _transfers.Send(datadir,address, address3 ,1) _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO members SET name='user1'") _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO members SET name='user2'") _sql.ExecuteSQLOnProxyFail(datadir, "INSERT INTO members SET name='user3'") bal1 = _transfers.GetBalance(datadir, address) bal2 = _transfers.GetBalance(datadir, address2) bal3 = _transfers.GetBalance(datadir, address3) _lib.FatalAssert(bal1[1] == 45.0, "Balance of a first addres is expected to be 45") _lib.FatalAssert(bal2[1] == 15.0, "Balance of a second addres is expected to be 15") _lib.FatalAssert(bal3[1] == 0.0, "Balance of a third addres is expected to be 0") startnode.StopNode(datadir) datadir = "" #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()
def test(testfilter): global datadirs _lib.CleanTestFolders() #return _complex.Make5BlocksBC() #return _complex.PrepareNodes() dirs = _complex.Copy6Nodes() nodes = [] i = 1 for d in dirs: #get address in wallets in this dir balances = _transfers.GetGroupBalance(d) address = balances.keys()[0] port = str(30000 + i ) nodes.append({'index':i - 1, 'port':port, 'datadir':d,'address':address,"title":"Server "+str(i)}) #_transfers.ReindexUTXO(d) #txlist = transactions.GetUnapprovedTransactions(d) #print txlist #start this node #print os.path.basename(d) startnode.StartNodeConfig(d) i = i + 1 datadirs.append(d) #check nodes on each node is correct for node in nodes: #print os.path.basename(node['datadir']) nodeslist = managenodes.GetNodes(node['datadir']) _lib.FatalAssert(len(nodeslist) == 2,"Should be 2 nodes on "+node["title"]) if node['index'] == 0: _lib.FatalAssert("localhost:30005" in nodeslist,"Node 6 should be on the node 0") _lib.FatalAssert("localhost:30004" in nodeslist,"Node 5 should be on the node 0") if node['index'] == 1: _lib.FatalAssert("localhost:30002" in nodeslist,"Node 2 should be on the node 1") _lib.FatalAssert("localhost:30003" in nodeslist,"Node 3 should be on the node 1") #raise ValueError('Stop') # test blocks branches _lib.StartTestGroup("Check blockchain before updates") blocks1 = _blocks.GetBlocks(nodes[0]["datadir"]) blocks2 = _blocks.GetBlocks(nodes[1]["datadir"]) _lib.FatalAssert(len(blocks1) == 9,"First branch should have 9 blocks") _lib.FatalAssert(len(blocks2) == 8,"Second branch should have 8 blocks") _lib.FatalAssert(blocks1[2] == blocks2[1],"7 block must be same for both") _lib.FatalAssert(blocks1[1] != blocks2[0],"8 block must be different") _lib.StartTestGroup("Connect subnetworks") managenodes.AddNode(nodes[0]["datadir"],"localhost",'30001') # wait whle blocks are exachanged _blocks.WaitBlocks(nodes[1]["datadir"],9) # get unapproved transactions (after block cancel) txlist = _transfers.WaitUnapprovedTransactions(nodes[1]["datadir"], 7) _lib.FatalAssert(len(txlist) == 7,"SHould be 7 unapproved TXs") #send another 2 TXs to have 9 required TXs balances = _transfers.GetGroupBalance(nodes[1]["datadir"]) mainbalance = _transfers.GetGroupBalance(nodes[0]["datadir"]) addr1 = balances.keys()[0] amount = "%.8f" % round(balances[addr1][0]/5,8) _transfers.Send(nodes[1]["datadir"],addr1,mainbalance.keys()[0],amount) _transfers.Send(nodes[1]["datadir"],addr1,mainbalance.keys()[0],amount) # wait while new block created and posted to all other b1 = _blocks.WaitBlocks(nodes[1]["datadir"],10) b2 = _blocks.WaitBlocks(nodes[0]["datadir"],10) _lib.StartTestGroup("Check blockchain after updates") blocks2_0 = _blocks.GetBlocks(nodes[0]["datadir"]) _lib.FatalAssert(len(blocks2_0) == 10,"10 block must be on node 0") _lib.FatalAssert(blocks2_0[1] == blocks1[0],"9 block must be same for both") blocks2_1 = _blocks.GetBlocks(nodes[1]["datadir"]) _lib.FatalAssert(len(blocks2_1) == 10,"10 block must be on node 1") _lib.FatalAssert(blocks2_1[1] == blocks1[0],"9 block must be same for both") _lib.StartTestGroup("Node 2 "+os.path.basename(nodes[2]["datadir"])) _blocks.WaitBlocks(nodes[2]["datadir"],10) blocks2_2 = _blocks.GetBlocks(nodes[2]["datadir"]) _lib.FatalAssert(len(blocks2_2) == 10,"10 block must be on node 2") _lib.FatalAssert(blocks2_2[1] == blocks2_1[1],"2-nd from top blocks on 2 must be same as on 1") _lib.StartTestGroup("Node 3 "+os.path.basename(nodes[3]["datadir"])) _blocks.WaitBlocks(nodes[3]["datadir"],10) blocks2_3 = _blocks.GetBlocks(nodes[3]["datadir"]) _lib.FatalAssert(len(blocks2_3) == 10,"10 block must be on node 3") _lib.FatalAssert(blocks2_3[1] == blocks2_1[1],"2-nd from top blocks on 3 must be same as on 1") _lib.StartTestGroup("Node 4 "+os.path.basename(nodes[4]["datadir"])) _blocks.WaitBlocks(nodes[4]["datadir"],10) blocks2_4 = _blocks.GetBlocks(nodes[4]["datadir"]) _lib.FatalAssert(len(blocks2_4) == 10,"10 block must be on node 4") _lib.FatalAssert(blocks2_4[1] == blocks2_1[1],"2-nd from top blocks on 4 must be same as on 1") _lib.StartTestGroup("Node 5 "+os.path.basename(nodes[5]["datadir"])) _blocks.WaitBlocks(nodes[5]["datadir"],10) blocks2_5 = _blocks.GetBlocks(nodes[5]["datadir"]) _lib.FatalAssert(len(blocks2_5) == 10,"10 block must be on node 5") _lib.FatalAssert(blocks2_5[1] == blocks2_1[1],"2-nd from top blocks on 5 must be same as on 1") _lib.StartTestGroup("Final checks") # should be empty list of transactions now transactions.GetUnapprovedTransactionsEmpty(nodes[1]["datadir"]) for node in nodes: startnode.StopNode(node['datadir']) datadirs[node['index']] = "" #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()
def test(testfilter): global datadir _lib.StartTestGroup("Init Blockchain on non empty DB") _lib.CleanTestFolders() datadir = _lib.CreateTestFolder() address2 = transactions.CreateWallet(datadir) address3 = transactions.CreateWallet(datadir) _lib.CopyTestConsensusConfig(datadir, "disabledcreate", address2) # add some data to the DB _lib.DBExecute( datadir, "create table test (a int unsigned auto_increment primary key, b varchar(10))" ) _lib.DBExecute(datadir, "insert into test SET b='row1'") _lib.DBExecute(datadir, "insert into test SET b='row2'") _lib.DBExecute( datadir, "create table members (a int unsigned auto_increment primary key, b varchar(10))" ) _lib.DBExecute(datadir, "insert into members SET b='row1'") _lib.DBExecute(datadir, "insert into members SET b='row2'") address = startnode.InitBockchain(datadir) _complex.AddProxyToConfig(datadir, "localhost:40041") _complex.AddInternalKeyToConfig(datadir, address3) # init internal signing startnode.StartNode(datadir, address, '30000') _lib.StartTestGroup("Do transactions") transactions.GetUnapprovedTransactionsEmpty(datadir) blocks = _blocks.GetBlocks(datadir) _lib.FatalAssert(len(blocks) == 2, "Should be 2 blocks in blockchain") _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO members SET b='row3'") _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO members SET b='row4'") blocks = _blocks.WaitBlocks(datadir, 3) _lib.FatalAssert(len(blocks) == 3, "Should be 3 blocks in blockchain") time.sleep(1) _sql.ExecuteSQLOnProxyFail(datadir, "INSERT INTO test SET b='row3'") _transfers.Send(datadir, address, address3, 1) _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO test SET b='row3'") _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO test SET b='row4'") _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO members SET b='row5'") startnode.StopNode(datadir) datadir = "" #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()
def test(testfilter): global datadirs _lib.CleanTestFolders() #return _complex.PrepareNodesWithSQL() _lib.StartTestGroup("Load ready BC into 6 nodes") dirs = _complex.Copy6NodesSQL() nodes = [] i = 1 for d in dirs: #get address in wallets in this dir balances = _transfers.GetGroupBalance(d) address = balances.keys()[0] port = str(30000 + i) nodes.append({ 'index': i - 1, 'port': port, 'datadir': d, 'address': address, "title": "Server " + str(i) }) #_transfers.ReindexUTXO(d) #txlist = transactions.GetUnapprovedTransactions(d) #print txlist #start this node #print os.path.basename(d) startnode.StartNodeConfig(d) i = i + 1 datadirs.append(d) #check nodes on each node is correct for node in nodes: #print os.path.basename(node['datadir']) nodeslist = managenodes.GetNodes(node['datadir']) _lib.FatalAssert( len(nodeslist) == 2, "Should be 2 nodes on " + node["title"]) if node['index'] == 0: _lib.FatalAssert("localhost:30005" in nodeslist, "Node 6 should be on the node 0") _lib.FatalAssert("localhost:30004" in nodeslist, "Node 5 should be on the node 0") if node['index'] == 1: _lib.FatalAssert("localhost:30002" in nodeslist, "Node 2 should be on the node 1") _lib.FatalAssert("localhost:30003" in nodeslist, "Node 3 should be on the node 1") #raise ValueError('Stop') # test blocks branches _lib.StartTestGroup("Check blockchain before updates") blocks1 = _blocks.GetBlocks(nodes[0]["datadir"]) blocks2 = _blocks.GetBlocks(nodes[1]["datadir"]) _lib.FatalAssert(len(blocks1) == 9, "First branch should have 9 blocks") _lib.FatalAssert(len(blocks2) == 8, "Second branch should have 8 blocks") _lib.FatalAssert(blocks1[2] == blocks2[1], "7 block must be same for both") _lib.FatalAssert(blocks1[1] != blocks2[0], "8 block must be different") _lib.StartTestGroup("Connect subnetworks") managenodes.AddNode(nodes[0]["datadir"], "localhost", '30001') # wait while blocks are exachanged _blocks.WaitBlocks(nodes[1]["datadir"], 9) s = 1 time.sleep(2) while s < 10: rows1 = _lib.DBGetRows(nodes[1]['datadir'], "SELECT * FROM test", True) rows2 = _lib.DBGetRows(nodes[2]['datadir'], "SELECT * FROM test", True) rows3 = _lib.DBGetRows(nodes[3]['datadir'], "SELECT * FROM test", True) if ((rows1[1][1] == "row2_updated" or rows1[1][1] == "row2_updated_other") and (rows2[1][1] == "row2_updated" or rows2[1][1] == "row2_updated_other") and (rows3[1][1] == "row2_updated" or rows3[1][1] == "row2_updated_other")): break time.sleep(1) s = s + 1 # get unapproved transactions (after block cancel) txlist = _transfers.WaitUnapprovedTransactions(nodes[1]["datadir"], 5, 15) #print(txlist) _lib.FatalAssert( len(txlist) == 5, "Should be 5 unapproved TXs, but has " + str(len(txlist))) #send another 2 TXs to have 9 required TXs balances = _transfers.GetGroupBalance(nodes[1]["datadir"]) mainbalance = _transfers.GetGroupBalance(nodes[0]["datadir"]) addr1 = balances.keys()[0] amount = "%.8f" % round(balances[addr1][0] / 5, 8) # add yet mode 4 TXs to complete a block _transfers.Send(nodes[1]["datadir"], addr1, mainbalance.keys()[0], amount) # 3 SQL txs # on another node. should go to the second node too _sql.ExecuteSQLOnProxy(nodes[0]['datadir'], "INSERT INTO test SET b='row11', a=11") _sql.ExecuteSQLOnProxy(nodes[1]['datadir'], "UPDATE test set b='row5_update_other' WHERE a=5") time.sleep(2) txlist = _transfers.WaitUnapprovedTransactions(nodes[0]["datadir"], 1, 10) # there should be minimum 1 tx, maximum 2. Because currency TX's can be based on other 1 currency TX's that are not yet on other nodes (from canceled block) _lib.FatalAssert( len(txlist) >= 1 and len(txlist) <= 2, "SHould be from 1 to 2 unapproved TXs on node 1") txlist = _transfers.WaitUnapprovedTransactions(nodes[1]["datadir"], 8, 10) _lib.FatalAssert(len(txlist) == 8, "SHould be 8 unapproved TXs") # after this TX new block should be created _sql.ExecuteSQLOnProxy( nodes[1]['datadir'], "UPDATE test set b='row11_update_other' WHERE a=11") # wait while new block created and posted to all other b1 = _blocks.WaitBlocks(nodes[1]["datadir"], 10) b2 = _blocks.WaitBlocks(nodes[0]["datadir"], 10) _lib.StartTestGroup("Check blockchain after updates") blocks2_0 = _blocks.GetBlocks(nodes[0]["datadir"]) _lib.FatalAssert(len(blocks2_0) == 10, "10 block must be on node 0") _lib.FatalAssert(blocks2_0[1] == blocks1[0], "9 block must be same for both") blocks2_1 = _blocks.GetBlocks(nodes[1]["datadir"]) _lib.FatalAssert(len(blocks2_1) == 10, "10 block must be on node 1") _lib.FatalAssert(blocks2_1[1] == blocks1[0], "9 block must be same for both") _lib.StartTestGroup("Node 2 " + os.path.basename(nodes[2]["datadir"])) _blocks.WaitBlocks(nodes[2]["datadir"], 10) blocks2_2 = _blocks.GetBlocks(nodes[2]["datadir"]) _lib.FatalAssert(len(blocks2_2) == 10, "10 block must be on node 2") _lib.FatalAssert(blocks2_2[1] == blocks2_1[1], "2-nd from top blocks on 2 must be same as on 1") _lib.StartTestGroup("Node 3 " + os.path.basename(nodes[3]["datadir"])) _blocks.WaitBlocks(nodes[3]["datadir"], 10) blocks2_3 = _blocks.GetBlocks(nodes[3]["datadir"]) _lib.FatalAssert(len(blocks2_3) == 10, "10 block must be on node 3") _lib.FatalAssert(blocks2_3[1] == blocks2_1[1], "2-nd from top blocks on 3 must be same as on 1") _lib.StartTestGroup("Node 4 " + os.path.basename(nodes[4]["datadir"])) _blocks.WaitBlocks(nodes[4]["datadir"], 10) blocks2_4 = _blocks.GetBlocks(nodes[4]["datadir"]) _lib.FatalAssert(len(blocks2_4) == 10, "10 block must be on node 4") _lib.FatalAssert(blocks2_4[1] == blocks2_1[1], "2-nd from top blocks on 4 must be same as on 1") _lib.StartTestGroup("Node 5 " + os.path.basename(nodes[5]["datadir"])) _blocks.WaitBlocks(nodes[5]["datadir"], 10) blocks2_5 = _blocks.GetBlocks(nodes[5]["datadir"]) _lib.FatalAssert(len(blocks2_5) == 10, "10 block must be on node 5") _lib.FatalAssert(blocks2_5[1] == blocks2_1[1], "2-nd from top blocks on 5 must be same as on 1") rows1 = _lib.DBGetRows(nodes[0]['datadir'], "SELECT * FROM test", True) rows2 = _lib.DBGetRows(nodes[1]['datadir'], "SELECT * FROM test", True) _lib.FatalAssert(rows1 == rows2, "Table contents on node 1 and 2 must be same") rows3 = _lib.DBGetRows(nodes[2]['datadir'], "SELECT * FROM test", True) _lib.FatalAssert(rows1 == rows3, "Table contents on node 1 and 3 must be same") rows4 = _lib.DBGetRows(nodes[3]['datadir'], "SELECT * FROM test", True) _lib.FatalAssert(rows1 == rows4, "Table contents on node 1 and 4 must be same") rows5 = _lib.DBGetRows(nodes[4]['datadir'], "SELECT * FROM test", True) _lib.FatalAssert(rows1 == rows5, "Table contents on node 1 and 5 must be same") rows6 = _lib.DBGetRows(nodes[5]['datadir'], "SELECT * FROM test", True) _lib.FatalAssert(rows1 == rows6, "Table contents on node 1 and 6 must be same") _lib.StartTestGroup("Final checks") # should be empty list of transactions now transactions.GetUnapprovedTransactionsEmpty(nodes[1]["datadir"]) for node in nodes: startnode.StopNode(node['datadir']) datadirs[node['index']] = "" #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()
def test(testfilter): global datadir _lib.StartTestGroup("SQL Consensus rules postponed") _lib.CleanTestFolders() datadir = _lib.CreateTestFolder() startnode.StartNodeWithoutBlockchain(datadir) address2 = transactions.CreateWallet(datadir) address3 = transactions.CreateWallet(datadir) _lib.CopyTestConsensusConfig(datadir,"postponedlimits", address2) address = startnode.InitBockchain(datadir) _complex.AddProxyToConfig(datadir, "localhost:40041") _complex.AddInternalKeyToConfig(datadir, address3) # init internal signing startnode.StartNode(datadir, address, '30000') _lib.StartTestGroup("Do transactions") transactions.GetUnapprovedTransactionsEmpty(datadir) _sql.ExecuteSQLOnProxy(datadir, "CREATE TABLE test (a INT auto_increment PRIMARY KEY, b VARCHAR(20))") blocks = _blocks.WaitBlocks(datadir, 2) time.sleep(1) _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test SET b='row1'") _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test SET b='row2'") blocks = _blocks.WaitBlocks(datadir, 3) time.sleep(1) _sql.ExecuteSQLOnProxy(datadir, "CREATE TABLE members (id INT auto_increment PRIMARY KEY, name VARCHAR(20))") tables = _lib.DBGetRows(datadir,"SHOW TABLES") found = False for table in tables: if table[0] == "members": found = True break _lib.FatalAssert(found, "Table not found in the DB") _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO members SET name='user1'") _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO members SET name='use2'") #_sql.ExecuteSQLOnProxy(datadir, "DROP TABLE members") blocks = _blocks.WaitBlocks(datadir, 4) time.sleep(1) _sql.ExecuteSQLOnProxyFail(datadir, "CREATE TABLE test2 (a INT auto_increment PRIMARY KEY, b VARCHAR(20))") _sql.ExecuteSQLOnProxy(datadir, "DROP TABLE members") _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test SET b='row3'") _sql.ExecuteSQLOnProxy(datadir,"UPDATE test SET b='row3+upd1' WHERE a=3") _sql.ExecuteSQLOnProxy(datadir,"UPDATE test SET b='row3+upd2' WHERE a=3") blocks = _blocks.WaitBlocks(datadir, 5) time.sleep(1) # now this must be paid _sql.ExecuteSQLOnProxyFail(datadir,"UPDATE test SET b='row3+upd2' WHERE a=3") _sql.ExecuteSQLOnProxy(datadir, "CREATE TABLE members (id INT auto_increment PRIMARY KEY, name VARCHAR(20))") tables = _lib.DBGetRows(datadir,"SHOW TABLES") found = False for table in tables: if table[0] == "members": found = True break _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO members SET name='user1'") _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO members SET name='user2'") _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO members SET name='user3'") _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test SET b='row4'") blocks = _blocks.WaitBlocks(datadir, 6) time.sleep(1) _sql.ExecuteSQLOnProxyFail(datadir, "INSERT INTO members SET name='user4'") _sql.ExecuteSQLOnProxyFail(datadir,"INSERT INTO test SET b='row5'") # send money to be able to execute this _transfers.Send(datadir,address, address3 ,10) # needs this to create table _sql.ExecuteSQLOnProxy(datadir, "INSERT INTO members SET name='user4'") _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test SET b='row5'") _sql.ExecuteSQLOnProxy(datadir, "CREATE TABLE test2 (a INT auto_increment PRIMARY KEY, b VARCHAR(20))") _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test2 SET b='row1'") _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test2 SET b='row2'") _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test2 SET b='row3'") blocks = _blocks.WaitBlocks(datadir, 7) time.sleep(1) startnode.StopNode(datadir) datadir = "" #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()
def test(testfilter): global datadir,datadir2 _lib.StartTestGroup("SQL Sync with Proxy") _lib.CleanTestFolders() datadir = _lib.CreateTestFolder('_1_') datadir2 = _lib.CreateTestFolder('_2_') startnode.StartNodeWithoutBlockchain(datadir) address = startnode.InitBockchain(datadir) _complex.AddProxyToConfig(datadir, "localhost:40041") _complex.AddInternalKeyToConfig(datadir, address) # init internal signing startnode.StartNode(datadir, address, '30000') _lib.StartTestGroup("Do transactions") transactions.GetUnapprovedTransactionsEmpty(datadir) _sql.ExecuteSQLOnProxy(datadir,"CREATE TABLE test (a INT auto_increment PRIMARY KEY, b VARCHAR(20))") # check new table exists tables = _lib.DBGetRows(datadir,"SHOW TABLES",True) found = False for table in tables: if table[0] == "test": found = True break _lib.FatalAssert(found, "Table not found in the DB") blocks = _blocks.WaitBlocks(datadir, 2) time.sleep(1) _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test SET b='row1'") _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test SET a=2,b='row2'") time.sleep(1) _sql.ExecuteSQLOnProxy(datadir,"INSERT INTO test (b) VALUES ('row3')") rows = _lib.DBGetRows(datadir,"SELECT * FROM test",True) _lib.FatalAssert(len(rows) == 3, "Must be 3 rows in a table") blocks = _blocks.WaitBlocks(datadir, 3) time.sleep(1)# while all caches are cleaned txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 1,"Should be 1 unapproved transaction") # update data _sql.ExecuteSQLOnProxy(datadir," update test SET b=\"row3 updated\" where a=3") _sql.ExecuteSQLOnProxy(datadir," update test SET b=\"row2 updated\" where a = '2'") blocks = _blocks.WaitBlocks(datadir, 4) time.sleep(1)# while all caches are cleaned rows = _lib.DBGetRows(datadir,"SELECT * FROM test",True) for row in rows: if row[0]=="1": _lib.FatalAssert(row[1] == "row1","Row 1 value is wrong. Got: "+row[1]) if row[0]=="2": _lib.FatalAssert(row[1] == "row2 updated","Row 2 value is wrong. Got: "+row[1]) if row[0]=="3": _lib.FatalAssert(row[1] == "row3 updated","Row 3 value is wrong. Got: "+row[1]) _sql.ExecuteSQLOnProxyFail(datadir,"INSERT INTO test SET a=2,b='row2'") _sql.ExecuteSQLOnProxy(datadir," DELETE from test where a=3") rows = _lib.DBGetRows(datadir,"SELECT * FROM test",True) _lib.FatalAssert(len(rows) == 2, "Must be 2 rows in a table") address2 = initblockchain.ImportBockchain(datadir2,"localhost",'30000') _complex.AddProxyToConfig(datadir2, "localhost:40042") _complex.AddInternalKeyToConfig(datadir2, address2) # init internal signing startnode.StartNode(datadir2, address2,'30001', "Server 2") blocks = _blocks.WaitBlocks(datadir2, 4) # must be 3 rows because delete transaction was not posted to that node rows = _lib.DBGetRows(datadir2,"SELECT * FROM test",True) _lib.FatalAssert(len(rows) == 3, "Must be 3 rows in a table") _sql.ExecuteSQLOnProxy(datadir," DELETE from test where a=2") # should be 1 row on first node rows = _lib.DBGetRows(datadir,"SELECT * FROM test",True) _lib.FatalAssert(len(rows) == 1, "Must be 1 rows in a table") time.sleep(1)# give time to send transaction # and 2 row on second rows = _lib.DBGetRows(datadir2,"SELECT * FROM test",True) _lib.FatalAssert(len(rows) == 2, "Must be 2 rows in a table") # insert on second node. check on first _sql.ExecuteSQLOnProxy(datadir2,"INSERT INTO test SET a=2,b='row2'") time.sleep(1)# give time to send transaction rows = _lib.DBGetRows(datadir,"SELECT * FROM test",True) _lib.FatalAssert(len(rows) == 2, "Must be 2 rows in a table") startnode.StopNode(datadir) datadir = "" startnode.StopNode(datadir2) datadir2 = "" #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()
def Make5BlocksBC(): datadir = _lib.CreateTestFolder() _lib.StartTest("Create first address") res = _lib.ExecuteNode(['createwallet','-configdir',datadir]) _lib.FatalAssertSubstr(res,"Your new address","Address creation returned wrong result") # get address from this response match = re.search( r'.+: (.+)', res) if not match: _lib.Fatal("Address can not be found in "+res) address = match.group(1) dbconfig = _lib.GetDBCredentials(datadir) _lib.StartTest("Create blockchain") res = _lib.ExecuteNode(['initblockchain','-configdir',datadir, '-minter', address, '-mysqlhost', dbconfig['host'], '-mysqlport', dbconfig['port'], '-mysqluser', dbconfig['user'], '-mysqlpass', dbconfig['password'], '-mysqldb', dbconfig['database'], '-logs','trace']) _lib.FatalAssertSubstr(res,"Done!","Blockchain init failed") # create another 3 addresses address2 = transactions.CreateWallet(datadir) address3 = transactions.CreateWallet(datadir) _lib.StartTestGroup("Do transfers") transactions.GetUnapprovedTransactionsEmpty(datadir) amount1 = '1' amount2 = '2' amount3 = '3' _lib.StartTestGroup("Send 1 transaction") # one TX in first block txid1 = _transfers.Send(datadir,address,address2,amount1) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 1,"Should be 1 unapproved transaction") blockchash = _blocks.MintBlock(datadir,address) blockshashes = _blocks.GetBlocks(datadir) _lib.FatalAssert(len(blockshashes) == 2,"Should be 2 blocks in blockchain") _lib.StartTestGroup("Send 2 transactions") # 2 TX in second block txid2 = _transfers.Send(datadir,address,address3,amount2) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 1,"Should be 1 unapproved transaction") txid3 = _transfers.Send(datadir,address,address3,amount3) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 2,"Should be 2 unapproved transaction") blockchash = _blocks.MintBlock(datadir,address) blockshashes = _blocks.GetBlocks(datadir) _lib.FatalAssert(len(blockshashes) == 3,"Should be 3 blocks in blockchain") _lib.StartTestGroup("Send 3 transactions") microamount = 0.01 txid1 = _transfers.Send(datadir,address,address2,microamount) txid2 = _transfers.Send(datadir,address2,address3,microamount) txid3 = _transfers.Send(datadir,address3,address,microamount) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 3,"Should be 3 unapproved transaction") blockchash = _blocks.MintBlock(datadir,address) transactions.GetUnapprovedTransactionsEmpty(datadir) blockshashes = _blocks.GetBlocks(datadir) _lib.FatalAssert(len(blockshashes) == 4,"Should be 4 blocks in blockchain") _lib.StartTestGroup("Send 4 transactions. Random value") microamountmax = 0.01 microamountmin = 0.0095 a1 = round(random.uniform(microamountmin, microamountmax),8) a2 = round(random.uniform(microamountmin, microamountmax),8) a3 = round(random.uniform(microamountmin, microamountmax),8) a4 = round(random.uniform(microamountmin, microamountmax),8) txid1 = _transfers.Send(datadir,address,address2,a1) txid2 = _transfers.Send(datadir,address2,address3,a2) txid3 = _transfers.Send(datadir,address3,address,a3) txid3 = _transfers.Send(datadir,address3,address,a4) txlist = transactions.GetUnapprovedTransactions(datadir) _lib.FatalAssert(len(txlist) == 4,"Should be 4 unapproved transaction") if txid1 not in txlist.keys(): _lib.Fatal("Transaction 1 is not in the list of transactions after iteration "+str(i)) if txid2 not in txlist.keys(): _lib.Fatal("Transaction 2 is not in the list of transactions after iteration "+str(i)) if txid3 not in txlist.keys(): _lib.Fatal("Transaction 3 is not in the list of transactions after iteration "+str(i)) blockchash = _blocks.MintBlock(datadir,address) transactions.GetUnapprovedTransactionsEmpty(datadir) blockshashes = _blocks.GetBlocks(datadir) _lib.FatalAssert(len(blockshashes) == 5,"Should be 5 blocks in blockchain") _lib.StartTestGroup("Send 5 transactions. Random value") txid1 = _transfers.Send(datadir,address,address2,a4) txid2 = _transfers.Send(datadir,address2,address3,a3) txid3 = _transfers.Send(datadir,address3,address,a2) txid3 = _transfers.Send(datadir,address3,address,a1) txid1 = _transfers.Send(datadir,address,address2,a1) blockchash = _blocks.MintBlock(datadir,address) transactions.GetUnapprovedTransactionsEmpty(datadir) blockshashes = _blocks.GetBlocks(datadir) _lib.FatalAssert(len(blockshashes) == 6,"Should be 6 blocks in blockchain") dstdir = _lib.getCurrentDir()+"/datafortests/bcwith4blocks/" copyfile(datadir+"/wallet.dat", dstdir+"wallet.t") DumpBCDB(datadir, dstdir+"db.sql") #copyfile(datadir+"/nodeslist.db", dstdir+"nodeslist.t") #copyfile(datadir+"/blockchain.db", dstdir+"blockchain.t") return [datadir, address, address2, address3]
def test(testfilter): global datadir1 global datadir2 global datadir3 _lib.StartTestGroup("Manage nodes list") _lib.CleanTestFolders() datadir1 = _lib.CreateTestFolder('_1_') datadir2 = _lib.CreateTestFolder('_2_') _lib.StartTestGroup("Create blockchain and run node 1") r = blocksbasic.PrepareBlockchain(datadir1, '30000') address = r[0] startnode.StartNode(datadir1, address, '30000', "Server 1") address2 = initblockchain.ImportBockchain(datadir2, "localhost", '30000') #RemoveAllNodes(datadir1) nodes = GetNodes(datadir1) _lib.FatalAssert(len(nodes) == 0, "Should be 0 nodes in output") AddNode(datadir1, "localhost", '30001') nodes = GetNodes(datadir1) _lib.FatalAssert(len(nodes) == 1, "Should be 1 nodes in output") RemoveNode(datadir1, "localhost", '30001') nodes = GetNodes(datadir1) _lib.FatalAssert(len(nodes) == 0, "Should be 0 nodes in output") startnode.StartNode(datadir2, address2, '30001', "Server 2") #RemoveAllNodes(datadir2) #AddNode(datadir1, "localhost",'30001') nodes = GetNodes(datadir1) _lib.FatalAssert(len(nodes) == 1, "Should be 1 nodes in output") startnode.StopNode(datadir2, "Server 2") startnode.StartNode(datadir2, address2, '30001', "Server 2") nodes = GetNodes(datadir1) _lib.FatalAssert(len(nodes) == 1, "Should be 1 nodes in output") _lib.FatalAssert( nodes.keys()[0] == "localhost:30001" or nodes.keys()[0] == "127.0.0.1:30001", "Wrong node in the list") # check transactions work fine between nodes _transfers.Send(datadir1, address, address2, '3') txlist = transactions.GetUnapprovedTransactions(datadir1) _lib.FatalAssert(len(txlist) == 1, "Should be 1 unapproved transaction") blocks = _blocks.WaitBlocks(datadir1, 2) # send another 2 TX to make a block _transfers.Send(datadir1, address, address2, '0.01') _transfers.Send(datadir1, address, address2, '0.01') blocks = _blocks.WaitBlocks(datadir1, 3) txid1 = _transfers.Send(datadir1, address, address2, '1') txlist = transactions.GetUnapprovedTransactions(datadir1) _lib.FatalAssert(len(txlist) == 1, "Should be 1 unapproved transaction") # and now get transactions from second node txlist = _transfers.WaitUnapprovedTransactions(datadir2, 1) _lib.FatalAssert( len(txlist) == 1, "Should be 1 unapproved transaction on second node") #print txid1 #print txlist if txid1 not in txlist.keys(): _lib.Fatal( "Transaction 1 is not in the list of transactions on second node") # start one more node datadir3 = _lib.CreateTestFolder('_3_') address3 = initblockchain.ImportBockchain(datadir3, "localhost", '30000') startnode.StartNode(datadir3, address3, '30002', "Server 3") #RemoveAllNodes(datadir3) #AddNode(datadir3, "localhost",'30001') time.sleep(2) # wait while nodes exchange addresses nodes = GetNodes(datadir1) _lib.FatalAssert(len(nodes) == 2, "Should be 2 nodes in output of 1") nodes = GetNodes(datadir2) _lib.FatalAssert(len(nodes) == 2, "Should be 2 nodes in output of 2") nodes = GetNodes(datadir3) _lib.FatalAssert(len(nodes) == 2, "Should be 2 nodes in output of 3") txid1 = _transfers.Send(datadir1, address, address3, '4') transactions.GetUnapprovedTransactionsEmpty(datadir3) txlist1 = transactions.GetUnapprovedTransactions(datadir1) time.sleep(3) # we need to give a chance to sync all txlist2 = transactions.GetUnapprovedTransactions(datadir2) _lib.FatalAssert( len(txlist1) == 2, "Should be 2 unapproved transactions on 1") _lib.FatalAssert( len(txlist2) == 2, "Should be 2 unapproved transactions on 2") if txid1 not in txlist1.keys(): _lib.Fatal( "Transaction 2 is not in the list of transactions on node 1") if txid1 not in txlist2.keys(): _lib.Fatal( "Transaction 2 is not in the list of transactions on node 2") # send one more TX. Block must be created txid3 = _transfers.Send(datadir1, address, address2, '1') time.sleep(5) # wait while a block is minted and posted to other nodes transactions.GetUnapprovedTransactionsEmpty(datadir1) transactions.GetUnapprovedTransactionsEmpty(datadir2) transactions.GetUnapprovedTransactionsEmpty(datadir3) # check if a block is present on all nodes. it must be 2 block on every node blockshashes = _blocks.GetBlocks(datadir1) _lib.FatalAssert( len(blockshashes) == 4, "Should be 4 blocks in blockchain on 1") blockshashes = _blocks.GetBlocks(datadir2) _lib.FatalAssert( len(blockshashes) == 4, "Should be 4 blocks in blockchain on 2") blockshashes = _blocks.GetBlocks(datadir3) _lib.FatalAssert( len(blockshashes) == 4, "Should be 4 blocks in blockchain on 3") startnode.StopNode(datadir1, "Server 1") startnode.StopNode(datadir2, "Server 2") startnode.StopNode(datadir3, "Server 3") #_lib.RemoveTestFolder(datadir1) #_lib.RemoveTestFolder(datadir2) datadir1 = "" datadir2 = "" datadir3 = "" _lib.EndTestGroupSuccess()
def test(testfilter): global datadirs _lib.CleanTestFolders() #return _complex.Make5BlocksBC() #return _complex.PrepareNodes() dirs = _complex.Copy6Nodes() nodes = [] i = 1 for d in dirs: #get address in wallets in this dir balances = _transfers.GetGroupBalance(d) address = balances.keys()[0] port = str(30000 + i) nodes.append({ 'index': i - 1, 'port': port, 'datadir': d, 'address': address, "title": "Server " + str(i) }) #_transfers.ReindexUTXO(d) #txlist = transactions.GetUnapprovedTransactions(d) #print txlist #start this node #print os.path.basename(d) startnode.StartNodeConfig(d) i = i + 1 datadirs.append(d) #check nodes on each node is correct for node in nodes: #print os.path.basename(node['datadir']) nodeslist = managenodes.GetNodes(node['datadir']) _lib.FatalAssert( len(nodeslist) == 2, "Should be 2 nodes on " + node["title"]) if node['index'] == 0: _lib.FatalAssert("localhost:30005" in nodeslist, "Node 6 should be on the node 0") _lib.FatalAssert("localhost:30004" in nodeslist, "Node 5 should be on the node 0") if node['index'] == 1: _lib.FatalAssert("localhost:30002" in nodeslist, "Node 2 should be on the node 1") _lib.FatalAssert("localhost:30003" in nodeslist, "Node 3 should be on the node 1") #raise ValueError('Stop') # test blocks branches # ensure subnetworks are fine managenodes.AddNode(nodes[2]["datadir"], "localhost", '30003') managenodes.AddNode(nodes[4]["datadir"], "localhost", '30005') _lib.StartTestGroup("Check blockchain before updates") blocks1 = _blocks.GetBlocks(nodes[0]["datadir"]) blocks2 = _blocks.GetBlocks(nodes[1]["datadir"]) _lib.FatalAssert(len(blocks1) == 9, "First branch should have 9 blocks") _lib.FatalAssert(len(blocks2) == 8, "Second branch should have 8 blocks") _lib.FatalAssert(blocks1[2] == blocks2[1], "7 block must be same for both") _lib.FatalAssert(blocks1[1] != blocks2[0], "8 block must be different") #====================================================================================== # remove node 6 from the first branch managenodes.RemoveAllNodes(nodes[5]["datadir"]) nodeslist = managenodes.GetNodes(nodes[5]["datadir"]) _lib.FatalAssert(len(nodeslist) == 0, "Should be 0 nodes on the node 6") # remove this node from 2 other nodes where it is known managenodes.RemoveNode(nodes[0]["datadir"], "localhost", "30005") managenodes.RemoveNode(nodes[4]["datadir"], "localhost", "30005") nodeslist = managenodes.GetNodes(nodes[0]["datadir"]) _lib.FatalAssert(len(nodeslist) == 1, "Should be 1 nodes on the node 1") nodeslist = managenodes.GetNodes(nodes[4]["datadir"]) _lib.FatalAssert(len(nodeslist) == 1, "Should be 1 nodes on the node 5") # add one more blockon the first node balances = _transfers.GetGroupBalance(nodes[0]["datadir"]) addr1 = balances.keys()[0] addr2 = balances.keys()[1] amount = "%.8f" % round(balances[addr1][0] / 12, 8) for x in range(1, 11): _transfers.Send(nodes[0]["datadir"], addr1, addr2, amount) _blocks.WaitBlocks(nodes[0]["datadir"], 10) time.sleep(4) # and again new block. balances = _transfers.GetGroupBalance(nodes[0]["datadir"]) addr1 = balances.keys()[1] addr2 = balances.keys()[0] amount = "%.8f" % round(balances[addr1][0] / 12, 8) for x in range(1, 12): _transfers.Send(nodes[0]["datadir"], addr1, addr2, amount) _blocks.WaitBlocks(nodes[0]["datadir"], 11) time.sleep(4) # create 2 more blocks on branch 2 balances = _transfers.GetGroupBalance(nodes[1]["datadir"]) addr3 = balances.keys()[0] amount = "%.8f" % round(balances[addr3][0] / 30, 8) for x in range(1, 10): # send to address on the firs node _transfers.Send(nodes[1]["datadir"], addr3, addr1, amount) _blocks.WaitBlocks(nodes[1]["datadir"], 9) time.sleep(4) for x in range(1, 11): # send to address on the firs node _transfers.Send(nodes[1]["datadir"], addr3, addr1, amount) _blocks.WaitBlocks(nodes[1]["datadir"], 10) # now branch 2 has more blocks than the node 6. # connect node 6 with the branch 2 _lib.StartTestGroup("Connect network 2 with the node 6") managenodes.AddNode(nodes[1]["datadir"], "localhost", '30005') managenodes.AddNode(nodes[4]["datadir"], "localhost", '30002') managenodes.AddNode(nodes[4]["datadir"], "localhost", '30003') managenodes.AddNode(nodes[4]["datadir"], "localhost", '30005') managenodes.WaitNodes(nodes[1]["datadir"], 3) managenodes.WaitNodes(nodes[2]["datadir"], 3) managenodes.WaitNodes(nodes[3]["datadir"], 3) # should be 10 blocks after sync _blocks.WaitBlocks(nodes[5]["datadir"], 10) # must be unapproved transactions from previous block 8 #txlist = transactions.GetUnapprovedTransactions(nodes[5]["datadir"]) _lib.StartTestGroup("Wait 11 blocks on every node of net 2") # new block is created from free transaction after reset of some blocks _blocks.WaitBlocks(nodes[5]["datadir"], 11) _blocks.WaitBlocks(nodes[1]["datadir"], 11) _blocks.WaitBlocks(nodes[2]["datadir"], 11) _blocks.WaitBlocks(nodes[3]["datadir"], 11) transactions.GetUnapprovedTransactionsEmpty(nodes[5]["datadir"]) #at this point branch 2 + node 6 have 11 blocks. #branch 1 has also 11 _lib.StartTestGroup("Connect all nodes") managenodes.AddNode(nodes[1]["datadir"], "localhost", '30000') #wait while all nodes know about other nodes netnodes = managenodes.WaitNodes(nodes[0]["datadir"], 5) netnodes = managenodes.WaitNodes(nodes[1]["datadir"], 5) netnodes = managenodes.WaitNodes(nodes[2]["datadir"], 5) netnodes = managenodes.WaitNodes(nodes[3]["datadir"], 5) netnodes = managenodes.WaitNodes(nodes[4]["datadir"], 5) netnodes = managenodes.WaitNodes(nodes[5]["datadir"], 5) nodeslist = managenodes.GetNodes(nodes[1]["datadir"]) _lib.FatalAssert(len(nodeslist) == 5, "Should be 5 nodes on the node 2") # add more transactions on the node 0 to get 12-th block balances = _transfers.GetGroupBalance(nodes[0]["datadir"]) addr1 = balances.keys()[0] addr2 = balances.keys()[2] amount = "%.8f" % round(balances[addr1][0] / 14, 8) # here a node can have some already prepared transactions . we will add 12. but total can be more for x in range(1, 13): tx = _transfers.Send(nodes[0]["datadir"], addr1, addr2, amount) _blocks.WaitBlocks(nodes[0]["datadir"], 12) # now sync should start. branch 2 will change branch _blocks.WaitBlocks(nodes[1]["datadir"], 12) _lib.StartTestGroup("Wait final blocks") # after some time new block should be created from all unconfirmed transactions blocks2_0 = _blocks.WaitBlocks(nodes[1]["datadir"], 13) if len(blocks2_0) < 13: # send some more transactions. it can be after all consensus some previous tranactions are not valid anymore balances = _transfers.GetGroupBalance(nodes[5]["datadir"]) addr1 = balances.keys()[0] amount = "%.8f" % round(balances[addr1][0] / 14, 8) for x in range(1, 11): tx = _transfers.Send(nodes[5]["datadir"], addr1, addr2, amount) blocks2_0 = _blocks.WaitBlocks(nodes[1]["datadir"], 13) _lib.FatalAssert(len(blocks2_0) == 13, "13 block must be on node 0") _blocks.WaitBlocks(nodes[0]["datadir"], 13) _lib.StartTestGroup("Check blockchain after updates") blocks2_0 = _blocks.GetBlocks(nodes[0]["datadir"]) _lib.FatalAssert(len(blocks2_0) == 13, "13 block must be on node 0") blocks2_1 = _blocks.GetBlocks(nodes[1]["datadir"]) _lib.FatalAssert(len(blocks2_1) == 13, "13 block must be on node 1") _lib.StartTestGroup("Node 2 " + os.path.basename(nodes[2]["datadir"])) _blocks.WaitBlocks(nodes[2]["datadir"], 13) blocks2_2 = _blocks.GetBlocks(nodes[2]["datadir"]) _lib.FatalAssert(len(blocks2_2) == 13, "13 block must be on node 2") #_lib.FatalAssert(blocks2_2[1] == blocks2_1[1],"2-nd from top blocks on 2 must be same as on 1") _lib.StartTestGroup("Node 3 " + os.path.basename(nodes[3]["datadir"])) _blocks.WaitBlocks(nodes[3]["datadir"], 13) blocks2_3 = _blocks.GetBlocks(nodes[3]["datadir"]) _lib.FatalAssert(len(blocks2_3) == 13, "13 block must be on node 3") #_lib.FatalAssert(blocks2_3[1] == blocks2_1[1],"2-nd from top blocks on 3 must be same as on 1") _lib.StartTestGroup("Node 4 " + os.path.basename(nodes[4]["datadir"])) _blocks.WaitBlocks(nodes[4]["datadir"], 13) blocks2_4 = _blocks.GetBlocks(nodes[4]["datadir"]) _lib.FatalAssert(len(blocks2_4) == 13, "13 block must be on node 4") #_lib.FatalAssert(blocks2_4[1] == blocks2_1[1],"2-nd from top blocks on 4 must be same as on 1") _lib.StartTestGroup("Node 5 " + os.path.basename(nodes[5]["datadir"])) _blocks.WaitBlocks(nodes[5]["datadir"], 13) blocks2_5 = _blocks.GetBlocks(nodes[5]["datadir"]) _lib.FatalAssert(len(blocks2_5) == 13, "13 block must be on node 5") #_lib.FatalAssert(blocks2_5[1] == blocks2_1[1],"2-nd from top blocks on 5 must be same as on 1") _lib.StartTestGroup("Final checks") # should be empty list of transactions now # we commented because it is not always empty and it is not bad #transactions.GetUnapprovedTransactionsEmpty(nodes[1]["datadir"]) for node in nodes: startnode.StopNode(node['datadir']) datadirs[node['index']] = "" #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()
def test(testfilter): global datadir _lib.StartTestGroup("Init Blockchain on non empty DB. Add 4000 records") _lib.CleanTestFolders() datadir = _lib.CreateTestFolder() address2 = transactions.CreateWallet(datadir) address3 = transactions.CreateWallet(datadir) _lib.CopyTestConsensusConfig(datadir, "disabledcreate", address2) # add some data to the DB _lib.DBExecute( datadir, "create table test (a int unsigned auto_increment primary key, b varchar(10))" ) # add 2k records sys.stdout.write("\t\t") for x in range(600): _lib.DBExecute(datadir, "insert into test SET b='row" + str(x) + "'") if x % 20 == 0: sys.stdout.write('.') if x % 200 == 0 and x > 0: sys.stdout.write(str(x)) print("") sys.stdout.write("\t\t") _lib.DBExecute( datadir, "create table members (a int unsigned auto_increment primary key, b varchar(10))" ) for x in range(600): _lib.DBExecute(datadir, "insert into members SET b='row" + str(x) + "'") if x % 20 == 0: sys.stdout.write('.') if x % 200 == 0 and x > 0: sys.stdout.write(str(x)) print("") _lib.StartTestGroup("Data added. Init BC") address = startnode.InitBockchain(datadir) _complex.AddProxyToConfig(datadir, "localhost:40041") _complex.AddInternalKeyToConfig(datadir, address3) # init internal signing startnode.StartNode(datadir, address, '30000') _lib.StartTestGroup("Do transactions") transactions.GetUnapprovedTransactionsEmpty(datadir) blocks = _blocks.GetBlocks(datadir) #print(blocks) #_lib.FatalAssert(len(blocks) == 4,"Should be 4 blocks in blockchain") _lib.FatalAssert(len(blocks) == 3, "Should be 3 blocks in blockchain") startnode.StopNode(datadir) datadir = "" #_lib.RemoveTestFolder(datadir) _lib.EndTestGroupSuccess()