mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-07-26 00:15:18 -04:00
changed trade protocol to use tasks, added scheduler framework
This commit is contained in:
parent
4f26d76746
commit
7e55b7325a
93 changed files with 3980 additions and 1273 deletions
|
@ -1,9 +1,9 @@
|
|||
package io.bitsquare;
|
||||
|
||||
import io.bitsquare.btc.BtcValidatorTest;
|
||||
import io.bitsquare.currency.BitcoinTest;
|
||||
import io.bitsquare.gui.util.BitSquareConverterTest;
|
||||
import io.bitsquare.gui.util.BitSquareValidatorTest;
|
||||
import io.nucleo.scheduler.SequenceSchedulerTest;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Suite;
|
||||
|
||||
|
@ -12,7 +12,7 @@ import org.junit.runners.Suite;
|
|||
BtcValidatorTest.class,
|
||||
BitSquareConverterTest.class,
|
||||
BitSquareValidatorTest.class,
|
||||
BitcoinTest.class
|
||||
SequenceSchedulerTest.class
|
||||
})
|
||||
|
||||
public class BitSquareTestSuite
|
||||
|
|
|
@ -19,16 +19,16 @@ public class BtcValidatorTest
|
|||
amount = BigInteger.ZERO;
|
||||
assertFalse("tx unfunded, pending", BtcValidator.isMinSpendableAmount(amount));
|
||||
|
||||
amount = FeePolicy.TX_FEE_depr;
|
||||
amount = FeePolicy.TX_FEE;
|
||||
assertFalse("tx unfunded, pending", BtcValidator.isMinSpendableAmount(amount));
|
||||
|
||||
amount = Transaction.MIN_NONDUST_OUTPUT;
|
||||
assertFalse("tx unfunded, pending", BtcValidator.isMinSpendableAmount(amount));
|
||||
|
||||
amount = FeePolicy.TX_FEE_depr.add(Transaction.MIN_NONDUST_OUTPUT);
|
||||
amount = FeePolicy.TX_FEE.add(Transaction.MIN_NONDUST_OUTPUT);
|
||||
assertFalse("tx unfunded, pending", BtcValidator.isMinSpendableAmount(amount));
|
||||
|
||||
amount = FeePolicy.TX_FEE_depr.add(Transaction.MIN_NONDUST_OUTPUT).add(BigInteger.ONE);
|
||||
amount = FeePolicy.TX_FEE.add(Transaction.MIN_NONDUST_OUTPUT).add(BigInteger.ONE);
|
||||
assertTrue("tx unfunded, pending", BtcValidator.isMinSpendableAmount(amount));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,50 +0,0 @@
|
|||
package io.bitsquare.currency;
|
||||
|
||||
import com.google.bitcoin.core.Transaction;
|
||||
import java.math.BigInteger;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class BitcoinTest
|
||||
{
|
||||
@Test
|
||||
public void testBitcoin()
|
||||
{
|
||||
Bitcoin bitcoin;
|
||||
Bitcoin compareValue;
|
||||
|
||||
bitcoin = new Bitcoin("0");
|
||||
assertTrue(bitcoin.isZero());
|
||||
|
||||
bitcoin = new Bitcoin("0");
|
||||
compareValue = new Bitcoin("1");
|
||||
assertTrue(bitcoin.isLess(compareValue));
|
||||
assertFalse(compareValue.isLess(bitcoin));
|
||||
assertFalse(compareValue.isEqual(bitcoin));
|
||||
|
||||
bitcoin = new Bitcoin("1");
|
||||
compareValue = new Bitcoin("0");
|
||||
assertFalse(bitcoin.isLess(compareValue));
|
||||
assertTrue(compareValue.isLess(bitcoin));
|
||||
assertFalse(compareValue.isEqual(bitcoin));
|
||||
|
||||
bitcoin = new Bitcoin("1");
|
||||
compareValue = new Bitcoin("1");
|
||||
assertFalse(bitcoin.isLess(compareValue));
|
||||
assertFalse(compareValue.isLess(bitcoin));
|
||||
assertTrue(compareValue.isEqual(bitcoin));
|
||||
|
||||
bitcoin = new Bitcoin(Transaction.MIN_NONDUST_OUTPUT);
|
||||
assertTrue(bitcoin.isMinValue());
|
||||
|
||||
bitcoin = new Bitcoin(Transaction.MIN_NONDUST_OUTPUT.subtract(BigInteger.ONE));
|
||||
assertFalse(bitcoin.isMinValue());
|
||||
|
||||
bitcoin = new Bitcoin(Transaction.MIN_NONDUST_OUTPUT.add(BigInteger.ONE));
|
||||
assertTrue(bitcoin.isMinValue());
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,5 +1,14 @@
|
|||
package io.bitsquare.gui.util;
|
||||
|
||||
import io.bitsquare.bank.BankAccountType;
|
||||
import io.bitsquare.locale.Country;
|
||||
import io.bitsquare.trade.Direction;
|
||||
import io.bitsquare.trade.Offer;
|
||||
import io.bitsquare.user.Arbitrator;
|
||||
import java.math.BigInteger;
|
||||
import java.util.Currency;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertFalse;
|
||||
|
@ -34,5 +43,37 @@ public class BitSquareValidatorTest
|
|||
assertFalse(BitSquareValidator.validateStringNotEmpty(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTradeAmountOutOfRange()
|
||||
{
|
||||
|
||||
assertFalse(BitSquareValidator.tradeAmountOutOfRange(BigInteger.ZERO, new MockOffer(BigInteger.TEN, BigInteger.valueOf(0))));
|
||||
assertTrue(BitSquareValidator.tradeAmountOutOfRange(BigInteger.ZERO, new MockOffer(BigInteger.TEN, BigInteger.valueOf(1))));
|
||||
assertFalse(BitSquareValidator.tradeAmountOutOfRange(BigInteger.TEN, new MockOffer(BigInteger.TEN, BigInteger.valueOf(0))));
|
||||
assertFalse(BitSquareValidator.tradeAmountOutOfRange(BigInteger.TEN, new MockOffer(BigInteger.TEN, BigInteger.valueOf(2))));
|
||||
assertTrue(BitSquareValidator.tradeAmountOutOfRange(BigInteger.TEN, new MockOffer(BigInteger.ONE, BigInteger.valueOf(0))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGreaterThanZero()
|
||||
{
|
||||
assertFalse(BitSquareValidator.greaterThanZero(BigInteger.ZERO));
|
||||
assertFalse(BitSquareValidator.greaterThanZero(BigInteger.valueOf(-1)));
|
||||
assertTrue(BitSquareValidator.greaterThanZero(BigInteger.ONE));
|
||||
}
|
||||
|
||||
public static class MockOffer extends Offer
|
||||
{
|
||||
|
||||
public MockOffer(BigInteger amount, BigInteger minAmount)
|
||||
{
|
||||
super(null, null, 0, amount, minAmount, null, null, null, null, null, 0, null, null);
|
||||
}
|
||||
|
||||
public MockOffer(String messagePubKeyAsHex, Direction direction, double price, BigInteger amount, BigInteger minAmount, BankAccountType bankAccountType, Currency currency, Country bankAccountCountry, String bankAccountUID, Arbitrator arbitrator, int collateral, List<Country> acceptedCountries, List<Locale> acceptedLanguageLocales)
|
||||
{
|
||||
super(messagePubKeyAsHex, direction, price, amount, minAmount, bankAccountType, currency, bankAccountCountry, bankAccountUID, arbitrator, collateral, acceptedCountries, acceptedLanguageLocales);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
228
src/test/java/io/nucleo/scheduler/SequenceSchedulerTest.java
Normal file
228
src/test/java/io/nucleo/scheduler/SequenceSchedulerTest.java
Normal file
|
@ -0,0 +1,228 @@
|
|||
package io.nucleo.scheduler;
|
||||
|
||||
import io.nucleo.scheduler.tasks.SyncWorker1;
|
||||
import io.nucleo.scheduler.tasks.SyncWorker2;
|
||||
import io.nucleo.scheduler.worker.Worker;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class SequenceSchedulerTest
|
||||
{
|
||||
private final boolean[] hasCompleted = new boolean[1];
|
||||
private final boolean[] hasFailed = new boolean[1];
|
||||
private final boolean[] worker1HasCompleted = new boolean[1];
|
||||
private final boolean[] worker1HasFailed = new boolean[1];
|
||||
private final boolean[] worker2HasCompleted = new boolean[1];
|
||||
private final boolean[] worker2HasFailed = new boolean[1];
|
||||
private SequenceScheduler sequenceScheduler;
|
||||
private Map<String, String> model = new HashMap<>();
|
||||
private List<Worker> workerList = new ArrayList<>();
|
||||
private Throwable worker1Throwable;
|
||||
|
||||
@Before
|
||||
public void setUp()
|
||||
{
|
||||
sequenceScheduler = new SequenceScheduler();
|
||||
sequenceScheduler.addResultHandlers((worker) -> {
|
||||
hasCompleted[0] = true;
|
||||
});
|
||||
sequenceScheduler.addFaultHandlers(throwable -> {
|
||||
hasFailed[0] = true;
|
||||
});
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception
|
||||
{
|
||||
hasCompleted[0] = false;
|
||||
hasFailed[0] = false;
|
||||
workerList.clear();
|
||||
model.clear();
|
||||
worker1Throwable = null;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmpty()
|
||||
{
|
||||
sequenceScheduler.execute();
|
||||
assertTrue(sequenceScheduler.getHasCompleted());
|
||||
assertTrue(hasCompleted[0]);
|
||||
assertFalse(hasFailed[0]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmpty2()
|
||||
{
|
||||
sequenceScheduler.setWorkers(workerList);
|
||||
sequenceScheduler.execute();
|
||||
assertTrue(sequenceScheduler.getHasCompleted());
|
||||
assertTrue(hasCompleted[0]);
|
||||
assertFalse(hasFailed[0]);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testOneWithCompleted()
|
||||
{
|
||||
Worker worker1 = getWorker1(false);
|
||||
workerList.add(worker1);
|
||||
sequenceScheduler.setWorkers(workerList);
|
||||
sequenceScheduler.execute();
|
||||
|
||||
assertTrue(sequenceScheduler.getHasCompleted());
|
||||
assertTrue(hasCompleted[0]);
|
||||
assertFalse(hasFailed[0]);
|
||||
|
||||
assertTrue(worker1.getHasCompleted());
|
||||
assertTrue(worker1HasCompleted[0]);
|
||||
assertFalse(worker1HasFailed[0]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOneWithFailed()
|
||||
{
|
||||
Worker worker1 = getWorker1(true);
|
||||
workerList.add(worker1);
|
||||
sequenceScheduler.setWorkers(workerList);
|
||||
sequenceScheduler.execute();
|
||||
|
||||
assertFalse(sequenceScheduler.getHasCompleted());
|
||||
assertFalse(hasCompleted[0]);
|
||||
assertTrue(hasFailed[0]);
|
||||
|
||||
assertFalse(worker1.getHasCompleted());
|
||||
assertFalse(worker1HasCompleted[0]);
|
||||
assertTrue(worker1HasFailed[0]);
|
||||
assertEquals(SyncWorker1.ERR_MSG, worker1Throwable.getMessage());
|
||||
}
|
||||
|
||||
// @Test
|
||||
public void testTwoCompleted()
|
||||
{
|
||||
Worker worker1 = getWorker1(false);
|
||||
Worker worker2 = getWorker2(false);
|
||||
workerList.add(worker1);
|
||||
workerList.add(worker2);
|
||||
sequenceScheduler.setWorkers(workerList);
|
||||
sequenceScheduler.execute();
|
||||
|
||||
assertTrue(sequenceScheduler.getHasCompleted());
|
||||
assertTrue(hasCompleted[0]);
|
||||
assertFalse(hasFailed[0]);
|
||||
|
||||
assertTrue(worker1.getHasCompleted());
|
||||
assertTrue(worker1HasCompleted[0]);
|
||||
assertFalse(worker1HasFailed[0]);
|
||||
|
||||
assertTrue(worker2.getHasCompleted());
|
||||
assertTrue(worker2HasCompleted[0]);
|
||||
assertFalse(worker2HasFailed[0]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoReverseOrder()
|
||||
{
|
||||
model.put("worker1State", "");
|
||||
model.put("worker2State", "");
|
||||
Worker worker1 = getWorker1(false);
|
||||
Worker worker2 = getWorker2(false);
|
||||
workerList.add(worker2);
|
||||
workerList.add(worker1);
|
||||
sequenceScheduler.setWorkers(workerList);
|
||||
sequenceScheduler.setModel(model);
|
||||
sequenceScheduler.execute();
|
||||
|
||||
assertEquals(SyncWorker1.STATE, model.get("worker1State"));
|
||||
assertEquals(SyncWorker2.STATE, model.get("worker2State"));
|
||||
|
||||
assertTrue(sequenceScheduler.getHasCompleted());
|
||||
assertTrue(hasCompleted[0]);
|
||||
assertFalse(hasFailed[0]);
|
||||
|
||||
assertTrue(worker1.getHasCompleted());
|
||||
assertTrue(worker1HasCompleted[0]);
|
||||
assertFalse(worker1HasFailed[0]);
|
||||
|
||||
assertTrue(worker2.getHasCompleted());
|
||||
assertTrue(worker2HasCompleted[0]);
|
||||
assertFalse(worker2HasFailed[0]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoFirstFailed()
|
||||
{
|
||||
Worker worker1 = getWorker1(true);
|
||||
Worker worker2 = getWorker2(false);
|
||||
workerList.add(worker1);
|
||||
workerList.add(worker2);
|
||||
sequenceScheduler.setWorkers(workerList);
|
||||
sequenceScheduler.execute();
|
||||
|
||||
assertFalse(sequenceScheduler.getHasCompleted());
|
||||
assertFalse(hasCompleted[0]);
|
||||
assertTrue(hasFailed[0]);
|
||||
|
||||
assertFalse(worker1.getHasCompleted());
|
||||
assertFalse(worker1HasCompleted[0]);
|
||||
assertTrue(worker1HasFailed[0]);
|
||||
|
||||
assertFalse(worker2.getHasCompleted());
|
||||
assertFalse(worker2HasCompleted[0]);
|
||||
assertFalse(worker2HasFailed[0]); // second has not been executed and is not failed!
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoSecondFailed()
|
||||
{
|
||||
Worker worker1 = getWorker1(false);
|
||||
Worker worker2 = getWorker2(true);
|
||||
workerList.add(worker1);
|
||||
workerList.add(worker2);
|
||||
sequenceScheduler.setWorkers(workerList);
|
||||
sequenceScheduler.execute();
|
||||
|
||||
assertFalse(sequenceScheduler.getHasCompleted());
|
||||
assertFalse(hasCompleted[0]);
|
||||
assertTrue(hasFailed[0]);
|
||||
|
||||
assertTrue(worker1.getHasCompleted());
|
||||
assertTrue(worker1HasCompleted[0]);
|
||||
assertFalse(worker1HasFailed[0]);
|
||||
|
||||
assertFalse(worker2.getHasCompleted());
|
||||
assertFalse(worker2HasCompleted[0]);
|
||||
assertTrue(worker2HasFailed[0]); // second has not been executed and is not failed!
|
||||
}
|
||||
|
||||
private Worker getWorker1(boolean letItFail)
|
||||
{
|
||||
Worker worker1 = new SyncWorker1(letItFail);
|
||||
worker1.addResultHandlers((worker) -> {
|
||||
worker1HasCompleted[0] = true;
|
||||
});
|
||||
worker1.addFaultHandlers(throwable -> {
|
||||
worker1HasFailed[0] = true;
|
||||
worker1Throwable = throwable;
|
||||
});
|
||||
return worker1;
|
||||
}
|
||||
|
||||
private Worker getWorker2(boolean letItFail)
|
||||
{
|
||||
Worker worker2 = new SyncWorker2(letItFail);
|
||||
worker2.addResultHandlers((worker) -> {
|
||||
worker2HasCompleted[0] = true;
|
||||
});
|
||||
worker2.addFaultHandlers(throwable -> {
|
||||
worker2HasFailed[0] = true;
|
||||
});
|
||||
return worker2;
|
||||
}
|
||||
}
|
29
src/test/java/io/nucleo/scheduler/tasks/SyncWorker1.java
Normal file
29
src/test/java/io/nucleo/scheduler/tasks/SyncWorker1.java
Normal file
|
@ -0,0 +1,29 @@
|
|||
package io.nucleo.scheduler.tasks;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class SyncWorker1 extends AbstractTask
|
||||
{
|
||||
|
||||
public static String ERR_MSG = "Failure message";
|
||||
public static String STATE = "ok";
|
||||
private boolean letItFail;
|
||||
|
||||
public SyncWorker1(boolean letItFail)
|
||||
{
|
||||
|
||||
this.letItFail = letItFail;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute()
|
||||
{
|
||||
System.out.println("execute " + this);
|
||||
if (model != null) ((Map<String, String>) model).put("worker1State", STATE);
|
||||
if (letItFail)
|
||||
failed(new Exception(ERR_MSG));
|
||||
else
|
||||
complete();
|
||||
}
|
||||
|
||||
}
|
27
src/test/java/io/nucleo/scheduler/tasks/SyncWorker2.java
Normal file
27
src/test/java/io/nucleo/scheduler/tasks/SyncWorker2.java
Normal file
|
@ -0,0 +1,27 @@
|
|||
package io.nucleo.scheduler.tasks;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class SyncWorker2 extends AbstractTask
|
||||
{
|
||||
public static String ERR_MSG = "Failure message";
|
||||
public static String STATE = "ok";
|
||||
private boolean letItFail;
|
||||
|
||||
public SyncWorker2(boolean letItFail)
|
||||
{
|
||||
this.letItFail = letItFail;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute()
|
||||
{
|
||||
System.out.println("execute " + this);
|
||||
if (model != null) ((Map<String, String>) model).put("worker2State", STATE);
|
||||
if (letItFail)
|
||||
failed(new Exception(ERR_MSG));
|
||||
else
|
||||
complete();
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue