private void checkExpiration(Instant now) { if( expiresAt.isBefore(now) ) { //System.out.println("cache expired "+parcel.getId()); records.remove(parcel.getId()); } } }
private Record(Parcel parcel) { expiresAt = Instant.now().plus(maxAge); this.parcel = parcel; records.put(parcel.getId(), this); }
report(getLabel(), () -> concatReportMessage("register parcel: ", parcel.getId()), DatagramAdapter.VerboseLevel.BASE); try { Object x = checkParcelInternal(parcel.getId(), parcel, true); if (x instanceof ParcelProcessor) { report(getLabel(), () -> concatReportMessage("parcel processor created for parcel: ", parcel.getId(), ", state is ", ((ParcelProcessor) x).processingState), DatagramAdapter.VerboseLevel.BASE); return true; parcel.getId()), DatagramAdapter.VerboseLevel.BASE); return false; report(getLabel(), () -> concatReportMessage("register parcel: ", parcel.getId(), "failed", e.getMessage()), DatagramAdapter.VerboseLevel.BASE);
protected synchronized Parcel registerWithNewParcel(Contract c) throws Exception { Set<PrivateKey> stepaPrivateKeys = new HashSet<>(); stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"))); Parcel parcel = createParcelWithClassU(c, stepaPrivateKeys); System.out.println("register parcel: " + parcel.getId() + " " + parcel.getPaymentContract().getId() + " " + parcel.getPayloadContract().getId()); node.registerParcel(parcel); synchronized (uContractLock) { uContract = parcel.getPaymentContract(); } return parcel; }
protected synchronized Parcel registerWithNewParcel(Contract c) throws Exception { Set<PrivateKey> stepaPrivateKeys = new HashSet<>(); stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"))); Parcel parcel = createParcelWithClassU(c, stepaPrivateKeys); System.out.println("register parcel: " + parcel.getId() + " " + parcel.getPaymentContract().getId() + " " + parcel.getPayloadContract().getId()); normalClient.registerParcelWithState(parcel.pack(),8000); synchronized (uContractLock) { uContract = parcel.getPaymentContract(); } return parcel; }
private synchronized void waitAndCheckState(Parcel parcel, ItemState waitState) throws Exception { try { System.out.println("wait parcel: " + parcel.getId() + " " + parcel.getPaymentContract().getId() + " " + parcel.getPayloadContract().getId()); node.waitParcel(parcel.getId(), 30000); System.out.println("wait payment: " + parcel.getId() + " " + parcel.getPaymentContract().getId() + " " + parcel.getPayloadContract().getId()); ItemResult itemResult = node.waitItem(parcel.getPaymentContract().getId(), 8000); assertEquals(ItemState.APPROVED, itemResult.state); System.out.println("wait payload with state: " + waitState + " " + parcel.getId() + " " + parcel.getPaymentContract().getId() + " " + parcel.getPayloadContract().getId()); itemResult = node.waitItem(parcel.getPayloadContract().getId(), 8000); parcel.getPayloadContract().traceErrors(); assertEquals(waitState, itemResult.state); } catch (TimeoutException e) { if (parcel != null) { fail("timeout, " + node + " parcel " + parcel.getId() + " " + parcel.getPaymentContract().getId() + " " + parcel.getPayloadContract().getId()); } else { fail("timeout, " + node); } } }
@Test(timeout = 90000) public void transactionalValidUntil_good() throws Exception { Set<PrivateKey> stepaPrivateKeys = new HashSet<>(); Set<PublicKey> stepaPublicKeys = new HashSet<>(); stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"))); for (PrivateKey pk : stepaPrivateKeys) { stepaPublicKeys.add(pk.getPublicKey()); } Contract stepaCoins = Contract.fromDslFile(ROOT_PATH + "stepaCoins.yml"); if (stepaCoins.getTransactional() == null) stepaCoins.createTransactionalSection(); stepaCoins.getTransactional().setValidUntil(ZonedDateTime.now().plusSeconds(Config.validUntilTailTime.getSeconds()*2).toEpochSecond()); stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next()); stepaCoins.seal(); stepaCoins.check(); stepaCoins.traceErrors(); Parcel parcel = createParcelWithFreshU(stepaCoins, stepaPrivateKeys); assertTrue(parcel.getPayloadContract().isOk()); node.registerParcel(parcel); node.waitParcel(parcel.getId(), 8000); assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state); }
@Test(timeout = 90000) public void transactionalValidUntil_timeEnds() throws Exception { Set<PrivateKey> stepaPrivateKeys = new HashSet<>(); Set<PublicKey> stepaPublicKeys = new HashSet<>(); stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"))); for (PrivateKey pk : stepaPrivateKeys) { stepaPublicKeys.add(pk.getPublicKey()); } Contract stepaCoins = Contract.fromDslFile(ROOT_PATH + "stepaCoins.yml"); if (stepaCoins.getTransactional() == null) stepaCoins.createTransactionalSection(); stepaCoins.getTransactional().setValidUntil(ZonedDateTime.now().plusSeconds(Config.validUntilTailTime.getSeconds()/2).toEpochSecond()); stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next()); stepaCoins.seal(); stepaCoins.check(); stepaCoins.traceErrors(); Parcel parcel = createParcelWithFreshU(stepaCoins, stepaPrivateKeys); assertFalse(parcel.getPayloadContract().isOk()); node.registerParcel(parcel); node.waitParcel(parcel.getId(), 8000); assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.DECLINED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state); }
private synchronized void waitAndCheckState(Parcel parcel, ItemState waitState) throws Exception { int attemps = 30; ItemResult itemResult; do { itemResult = normalClient.getState(parcel.getPaymentContract().getId()); if(!itemResult.state.isPending()) break; attemps--; if(attemps <= 0) fail("timeout1, parcel " + parcel.getId() + " " + parcel.getPaymentContract().getId() + " " + parcel.getPayloadContract().getId()); Thread.sleep(500); } while(true); assertEquals(ItemState.APPROVED, itemResult.state); attemps = 30; do { itemResult = normalClient.getState(parcel.getPayloadContract().getId()); if(!itemResult.state.isPending()) break; attemps--; if(attemps <= 0) fail("timeout2, parcel " + parcel.getId() + " " + parcel.getPaymentContract().getId() + " " + parcel.getPayloadContract().getId()); Thread.sleep(500); } while(true); assertEquals(waitState, itemResult.state); }
node.waitParcel(payingParcel.getId(), 8000);
@Test(timeout = 90000) public void transactionalValidUntil_timeIsOver() throws Exception { Set<PrivateKey> stepaPrivateKeys = new HashSet<>(); Set<PublicKey> stepaPublicKeys = new HashSet<>(); stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"))); for (PrivateKey pk : stepaPrivateKeys) { stepaPublicKeys.add(pk.getPublicKey()); } Contract stepaCoins = Contract.fromDslFile(ROOT_PATH + "stepaCoins.yml"); if (stepaCoins.getTransactional() == null) stepaCoins.createTransactionalSection(); stepaCoins.getTransactional().setValidUntil(ZonedDateTime.now().plusMonths(-1).toEpochSecond()); stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next()); stepaCoins.seal(); stepaCoins.check(); stepaCoins.traceErrors(); Parcel parcel = createParcelWithFreshU(stepaCoins, stepaPrivateKeys); assertFalse(parcel.getPayloadContract().isOk()); node.registerParcel(parcel); node.waitParcel(parcel.getId(), 8000); assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.DECLINED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state); }
node.waitParcel(payingParcel.getId(), 8000);
node.waitParcel(payingParcel.getId(), 8000);
@Test(timeout = 90000) public void declineParcelWithBadPayload() throws Exception { Set<PrivateKey> stepaPrivateKeys = new HashSet<>(); Set<PublicKey> stepaPublicKeys = new HashSet<>(); stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"))); for (PrivateKey pk : stepaPrivateKeys) { stepaPublicKeys.add(pk.getPublicKey()); } Contract stepaCoins = Contract.fromDslFile(ROOT_PATH + "stepaCoins.yml"); // stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next()); stepaCoins.seal(); stepaCoins.check(); stepaCoins.traceErrors(); Parcel parcel = createParcelWithFreshU(stepaCoins, stepaPrivateKeys); assertTrue(parcel.getPaymentContract().isOk()); assertFalse(parcel.getPayloadContract().isOk()); node.registerParcel(parcel); // wait parcel node.waitParcel(parcel.getId(), 8000); // check payment and payload contracts assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.DECLINED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state); }
assertTrue(parcel.getPayloadContract().isOk()); System.out.println("Parcel: " + parcel.getId()); System.out.println("Payment contract: " + parcel.getPaymentContract().getId() + " is U: " + parcel.getPaymentContract().isU(config.getUIssuerKeys(), config.getUIssuerName())); System.out.println("Payload contract: " + parcel.getPayloadContract().getId() + " is U: " + parcel.getPayloadContract().isU(config.getUIssuerKeys(), config.getUIssuerName())); node.waitParcel(parcel.getId(), 8000);
node.waitParcel(payingParcel.getId(), 8000);
node.waitParcel(parcel.getId(), 8000);
@Test(timeout = 90000) public void payForParcelWithLastU() throws Exception { Set<PrivateKey> stepaPrivateKeys = new HashSet<>(); Set<PublicKey> stepaPublicKeys = new HashSet<>(); stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"))); for (PrivateKey pk : stepaPrivateKeys) stepaPublicKeys.add(pk.getPublicKey()); Contract paidContract = new Contract(stepaPrivateKeys.iterator().next()); paidContract.seal(); paidContract.check(); paidContract.traceErrors(); // create 1 U Contract stepaU = InnerContractsService.createFreshU(1, stepaPublicKeys, true); stepaU.check(); stepaU.traceErrors(); node.registerItem(stepaU); ItemResult itemResult = node.waitItem(stepaU.getId(), 18000); assertEquals(ItemState.APPROVED, itemResult.state); assertEquals(stepaU.getStateData().getIntOrThrow("transaction_units"), 1); assertEquals(stepaU.getStateData().getIntOrThrow("test_transaction_units"), 100); // pay 1 U Parcel parcel = ContractsService.createParcel(paidContract, stepaU, 1, stepaPrivateKeys, false); node.registerParcel(parcel); node.waitParcel(parcel.getId(), 8000); // check zero U registered assertEquals(ItemState.APPROVED, node.waitItem(paidContract.getId(), 8000).state); assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPaymentContract().getId(), 8000).state); assertEquals(parcel.getPaymentContract().getStateData().getIntOrThrow("transaction_units"), 0); assertEquals(parcel.getPaymentContract().getStateData().getIntOrThrow("test_transaction_units"), 100); }
node.waitParcel(parcel.getId(), 8000); ItemResult itemResult = node.waitItem(parcel.getPayloadContract().getId(), 3000); if (ItemState.APPROVED != itemResult.state)
node.waitParcel(parcel.getId(), 8000);