Ejemplo n.º 1
0
def staking_participant(funded_blockchain, blockchain_ursulas):
    # Start up the local fleet
    for teacher in blockchain_ursulas:
        start_pytest_ursula_services(ursula=teacher)

    teachers = list(blockchain_ursulas)
    staking_participant = teachers[-1]
    return staking_participant
Ejemplo n.º 2
0
def test_availability_tracker_integration(blockchain_ursulas, monkeypatch):

    # Start up self-services
    ursula = blockchain_ursulas.pop()
    start_pytest_ursula_services(ursula=ursula)

    ursula._availability_tracker = AvailabilityTracker(ursula=ursula)

    def maintain():
        tracker = ursula._availability_tracker

        def mock_node_information_endpoint(middleware, port, *args, **kwargs):
            ursula_were_looking_for = ursula.rest_interface.port == port
            if ursula_were_looking_for:
                raise RestMiddleware.NotFound("Fake Reason")  # Make this node unreachable
            else:
                response = Response(response=bytes(ursula), mimetype='application/octet-stream')
                return response

        # apply the monkeypatch for requests.get to mock_get
        monkeypatch.setattr(NucypherMiddlewareClient,
                            NucypherMiddlewareClient.node_information.__name__,
                            mock_node_information_endpoint)

        ursula._availability_tracker.start()
        tracker.measure_sample()  # This makes a REST Call

        start, timeout = maya.now(), 1  # seconds
        while True:
            try:
                assert len(tracker.excuses)
            except AssertionError:
                now = maya.now()
                if (now - start).total_seconds() > timeout:
                    pytest.fail()
                time.sleep(0.1)
                continue
            else:
                break

    # Run the Callbacks
    try:
        d = threads.deferToThread(maintain)
        yield d
    finally:
        if ursula._availability_tracker:
            ursula._availability_tracker.stop()
            ursula._availability_tracker = None
Ejemplo n.º 3
0
def test_availability_sensor_integration(blockchain_ursulas, monkeypatch):

    # Start up self-services
    ursula = blockchain_ursulas.pop()
    start_pytest_ursula_services(ursula=ursula)

    ursula._availability_sensor = AvailabilitySensor(ursula=ursula)

    def maintain():
        sensor = ursula._availability_sensor

        def mock_node_information_endpoint(middleware, port, *args, **kwargs):
            ursula_were_looking_for = ursula.rest_interface.port == port
            if ursula_were_looking_for:
                raise RestMiddleware.NotFound(
                    "Fake Reason")  # Make this node unreachable
            else:
                response = Response(response=bytes(ursula),
                                    mimetype='application/octet-stream')
                return response

        # apply the monkeypatch for requests.get to mock_get
        monkeypatch.setattr(NucypherMiddlewareClient,
                            NucypherMiddlewareClient.node_information.__name__,
                            mock_node_information_endpoint)

        ursula._availability_sensor.start()
        sensor.measure()  # This makes a REST Call

        # to keep this test fast, were just checking for a single entry
        # (technically there will be 10, but resolution is one second.)
        assert len(sensor._AvailabilitySensor__excuses) > 0

    # Run the Callbacks
    try:
        d = threads.deferToThread(maintain)
        yield d
    finally:
        if ursula._availability_sensor:
            ursula._availability_sensor.stop()
            ursula._availability_sensor = None
Ejemplo n.º 4
0
 def _run_teacher(_encrypt_result):
     start_pytest_ursula_services(ursula=teacher)
     return teacher_uri
Ejemplo n.º 5
0
 def run_teacher():
     start_pytest_ursula_services(ursula=teacher)
     return teacher_uri
Ejemplo n.º 6
0
def test_persistent_node_storage_integration(click_runner,
                                             custom_filepath,
                                             testerchain,
                                             blockchain_ursulas,
                                             agency_local_registry):

    alice, ursula, another_ursula, felix, staker, *all_yall = testerchain.unassigned_accounts
    filename = UrsulaConfiguration.generate_filename()
    another_ursula_configuration_file_location = os.path.join(custom_filepath, filename)

    init_args = ('ursula', 'init',
                 '--provider', TEST_PROVIDER_URI,
                 '--worker-address', another_ursula,
                 '--network', TEMPORARY_DOMAIN,
                 '--rest-host', MOCK_IP_ADDRESS,
                 '--config-root', custom_filepath,
                 '--registry-filepath', agency_local_registry.filepath,
                 )

    envvars = {NUCYPHER_ENVVAR_KEYRING_PASSWORD: INSECURE_DEVELOPMENT_PASSWORD}
    result = click_runner.invoke(nucypher_cli, init_args, catch_exceptions=False, env=envvars)
    assert result.exit_code == 0

    teacher = blockchain_ursulas.pop()
    teacher_uri = teacher.rest_information()[0].uri

    start_pytest_ursula_services(ursula=teacher)

    user_input = f'{INSECURE_DEVELOPMENT_PASSWORD}\n'

    run_args = ('ursula', 'run',
                '--dry-run',
                '--debug',
                '--interactive',
                '--config-file', another_ursula_configuration_file_location,
                '--teacher', teacher_uri)

    Worker.BONDING_TIMEOUT = 1
    with pytest.raises(Teacher.DetachedWorker):
        # Worker init success, but unassigned.
        result = yield threads.deferToThread(click_runner.invoke,
                                             nucypher_cli, run_args,
                                             catch_exceptions=False,
                                             input=user_input,
                                             env=envvars)
    assert result.exit_code == 0

    # Run an Ursula amidst the other configuration files
    run_args = ('ursula', 'run',
                '--dry-run',
                '--debug',
                '--interactive',
                '--config-file', another_ursula_configuration_file_location)

    with pytest.raises(Teacher.DetachedWorker):
        # Worker init success, but unassigned.
        result = yield threads.deferToThread(click_runner.invoke,
                                             nucypher_cli, run_args,
                                             catch_exceptions=False,
                                             input=user_input,
                                             env=envvars)
    assert result.exit_code == 0
Ejemplo n.º 7
0
 def start():
     # Start running the worker
     start_pytest_ursula_services(ursula=ursula)
     ursula.work_tracker.start()
Ejemplo n.º 8
0
def test_availability_tracker_success(blockchain_ursulas):

    # Start up self-services
    ursula = blockchain_ursulas.pop()
    start_pytest_ursula_services(ursula=ursula)

    ursula._availability_tracker = AvailabilityTracker(ursula=ursula)

    def measure():
        ursula._availability_tracker.start()
        assert ursula._availability_tracker.score == 10
        ursula._availability_tracker.record(False)
        assert ursula._availability_tracker.score == 9.0
        for i in range(7):
            ursula._availability_tracker.record(True)
        assert ursula._availability_tracker.score > 9.5

    def maintain():
        tracker = ursula._availability_tracker
        tracker.maintain()

        # The node goes offline for some time...
        for _ in range(10):
            ursula._availability_tracker.record(False, reason={'error': 'fake failure reason'})

        assert tracker.score < 4
        assert tracker.status() == (tracker.score > (tracker.SENSITIVITY * tracker.MAXIMUM_SCORE))
        assert not tracker.status()

        original_issuer = AvailabilityTracker.issue_warnings
        warnings = dict()
        def issue_warnings(tracker, *args, **kwargs):
            result = original_issuer(tracker, *args, **kwargs)
            warnings[tracker.score] = result
        AvailabilityTracker.issue_warnings = issue_warnings
        tracker.maintain()
        assert warnings
        AvailabilityTracker.issue_warnings = original_issuer

        # to keep this test fast, were just checking for a single entry
        # (technically there will be 10, but resolution is one second.)
        assert len(tracker.excuses) > 0

    def raise_to_maximum():
        tracker = ursula._availability_tracker
        for i in range(150):
            tracker.record(True)
        assert tracker.score > 9.98
        assert tracker.status() == bool(tracker.score > (tracker.SENSITIVITY * tracker.MAXIMUM_SCORE))
        assert tracker.status()

    # Run the Callbacks
    try:
        d = threads.deferToThread(measure)
        yield d
        d = threads.deferToThread(maintain)
        yield d
        d = threads.deferToThread(raise_to_maximum)
        yield d
    finally:
        if ursula._availability_tracker:
            ursula._availability_tracker.stop()
            ursula._availability_tracker = None