forked from Qortal/qortal
4a1c3821db
* Code added for calculating an account's generating balance. (CIYAM AT support yet to be added). * Added associated code in Block for calculating next block's timestamp, generating balance, base target, etc. * ValidationResult enum added to Block, mostly to aid debugging. * Block.isValid() now returns ValidationResult instead of boolean. * Block.isValid() now has added proof-of-stake tests. * Some blockchain-related constants, like feature release heights/timestamps, moved from Block to BlockChain. * Added better Block constructor for use when creating a new block. * Added helpful 'navigation' methods to Block to get to block's parent (or child). * Changed visibility of block's individual signature calculators to protected, in favour of public sign() method. * Added asset existence check to Payment.isValid. * All current transaction objects (qora.transaction.*) now have private subclassed transaction variable to save multiple casts in various methods. * Also added to above: * isInvolved(Account) : boolean * getRecipients() : List<Account> * getAmount(Account) : BigDecimal * Added BlockRepository.getLastBlock() to fetch highest block in blockchain. * Added diagnostics to HSQLDBRepository.close() to alert if there are any uncommitted changes during closure. (Currently under suspicion due to possible HSQLDB bug!) * Old "TransactionTests" renamed to "SerializationTests" as that's what they really are. * New "TransactionTests" added to test processing of transactions. (Currently only a PaymentTransaction). * PaymentTransformer.toBytes() detects and skips null signature. This was causing issues with Transaction.toBytesLessSignature(). Needs rolling out to other transaction types if acceptable.
93 lines
3.5 KiB
Java
93 lines
3.5 KiB
Java
package test;
|
|
|
|
import static org.junit.Assert.*;
|
|
|
|
import java.sql.SQLException;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
|
|
import org.junit.Test;
|
|
|
|
import data.block.BlockData;
|
|
import data.transaction.GenesisTransactionData;
|
|
import data.transaction.TransactionData;
|
|
import qora.block.Block;
|
|
import qora.block.GenesisBlock;
|
|
import qora.transaction.GenesisTransaction;
|
|
import qora.transaction.Transaction;
|
|
import repository.DataException;
|
|
import repository.Repository;
|
|
import repository.RepositoryManager;
|
|
import transform.TransformationException;
|
|
import transform.transaction.TransactionTransformer;
|
|
|
|
public class SerializationTests extends Common {
|
|
|
|
@Test
|
|
public void testGenesisSerialization() throws TransformationException, DataException {
|
|
try (final Repository repository = RepositoryManager.getRepository()) {
|
|
GenesisBlock block = new GenesisBlock(repository);
|
|
|
|
GenesisTransaction transaction = (GenesisTransaction) block.getTransactions().get(1);
|
|
assertNotNull(transaction);
|
|
|
|
GenesisTransactionData genesisTransactionData = (GenesisTransactionData) transaction.getTransactionData();
|
|
|
|
System.out.println(genesisTransactionData.getTimestamp() + ": " + genesisTransactionData.getRecipient() + " received "
|
|
+ genesisTransactionData.getAmount().toPlainString());
|
|
|
|
byte[] bytes = TransactionTransformer.toBytes(genesisTransactionData);
|
|
|
|
GenesisTransactionData parsedTransactionData = (GenesisTransactionData) TransactionTransformer.fromBytes(bytes);
|
|
|
|
System.out.println(parsedTransactionData.getTimestamp() + ": " + parsedTransactionData.getRecipient() + " received "
|
|
+ parsedTransactionData.getAmount().toPlainString());
|
|
|
|
/*
|
|
* NOTE: parsedTransactionData.getSignature() will be null as no signature is present in serialized bytes and calculating the signature is performed
|
|
* by GenesisTransaction, not GenesisTransactionData
|
|
*/
|
|
// Not applicable: assertTrue(Arrays.equals(genesisTransactionData.getSignature(), parsedTransactionData.getSignature()));
|
|
|
|
GenesisTransaction parsedTransaction = new GenesisTransaction(repository, parsedTransactionData);
|
|
assertTrue(Arrays.equals(genesisTransactionData.getSignature(), parsedTransaction.getTransactionData().getSignature()));
|
|
}
|
|
}
|
|
|
|
private void testGenericSerialization(TransactionData transactionData) throws TransformationException {
|
|
assertNotNull(transactionData);
|
|
|
|
byte[] bytes = TransactionTransformer.toBytes(transactionData);
|
|
|
|
TransactionData parsedTransactionData = TransactionTransformer.fromBytes(bytes);
|
|
|
|
assertTrue(Arrays.equals(transactionData.getSignature(), parsedTransactionData.getSignature()));
|
|
|
|
assertEquals(TransactionTransformer.getDataLength(transactionData), bytes.length);
|
|
}
|
|
|
|
@Test
|
|
public void testPaymentSerialization() throws TransformationException, DataException {
|
|
try (final Repository repository = RepositoryManager.getRepository()) {
|
|
// Block 949 has lots of varied transactions
|
|
// Blocks 390 & 754 have only payment transactions
|
|
BlockData blockData = repository.getBlockRepository().fromHeight(754);
|
|
assertNotNull("Block 754 is required for this test", blockData);
|
|
|
|
Block block = new Block(repository, blockData);
|
|
|
|
List<Transaction> transactions = block.getTransactions();
|
|
assertNotNull(transactions);
|
|
|
|
for (Transaction transaction : transactions)
|
|
testGenericSerialization(transaction.getTransactionData());
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testMessageSerialization() throws SQLException, TransformationException {
|
|
// Message transactions went live block 99000
|
|
// Some transactions to be found in block 99001/2/5/6
|
|
}
|
|
|
|
} |