TEST_F(TransfersTest, base) { uint64_t TRANSFER_AMOUNT; currency.parseAmount("500000.5", TRANSFER_AMOUNT); launchTestnet(2); std::unique_ptr<CryptoNote::INode> node1; std::unique_ptr<CryptoNote::INode> node2; nodeDaemons[0]->makeINode(node1); nodeDaemons[1]->makeINode(node2); CryptoNote::AccountBase dstAcc; dstAcc.generate(); AccountKeys dstKeys = reinterpret_cast<const AccountKeys&>(dstAcc.getAccountKeys()); BlockchainSynchronizer blockSync(*node2.get(), currency.genesisBlockHash()); TransfersSyncronizer transferSync(currency, blockSync, *node2.get()); TransfersObserver transferObserver; WalletLegacyObserver walletObserver; AccountSubscription sub; sub.syncStart.timestamp = 0; sub.syncStart.height = 0; sub.keys = dstKeys; sub.transactionSpendableAge = 5; ITransfersSubscription& transferSub = transferSync.addSubscription(sub); ITransfersContainer& transferContainer = transferSub.getContainer(); transferSub.addObserver(&transferObserver); Tests::Common::TestWalletLegacy wallet1(m_dispatcher, m_currency, *node1); ASSERT_FALSE(static_cast<bool>(wallet1.init())); wallet1.wallet()->addObserver(&walletObserver); ASSERT_TRUE(mineBlocks(*nodeDaemons[0], wallet1.address(), 1)); ASSERT_TRUE(mineBlocks(*nodeDaemons[0], wallet1.address(), currency.minedMoneyUnlockWindow())); wallet1.waitForSynchronizationToHeight(static_cast<uint32_t>(2 + currency.minedMoneyUnlockWindow())); // start syncing and wait for a transfer FutureGuard<bool> waitFuture(std::async(std::launch::async, [&transferObserver] { return transferObserver.waitTransfer(); })); Interrupter transferObserverInterrupter(transferObserver); blockSync.start(); Hash txId; ASSERT_FALSE(static_cast<bool>(wallet1.sendTransaction(currency.accountAddressAsString(dstAcc), TRANSFER_AMOUNT, txId))); ASSERT_TRUE(mineBlocks(*nodeDaemons[0], wallet1.address(), 1)); ASSERT_TRUE(waitFuture.get()); transferObserverInterrupter.cancel(); std::cout << "Received transfer: " << currency.formatAmount(transferContainer.balance(ITransfersContainer::IncludeAll)) << std::endl; ASSERT_EQ(TRANSFER_AMOUNT, transferContainer.balance(ITransfersContainer::IncludeAll)); ASSERT_GT(transferContainer.getTransactionOutputs(txId, ITransfersContainer::IncludeAll).size(), 0); blockSync.stop(); }
TEST_F(TransfersTest, base) { uint64_t TRANSFER_AMOUNT; currency.parseAmount("500000.5", TRANSFER_AMOUNT); launchTestnet(2); std::unique_ptr<CryptoNote::INode> node1; std::unique_ptr<CryptoNote::INode> node2; nodeDaemons[0]->makeINode(node1); nodeDaemons[1]->makeINode(node2); cryptonote::account_base dstAcc; dstAcc.generate(); AccountKeys dstKeys = reinterpret_cast<const AccountKeys&>(dstAcc.get_keys()); BlockchainSynchronizer blockSync(*node2.get(), currency.genesisBlockHash()); TransfersSyncronizer transferSync(currency, blockSync, *node2.get()); TransfersObserver transferObserver; WalletObserver walletObserver; AccountSubscription sub; sub.syncStart.timestamp = 0; sub.syncStart.height = 0; sub.keys = dstKeys; sub.transactionSpendableAge = 5; ITransfersSubscription& transferSub = transferSync.addSubscription(sub); ITransfersContainer& transferContainer = transferSub.getContainer(); transferSub.addObserver(&transferObserver); std::unique_ptr<IWallet> wallet1; makeWallet(wallet1, node1); mineBlock(wallet1); wallet1->addObserver(&walletObserver); startMining(1); while (wallet1->actualBalance() < TRANSFER_AMOUNT) { walletObserver.m_sem.wait(); } // start syncing and wait for a transfer auto waitFuture = std::async(std::launch::async, [&transferObserver] { return transferObserver.waitTransfer(); }); blockSync.start(); Transfer transfer; transfer.address = currency.accountAddressAsString(dstAcc); transfer.amount = TRANSFER_AMOUNT; wallet1->sendTransaction(transfer, currency.minimumFee()); auto result = waitFuture.get(); std::cout << "Received transfer: " << currency.formatAmount(transferContainer.balance(ITransfersContainer::IncludeAll)) << std::endl; ASSERT_EQ(TRANSFER_AMOUNT, transferContainer.balance(ITransfersContainer::IncludeAll)); auto BACK_TRANSFER = TRANSFER_AMOUNT / 2; stopMining(); blockSync.stop(); }