Exemplo n.º 1
0
def test_removal_of_priors(manager, dummy_wallet, db_session, mock_queue_sig):

    uuid1 = str_uuid()
    uuid2 = str_uuid()
    uuid3 = str_uuid()

    manager.send_eth(uuid1, 100, deterministic_address_1, dummy_wallet.address)
    db_session.commit()

    # Create two tasks, both dependent on task 1
    manager.send_eth(uuid2, 100, deterministic_address_1, dummy_wallet.address, prior_tasks=[uuid1])
    db_session.commit()

    manager.send_eth(uuid3, 100, deterministic_address_1, dummy_wallet.address, prior_tasks=[uuid1])
    db_session.commit()

    task_1 = db_session.query(BlockchainTask).filter(BlockchainTask.uuid == uuid1).first()
    task_2 = db_session.query(BlockchainTask).filter(BlockchainTask.uuid == uuid2).first()
    task_3 = db_session.query(BlockchainTask).filter(BlockchainTask.uuid == uuid3).first()

    assert task_1.posterior_tasks == [task_2, task_3]
    assert task_2.prior_tasks == [task_1]

    manager.remove_prior_task_dependency(uuid2, uuid1)

    # Make sure only the task1<>task2 dependency is removed
    assert task_1.posterior_tasks == [task_3]
    assert task_2.prior_tasks == []
    assert task_3.prior_tasks == [task_1]

    sig_output = mock_queue_sig[-1][0]

    # Make sure task2 is sent to the queue for retry
    assert sig_output.task == 'ETHEREUM.celery_tasks.attempt_transaction'
    assert sig_output.kwargs == {'task_uuid': uuid2}
Exemplo n.º 2
0
    def test_task_relationships(self, db_session):

        prior = BlockchainTask(uuid=str_uuid())

        posterior = BlockchainTask(uuid=str_uuid())

        posterior.prior_tasks.append(prior)

        db_session.add_all([prior, posterior])
        db_session.commit()

        assert prior in posterior.prior_tasks
        assert posterior in prior.posterior_tasks
Exemplo n.º 3
0
def test_remove_all_posterior_dependencies(manager, dummy_wallet, db_session, mock_queue_sig):

    uuid0 = str_uuid()
    uuid1 = str_uuid()
    uuid2 = str_uuid()
    uuid3 = str_uuid()

    # Include a task 0 that we won't remove dependencies for
    manager.send_eth(uuid0, 100, deterministic_address_1, dummy_wallet.address)
    db_session.commit()

    manager.send_eth(uuid1, 100, deterministic_address_1, dummy_wallet.address)
    db_session.commit()

    # Create two tasks, both dependent on task 1 and task 0
    manager.send_eth(uuid2, 100, deterministic_address_1, dummy_wallet.address, prior_tasks=[uuid1, uuid0])
    db_session.commit()

    manager.send_eth(uuid3, 100, deterministic_address_1, dummy_wallet.address, prior_tasks=[uuid1, uuid0])
    db_session.commit()

    task_0 = db_session.query(BlockchainTask).filter(BlockchainTask.uuid == uuid0).first()
    task_1 = db_session.query(BlockchainTask).filter(BlockchainTask.uuid == uuid1).first()
    task_2 = db_session.query(BlockchainTask).filter(BlockchainTask.uuid == uuid2).first()
    task_3 = db_session.query(BlockchainTask).filter(BlockchainTask.uuid == uuid3).first()

    assert task_0.posterior_tasks == [task_2, task_3]
    assert task_1.posterior_tasks == [task_2, task_3]
    assert task_2.prior_tasks == [task_0, task_1]
    assert task_3.prior_tasks == [task_0, task_1]

    manager.remove_all_posterior_dependencies(uuid1)

    # Make sure all posterior dependencies are removed, but other priors are unaffected
    assert task_1.posterior_tasks == []
    assert task_2.prior_tasks == [task_0]
    assert task_3.prior_tasks == [task_0]

    sig_output1 = mock_queue_sig[-2][0]
    sig_output2 = mock_queue_sig[-1][0]

    # Make sure task2 is sent to the queue for retry
    assert sig_output1.task == 'ETHEREUM.celery_tasks.attempt_transaction'
    assert sig_output1.kwargs == {'task_uuid': uuid2}

    # Make sure task3 is sent to the queue for retry
    assert sig_output2.task == 'ETHEREUM.celery_tasks.attempt_transaction'
    assert sig_output2.kwargs == {'task_uuid': uuid3}
Exemplo n.º 4
0
    def test_transaction_status_propagation(self, db_session):

        task = BlockchainTask(uuid=str_uuid())

        assert task.status == 'UNSTARTED'

        transaction_1 = BlockchainTransaction()
        transaction_1.task = task
        transaction_1.status = 'PENDING'

        assert task.status == 'PENDING'

        transaction_2 = BlockchainTransaction()
        transaction_2.task = task
        transaction_2.status = 'SUCCESS'

        assert task.status == 'SUCCESS'
        assert task.status_code == 1

        db_session.add_all([task, transaction_1, transaction_2])
        db_session.commit()

        # Uses a custom expression so worth testing the filter
        queried_task = db_session.query(BlockchainTask).filter(
            BlockchainTask.status == 'SUCCESS').first()
        assert queried_task == task
Exemplo n.º 5
0
    def test_add_prior_tasks(self, db_session,
                             persistence_module: SQLPersistenceInterface):

        prior_1 = BlockchainTask(uuid=str_uuid())
        prior_2 = BlockchainTask(uuid=str_uuid())
        uuid_1 = prior_1.uuid
        uuid_2 = prior_2.uuid

        posterior = BlockchainTask(uuid=str_uuid())

        db_session.add_all([prior_1, prior_2, posterior])
        db_session.commit()

        posterior.add_prior_tasks([uuid_1, uuid_2])

        assert prior_1 in posterior.prior_tasks
        assert prior_2 in posterior.prior_tasks
Exemplo n.º 6
0
def dummy_task(db_session, dummy_wallet):
    from sql_persistence.models import BlockchainTask

    task = BlockchainTask(uuid=str_uuid(), signing_wallet=dummy_wallet)

    db_session.add(task)
    db_session.commit()

    return task
Exemplo n.º 7
0
    def test_set_task_type(self, db_session):

        prior = BlockchainTask(uuid=str_uuid())

        prior.type = 'SEND_ETH'

        assert prior.type == 'SEND_ETH'

        with pytest.raises(ValueError):
            prior.type = 'NOT_A_TYPE'
Exemplo n.º 8
0
def test_duplicate_task_uuids_not_accepted(manager, dummy_wallet, db_session):
    uuid = str_uuid()

    t1 = manager.send_eth(uuid, 100, deterministic_address_1, dummy_wallet.address)

    t2 = manager.send_eth(uuid, 100, deterministic_address_1, dummy_wallet.address)

    matching_tasks = db_session.query(BlockchainTask).filter(BlockchainTask.uuid == uuid).all()

    assert len(matching_tasks) == 1
    assert t1 == t2
    assert matching_tasks[0].id == t1
Exemplo n.º 9
0
    def test_create_blockchain_transaction(
            self, db_session, persistence_module: SQLPersistenceInterface):

        wallet = BlockchainWallet()
        db_session.add(wallet)

        task = BlockchainTask(str_uuid())
        task.signing_wallet = wallet
        db_session.add(task)

        trans = persistence_module.create_blockchain_transaction(
            task_uuid=task.uuid)

        assert trans.task.uuid == task.uuid
Exemplo n.º 10
0
    def test_deploy_contract_test(self, db_session,
                                  persistence_module: SQLPersistenceInterface):
        signing_wallet_obj = BlockchainWallet()
        db_session.add(signing_wallet_obj)

        uuid = str_uuid()
        contract_name = 'ERC20'
        args = []
        kwargs = None
        gas_limit = None
        prior_tasks = None

        trans = persistence_module.create_deploy_contract_task(
            uuid, signing_wallet_obj, contract_name, args, kwargs, gas_limit,
            prior_tasks)

        assert trans.uuid == uuid
        assert trans.type == 'DEPLOY_CONTRACT'
Exemplo n.º 11
0
    def test_create_function_task(self, db_session,
                                  persistence_module: SQLPersistenceInterface):

        signing_wallet_obj = BlockchainWallet()
        db_session.add(signing_wallet_obj)

        uuid = str_uuid()
        contract_address = '0x1234'
        abi_type = "ERC20"  # aka contract_type
        function_name = "transferFrom"
        args = ['0x1234', '0x2345', int(1e36)]
        kwargs = None
        signing_address = None
        encrypted_private_key = None
        gas_limit = None
        prior_tasks = None
        reserves_task = None

        trans = persistence_module.create_function_task(
            uuid, signing_wallet_obj, contract_address, abi_type,
            function_name, args, kwargs, gas_limit, prior_tasks, reserves_task)

        assert trans.uuid == uuid
        assert trans.type == 'FUNCTION'
Exemplo n.º 12
0
 def mock_response(sig, countdown=0):
     return str_uuid()
Exemplo n.º 13
0
 def mock_response(sig, countdown=0):
     queued_sigs.append((sig, countdown))
     return str_uuid()