mirror of
https://github.com/Qortal/qortal.git
synced 2025-07-24 10:41:23 +00:00
Proper JSON unmarshalling for settings, blockchain config, genesis block
GenesisBlock (v4) now supports various transaction types (issue-asset, etc.) with generated signatures (like genesis transaction signature) and missing references inserted. JUnit reverted back to v4 for Eclipse support (for now).
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.Test;
|
||||
import org.qora.asset.Asset;
|
||||
import org.qora.data.at.ATStateData;
|
||||
import org.qora.data.block.BlockData;
|
||||
@@ -14,7 +14,7 @@ import org.qora.transaction.DeployAtTransaction;
|
||||
import org.qora.transform.TransformationException;
|
||||
import org.qora.utils.Base58;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Arrays;
|
||||
|
@@ -3,7 +3,7 @@ package org.qora.test;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.Test;
|
||||
import org.qora.block.Block;
|
||||
import org.qora.block.GenesisBlock;
|
||||
import org.qora.data.block.BlockData;
|
||||
@@ -15,7 +15,7 @@ import org.qora.transaction.Transaction;
|
||||
import org.qora.transform.TransformationException;
|
||||
import org.qora.transform.block.BlockTransformer;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class BlockTests extends Common {
|
||||
|
||||
@@ -66,7 +66,7 @@ public class BlockTests extends Common {
|
||||
// Block 949 has lots of varied transactions
|
||||
// Blocks 390 & 754 have only payment transactions
|
||||
BlockData blockData = repository.getBlockRepository().fromHeight(754);
|
||||
assertNotNull(blockData, "Block 754 is required for this test");
|
||||
assertNotNull("Block 754 is required for this test", blockData);
|
||||
|
||||
Block block = new Block(repository, blockData);
|
||||
assertTrue(block.isSignatureValid());
|
||||
@@ -107,7 +107,7 @@ public class BlockTests extends Common {
|
||||
// Block 949 has lots of varied transactions
|
||||
// Blocks 390 & 754 have only payment transactions
|
||||
BlockData blockData = repository.getBlockRepository().fromHeight(754);
|
||||
assertNotNull(blockData, "Block 754 is required for this test");
|
||||
assertNotNull("Block 754 is required for this test", blockData);
|
||||
|
||||
Block block = new Block(repository, blockData);
|
||||
assertTrue(block.isSignatureValid());
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.Test;
|
||||
import org.qora.block.BlockChain;
|
||||
import org.qora.repository.DataException;
|
||||
|
||||
|
@@ -1,24 +1,54 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.qora.controller.Controller;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.security.Security;
|
||||
|
||||
import org.bitcoinj.core.Base58;
|
||||
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||
import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.qora.repository.DataException;
|
||||
import org.qora.repository.Repository;
|
||||
import org.qora.repository.RepositoryFactory;
|
||||
import org.qora.repository.RepositoryManager;
|
||||
import org.qora.repository.hsqldb.HSQLDBRepositoryFactory;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.qora.settings.Settings;
|
||||
|
||||
public class Common {
|
||||
|
||||
@BeforeAll
|
||||
public static final String testConnectionUrl = "jdbc:hsqldb:mem:testdb";
|
||||
public static final String testSettingsFilename = "test-settings.json";
|
||||
|
||||
public static final byte[] v2testPrivateKey = Base58.decode("A9MNsATgQgruBUjxy2rjWY36Yf19uRioKZbiLFT2P7c6");
|
||||
public static final byte[] v2testPublicKey = Base58.decode("2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP");
|
||||
public static final String v2testAddress = "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v";
|
||||
|
||||
static {
|
||||
// This must go before any calls to LogManager/Logger
|
||||
System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
|
||||
|
||||
Security.insertProviderAt(new BouncyCastleProvider(), 0);
|
||||
Security.insertProviderAt(new BouncyCastleJsseProvider(), 1);
|
||||
|
||||
// Load/check settings, which potentially sets up blockchain config, etc.
|
||||
Settings.fileInstance(testSettingsFilename);
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
public static void setRepository() throws DataException {
|
||||
RepositoryFactory repositoryFactory = new HSQLDBRepositoryFactory(Controller.connectionUrl);
|
||||
RepositoryFactory repositoryFactory = new HSQLDBRepositoryFactory(testConnectionUrl);
|
||||
RepositoryManager.setRepositoryFactory(repositoryFactory);
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
@AfterClass
|
||||
public static void closeRepository() throws DataException {
|
||||
RepositoryManager.closeRepositoryFactory();
|
||||
}
|
||||
|
||||
public static void assetEmptyBlockchain(Repository repository) throws DataException {
|
||||
assertEquals("Blockchain should be empty for this test", 0, repository.getBlockRepository().getBlockchainHeight());
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.Test;
|
||||
import org.qora.data.transaction.TransactionData;
|
||||
import org.qora.transaction.CreateAssetOrderTransaction;
|
||||
import org.qora.transaction.CreatePollTransaction;
|
||||
@@ -8,7 +8,7 @@ import org.qora.transaction.IssueAssetTransaction;
|
||||
import org.qora.transform.TransformationException;
|
||||
import org.qora.transform.transaction.TransactionTransformer;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import com.google.common.hash.HashCode;
|
||||
|
||||
|
@@ -1,16 +1,17 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.Test;
|
||||
import org.qora.block.BlockChain;
|
||||
import org.qora.crypto.Crypto;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import com.google.common.hash.HashCode;
|
||||
|
||||
public class CryptoTests {
|
||||
public class CryptoTests extends Common {
|
||||
|
||||
@Test
|
||||
public void testCryptoDigest() {
|
||||
public void testDigest() {
|
||||
byte[] input = HashCode.fromString("00").asBytes();
|
||||
byte[] digest = Crypto.digest(input);
|
||||
byte[] expected = HashCode.fromString("6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d").asBytes();
|
||||
@@ -19,7 +20,7 @@ public class CryptoTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCryptoDoubleDigest() {
|
||||
public void testDoubleDigest() {
|
||||
byte[] input = HashCode.fromString("00").asBytes();
|
||||
byte[] digest = Crypto.doubleDigest(input);
|
||||
byte[] expected = HashCode.fromString("1406e05881e299367766d313e26c05564ec91bf721d31726bd6e46e60689539a").asBytes();
|
||||
@@ -28,9 +29,9 @@ public class CryptoTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCryptoQoraAddress() {
|
||||
public void testPublicKeyToAddress() {
|
||||
byte[] publicKey = HashCode.fromString("775ada64a48a30b3bfc4f1db16bca512d4088704975a62bde78781ce0cba90d6").asBytes();
|
||||
String expected = "QUD9y7NZqTtNwvSAUfewd7zKUGoVivVnTW";
|
||||
String expected = BlockChain.getUseBrokenMD160ForAddresses() ? "QUD9y7NZqTtNwvSAUfewd7zKUGoVivVnTW" : "QPc6TvGJ5RjW6LpwUtafx7XRCdRvyN6rsA";
|
||||
|
||||
assertEquals(expected, Crypto.toAddress(publicKey));
|
||||
}
|
||||
|
@@ -1,90 +0,0 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.qora.block.Block;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
public class ExceptionTests {
|
||||
|
||||
/**
|
||||
* Proof of concept for block processing throwing transaction-related SQLException rather than savepoint-rollback-related SQLException.
|
||||
* <p>
|
||||
* See {@link Block#isValid(Connection)}.
|
||||
*/
|
||||
@Test
|
||||
public void testBlockProcessingExceptions() {
|
||||
try {
|
||||
simulateThrow();
|
||||
fail("Should not return result");
|
||||
} catch (Exception e) {
|
||||
assertEquals("Transaction issue", e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
boolean result = simulateFalse();
|
||||
assertFalse(result);
|
||||
} catch (Exception e) {
|
||||
fail("Unexpected exception: " + e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
boolean result = simulateTrue();
|
||||
assertTrue(result);
|
||||
} catch (Exception e) {
|
||||
fail("Unexpected exception: " + e.getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public boolean simulateThrow() throws Exception {
|
||||
// simulate create savepoint (no-op)
|
||||
|
||||
try {
|
||||
// simulate processing transactions but an exception is thrown
|
||||
throw new Exception("Transaction issue");
|
||||
} finally {
|
||||
// attempt to rollback
|
||||
try {
|
||||
// simulate failing to rollback due to prior exception
|
||||
throw new Exception("Rollback issue");
|
||||
} catch (Exception e) {
|
||||
// test discard of rollback exception, leaving prior exception
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean simulateFalse() throws Exception {
|
||||
// simulate create savepoint (no-op)
|
||||
|
||||
try {
|
||||
// simulate processing transactions but false returned
|
||||
return false;
|
||||
} finally {
|
||||
// attempt to rollback
|
||||
try {
|
||||
// simulate successful rollback (no-op)
|
||||
} catch (Exception e) {
|
||||
// test discard of rollback exception, leaving prior exception
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean simulateTrue() throws Exception {
|
||||
// simulate create savepoint (no-op)
|
||||
|
||||
try {
|
||||
// simulate processing transactions successfully
|
||||
} finally {
|
||||
// attempt to rollback
|
||||
try {
|
||||
// simulate successful rollback (no-op)
|
||||
} catch (Exception e) {
|
||||
// test discard of rollback exception, leaving prior exception
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
@@ -3,53 +3,33 @@ package org.qora.test;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.qora.account.Account;
|
||||
import org.qora.asset.Asset;
|
||||
import org.junit.Test;
|
||||
import org.qora.block.Block;
|
||||
import org.qora.block.GenesisBlock;
|
||||
import org.qora.data.transaction.TransactionData;
|
||||
import org.qora.repository.DataException;
|
||||
import org.qora.repository.Repository;
|
||||
import org.qora.repository.RepositoryFactory;
|
||||
import org.qora.repository.RepositoryManager;
|
||||
import org.qora.repository.hsqldb.HSQLDBRepositoryFactory;
|
||||
import org.qora.transaction.Transaction;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
// Don't extend Common as we want an in-memory database
|
||||
public class GenesisTests {
|
||||
|
||||
public static final String connectionUrl = "jdbc:hsqldb:mem:db/blockchain;create=true";
|
||||
|
||||
@BeforeAll
|
||||
public static void setRepository() throws DataException {
|
||||
RepositoryFactory repositoryFactory = new HSQLDBRepositoryFactory(connectionUrl);
|
||||
RepositoryManager.setRepositoryFactory(repositoryFactory);
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
public static void closeRepository() throws DataException {
|
||||
RepositoryManager.closeRepositoryFactory();
|
||||
}
|
||||
public class GenesisTests extends Common {
|
||||
|
||||
@Test
|
||||
public void testGenesisBlockTransactions() throws DataException {
|
||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||
assertEquals(0, repository.getBlockRepository().getBlockchainHeight(), "Blockchain should be empty for this test");
|
||||
assertEquals("Blockchain should be empty for this test", 0, repository.getBlockRepository().getBlockchainHeight());
|
||||
|
||||
GenesisBlock block = GenesisBlock.getInstance(repository);
|
||||
|
||||
assertNotNull(block);
|
||||
assertNotNull("No genesis block?", block);
|
||||
assertTrue(block.isSignatureValid());
|
||||
// Note: only true if blockchain is empty
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid());
|
||||
assertEquals("Block invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
List<Transaction> transactions = block.getTransactions();
|
||||
assertNotNull(transactions);
|
||||
assertNotNull("No transactions?", transactions);
|
||||
|
||||
for (Transaction transaction : transactions) {
|
||||
assertNotNull(transaction);
|
||||
@@ -67,26 +47,6 @@ public class GenesisTests {
|
||||
// Actually try to process genesis block onto empty blockchain
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
|
||||
// Attempt to load first transaction directly from database
|
||||
TransactionData transactionData = repository.getTransactionRepository().fromSignature(transactions.get(0).getTransactionData().getSignature());
|
||||
assertNotNull(transactionData);
|
||||
|
||||
assertEquals(Transaction.TransactionType.GENESIS, transactionData.getType());
|
||||
assertTrue(transactionData.getFee().compareTo(BigDecimal.ZERO) == 0);
|
||||
assertNull(transactionData.getReference());
|
||||
|
||||
Transaction transaction = Transaction.fromData(repository, transactionData);
|
||||
assertNotNull(transaction);
|
||||
|
||||
assertTrue(transaction.isSignatureValid());
|
||||
assertEquals(Transaction.ValidationResult.OK, transaction.isValid());
|
||||
|
||||
// Check known balance
|
||||
Account testAccount = new Account(repository, "QegT2Ws5YjLQzEZ9YMzWsAZMBE8cAygHZN");
|
||||
BigDecimal testBalance = testAccount.getConfirmedBalance(Asset.QORA);
|
||||
BigDecimal expectedBalance = new BigDecimal("12606834").setScale(8);
|
||||
assertTrue(testBalance.compareTo(expectedBalance) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
99
src/test/java/org/qora/test/GroupApprovalTests.java
Normal file
99
src/test/java/org/qora/test/GroupApprovalTests.java
Normal file
@@ -0,0 +1,99 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.qora.account.PrivateKeyAccount;
|
||||
import org.qora.block.BlockChain;
|
||||
import org.qora.block.BlockGenerator;
|
||||
import org.qora.data.transaction.CreateGroupTransactionData;
|
||||
import org.qora.data.transaction.PaymentTransactionData;
|
||||
import org.qora.data.transaction.TransactionData;
|
||||
import org.qora.group.Group;
|
||||
import org.qora.group.Group.ApprovalThreshold;
|
||||
import org.qora.repository.DataException;
|
||||
import org.qora.repository.Repository;
|
||||
import org.qora.repository.RepositoryManager;
|
||||
import org.qora.transaction.CreateGroupTransaction;
|
||||
import org.qora.transaction.PaymentTransaction;
|
||||
import org.qora.transaction.Transaction;
|
||||
import org.qora.transaction.Transaction.ValidationResult;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public class GroupApprovalTests extends Common {
|
||||
|
||||
/** Check that a tx type that doesn't need approval doesn't accept txGroupId apart from NO_GROUP */
|
||||
@Test
|
||||
public void testNonApprovalTxGroupId() throws DataException {
|
||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||
BlockChain.validate();
|
||||
|
||||
TransactionData transactionData = buildPayment(repository, Group.NO_GROUP);
|
||||
Transaction transaction = new PaymentTransaction(repository, transactionData);
|
||||
assertEquals(ValidationResult.OK, transaction.isValidUnconfirmed());
|
||||
|
||||
int groupId = createGroup(repository);
|
||||
|
||||
transactionData = buildPayment(repository, groupId);
|
||||
transaction = new PaymentTransaction(repository, transactionData);
|
||||
assertEquals(ValidationResult.INVALID_TX_GROUP_ID, transaction.isValidUnconfirmed());
|
||||
}
|
||||
}
|
||||
|
||||
private PaymentTransactionData buildPayment(Repository repository, int txGroupId) throws DataException {
|
||||
long timestamp = System.currentTimeMillis() - 1000L;
|
||||
byte[] reference = repository.getAccountRepository().getLastReference(v2testAddress);
|
||||
byte[] senderPublicKey = v2testPublicKey;
|
||||
String recipient = v2testAddress;
|
||||
BigDecimal amount = BigDecimal.ONE.setScale(8);
|
||||
BigDecimal fee = BigDecimal.ONE.setScale(8);
|
||||
|
||||
return new PaymentTransactionData(timestamp, txGroupId, reference, senderPublicKey, recipient, amount, fee);
|
||||
}
|
||||
|
||||
private int createGroup(Repository repository) throws DataException {
|
||||
long timestamp = System.currentTimeMillis() - 1000L;
|
||||
int txGroupId = Group.NO_GROUP;
|
||||
byte[] reference = repository.getAccountRepository().getLastReference(v2testAddress);
|
||||
byte[] creatorPublicKey = v2testPublicKey;
|
||||
String owner = v2testAddress;
|
||||
String groupName = "test-group";
|
||||
String description = "test group description";
|
||||
boolean isOpen = false;
|
||||
ApprovalThreshold approvalThreshold = ApprovalThreshold.ONE;
|
||||
int minimumBlockDelay = 0;
|
||||
int maximumBlockDelay = 1440;
|
||||
Integer groupId = null;
|
||||
BigDecimal fee = BigDecimal.ONE.setScale(8);
|
||||
byte[] signature = null;
|
||||
|
||||
TransactionData transactionData = new CreateGroupTransactionData(timestamp, txGroupId, reference, creatorPublicKey, owner, groupName, description,
|
||||
isOpen, approvalThreshold, minimumBlockDelay, maximumBlockDelay, groupId, fee, signature);
|
||||
Transaction transaction = new CreateGroupTransaction(repository, transactionData);
|
||||
|
||||
// Sign transaction
|
||||
PrivateKeyAccount signer = new PrivateKeyAccount(repository, v2testPrivateKey);
|
||||
transaction.sign(signer);
|
||||
|
||||
// Add to unconfirmed
|
||||
if (!transaction.isSignatureValid())
|
||||
throw new RuntimeException("CREATE_GROUP transaction's signature invalid");
|
||||
|
||||
ValidationResult result = transaction.isValidUnconfirmed();
|
||||
if (result != ValidationResult.OK)
|
||||
throw new RuntimeException(String.format("CREATE_GROUP transaction invalid: %s", result.name()));
|
||||
|
||||
repository.getTransactionRepository().save(transactionData);
|
||||
repository.getTransactionRepository().unconfirmTransaction(transactionData);
|
||||
repository.saveChanges();
|
||||
|
||||
// Generate block
|
||||
BlockGenerator.generateTestingBlock(repository, signer);
|
||||
|
||||
// Return assigned groupId
|
||||
transactionData = repository.getTransactionRepository().fromSignature(transactionData.getSignature());
|
||||
return ((CreateGroupTransactionData) transactionData).getGroupId();
|
||||
}
|
||||
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.Test;
|
||||
import org.qora.account.PublicKeyAccount;
|
||||
import org.qora.data.transaction.PaymentTransactionData;
|
||||
import org.qora.data.transaction.TransactionData;
|
||||
@@ -11,7 +11,7 @@ import org.qora.repository.TransactionRepository;
|
||||
import org.qora.transaction.Transaction.TransactionType;
|
||||
import org.qora.utils.Base58;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class LoadTests extends Common {
|
||||
|
||||
@@ -20,15 +20,14 @@ public class LoadTests extends Common {
|
||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||
TransactionRepository transactionRepository = repository.getTransactionRepository();
|
||||
|
||||
assertTrue(repository.getBlockRepository().getBlockchainHeight() >= 49778,
|
||||
"Migrate from old database to at least block 49778 before running this test");
|
||||
assertTrue("Migrate from old database to at least block 49778 before running this test", repository.getBlockRepository().getBlockchainHeight() >= 49778);
|
||||
|
||||
String signature58 = "1211ZPwG3hk5evWzXCZi9hMDRpwumWmkENjwWkeTCik9xA5uoYnxzF7rwR5hmHH3kG2RXo7ToCAaRc7dvnynByJt";
|
||||
byte[] signature = Base58.decode(signature58);
|
||||
|
||||
TransactionData transactionData = transactionRepository.fromSignature(signature);
|
||||
assertNotNull(transactionData, "Transaction data not loaded from repository");
|
||||
assertEquals(TransactionType.PAYMENT, transactionData.getType(), "Transaction data not PAYMENT type");
|
||||
assertNotNull("Transaction data not loaded from repository", transactionData);
|
||||
assertEquals("Transaction data not PAYMENT type", TransactionType.PAYMENT, transactionData.getType());
|
||||
assertEquals("QXwu8924WdgPoRmtiWQBUMF6eedmp1Hu2E", PublicKeyAccount.getAddress(transactionData.getCreatorPublicKey()));
|
||||
|
||||
PaymentTransactionData paymentTransactionData = (PaymentTransactionData) transactionData;
|
||||
@@ -47,8 +46,7 @@ public class LoadTests extends Common {
|
||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||
TransactionRepository transactionRepository = repository.getTransactionRepository();
|
||||
|
||||
assertTrue(repository.getBlockRepository().getBlockchainHeight() >= 49778,
|
||||
"Migrate from old database to at least block 49778 before running this test");
|
||||
assertTrue("Migrate from old database to at least block 49778 before running this test", repository.getBlockRepository().getBlockchainHeight() >= 49778);
|
||||
|
||||
String signature58 = "1211ZPwG3hk5evWzXCZi9hMDRpwumWmkENjwWkeTCik9xA5uoYnxzF7rwR5hmHH3kG2RXo7ToCAaRc7dvnynByJt";
|
||||
byte[] signature = Base58.decode(signature58);
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.Test;
|
||||
import org.qora.data.block.BlockData;
|
||||
import org.qora.data.transaction.TransactionData;
|
||||
import org.qora.repository.DataException;
|
||||
@@ -10,7 +10,7 @@ import org.qora.repository.TransactionRepository;
|
||||
import org.qora.transaction.Transaction.TransactionType;
|
||||
import org.qora.utils.Base58;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class NavigationTests extends Common {
|
||||
|
||||
@@ -19,8 +19,7 @@ public class NavigationTests extends Common {
|
||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||
TransactionRepository transactionRepository = repository.getTransactionRepository();
|
||||
|
||||
assertTrue(repository.getBlockRepository().getBlockchainHeight() >= 49778,
|
||||
"Migrate from old database to at least block 49778 before running this test");
|
||||
assertTrue("Migrate from old database to at least block 49778 before running this test", repository.getBlockRepository().getBlockchainHeight() >= 49778);
|
||||
|
||||
String signature58 = "1211ZPwG3hk5evWzXCZi9hMDRpwumWmkENjwWkeTCik9xA5uoYnxzF7rwR5hmHH3kG2RXo7ToCAaRc7dvnynByJt";
|
||||
byte[] signature = Base58.decode(signature58);
|
||||
@@ -28,15 +27,15 @@ public class NavigationTests extends Common {
|
||||
System.out.println("Navigating to Block from transaction " + signature58);
|
||||
|
||||
TransactionData transactionData = transactionRepository.fromSignature(signature);
|
||||
assertNotNull(transactionData, "Transaction data not loaded from repository");
|
||||
assertEquals(TransactionType.PAYMENT, transactionData.getType(), "Transaction data not PAYMENT type");
|
||||
assertNotNull("Transaction data not loaded from repository", transactionData);
|
||||
assertEquals("Transaction data not PAYMENT type", TransactionType.PAYMENT, transactionData.getType());
|
||||
|
||||
int transactionHeight = transactionRepository.getHeightFromSignature(signature);
|
||||
assertNotEquals(0, transactionHeight, "Transaction not found or transaction's block not found");
|
||||
assertEquals(49778, transactionHeight, "Transaction's block height expected to be 49778");
|
||||
assertFalse("Transaction not found or transaction's block not found", transactionHeight == 0);
|
||||
assertEquals("Transaction's block height expected to be 49778", 49778, transactionHeight);
|
||||
|
||||
BlockData blockData = repository.getBlockRepository().fromHeight(transactionHeight);
|
||||
assertNotNull(blockData, "Block 49778 not loaded from database");
|
||||
assertNotNull("Block 49778 not loaded from database", blockData);
|
||||
System.out.println("Block " + blockData.getHeight() + ", signature: " + Base58.encode(blockData.getSignature()));
|
||||
|
||||
assertEquals((Integer) 49778, blockData.getHeight());
|
||||
|
@@ -1,11 +1,11 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.Test;
|
||||
import org.qora.repository.DataException;
|
||||
import org.qora.repository.Repository;
|
||||
import org.qora.repository.RepositoryManager;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
@@ -3,7 +3,7 @@ package org.qora.test;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.Test;
|
||||
import org.qora.account.PublicKeyAccount;
|
||||
import org.qora.data.transaction.PaymentTransactionData;
|
||||
import org.qora.group.Group;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.Test;
|
||||
import org.qora.block.Block;
|
||||
import org.qora.block.GenesisBlock;
|
||||
import org.qora.data.block.BlockData;
|
||||
@@ -15,7 +15,7 @@ import org.qora.transaction.Transaction.TransactionType;
|
||||
import org.qora.transform.TransformationException;
|
||||
import org.qora.transform.transaction.TransactionTransformer;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -60,15 +60,15 @@ public class SerializationTests extends Common {
|
||||
|
||||
TransactionData parsedTransactionData = TransactionTransformer.fromBytes(bytes);
|
||||
|
||||
assertTrue(Arrays.equals(transactionData.getSignature(), parsedTransactionData.getSignature()), "Transaction signature mismatch");
|
||||
assertTrue("Transaction signature mismatch", Arrays.equals(transactionData.getSignature(), parsedTransactionData.getSignature()));
|
||||
|
||||
assertEquals(bytes.length, TransactionTransformer.getDataLength(transactionData), "Data length mismatch");
|
||||
assertEquals("Data length mismatch", bytes.length, TransactionTransformer.getDataLength(transactionData));
|
||||
}
|
||||
|
||||
private void testSpecificBlockTransactions(int height, TransactionType type) throws DataException, TransformationException {
|
||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||
BlockData blockData = repository.getBlockRepository().fromHeight(height);
|
||||
assertNotNull(blockData, "Block " + height + " is required for this test");
|
||||
assertNotNull("Block " + height + " is required for this test", blockData);
|
||||
|
||||
Block block = new Block(repository, blockData);
|
||||
|
||||
|
64
src/test/java/org/qora/test/SettingsTests.java
Normal file
64
src/test/java/org/qora/test/SettingsTests.java
Normal file
@@ -0,0 +1,64 @@
|
||||
package org.qora.test;
|
||||
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.JAXBException;
|
||||
import javax.xml.bind.Unmarshaller;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import org.eclipse.persistence.jaxb.JAXBContextFactory;
|
||||
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
|
||||
import org.qora.block.BlockChain;
|
||||
import org.qora.data.transaction.TransactionData;
|
||||
import org.qora.settings.Settings;
|
||||
|
||||
public class SettingsTests {
|
||||
|
||||
public static void main(String[] args) throws JAXBException, IOException {
|
||||
// JAXBContext jc = JAXBContext.newInstance(SettingsData.class);
|
||||
JAXBContext jc = JAXBContextFactory.createContext(new Class[] {Settings.class, BlockChain.class, TransactionData.class}, null);
|
||||
|
||||
// Create the Unmarshaller Object using the JaxB Context
|
||||
Unmarshaller unmarshaller = jc.createUnmarshaller();
|
||||
|
||||
// Set the Unmarshaller media type to JSON or XML
|
||||
unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json");
|
||||
|
||||
// Set it to true if you need to include the JSON root element in the JSON input
|
||||
unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false);
|
||||
|
||||
Settings settings = null;
|
||||
|
||||
// Create the StreamSource by creating Reader to the JSON input
|
||||
try (Reader settingsReader = new FileReader("settings.json")) {
|
||||
StreamSource json = new StreamSource(settingsReader);
|
||||
|
||||
// Getting the SettingsData pojo from the json
|
||||
settings = unmarshaller.unmarshal(json, Settings.class).getValue();
|
||||
|
||||
System.out.println("API settings:");
|
||||
System.out.println(String.format("Enabled: %s, port: %d, restricted: %s, whitelist: %s", yn(settings.isApiEnabled()), settings.getApiPort(),
|
||||
yn(settings.isApiRestricted()), String.join(", ", settings.getApiWhitelist())));
|
||||
}
|
||||
|
||||
String blockchainConfig = settings.getBlockchainConfig();
|
||||
if (blockchainConfig != null)
|
||||
try (Reader settingsReader = new FileReader(blockchainConfig)) {
|
||||
StreamSource json = new StreamSource(settingsReader);
|
||||
|
||||
// Getting the BlockChainData pojo from the JSON
|
||||
BlockChain blockchain = unmarshaller.unmarshal(json, BlockChain.class).getValue();
|
||||
|
||||
System.out.println("BlockChain settings:");
|
||||
System.out.println(String.format("TestNet: %s", yn(blockchain.isTestNet())));
|
||||
}
|
||||
}
|
||||
|
||||
private static String yn(boolean flag) {
|
||||
return flag ? "yes" : "no";
|
||||
}
|
||||
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.Test;
|
||||
import org.qora.account.PrivateKeyAccount;
|
||||
import org.qora.block.Block;
|
||||
import org.qora.block.GenesisBlock;
|
||||
@@ -11,7 +11,7 @@ import org.qora.repository.RepositoryManager;
|
||||
import org.qora.utils.Base58;
|
||||
import org.qora.utils.NTP;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package org.qora.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
import org.qora.account.Account;
|
||||
import org.qora.account.PrivateKeyAccount;
|
||||
import org.qora.account.PublicKeyAccount;
|
||||
@@ -37,10 +38,7 @@ import org.qora.repository.AccountRepository;
|
||||
import org.qora.repository.AssetRepository;
|
||||
import org.qora.repository.DataException;
|
||||
import org.qora.repository.Repository;
|
||||
import org.qora.repository.RepositoryFactory;
|
||||
import org.qora.repository.RepositoryManager;
|
||||
import org.qora.repository.hsqldb.HSQLDBRepositoryFactory;
|
||||
import org.qora.settings.Settings;
|
||||
import org.qora.transaction.BuyNameTransaction;
|
||||
import org.qora.transaction.CancelAssetOrderTransaction;
|
||||
import org.qora.transaction.CancelSellNameTransaction;
|
||||
@@ -58,8 +56,7 @@ import org.qora.transaction.UpdateNameTransaction;
|
||||
import org.qora.transaction.VoteOnPollTransaction;
|
||||
import org.qora.transaction.Transaction.ValidationResult;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.math.BigDecimal;
|
||||
@@ -68,14 +65,9 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import com.google.common.hash.HashCode;
|
||||
|
||||
// Don't extend Common as we want to use an in-memory database
|
||||
public class TransactionTests {
|
||||
|
||||
private static final String connectionUrl = "jdbc:hsqldb:mem:db/blockchain;create=true";
|
||||
public class TransactionTests extends Common {
|
||||
|
||||
private static final byte[] generatorSeed = HashCode.fromString("0123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210").asBytes();
|
||||
private static final byte[] senderSeed = HashCode.fromString("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef").asBytes();
|
||||
@@ -92,22 +84,11 @@ public class TransactionTests {
|
||||
private PrivateKeyAccount generator;
|
||||
private byte[] reference;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void createTestAccounts(Long genesisTimestamp) throws DataException {
|
||||
RepositoryFactory repositoryFactory = new HSQLDBRepositoryFactory(connectionUrl);
|
||||
RepositoryManager.setRepositoryFactory(repositoryFactory);
|
||||
|
||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||
assertEquals(0, repository.getBlockRepository().getBlockchainHeight(), "Blockchain should be empty for this test");
|
||||
assertEquals("Blockchain should be empty for this test", 0, repository.getBlockRepository().getBlockchainHeight());
|
||||
}
|
||||
|
||||
// [Un]set genesis timestamp as required by test
|
||||
JSONObject settingsJSON = new JSONObject();
|
||||
if (genesisTimestamp != null)
|
||||
settingsJSON.put("testnetstamp", genesisTimestamp);
|
||||
|
||||
Settings.test(settingsJSON);
|
||||
|
||||
// This needs to be called outside of acquiring our own repository or it will deadlock
|
||||
BlockChain.validate();
|
||||
|
||||
@@ -137,9 +118,9 @@ public class TransactionTests {
|
||||
repository.saveChanges();
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void closeRepository() throws DataException {
|
||||
RepositoryManager.closeRepositoryFactory();
|
||||
@After
|
||||
public void afterTest() throws DataException {
|
||||
repository.close();
|
||||
}
|
||||
|
||||
private Transaction createPayment(PrivateKeyAccount sender, String recipient) throws DataException {
|
||||
@@ -147,7 +128,8 @@ public class TransactionTests {
|
||||
BigDecimal amount = genericPaymentAmount;
|
||||
BigDecimal fee = BigDecimal.ONE;
|
||||
long timestamp = parentBlockData.getTimestamp() + 1_000;
|
||||
PaymentTransactionData paymentTransactionData = new PaymentTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(), recipient, amount, fee);
|
||||
PaymentTransactionData paymentTransactionData = new PaymentTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(), recipient,
|
||||
amount, fee);
|
||||
|
||||
Transaction paymentTransaction = new PaymentTransaction(repository, paymentTransactionData);
|
||||
paymentTransaction.sign(sender);
|
||||
@@ -164,8 +146,8 @@ public class TransactionTests {
|
||||
BigDecimal amount = BigDecimal.valueOf(1_000L);
|
||||
BigDecimal fee = BigDecimal.ONE;
|
||||
long timestamp = parentBlockData.getTimestamp() + 1_000;
|
||||
PaymentTransactionData paymentTransactionData = new PaymentTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(), recipient.getAddress(),
|
||||
amount, fee);
|
||||
PaymentTransactionData paymentTransactionData = new PaymentTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(),
|
||||
recipient.getAddress(), amount, fee);
|
||||
|
||||
Transaction paymentTransaction = new PaymentTransaction(repository, paymentTransactionData);
|
||||
paymentTransaction.sign(sender);
|
||||
@@ -177,8 +159,8 @@ public class TransactionTests {
|
||||
block.addTransaction(paymentTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -186,21 +168,21 @@ public class TransactionTests {
|
||||
// Check sender's balance
|
||||
BigDecimal expectedBalance = initialSenderBalance.subtract(amount).subtract(fee);
|
||||
BigDecimal actualBalance = accountRepository.getBalance(sender.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Sender's new balance incorrect");
|
||||
assertTrue("Sender's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Fee should be in generator's balance
|
||||
expectedBalance = initialGeneratorBalance.add(fee);
|
||||
actualBalance = accountRepository.getBalance(generator.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Generator's new balance incorrect");
|
||||
assertTrue("Generator's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Amount should be in recipient's balance
|
||||
expectedBalance = amount;
|
||||
actualBalance = accountRepository.getBalance(recipient.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Recipient's new balance incorrect");
|
||||
assertTrue("Recipient's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check recipient's reference
|
||||
byte[] recipientsReference = recipient.getLastReference();
|
||||
assertTrue(Arrays.equals(paymentTransaction.getTransactionData().getSignature(), recipientsReference), "Recipient's new reference incorrect");
|
||||
assertTrue("Recipient's new reference incorrect", Arrays.equals(paymentTransaction.getTransactionData().getSignature(), recipientsReference));
|
||||
|
||||
// Orphan block
|
||||
block.orphan();
|
||||
@@ -208,11 +190,11 @@ public class TransactionTests {
|
||||
|
||||
// Check sender's balance
|
||||
actualBalance = accountRepository.getBalance(sender.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(initialSenderBalance.compareTo(actualBalance) == 0, "Sender's reverted balance incorrect");
|
||||
assertTrue("Sender's reverted balance incorrect", initialSenderBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check generator's balance
|
||||
actualBalance = accountRepository.getBalance(generator.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(initialGeneratorBalance.compareTo(actualBalance) == 0, "Generator's new balance incorrect");
|
||||
assertTrue("Generator's new balance incorrect", initialGeneratorBalance.compareTo(actualBalance) == 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -225,8 +207,8 @@ public class TransactionTests {
|
||||
|
||||
BigDecimal fee = BigDecimal.ONE;
|
||||
long timestamp = parentBlockData.getTimestamp() + 1_000;
|
||||
RegisterNameTransactionData registerNameTransactionData = new RegisterNameTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(), sender.getAddress(),
|
||||
name, data, fee);
|
||||
RegisterNameTransactionData registerNameTransactionData = new RegisterNameTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(),
|
||||
sender.getAddress(), name, data, fee);
|
||||
|
||||
Transaction registerNameTransaction = new RegisterNameTransaction(repository, registerNameTransactionData);
|
||||
registerNameTransaction.sign(sender);
|
||||
@@ -238,8 +220,8 @@ public class TransactionTests {
|
||||
block.addTransaction(registerNameTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -247,19 +229,19 @@ public class TransactionTests {
|
||||
// Check sender's balance
|
||||
BigDecimal expectedBalance = initialSenderBalance.subtract(fee);
|
||||
BigDecimal actualBalance = accountRepository.getBalance(sender.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Sender's new balance incorrect");
|
||||
assertTrue("Sender's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Fee should be in generator's balance
|
||||
expectedBalance = initialGeneratorBalance.add(fee);
|
||||
actualBalance = accountRepository.getBalance(generator.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Generator's new balance incorrect");
|
||||
assertTrue("Generator's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check name was registered
|
||||
NameData actualNameData = this.repository.getNameRepository().fromName(name);
|
||||
assertNotNull(actualNameData);
|
||||
|
||||
// Check sender's reference
|
||||
assertTrue(Arrays.equals(registerNameTransactionData.getSignature(), sender.getLastReference()), "Sender's new reference incorrect");
|
||||
assertTrue("Sender's new reference incorrect", Arrays.equals(registerNameTransactionData.getSignature(), sender.getLastReference()));
|
||||
|
||||
// Update variables for use by other tests
|
||||
reference = sender.getLastReference();
|
||||
@@ -294,8 +276,8 @@ public class TransactionTests {
|
||||
block.addTransaction(updateNameTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -327,7 +309,8 @@ public class TransactionTests {
|
||||
|
||||
BigDecimal fee = BigDecimal.ONE;
|
||||
long timestamp = parentBlockData.getTimestamp() + 1_000;
|
||||
SellNameTransactionData sellNameTransactionData = new SellNameTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(), name, amount, fee);
|
||||
SellNameTransactionData sellNameTransactionData = new SellNameTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(), name, amount,
|
||||
fee);
|
||||
|
||||
Transaction sellNameTransaction = new SellNameTransaction(repository, sellNameTransactionData);
|
||||
sellNameTransaction.sign(sender);
|
||||
@@ -339,8 +322,8 @@ public class TransactionTests {
|
||||
block.addTransaction(sellNameTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -378,7 +361,8 @@ public class TransactionTests {
|
||||
|
||||
BigDecimal fee = BigDecimal.ONE;
|
||||
long timestamp = parentBlockData.getTimestamp() + 1_000;
|
||||
CancelSellNameTransactionData cancelSellNameTransactionData = new CancelSellNameTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(), name, fee);
|
||||
CancelSellNameTransactionData cancelSellNameTransactionData = new CancelSellNameTransactionData(timestamp, Group.NO_GROUP, reference,
|
||||
sender.getPublicKey(), name, fee);
|
||||
|
||||
Transaction cancelSellNameTransaction = new CancelSellNameTransaction(repository, cancelSellNameTransactionData);
|
||||
cancelSellNameTransaction.sign(sender);
|
||||
@@ -390,8 +374,8 @@ public class TransactionTests {
|
||||
block.addTransaction(cancelSellNameTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -443,8 +427,8 @@ public class TransactionTests {
|
||||
|
||||
BigDecimal fee = BigDecimal.ONE;
|
||||
long timestamp = parentBlockData.getTimestamp() + 1_000;
|
||||
BuyNameTransactionData buyNameTransactionData = new BuyNameTransactionData(timestamp, Group.NO_GROUP, buyersReference, buyer.getPublicKey(),
|
||||
name, originalNameData.getSalePrice(), seller, nameReference, fee);
|
||||
BuyNameTransactionData buyNameTransactionData = new BuyNameTransactionData(timestamp, Group.NO_GROUP, buyersReference, buyer.getPublicKey(), name,
|
||||
originalNameData.getSalePrice(), seller, nameReference, fee);
|
||||
|
||||
Transaction buyNameTransaction = new BuyNameTransaction(repository, buyNameTransactionData);
|
||||
buyNameTransaction.sign(buyer);
|
||||
@@ -456,8 +440,8 @@ public class TransactionTests {
|
||||
block.addTransaction(buyNameTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -496,8 +480,8 @@ public class TransactionTests {
|
||||
Account recipient = new PublicKeyAccount(repository, recipientSeed);
|
||||
BigDecimal fee = BigDecimal.ONE;
|
||||
long timestamp = parentBlockData.getTimestamp() + 1_000;
|
||||
CreatePollTransactionData createPollTransactionData = new CreatePollTransactionData(timestamp, Group.NO_GROUP, reference,
|
||||
sender.getPublicKey(), recipient.getAddress(), pollName, description, pollOptions, fee);
|
||||
CreatePollTransactionData createPollTransactionData = new CreatePollTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(),
|
||||
recipient.getAddress(), pollName, description, pollOptions, fee);
|
||||
|
||||
Transaction createPollTransaction = new CreatePollTransaction(repository, createPollTransactionData);
|
||||
createPollTransaction.sign(sender);
|
||||
@@ -509,8 +493,8 @@ public class TransactionTests {
|
||||
block.addTransaction(createPollTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -518,19 +502,19 @@ public class TransactionTests {
|
||||
// Check sender's balance
|
||||
BigDecimal expectedBalance = initialSenderBalance.subtract(fee);
|
||||
BigDecimal actualBalance = accountRepository.getBalance(sender.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Sender's new balance incorrect");
|
||||
assertTrue("Sender's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Fee should be in generator's balance
|
||||
expectedBalance = initialGeneratorBalance.add(fee);
|
||||
actualBalance = accountRepository.getBalance(generator.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Generator's new balance incorrect");
|
||||
assertTrue("Generator's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check poll was created
|
||||
PollData actualPollData = this.repository.getVotingRepository().fromPollName(pollName);
|
||||
assertNotNull(actualPollData);
|
||||
|
||||
// Check sender's reference
|
||||
assertTrue(Arrays.equals(createPollTransactionData.getSignature(), sender.getLastReference()), "Sender's new reference incorrect");
|
||||
assertTrue("Sender's new reference incorrect", Arrays.equals(createPollTransactionData.getSignature(), sender.getLastReference()));
|
||||
|
||||
// Update variables for use by other tests
|
||||
reference = sender.getLastReference();
|
||||
@@ -550,8 +534,8 @@ public class TransactionTests {
|
||||
|
||||
for (int optionIndex = 0; optionIndex <= pollOptionsSize; ++optionIndex) {
|
||||
// Make a vote-on-poll transaction
|
||||
VoteOnPollTransactionData voteOnPollTransactionData = new VoteOnPollTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(), pollName,
|
||||
optionIndex, fee);
|
||||
VoteOnPollTransactionData voteOnPollTransactionData = new VoteOnPollTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(),
|
||||
pollName, optionIndex, fee);
|
||||
|
||||
Transaction voteOnPollTransaction = new VoteOnPollTransaction(repository, voteOnPollTransactionData);
|
||||
voteOnPollTransaction.sign(sender);
|
||||
@@ -568,8 +552,8 @@ public class TransactionTests {
|
||||
block.addTransaction(voteOnPollTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -589,10 +573,10 @@ public class TransactionTests {
|
||||
List<VoteOnPollData> votes = repository.getVotingRepository().getVotes(pollName);
|
||||
assertNotNull(votes);
|
||||
|
||||
assertEquals(1, votes.size(), "Only one vote expected");
|
||||
assertEquals("Only one vote expected", 1, votes.size());
|
||||
|
||||
assertEquals(pollOptionsSize - 1, votes.get(0).getOptionIndex(), "Wrong vote option index");
|
||||
assertTrue(Arrays.equals(sender.getPublicKey(), votes.get(0).getVoterPublicKey()), "Wrong voter public key");
|
||||
assertEquals("Wrong vote option index", pollOptionsSize - 1, votes.get(0).getOptionIndex());
|
||||
assertTrue("Wrong voter public key", Arrays.equals(sender.getPublicKey(), votes.get(0).getVoterPublicKey()));
|
||||
|
||||
// Orphan last block
|
||||
BlockData lastBlockData = repository.getBlockRepository().getLastBlock();
|
||||
@@ -604,10 +588,10 @@ public class TransactionTests {
|
||||
votes = repository.getVotingRepository().getVotes(pollName);
|
||||
assertNotNull(votes);
|
||||
|
||||
assertEquals(1, votes.size(), "Only one vote expected");
|
||||
assertEquals("Only one vote expected", 1, votes.size());
|
||||
|
||||
assertEquals(pollOptionsSize - 1 - 1, votes.get(0).getOptionIndex(), "Wrong vote option index");
|
||||
assertTrue(Arrays.equals(sender.getPublicKey(), votes.get(0).getVoterPublicKey()), "Wrong voter public key");
|
||||
assertEquals("Wrong vote option index", pollOptionsSize - 1 - 1, votes.get(0).getOptionIndex());
|
||||
assertTrue("Wrong voter public key", Arrays.equals(sender.getPublicKey(), votes.get(0).getVoterPublicKey()));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -635,8 +619,8 @@ public class TransactionTests {
|
||||
block.addTransaction(issueAssetTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -644,12 +628,12 @@ public class TransactionTests {
|
||||
// Check sender's balance
|
||||
BigDecimal expectedBalance = initialSenderBalance.subtract(fee);
|
||||
BigDecimal actualBalance = accountRepository.getBalance(sender.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Sender's new balance incorrect");
|
||||
assertTrue("Sender's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Fee should be in generator's balance
|
||||
expectedBalance = initialGeneratorBalance.add(fee);
|
||||
actualBalance = accountRepository.getBalance(generator.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Generator's new balance incorrect");
|
||||
assertTrue("Generator's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check we now have an assetId
|
||||
Long assetId = issueAssetTransactionData.getAssetId();
|
||||
@@ -673,11 +657,11 @@ public class TransactionTests {
|
||||
|
||||
// Check sender's balance
|
||||
actualBalance = accountRepository.getBalance(sender.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(initialSenderBalance.compareTo(actualBalance) == 0, "Sender's reverted balance incorrect");
|
||||
assertTrue("Sender's reverted balance incorrect", initialSenderBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check generator's balance
|
||||
actualBalance = accountRepository.getBalance(generator.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(initialGeneratorBalance.compareTo(actualBalance) == 0, "Generator's reverted balance incorrect");
|
||||
assertTrue("Generator's reverted balance incorrect", initialGeneratorBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check asset no longer exists
|
||||
assertFalse(assetRepo.assetExists(assetId));
|
||||
@@ -725,8 +709,8 @@ public class TransactionTests {
|
||||
block.addTransaction(transferAssetTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -734,12 +718,12 @@ public class TransactionTests {
|
||||
// Check sender's balance
|
||||
BigDecimal expectedBalance = originalSenderBalance.subtract(fee);
|
||||
BigDecimal actualBalance = accountRepository.getBalance(sender.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Sender's new balance incorrect");
|
||||
assertTrue("Sender's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Fee should be in generator's balance
|
||||
expectedBalance = originalGeneratorBalance.add(fee);
|
||||
actualBalance = accountRepository.getBalance(generator.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Generator's new balance incorrect");
|
||||
assertTrue("Generator's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check asset balances
|
||||
BigDecimal actualSenderAssetBalance = sender.getConfirmedBalance(assetId);
|
||||
@@ -757,11 +741,11 @@ public class TransactionTests {
|
||||
|
||||
// Check sender's balance
|
||||
actualBalance = accountRepository.getBalance(sender.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(originalSenderBalance.compareTo(actualBalance) == 0, "Sender's reverted balance incorrect");
|
||||
assertTrue("Sender's reverted balance incorrect", originalSenderBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check generator's balance
|
||||
actualBalance = accountRepository.getBalance(generator.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(originalGeneratorBalance.compareTo(actualBalance) == 0, "Generator's reverted balance incorrect");
|
||||
assertTrue("Generator's reverted balance incorrect", originalGeneratorBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check asset balances
|
||||
actualSenderAssetBalance = sender.getConfirmedBalance(assetId);
|
||||
@@ -817,8 +801,8 @@ public class TransactionTests {
|
||||
BigDecimal fee = BigDecimal.ONE;
|
||||
long timestamp = parentBlockData.getTimestamp() + 1_000;
|
||||
|
||||
CreateAssetOrderTransactionData createOrderTransactionData = new CreateAssetOrderTransactionData(timestamp, Group.NO_GROUP, buyersReference, buyer.getPublicKey(), haveAssetId,
|
||||
wantAssetId, amount, price, fee);
|
||||
CreateAssetOrderTransactionData createOrderTransactionData = new CreateAssetOrderTransactionData(timestamp, Group.NO_GROUP, buyersReference,
|
||||
buyer.getPublicKey(), haveAssetId, wantAssetId, amount, price, fee);
|
||||
Transaction createOrderTransaction = new CreateAssetOrderTransaction(this.repository, createOrderTransactionData);
|
||||
createOrderTransaction.sign(buyer);
|
||||
assertTrue(createOrderTransaction.isSignatureValid());
|
||||
@@ -829,8 +813,8 @@ public class TransactionTests {
|
||||
block.addTransaction(createOrderTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -898,7 +882,8 @@ public class TransactionTests {
|
||||
BigDecimal fee = BigDecimal.ONE;
|
||||
long timestamp = parentBlockData.getTimestamp() + 1_000;
|
||||
byte[] buyersReference = buyer.getLastReference();
|
||||
CancelAssetOrderTransactionData cancelOrderTransactionData = new CancelAssetOrderTransactionData(timestamp, Group.NO_GROUP, buyersReference, buyer.getPublicKey(), orderId, fee);
|
||||
CancelAssetOrderTransactionData cancelOrderTransactionData = new CancelAssetOrderTransactionData(timestamp, Group.NO_GROUP, buyersReference,
|
||||
buyer.getPublicKey(), orderId, fee);
|
||||
|
||||
Transaction cancelOrderTransaction = new CancelAssetOrderTransaction(this.repository, cancelOrderTransactionData);
|
||||
cancelOrderTransaction.sign(buyer);
|
||||
@@ -910,8 +895,8 @@ public class TransactionTests {
|
||||
block.addTransaction(cancelOrderTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -973,8 +958,8 @@ public class TransactionTests {
|
||||
long timestamp = parentBlockData.getTimestamp() + 1_000;
|
||||
BigDecimal senderPreTradeWantBalance = sender.getConfirmedBalance(wantAssetId);
|
||||
|
||||
CreateAssetOrderTransactionData createOrderTransactionData = new CreateAssetOrderTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(), haveAssetId,
|
||||
wantAssetId, amount, price, fee);
|
||||
CreateAssetOrderTransactionData createOrderTransactionData = new CreateAssetOrderTransactionData(timestamp, Group.NO_GROUP, reference,
|
||||
sender.getPublicKey(), haveAssetId, wantAssetId, amount, price, fee);
|
||||
Transaction createOrderTransaction = new CreateAssetOrderTransaction(this.repository, createOrderTransactionData);
|
||||
createOrderTransaction.sign(sender);
|
||||
assertTrue(createOrderTransaction.isSignatureValid());
|
||||
@@ -985,8 +970,8 @@ public class TransactionTests {
|
||||
block.addTransaction(createOrderTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -999,7 +984,7 @@ public class TransactionTests {
|
||||
// Check order has trades
|
||||
List<TradeData> trades = assetRepo.getOrdersTrades(orderId);
|
||||
assertNotNull(trades);
|
||||
assertEquals(1, trades.size(), "Trade didn't happen");
|
||||
assertEquals("Trade didn't happen", 1, trades.size());
|
||||
TradeData tradeData = trades.get(0);
|
||||
|
||||
// Check trade has correct values
|
||||
@@ -1082,7 +1067,8 @@ public class TransactionTests {
|
||||
payments.add(paymentData);
|
||||
}
|
||||
|
||||
MultiPaymentTransactionData multiPaymentTransactionData = new MultiPaymentTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(), payments, fee);
|
||||
MultiPaymentTransactionData multiPaymentTransactionData = new MultiPaymentTransactionData(timestamp, Group.NO_GROUP, reference, sender.getPublicKey(),
|
||||
payments, fee);
|
||||
|
||||
Transaction multiPaymentTransaction = new MultiPaymentTransaction(repository, multiPaymentTransactionData);
|
||||
multiPaymentTransaction.sign(sender);
|
||||
@@ -1094,20 +1080,20 @@ public class TransactionTests {
|
||||
block.addTransaction(multiPaymentTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
|
||||
// Check sender's balance
|
||||
BigDecimal actualBalance = accountRepository.getBalance(sender.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedSenderBalance.compareTo(actualBalance) == 0, "Sender's new balance incorrect");
|
||||
assertTrue("Sender's new balance incorrect", expectedSenderBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Fee should be in generator's balance
|
||||
BigDecimal expectedBalance = initialGeneratorBalance.add(fee);
|
||||
actualBalance = accountRepository.getBalance(generator.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Generator's new balance incorrect");
|
||||
assertTrue("Generator's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check recipients
|
||||
for (int i = 0; i < payments.size(); ++i) {
|
||||
@@ -1115,12 +1101,12 @@ public class TransactionTests {
|
||||
Account recipient = new Account(this.repository, paymentData.getRecipient());
|
||||
|
||||
byte[] recipientsReference = recipient.getLastReference();
|
||||
assertTrue(Arrays.equals(multiPaymentTransaction.getTransactionData().getSignature(), recipientsReference), "Recipient's new reference incorrect");
|
||||
assertTrue("Recipient's new reference incorrect", Arrays.equals(multiPaymentTransaction.getTransactionData().getSignature(), recipientsReference));
|
||||
|
||||
// Amount should be in recipient's balance
|
||||
expectedBalance = paymentData.getAmount();
|
||||
actualBalance = accountRepository.getBalance(recipient.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Recipient's new balance incorrect");
|
||||
assertTrue("Recipient's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
}
|
||||
|
||||
@@ -1130,11 +1116,11 @@ public class TransactionTests {
|
||||
|
||||
// Check sender's balance
|
||||
actualBalance = accountRepository.getBalance(sender.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(initialSenderBalance.compareTo(actualBalance) == 0, "Sender's reverted balance incorrect");
|
||||
assertTrue("Sender's reverted balance incorrect", initialSenderBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Check generator's balance
|
||||
actualBalance = accountRepository.getBalance(generator.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(initialGeneratorBalance.compareTo(actualBalance) == 0, "Generator's new balance incorrect");
|
||||
assertTrue("Generator's new balance incorrect", initialGeneratorBalance.compareTo(actualBalance) == 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1164,8 +1150,8 @@ public class TransactionTests {
|
||||
block.addTransaction(messageTransactionData);
|
||||
block.sign();
|
||||
|
||||
assertTrue(block.isSignatureValid(), "Block signatures invalid");
|
||||
assertEquals(Block.ValidationResult.OK, block.isValid(), "Block is invalid");
|
||||
assertTrue("Block signatures invalid", block.isSignatureValid());
|
||||
assertEquals("Block is invalid", Block.ValidationResult.OK, block.isValid());
|
||||
|
||||
block.process();
|
||||
repository.saveChanges();
|
||||
@@ -1173,17 +1159,17 @@ public class TransactionTests {
|
||||
// Check sender's balance
|
||||
BigDecimal expectedBalance = initialSenderBalance.subtract(amount).subtract(fee);
|
||||
BigDecimal actualBalance = accountRepository.getBalance(sender.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Sender's new balance incorrect");
|
||||
assertTrue("Sender's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Fee should be in generator's balance
|
||||
expectedBalance = initialGeneratorBalance.add(fee);
|
||||
actualBalance = accountRepository.getBalance(generator.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Generator's new balance incorrect");
|
||||
assertTrue("Generator's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
|
||||
// Amount should be in recipient's balance
|
||||
expectedBalance = amount;
|
||||
actualBalance = accountRepository.getBalance(recipient.getAddress(), Asset.QORA).getBalance();
|
||||
assertTrue(expectedBalance.compareTo(actualBalance) == 0, "Recipient's new balance incorrect");
|
||||
assertTrue("Recipient's new balance incorrect", expectedBalance.compareTo(actualBalance) == 0);
|
||||
}
|
||||
|
||||
}
|
@@ -1,18 +0,0 @@
|
||||
package org.qora.test.utils;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
|
||||
public class AssertExtensions {
|
||||
|
||||
public static <T> void assertItemsEqual(Collection<T> expected, Iterable<T> actual) {
|
||||
assertItemsEqual(expected, actual, (String) null);
|
||||
}
|
||||
|
||||
public static <T> void assertItemsEqual(Collection<T> expected, Iterable<T> actual, String message) {
|
||||
assertThat(message, actual, containsInAnyOrder(expected.toArray()));
|
||||
}
|
||||
|
||||
}
|
6
src/test/resources/test-settings.json
Normal file
6
src/test/resources/test-settings.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"restrictedApi": false,
|
||||
"blockchainConfig": "src/test/resources/test-v2qorachain.json",
|
||||
"wipeUnconfirmedOnStart": false,
|
||||
"minPeers": 0
|
||||
}
|
31
src/test/resources/test-v2qorachain.json
Normal file
31
src/test/resources/test-v2qorachain.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"isTestNet": true,
|
||||
"maxBalance": "10000000000",
|
||||
"blockDifficultyInterval": 10,
|
||||
"minBlockTime": 30000,
|
||||
"maxBlockTime": 60000,
|
||||
"blockTimestampMargin": 500,
|
||||
"maxBytesPerUnitFee": 1024,
|
||||
"unitFee": "0.1",
|
||||
"requireGroupForApproval": true,
|
||||
"defaultGroupId": 2,
|
||||
"genesisInfo": {
|
||||
"version": 4,
|
||||
"timestamp": 0,
|
||||
"generatingBalance": "10000000",
|
||||
"transactions": [
|
||||
{ "type": "ISSUE_ASSET", "owner": "QcFmNxSArv5tWEzCtTKb2Lqc5QkKuQ7RNs", "assetName": "QORA", "description": "QORA native coin", "quantity": 10000000000, "isDivisible": true, "fee": 0, "reference": "3Verk6ZKBJc3WTTVfxFC9icSjKdM8b92eeJEpJP8qNizG4ZszNFq8wdDYdSjJXq2iogDFR1njyhsBdVpbvDfjzU7" },
|
||||
{ "type": "GENESIS", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "amount": "9876543210.12345678", "fee": 0 },
|
||||
{ "type": "CREATE_GROUP", "creatorPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "owner": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "groupName": "dev-group", "description": "developer group", "isOpen": false, "approvalThreshold": "PCT100", "minimumBlockDelay": 0, "maximumBlockDelay": 1440 }
|
||||
]
|
||||
},
|
||||
"featureTriggers": {
|
||||
"messageHeight": 0,
|
||||
"atHeight": 0,
|
||||
"assetsTimestamp": 0,
|
||||
"votingTimestamp": 0,
|
||||
"arbitraryTimestamp": 0,
|
||||
"powfixTimestamp": 0,
|
||||
"v2Timestamp": 0
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user