getApiAllowed() {
- return this.apiAllowed;
+ public String getUserPath() {
+ return this.userPath;
}
public boolean isApiEnabled() {
return this.apiEnabled;
}
- public boolean isRestrictedApi() {
- if (this.restrictedApi != null)
- return this.restrictedApi;
+ public int getApiPort() {
+ return this.apiPort;
+ }
+
+ public String[] getApiWhitelist() {
+ return this.apiWhitelist;
+ }
+
+ public boolean isApiRestricted() {
+ // Explicitly set value takes precedence
+ if (this.apiRestricted != null)
+ return this.apiRestricted;
// Not set in config file, so restrict if not testnet
- return !BlockChain.getInstance().getIsTestNet();
+ return !BlockChain.getInstance().isTestNet();
+ }
+
+ public boolean getWipeUnconfirmedOnStart() {
+ return this.wipeUnconfirmedOnStart;
+ }
+
+ public int getMaxUnconfirmedPerAccount() {
+ return this.maxUnconfirmedPerAccount;
+ }
+
+ public int getMaxTransactionTimestampFuture() {
+ return this.maxTransactionTimestampFuture;
}
public int getListenPort() {
return this.listenPort;
}
- public int getDefaultListenPort() {
- return DEFAULT_LISTEN_PORT;
- }
-
public String getBindAddress() {
return this.bindAddress;
}
@@ -240,55 +204,12 @@ public class Settings {
return this.maxPeers;
}
+ public String getBlockchainConfig() {
+ return this.blockchainConfig;
+ }
+
public boolean useBitcoinTestNet() {
return this.useBitcoinTestNet;
}
- public boolean getWipeUnconfirmedOnStart() {
- return this.wipeUnconfirmedOnStart;
- }
-
- public int getMaxUnconfirmedPerAccount() {
- return this.maxUnconfirmedPerAccount;
- }
-
- public long getMaxTransactionTimestampFuture() {
- return this.maxTransactionTimestampFuture;
- }
-
- // Config parsing
-
- public static Object getTypedJson(JSONObject json, String key, Class> clazz) {
- if (!json.containsKey(key)) {
- LOGGER.error("Missing \"" + key + "\" in blockchain config file");
- throw new RuntimeException("Missing \"" + key + "\" in blockchain config file");
- }
-
- Object value = json.get(key);
- if (!clazz.isInstance(value)) {
- LOGGER.error("\"" + key + "\" not " + clazz.getSimpleName() + " in blockchain config file");
- throw new RuntimeException("\"" + key + "\" not " + clazz.getSimpleName() + " in blockchain config file");
- }
-
- return value;
- }
-
- public static BigDecimal getJsonBigDecimal(JSONObject json, String key) {
- try {
- return new BigDecimal((String) getTypedJson(json, key, String.class));
- } catch (NumberFormatException e) {
- LOGGER.error("Unable to parse \"" + key + "\" in blockchain config file");
- throw new RuntimeException("Unable to parse \"" + key + "\" in blockchain config file");
- }
- }
-
- public static Long getJsonQuotedLong(JSONObject json, String key) {
- try {
- return Long.parseLong((String) getTypedJson(json, key, String.class));
- } catch (NumberFormatException e) {
- LOGGER.error("Unable to parse \"" + key + "\" in blockchain config file");
- throw new RuntimeException("Unable to parse \"" + key + "\" in blockchain config file");
- }
- }
-
}
diff --git a/src/main/java/org/qora/transaction/ArbitraryTransaction.java b/src/main/java/org/qora/transaction/ArbitraryTransaction.java
index e69ce8d1..2391e741 100644
--- a/src/main/java/org/qora/transaction/ArbitraryTransaction.java
+++ b/src/main/java/org/qora/transaction/ArbitraryTransaction.java
@@ -149,7 +149,7 @@ public class ArbitraryTransaction extends Transaction {
Account sender = this.getSender();
int blockHeight = this.repository.getBlockRepository().getBlockchainHeight();
- String senderPathname = Settings.getInstance().getUserpath() + "arbitrary" + File.separator + sender.getAddress();
+ String senderPathname = Settings.getInstance().getUserPath() + "arbitrary" + File.separator + sender.getAddress();
String blockPathname = senderPathname + File.separator + blockHeight;
String dataPathname = blockPathname + File.separator + Base58.encode(arbitraryTransactionData.getSignature()) + "-"
+ arbitraryTransactionData.getService() + ".raw";
@@ -187,7 +187,7 @@ public class ArbitraryTransaction extends Transaction {
Account sender = this.getSender();
int blockHeight = this.repository.getBlockRepository().getBlockchainHeight();
- String senderPathname = Settings.getInstance().getUserpath() + "arbitrary" + File.separator + sender.getAddress();
+ String senderPathname = Settings.getInstance().getUserPath() + "arbitrary" + File.separator + sender.getAddress();
String blockPathname = senderPathname + File.separator + blockHeight;
String dataPathname = blockPathname + File.separator + Base58.encode(arbitraryTransactionData.getSignature()) + "-"
+ arbitraryTransactionData.getService() + ".raw";
diff --git a/src/main/java/org/qora/transaction/Transaction.java b/src/main/java/org/qora/transaction/Transaction.java
index 667236bb..d73b0b33 100644
--- a/src/main/java/org/qora/transaction/Transaction.java
+++ b/src/main/java/org/qora/transaction/Transaction.java
@@ -184,6 +184,7 @@ public abstract class Transaction {
INVALID_GROUP_ID(64),
TRANSACTION_UNKNOWN(65),
TRANSACTION_ALREADY_CONFIRMED(66),
+ INVALID_TX_GROUP_ID(67),
NOT_YET_RELEASED(1000);
public final int value;
@@ -480,7 +481,7 @@ public abstract class Transaction {
// Check transaction's txGroupId
if (!this.isValidTxGroupId())
- return ValidationResult.INVALID_GROUP_ID;
+ return ValidationResult.INVALID_TX_GROUP_ID;
creator.setLastReference(creator.getUnconfirmedLastReference());
ValidationResult result = this.isValid();
@@ -498,19 +499,19 @@ public abstract class Transaction {
private boolean isValidTxGroupId() throws DataException {
int txGroupId = this.transactionData.getTxGroupId();
+ // If transaction type doesn't need approval then we insist on NO_GROUP
+ if (!this.transactionData.getType().needsApproval && txGroupId != Group.NO_GROUP)
+ return false;
+
// Handling NO_GROUP
if (txGroupId == Group.NO_GROUP)
- // true if NO_GROUP allowed, false otherwise
- return BlockChain.getInstance().getGrouplessAllowed();
+ // true if NO_GROUP txGroupId is allowed for approval-needing tx types
+ return !BlockChain.getInstance().getRequireGroupForApproval();
// Group even exist?
if (!this.repository.getGroupRepository().groupExists(txGroupId))
return false;
- // Does this transaction type bypass approval?
- if (!this.transactionData.getType().needsApproval)
- return true;
-
GroupRepository groupRepository = this.repository.getGroupRepository();
// Is transaction's creator is group member?
@@ -642,6 +643,9 @@ public abstract class Transaction {
/**
* Returns whether transaction needs to go through group-admin approval.
+ *
+ * This test is more than simply "does this transaction type need approval?"
+ * because group admins bypass approval for transactions attached to their group.
*
* @throws DataException
*/
@@ -659,7 +663,7 @@ public abstract class Transaction {
if (!groupRepository.groupExists(txGroupId))
// Group no longer exists? Possibly due to blockchain orphaning undoing group creation?
- return true;
+ return true; // stops tx being included in block but it will eventually expire
// If transaction's creator is group admin then auto-approve
PublicKeyAccount creator = this.getCreator();
@@ -678,7 +682,8 @@ public abstract class Transaction {
// Is transaction is outside of min/max approval period?
int creationBlockHeight = this.repository.getBlockRepository().getHeightFromTimestamp(this.transactionData.getTimestamp());
int currentBlockHeight = this.repository.getBlockRepository().getBlockchainHeight();
- if (currentBlockHeight < creationBlockHeight + groupData.getMinimumBlockDelay() || currentBlockHeight > creationBlockHeight + groupData.getMaximumBlockDelay())
+ if (currentBlockHeight < creationBlockHeight + groupData.getMinimumBlockDelay()
+ || currentBlockHeight > creationBlockHeight + groupData.getMaximumBlockDelay())
return false;
return group.getGroupData().getApprovalThreshold().meetsApprovalThreshold(repository, txGroupId, this.transactionData.getSignature());
diff --git a/src/main/java/org/qora/utils/StringLongMapXmlAdapter.java b/src/main/java/org/qora/utils/StringLongMapXmlAdapter.java
new file mode 100644
index 00000000..e5757f2d
--- /dev/null
+++ b/src/main/java/org/qora/utils/StringLongMapXmlAdapter.java
@@ -0,0 +1,53 @@
+package org.qora.utils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlValue;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+import org.eclipse.persistence.oxm.annotations.XmlVariableNode;
+
+public class StringLongMapXmlAdapter extends XmlAdapter> {
+
+ public static class StringLongMap {
+ @XmlVariableNode("key")
+ List entries = new ArrayList();
+ }
+
+ public static class MapEntry {
+ @XmlTransient
+ public String key;
+
+ @XmlValue
+ public Long value;
+ }
+
+ @Override
+ public Map unmarshal(StringLongMap stringLongMap) throws Exception {
+ Map map = new HashMap<>(stringLongMap.entries.size());
+
+ for (MapEntry entry : stringLongMap.entries)
+ map.put(entry.key, entry.value);
+
+ return map;
+ }
+
+ @Override
+ public StringLongMap marshal(Map map) throws Exception {
+ StringLongMap output = new StringLongMap();
+
+ for (Entry entry : map.entrySet()) {
+ MapEntry mapEntry = new MapEntry();
+ mapEntry.key = entry.getKey();
+ mapEntry.value = entry.getValue();
+ output.entries.add(mapEntry);
+ }
+
+ return output;
+ }
+}
diff --git a/src/test/java/org/qora/test/ATTests.java b/src/test/java/org/qora/test/ATTests.java
index fda75011..e759a928 100644
--- a/src/test/java/org/qora/test/ATTests.java
+++ b/src/test/java/org/qora/test/ATTests.java
@@ -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;
diff --git a/src/test/java/org/qora/test/BlockTests.java b/src/test/java/org/qora/test/BlockTests.java
index ede8d4be..6487aaa5 100644
--- a/src/test/java/org/qora/test/BlockTests.java
+++ b/src/test/java/org/qora/test/BlockTests.java
@@ -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());
diff --git a/src/test/java/org/qora/test/BlockchainTests.java b/src/test/java/org/qora/test/BlockchainTests.java
index 6df80569..f80965bb 100644
--- a/src/test/java/org/qora/test/BlockchainTests.java
+++ b/src/test/java/org/qora/test/BlockchainTests.java
@@ -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;
diff --git a/src/test/java/org/qora/test/Common.java b/src/test/java/org/qora/test/Common.java
index 62d39d18..93a0ee3c 100644
--- a/src/test/java/org/qora/test/Common.java
+++ b/src/test/java/org/qora/test/Common.java
@@ -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());
+ }
+
}
diff --git a/src/test/java/org/qora/test/CompatibilityTests.java b/src/test/java/org/qora/test/CompatibilityTests.java
index 49737dbf..6fbafcb2 100644
--- a/src/test/java/org/qora/test/CompatibilityTests.java
+++ b/src/test/java/org/qora/test/CompatibilityTests.java
@@ -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;
diff --git a/src/test/java/org/qora/test/CryptoTests.java b/src/test/java/org/qora/test/CryptoTests.java
index be7543af..bbb25ef2 100644
--- a/src/test/java/org/qora/test/CryptoTests.java
+++ b/src/test/java/org/qora/test/CryptoTests.java
@@ -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));
}
diff --git a/src/test/java/org/qora/test/ExceptionTests.java b/src/test/java/org/qora/test/ExceptionTests.java
deleted file mode 100644
index eb6e13bb..00000000
--- a/src/test/java/org/qora/test/ExceptionTests.java
+++ /dev/null
@@ -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.
- *
- * 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;
- }
-
-}
diff --git a/src/test/java/org/qora/test/GenesisTests.java b/src/test/java/org/qora/test/GenesisTests.java
index f7dcf455..59df1090 100644
--- a/src/test/java/org/qora/test/GenesisTests.java
+++ b/src/test/java/org/qora/test/GenesisTests.java
@@ -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 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);
}
}
diff --git a/src/test/java/org/qora/test/GroupApprovalTests.java b/src/test/java/org/qora/test/GroupApprovalTests.java
new file mode 100644
index 00000000..695a2163
--- /dev/null
+++ b/src/test/java/org/qora/test/GroupApprovalTests.java
@@ -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();
+ }
+
+}
diff --git a/src/test/java/org/qora/test/LoadTests.java b/src/test/java/org/qora/test/LoadTests.java
index ce55b1e9..63b764a5 100644
--- a/src/test/java/org/qora/test/LoadTests.java
+++ b/src/test/java/org/qora/test/LoadTests.java
@@ -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);
diff --git a/src/test/java/org/qora/test/NavigationTests.java b/src/test/java/org/qora/test/NavigationTests.java
index 932ae0b7..64db0a22 100644
--- a/src/test/java/org/qora/test/NavigationTests.java
+++ b/src/test/java/org/qora/test/NavigationTests.java
@@ -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());
diff --git a/src/test/java/org/qora/test/RepositoryTests.java b/src/test/java/org/qora/test/RepositoryTests.java
index b8f88335..5847086f 100644
--- a/src/test/java/org/qora/test/RepositoryTests.java
+++ b/src/test/java/org/qora/test/RepositoryTests.java
@@ -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;
diff --git a/src/test/java/org/qora/test/SaveTests.java b/src/test/java/org/qora/test/SaveTests.java
index d95b8074..ce6eb556 100644
--- a/src/test/java/org/qora/test/SaveTests.java
+++ b/src/test/java/org/qora/test/SaveTests.java
@@ -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;
diff --git a/src/test/java/org/qora/test/SerializationTests.java b/src/test/java/org/qora/test/SerializationTests.java
index 7837af8e..8741e011 100644
--- a/src/test/java/org/qora/test/SerializationTests.java
+++ b/src/test/java/org/qora/test/SerializationTests.java
@@ -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);
diff --git a/src/test/java/org/qora/test/SettingsTests.java b/src/test/java/org/qora/test/SettingsTests.java
new file mode 100644
index 00000000..8149a636
--- /dev/null
+++ b/src/test/java/org/qora/test/SettingsTests.java
@@ -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";
+ }
+
+}
diff --git a/src/test/java/org/qora/test/SignatureTests.java b/src/test/java/org/qora/test/SignatureTests.java
index 196a02ce..033b87bc 100644
--- a/src/test/java/org/qora/test/SignatureTests.java
+++ b/src/test/java/org/qora/test/SignatureTests.java
@@ -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;
diff --git a/src/test/java/org/qora/test/TransactionTests.java b/src/test/java/org/qora/test/TransactionTests.java
index c5b32d41..54a1c7dd 100644
--- a/src/test/java/org/qora/test/TransactionTests.java
+++ b/src/test/java/org/qora/test/TransactionTests.java
@@ -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 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 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);
}
}
\ No newline at end of file
diff --git a/src/test/java/org/qora/test/utils/AssertExtensions.java b/src/test/java/org/qora/test/utils/AssertExtensions.java
deleted file mode 100644
index 747b001f..00000000
--- a/src/test/java/org/qora/test/utils/AssertExtensions.java
+++ /dev/null
@@ -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 void assertItemsEqual(Collection expected, Iterable actual) {
- assertItemsEqual(expected, actual, (String) null);
- }
-
- public static void assertItemsEqual(Collection expected, Iterable actual, String message) {
- assertThat(message, actual, containsInAnyOrder(expected.toArray()));
- }
-
-}
diff --git a/src/test/resources/test-settings.json b/src/test/resources/test-settings.json
new file mode 100644
index 00000000..4fe80523
--- /dev/null
+++ b/src/test/resources/test-settings.json
@@ -0,0 +1,6 @@
+{
+ "restrictedApi": false,
+ "blockchainConfig": "src/test/resources/test-v2qorachain.json",
+ "wipeUnconfirmedOnStart": false,
+ "minPeers": 0
+}
diff --git a/src/test/resources/test-v2qorachain.json b/src/test/resources/test-v2qorachain.json
new file mode 100644
index 00000000..c56b090b
--- /dev/null
+++ b/src/test/resources/test-v2qorachain.json
@@ -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
+ }
+}