Search in sources :

Example 1 with Db

use of com.icodici.db.Db in project universa by UniversaBlockchain.

the class BaseNetworkTest method registerParcelWithRealPayment.

@Test(timeout = 90000)
public void registerParcelWithRealPayment() 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();
    PrivateKey ownerKey = new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"));
    Set<PublicKey> keys = new HashSet();
    keys.add(ownerKey.getPublicKey());
    Contract stepaU = InnerContractsService.createFreshU(100, keys, true);
    stepaU.check();
    // stepaU.setIsU(true);
    stepaU.traceErrors();
    node.registerItem(stepaU);
    ItemResult itemResult = node.waitItem(stepaU.getId(), 18000);
    assertEquals(ItemState.APPROVED, itemResult.state);
    Parcel parcel = ContractsService.createParcel(stepaCoins, stepaU, 1, stepaPrivateKeys, false);
    parcel.getPayment().getContract().paymentCheck(config.getUIssuerKeys());
    parcel.getPayment().getContract().traceErrors();
    parcel.getPayload().getContract().check();
    parcel.getPayload().getContract().traceErrors();
    assertEquals(100 - 1, parcel.getPaymentContract().getStateData().getIntOrThrow("transaction_units"));
    assertEquals(10000, parcel.getPaymentContract().getStateData().getIntOrThrow("test_transaction_units"));
    assertTrue(parcel.getPaymentContract().isOk());
    assertFalse(parcel.getPaymentContract().isLimitedForTestnet());
    assertTrue(parcel.getPayloadContract().isOk());
    assertFalse(parcel.getPayloadContract().isLimitedForTestnet());
    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()));
    // int todayPaidAmount = node.nodeStats.todayPaidAmount;//        reuse payment for another contract
    // Contract contract = new Contract(TestKeys.privateKey(12));
    // contract.seal();
    // Parcel parcel2 = new Parcel(contract.getTransactionPack(), parcel.getPayment());
    node.registerParcel(parcel);
    // node.registerParcel(parcel2);
    node.waitParcel(parcel.getId(), 8000);
    // node.nodeStats.collect(ledger,config);
    // assertEquals(node.nodeStats.todayPaidAmount-todayPaidAmount,1);
    // check payment and payload contracts
    assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state);
    assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state);
    assertTrue(!node.checkItem(parcel.getPayload().getContract().getId()).isTestnet);
    if (ledger instanceof PostgresLedger) {
        PostgresLedger pl = (PostgresLedger) ledger;
        try (Db db = pl.getDb()) {
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPayloadContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 0);
                }
            }
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPaymentContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 0);
                }
            }
        }
    }
}
Also used : PrivateKey(com.icodici.crypto.PrivateKey) PublicKey(com.icodici.crypto.PublicKey) ResultSet(java.sql.ResultSet) PreparedStatement(java.sql.PreparedStatement) Db(com.icodici.db.Db) Test(org.junit.Test)

Example 2 with Db

use of com.icodici.db.Db in project universa by UniversaBlockchain.

the class BaseNetworkTest method registerParcelWithTestPayment.

@Test(timeout = 90000)
public void registerParcelWithTestPayment() 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.setExpiresAt(ZonedDateTime.now().plusMonths(1));
    stepaCoins.seal();
    stepaCoins.check();
    stepaCoins.traceErrors();
    PrivateKey ownerKey = new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"));
    Set<PublicKey> keys = new HashSet();
    keys.add(ownerKey.getPublicKey());
    Contract stepaU = InnerContractsService.createFreshU(100, keys, true);
    stepaU.check();
    // stepaU.setIsU(true);
    stepaU.traceErrors();
    node.registerItem(stepaU);
    ItemResult itemResult = node.waitItem(stepaU.getId(), 18000);
    assertEquals(ItemState.APPROVED, itemResult.state);
    Parcel parcel = ContractsService.createParcel(stepaCoins, stepaU, 1, stepaPrivateKeys, true);
    parcel.getPayment().getContract().paymentCheck(config.getUIssuerKeys());
    parcel.getPayment().getContract().traceErrors();
    parcel.getPayload().getContract().check();
    parcel.getPayload().getContract().traceErrors();
    assertEquals(100, parcel.getPaymentContract().getStateData().getIntOrThrow("transaction_units"));
    assertEquals(10000 - 1, parcel.getPaymentContract().getStateData().getIntOrThrow("test_transaction_units"));
    assertTrue(parcel.getPaymentContract().isOk());
    assertTrue(!parcel.getPaymentContract().isLimitedForTestnet());
    assertTrue(parcel.getPayloadContract().isOk());
    assertTrue(parcel.getPayloadContract().isLimitedForTestnet());
    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.nodeStats.collect(ledger, config);
    // int todayPaidAmount = node.nodeStats.todayPaidAmount;
    // LogPrinter.showDebug(true);
    node.registerParcel(parcel);
    // wait parcel
    node.waitParcel(parcel.getId(), 8000);
    node.nodeStats.collect(ledger, config);
    // assertEquals(node.nodeStats.todayPaidAmount-todayPaidAmount,0);
    // check payment and payload contracts
    assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayment().getContract().getId(), 8000).state);
    assertEquals(ItemState.APPROVED, node.waitItem(parcel.getPayload().getContract().getId(), 8000).state);
    assertTrue(node.checkItem(parcel.getPayload().getContract().getId()).isTestnet);
    if (ledger instanceof PostgresLedger) {
        PostgresLedger pl = (PostgresLedger) ledger;
        try (Db db = pl.getDb()) {
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPayloadContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 1);
                }
            }
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPaymentContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 0);
                }
            }
        }
    }
}
Also used : PrivateKey(com.icodici.crypto.PrivateKey) PublicKey(com.icodici.crypto.PublicKey) ResultSet(java.sql.ResultSet) PreparedStatement(java.sql.PreparedStatement) Db(com.icodici.db.Db) Test(org.junit.Test)

Example 3 with Db

use of com.icodici.db.Db in project universa by UniversaBlockchain.

the class BaseNetworkTest method registerParcelWithRealAndTestRevisionPayment.

@Test(timeout = 90000)
public void registerParcelWithRealAndTestRevisionPayment() throws Exception {
    Set<PrivateKey> stepaPrivateKeys = new HashSet<>();
    Set<PrivateKey> martyPrivateKeys = new HashSet<>();
    stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey")));
    martyPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/marty_mcfly.private.unikey")));
    Contract subContract = Contract.fromDslFile(ROOT_PATH + "martyCoins.yml");
    subContract.addSignerKey(martyPrivateKeys.iterator().next());
    subContract.setExpiresAt(ZonedDateTime.now().plusMonths(1));
    subContract.seal();
    subContract.check();
    subContract.traceErrors();
    Contract stepaCoins = Contract.fromDslFile(ROOT_PATH + "stepaCoins.yml");
    stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next());
    stepaCoins.setExpiresAt(ZonedDateTime.now().plusMonths(1));
    stepaCoins.getTransactionPack().addReferencedItem(subContract);
    stepaCoins.addNewItems(subContract);
    stepaCoins.seal();
    stepaCoins.check();
    stepaCoins.traceErrors();
    PrivateKey ownerKey = new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"));
    Set<PublicKey> keys = new HashSet();
    keys.add(ownerKey.getPublicKey());
    Contract stepaU = InnerContractsService.createFreshU(100, keys, true);
    stepaU.check();
    stepaU.traceErrors();
    node.registerItem(stepaU);
    ItemResult itemResult = node.waitItem(stepaU.getId(), 18000);
    assertEquals(ItemState.APPROVED, itemResult.state);
    Parcel parcel = ContractsService.createParcel(stepaCoins, stepaU, 1, stepaPrivateKeys, false);
    parcel.getPayment().getContract().paymentCheck(config.getUIssuerKeys());
    parcel.getPayment().getContract().traceErrors();
    parcel.getPayload().getContract().check();
    parcel.getPayload().getContract().traceErrors();
    assertEquals(100 - 1, parcel.getPaymentContract().getStateData().getIntOrThrow("transaction_units"));
    assertEquals(10000, parcel.getPaymentContract().getStateData().getIntOrThrow("test_transaction_units"));
    assertTrue(parcel.getPaymentContract().isOk());
    assertFalse(parcel.getPaymentContract().isLimitedForTestnet());
    assertTrue(parcel.getPayloadContract().isOk());
    assertFalse(parcel.getPayloadContract().isLimitedForTestnet());
    Contract subItemPayload = (Contract) parcel.getPayloadContract().getNewItems().iterator().next();
    subItemPayload.check();
    subItemPayload.traceErrors();
    assertTrue(subItemPayload.isOk());
    assertFalse(subItemPayload.isLimitedForTestnet());
    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()));
    System.out.println("Payload subitem contract: " + subItemPayload.getId() + " is U: " + subItemPayload.isU(config.getUIssuerKeys(), config.getUIssuerName()));
    node.registerParcel(parcel);
    // wait parcel
    node.waitParcel(parcel.getId(), 8000);
    // check payment and payload contracts
    ItemResult itemResultPayment = node.waitItem(parcel.getPayment().getContract().getId(), 8000);
    ItemResult itemResultPayload = node.waitItem(parcel.getPayload().getContract().getId(), 8000);
    ItemResult itemResultSubItem = node.waitItem(subItemPayload.getId(), 8000);
    assertEquals(ItemState.APPROVED, itemResultPayment.state);
    assertEquals(ItemState.APPROVED, itemResultPayload.state);
    assertEquals(ItemState.APPROVED, itemResultSubItem.state);
    if (ledger instanceof PostgresLedger) {
        PostgresLedger pl = (PostgresLedger) ledger;
        try (Db db = pl.getDb()) {
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPayloadContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 0);
                }
            }
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPaymentContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 0);
                }
            }
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", subItemPayload.getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 0);
                }
            }
        }
    }
    stepaU = InnerContractsService.createFreshU(100, keys, true);
    stepaU.check();
    stepaU.traceErrors();
    node.registerItem(stepaU);
    itemResult = node.waitItem(stepaU.getId(), 18000);
    assertEquals(ItemState.APPROVED, itemResult.state);
    subContract = subContract.createRevision();
    subContract.addSignerKey(martyPrivateKeys.iterator().next());
    subContract.setOwnerKey(stepaPrivateKeys.iterator().next());
    subContract.seal();
    subContract.check();
    subContract.traceErrors();
    stepaCoins = stepaCoins.createRevision();
    stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next());
    stepaCoins.setOwnerKey(martyPrivateKeys.iterator().next());
    stepaCoins.getTransactionPack().addReferencedItem(subContract);
    stepaCoins.addNewItems(subContract);
    stepaCoins.seal();
    stepaCoins.check();
    stepaCoins.traceErrors();
    parcel = ContractsService.createParcel(stepaCoins, stepaU, 1, stepaPrivateKeys, true);
    parcel.getPayment().getContract().paymentCheck(config.getUIssuerKeys());
    parcel.getPayment().getContract().traceErrors();
    parcel.getPayload().getContract().check();
    parcel.getPayload().getContract().traceErrors();
    assertEquals(100, parcel.getPaymentContract().getStateData().getIntOrThrow("transaction_units"));
    assertEquals(10000 - 1, parcel.getPaymentContract().getStateData().getIntOrThrow("test_transaction_units"));
    assertTrue(parcel.getPaymentContract().isOk());
    assertTrue(!parcel.getPaymentContract().isLimitedForTestnet());
    assertTrue(parcel.getPayloadContract().isOk());
    assertTrue(parcel.getPayloadContract().isLimitedForTestnet());
    subItemPayload = (Contract) parcel.getPayloadContract().getNewItems().iterator().next();
    subItemPayload.check();
    subItemPayload.traceErrors();
    assertTrue(subItemPayload.isOk());
    assertTrue(subItemPayload.isLimitedForTestnet());
    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()));
    System.out.println("Payload subitem contract: " + subItemPayload.getId() + " is U: " + subItemPayload.isU(config.getUIssuerKeys(), config.getUIssuerName()));
    node.registerParcel(parcel);
    // wait parcel
    node.waitParcel(parcel.getId(), 8000);
    // check payment and payload contracts
    itemResultPayment = node.waitItem(parcel.getPayment().getContract().getId(), 8000);
    itemResultPayload = node.waitItem(parcel.getPayload().getContract().getId(), 8000);
    itemResultSubItem = node.waitItem(subItemPayload.getId(), 8000);
    assertEquals(ItemState.APPROVED, itemResultPayment.state);
    assertEquals(ItemState.APPROVED, itemResultPayload.state);
    assertEquals(ItemState.APPROVED, itemResultSubItem.state);
    if (ledger instanceof PostgresLedger) {
        PostgresLedger pl = (PostgresLedger) ledger;
        try (Db db = pl.getDb()) {
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPayloadContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 1);
                }
            }
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPaymentContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 0);
                }
            }
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", subItemPayload.getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 1);
                }
            }
        }
    }
}
Also used : PrivateKey(com.icodici.crypto.PrivateKey) PublicKey(com.icodici.crypto.PublicKey) ResultSet(java.sql.ResultSet) PreparedStatement(java.sql.PreparedStatement) Db(com.icodici.db.Db) Test(org.junit.Test)

Example 4 with Db

use of com.icodici.db.Db in project universa by UniversaBlockchain.

the class PostgresLedgerTest method reconnectAfterPostgresRestart_queryType3_transaction.

@Ignore
@Test
public // db.transaction
void reconnectAfterPostgresRestart_queryType3_transaction() throws Exception {
    final long TEST_DURATION_SECONDS = 30;
    System.out.println("TEST_DURATION_SECONDS = " + TEST_DURATION_SECONDS);
    System.out.println("For success testing, restart pg daemon manually several times during this test running.");
    HashId someHashId = HashId.createRandom();
    StateRecord sr0 = new StateRecord(someHashId);
    sr0.setState(ItemState.LOCKED_FOR_CREATION);
    ledger.save(sr0);
    AtomicLong reqCounter = new AtomicLong(0);
    AtomicLong ansCounter = new AtomicLong(0);
    ThreadPoolExecutor pool = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2);
    long t0 = System.currentTimeMillis();
    while (true) {
        reqCounter.incrementAndGet();
        pool.submit(() -> {
            AtomicBoolean doRepeat = new AtomicBoolean(true);
            while (doRepeat.get()) {
                try {
                    Db db = ledger.getDb();
                    db.transaction(() -> {
                        ResultSet rs = db.queryRow("SELECT state FROM ledger, pg_sleep(0.01) WHERE hash=?", someHashId.getDigest());
                        int iValue = rs.getInt(1);
                        iValue += 1;
                        db.queryRow("UPDATE ledger SET state=? WHERE hash=? RETURNING id;", iValue, someHashId.getDigest());
                        Thread.sleep(10);
                        rs = db.queryRow("SELECT state FROM ledger, pg_sleep(0.01) WHERE hash=?", someHashId.getDigest());
                        int iValue2 = rs.getInt(1);
                        if (iValue2 == iValue)
                            ansCounter.incrementAndGet();
                        doRepeat.set(false);
                        return null;
                    });
                } catch (Exception e) {
                    System.out.println("sleep and repeat...");
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException id) {
                    }
                }
            }
            System.out.println("reqCounter = " + reqCounter + ", ansCounter: " + ansCounter);
        // try{Thread.sleep(1000);}catch (InterruptedException ie){}
        });
        if (reqCounter.get() - ansCounter.get() > 100)
            Thread.sleep(100);
        long dt = System.currentTimeMillis() - t0;
        if (dt >= TEST_DURATION_SECONDS * 1000)
            break;
    }
    while (ansCounter.get() < reqCounter.get()) {
        Thread.sleep(1000);
        System.out.println("waiting for reqCounter == ansCounter: reqCounter = " + reqCounter + ", ansCounter = " + ansCounter);
        long dt = System.currentTimeMillis() - t0;
        if (dt >= TEST_DURATION_SECONDS * 2 * 1000)
            break;
    }
    assertEquals(reqCounter.get(), ansCounter.get());
    System.out.println("SUCCESS");
}
Also used : HashId(com.icodici.universa.HashId) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) AtomicLong(java.util.concurrent.atomic.AtomicLong) ResultSet(java.sql.ResultSet) Db(com.icodici.db.Db) PooledDb(com.icodici.db.PooledDb) SQLException(java.sql.SQLException) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 5 with Db

use of com.icodici.db.Db in project universa by UniversaBlockchain.

the class BaseNetworkTest method registerParcelWithTestAndRealRevisionPayment.

@Test(timeout = 90000)
public void registerParcelWithTestAndRealRevisionPayment() throws Exception {
    Set<PrivateKey> stepaPrivateKeys = new HashSet<>();
    Set<PrivateKey> martyPrivateKeys = new HashSet<>();
    stepaPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey")));
    martyPrivateKeys.add(new PrivateKey(Do.read(ROOT_PATH + "keys/marty_mcfly.private.unikey")));
    Contract subContract = Contract.fromDslFile(ROOT_PATH + "martyCoins.yml");
    subContract.addSignerKey(martyPrivateKeys.iterator().next());
    subContract.setExpiresAt(ZonedDateTime.now().plusMonths(1));
    subContract.seal();
    subContract.check();
    subContract.traceErrors();
    Contract stepaCoins = Contract.fromDslFile(ROOT_PATH + "stepaCoins.yml");
    stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next());
    stepaCoins.setExpiresAt(ZonedDateTime.now().plusMonths(1));
    stepaCoins.getTransactionPack().addReferencedItem(subContract);
    stepaCoins.addNewItems(subContract);
    stepaCoins.seal();
    stepaCoins.check();
    stepaCoins.traceErrors();
    PrivateKey ownerKey = new PrivateKey(Do.read(ROOT_PATH + "keys/stepan_mamontov.private.unikey"));
    Set<PublicKey> keys = new HashSet();
    keys.add(ownerKey.getPublicKey());
    Contract stepaU = InnerContractsService.createFreshU(100, keys, true);
    stepaU.check();
    stepaU.traceErrors();
    node.registerItem(stepaU);
    ItemResult itemResult = node.waitItem(stepaU.getId(), 18000);
    assertEquals(ItemState.APPROVED, itemResult.state);
    Parcel parcel = ContractsService.createParcel(stepaCoins, stepaU, 1, stepaPrivateKeys, true);
    parcel.getPayment().getContract().paymentCheck(config.getUIssuerKeys());
    parcel.getPayment().getContract().traceErrors();
    parcel.getPayload().getContract().check();
    parcel.getPayload().getContract().traceErrors();
    assertEquals(100, parcel.getPaymentContract().getStateData().getIntOrThrow("transaction_units"));
    assertEquals(10000 - 1, parcel.getPaymentContract().getStateData().getIntOrThrow("test_transaction_units"));
    assertTrue(parcel.getPaymentContract().isOk());
    assertTrue(!parcel.getPaymentContract().isLimitedForTestnet());
    assertTrue(parcel.getPayloadContract().isOk());
    assertTrue(parcel.getPayloadContract().isLimitedForTestnet());
    Contract subItemPayload = (Contract) parcel.getPayloadContract().getNewItems().iterator().next();
    subItemPayload.check();
    subItemPayload.traceErrors();
    assertTrue(subItemPayload.isOk());
    assertTrue(subItemPayload.isLimitedForTestnet());
    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()));
    System.out.println("Payload subitem contract: " + subItemPayload.getId() + " is U: " + subItemPayload.isU(config.getUIssuerKeys(), config.getUIssuerName()));
    node.registerParcel(parcel);
    // wait parcel
    node.waitParcel(parcel.getId(), 8000);
    // check payment and payload contracts
    ItemResult itemResultPayment = node.waitItem(parcel.getPayment().getContract().getId(), 8000);
    ItemResult itemResultPayload = node.waitItem(parcel.getPayload().getContract().getId(), 8000);
    ItemResult itemResultSubItem = node.waitItem(subItemPayload.getId(), 8000);
    assertEquals(ItemState.APPROVED, itemResultPayment.state);
    assertEquals(ItemState.APPROVED, itemResultPayload.state);
    assertEquals(ItemState.APPROVED, itemResultSubItem.state);
    if (ledger instanceof PostgresLedger) {
        PostgresLedger pl = (PostgresLedger) ledger;
        try (Db db = pl.getDb()) {
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPayloadContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 1);
                }
            }
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPaymentContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 0);
                }
            }
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", subItemPayload.getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 1);
                }
            }
        }
    }
    stepaU = InnerContractsService.createFreshU(100, keys, true);
    stepaU.check();
    stepaU.traceErrors();
    node.registerItem(stepaU);
    itemResult = node.waitItem(stepaU.getId(), 18000);
    assertEquals(ItemState.APPROVED, itemResult.state);
    subContract = subContract.createRevision();
    subContract.addSignerKey(martyPrivateKeys.iterator().next());
    subContract.setOwnerKey(stepaPrivateKeys.iterator().next());
    subContract.seal();
    subContract.check();
    subContract.traceErrors();
    stepaCoins = stepaCoins.createRevision();
    stepaCoins.addSignerKey(stepaPrivateKeys.iterator().next());
    stepaCoins.setOwnerKey(martyPrivateKeys.iterator().next());
    stepaCoins.getTransactionPack().addReferencedItem(subContract);
    stepaCoins.addNewItems(subContract);
    stepaCoins.seal();
    stepaCoins.check();
    stepaCoins.traceErrors();
    parcel = ContractsService.createParcel(stepaCoins, stepaU, 1, stepaPrivateKeys, false);
    parcel.getPayment().getContract().paymentCheck(config.getUIssuerKeys());
    parcel.getPayment().getContract().traceErrors();
    parcel.getPayload().getContract().check();
    parcel.getPayload().getContract().traceErrors();
    assertEquals(100 - 1, parcel.getPaymentContract().getStateData().getIntOrThrow("transaction_units"));
    assertEquals(10000, parcel.getPaymentContract().getStateData().getIntOrThrow("test_transaction_units"));
    assertTrue(parcel.getPaymentContract().isOk());
    assertFalse(parcel.getPaymentContract().isLimitedForTestnet());
    assertTrue(parcel.getPayloadContract().isOk());
    assertFalse(parcel.getPayloadContract().isLimitedForTestnet());
    subItemPayload = (Contract) parcel.getPayloadContract().getNewItems().iterator().next();
    subItemPayload.check();
    subItemPayload.traceErrors();
    assertTrue(subItemPayload.isOk());
    assertFalse(subItemPayload.isLimitedForTestnet());
    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()));
    System.out.println("Payload subitem contract: " + subItemPayload.getId() + " is U: " + subItemPayload.isU(config.getUIssuerKeys(), config.getUIssuerName()));
    node.registerParcel(parcel);
    // wait parcel
    node.waitParcel(parcel.getId(), 8000);
    // check payment and payload contracts
    itemResultPayment = node.waitItem(parcel.getPayment().getContract().getId(), 8000);
    itemResultPayload = node.waitItem(parcel.getPayload().getContract().getId(), 8000);
    itemResultSubItem = node.waitItem(subItemPayload.getId(), 8000);
    assertEquals(ItemState.APPROVED, itemResultPayment.state);
    assertEquals(ItemState.APPROVED, itemResultPayload.state);
    assertEquals(ItemState.APPROVED, itemResultSubItem.state);
    if (ledger instanceof PostgresLedger) {
        PostgresLedger pl = (PostgresLedger) ledger;
        try (Db db = pl.getDb()) {
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPayloadContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 0);
                }
            }
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", parcel.getPaymentContract().getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 0);
                }
            }
            try (PreparedStatement ps = db.statement("select count(*) from ledger_testrecords where hash = ?", subItemPayload.getId().getDigest())) {
                try (ResultSet rs = ps.executeQuery()) {
                    assertTrue(rs.next());
                    assertEquals(rs.getInt(1), 0);
                }
            }
        }
    }
}
Also used : PrivateKey(com.icodici.crypto.PrivateKey) PublicKey(com.icodici.crypto.PublicKey) ResultSet(java.sql.ResultSet) PreparedStatement(java.sql.PreparedStatement) Db(com.icodici.db.Db) Test(org.junit.Test)

Aggregations

Db (com.icodici.db.Db)6 Test (org.junit.Test)6 PrivateKey (com.icodici.crypto.PrivateKey)5 PublicKey (com.icodici.crypto.PublicKey)5 PreparedStatement (java.sql.PreparedStatement)5 ResultSet (java.sql.ResultSet)5 PooledDb (com.icodici.db.PooledDb)2 HashId (com.icodici.universa.HashId)1 IOException (java.io.IOException)1 SQLException (java.sql.SQLException)1 TimeoutException (java.util.concurrent.TimeoutException)1 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1 AtomicLong (java.util.concurrent.atomic.AtomicLong)1 Ignore (org.junit.Ignore)1