Beispiel #1
0
    def test_immediate_polling_with_local_clock_unsynced(self):
        """First poll happens with minimal delay if local clock is way off from
        the remote/server clock."""

        # each thread can have its instance of a session because
        # the mocked responses are stateless
        def create_mock_session(client):
            badnow = datetime_in_future(100)
            session = mock.Mock()
            session.post = lambda path, _: choose_reply(
                path, {'problems/': '[%s]' % continue_reply('1', 'abc123')},
                date=badnow)
            session.get = lambda path: choose_reply(path, {
                'problems/?id=1':
                '[%s]' % complete_no_answer_reply('1', 'abc123'),
                'problems/1/':
                complete_reply('1', 'abc123')
            },
                                                    date=badnow)
            return session

        with mock.patch.object(Client, 'create_session', create_mock_session):
            with Client('endpoint', 'token') as client:
                solver = Solver(client, solver_data('abc123'))

                def assert_no_delay(s):
                    s and self.assertTrue(
                        abs(s - client._POLL_BACKOFF_MIN) <
                        client._POLL_BACKOFF_MIN / 10.0)

                with mock.patch('time.sleep', assert_no_delay):
                    future = solver.sample_qubo({})
                    future.result()
    def test_eta_min_is_ignored_on_first_poll(self):
        "eta_min/earliest_estimated_completion should not be used anymore"

        with Client('endpoint', 'token') as client:
            now = datetime_in_future(0)
            eta_min, eta_max = datetime_in_future(10), datetime_in_future(30)
            client.session = mock.Mock()
            client.session.post = lambda path, _: choose_reply(path, {
                'endpoint/problems/':
                '[%s]' % continue_reply(
                    '1', 'abc123', eta_min=eta_min, eta_max=eta_max, now=now)
            },
                                                               date=now)
            client.session.get = lambda path: choose_reply(path, {
                'endpoint/problems/?id=1':
                '[%s]' % complete_no_answer_reply('1', 'abc123'),
                'endpoint/problems/1/':
                complete_reply('1', 'abc123')
            },
                                                           date=now)

            solver = Solver(client, solver_data('abc123'))

            def assert_no_delay(s):
                s and self.assertTrue(
                    abs(s - client._POLL_BACKOFF_MIN) <
                    client._POLL_BACKOFF_MIN / 10.0)

            with mock.patch('time.sleep', assert_no_delay):
                future = solver.sample_qubo({})
                future.result()
    def test_immediate_polling_with_local_clock_unsynced(self):
        """First poll happens with minimal delay if local clock is way off from
        the remote/server clock."""

        with Client('endpoint', 'token') as client:
            badnow = datetime_in_future(100)
            client.session = mock.Mock()
            client.session.post = lambda path, _: choose_reply(
                path,
                {'endpoint/problems/': '[%s]' % continue_reply('1', 'abc123')},
                date=badnow)
            client.session.get = lambda path: choose_reply(path, {
                'endpoint/problems/?id=1':
                '[%s]' % complete_no_answer_reply('1', 'abc123'),
                'endpoint/problems/1/':
                complete_reply('1', 'abc123')
            },
                                                           date=badnow)

            solver = Solver(client, solver_data('abc123'))

            def assert_no_delay(s):
                s and self.assertTrue(
                    abs(s - client._POLL_BACKOFF_MIN) <
                    client._POLL_BACKOFF_MIN / 10.0)

            with mock.patch('time.sleep', assert_no_delay):
                future = solver.sample_qubo({})
                future.result()
    def test_immediate_polling_without_eta_min(self):
        "First poll happens with minimal delay if eta_min missing"

        # each thread can have its instance of a session because
        # responses are stateless
        def create_mock_session(client):
            now = datetime_in_future(0)
            session = mock.Mock()
            session.post = lambda path, _: choose_reply(
                path, {'problems/': '[%s]' % continue_reply('1', 'abc123')},
                date=now)
            session.get = lambda path: choose_reply(path, {
                'problems/?id=1':
                '[%s]' % complete_no_answer_reply('1', 'abc123'),
                'problems/1/':
                complete_reply('1', 'abc123')
            },
                                                    date=now)
            return session

        with mock.patch.object(Client, 'create_session', create_mock_session):
            with Client('endpoint', 'token') as client:
                solver = Solver(client, solver_data('abc123'))

                def assert_no_delay(s):
                    s and self.assertTrue(
                        abs(s - client.poll_backoff_min) <
                        client._DEFAULT_POLL_BACKOFF_MIN)

                with mock.patch('time.sleep', assert_no_delay):
                    future = solver.sample_qubo({})
                    future.result()
    def test_eta_min_is_ignored_on_first_poll(self):
        "eta_min/earliest_estimated_completion should not be used anymore"

        # each thread can have its instance of a session because
        # the mocked responses are stateless
        def create_mock_session(client):
            now = datetime_in_future(0)
            eta_min, eta_max = datetime_in_future(10), datetime_in_future(30)
            session = mock.Mock()
            session.post = lambda path, _: choose_reply(path, {
                'problems/': '[%s]' % continue_reply(
                    '1', 'abc123', eta_min=eta_min, eta_max=eta_max, now=now)
            }, date=now)
            session.get = lambda path: choose_reply(path, {
                'problems/?id=1': '[%s]' % complete_no_answer_reply(
                    '1', 'abc123'),
                'problems/1/': complete_reply(
                    '1', 'abc123')
            }, date=now)
            return session

        with mock.patch.object(Client, 'create_session', create_mock_session):
            with Client('endpoint', 'token') as client:
                solver = Solver(client, solver_data('abc123'))

                def assert_no_delay(s):
                    s and self.assertTrue(
                        abs(s - client.poll_backoff_min) < client.DEFAULTS['poll_backoff_min'])

                with mock.patch('time.sleep', assert_no_delay):
                    future = solver.sample_qubo({})
                    future.result()
    def test_submit_bqm_qubo_ok_reply(self):
        """Handle a normal query and response."""

        qubo_msg_diff = dict(type="qubo")
        qubo_answer_diff = {
            'energies': 'AAAAAAAAAAA=',
            'solutions': 'AA==',
            'active_variables': 'AAAAAAQAAAA='
        }

        # each thread can have its instance of a session because
        # the mocked responses are stateless
        def create_mock_session(client):
            session = mock.Mock()
            session.post = lambda a, _: choose_reply(a, {
                'problems/': '[%s]' % complete_no_answer_reply(
                    '123', 'abc123')})
            session.get = lambda a: choose_reply(a, {
                'problems/123/': complete_reply(
                    '123', 'abc123', answer=qubo_answer_diff, msg=qubo_msg_diff)})
            return session

        with mock.patch.object(Client, 'create_session', create_mock_session):
            with Client('endpoint', 'token') as client:
                solver = Solver(client, solver_data('abc123'))

                qubo = {(0, 0): 4.0, (0, 4): -4, (4, 4): 4.0}
                offset = -2.0
                params = dict(num_reads=100)

                results = solver.sample_qubo(qubo, offset, **params)

                # make sure energies are correct in raw results
                for energy, sample in zip(results.energies, results.samples):
                    self.assertEqual(energy, evaluate_ising({}, qubo, sample, offset=offset))
Beispiel #7
0
    def test_polling_recovery_after_5xx(self):
        "Polling shouldn't be aborted on 5xx responses."

        # we need a "global session", because mocked responses are stateful
        def global_mock_session():
            session = mock.Mock()

            # on submit, return status pending
            session.post = lambda path, _: choose_reply(
                path, {'problems/': '[%s]' % continue_reply('123', 'abc123')})

            # on first and second status poll, fail with 503 and 504
            # on third status poll, return completed
            statuses = iter([503, 504])

            def continue_then_complete(path, state={'count': 0}):
                state['count'] += 1
                if state['count'] < 3:
                    return choose_reply(path,
                                        replies={
                                            'problems/?id=123':
                                            '[%s]' %
                                            continue_reply('123', 'abc123'),
                                            'problems/123/':
                                            continue_reply('123', 'abc123')
                                        },
                                        statuses={
                                            'problems/?id=123': statuses,
                                            'problems/123/': statuses
                                        })
                else:
                    return choose_reply(
                        path, {
                            'problems/?id=123':
                            '[%s]' % complete_no_answer_reply('123', 'abc123'),
                            'problems/123/':
                            complete_reply('123', 'abc123')
                        })

            session.get = continue_then_complete

            return session

        session = global_mock_session()

        with mock.patch.object(Client, 'create_session', lambda self: session):
            with Client('endpoint', 'token') as client:
                solver = Solver(client, solver_data('abc123'))

                future = solver.sample_qubo({})
                future.result()

                # after third poll, back-off interval should be 4 x initial back-off
                self.assertEqual(future._poll_backoff,
                                 Client._POLL_BACKOFF_MIN * 2**2)
    def test_exponential_backoff_polling(self):
        "After each poll, back-off should double"

        # we need a "global session", because mocked responses are stateful
        def global_mock_session():
            session = mock.Mock()

            # on submit, return status pending
            session.post = lambda path, _: choose_reply(
                path, {'problems/': '[%s]' % continue_reply('123', 'abc123')})

            # on first and second status poll, return pending
            # on third status poll, return completed
            def continue_then_complete(path, state={'count': 0}):
                state['count'] += 1
                if state['count'] < 3:
                    return choose_reply(
                        path, {
                            'problems/?id=123':
                            '[%s]' % continue_reply('123', 'abc123'),
                            'problems/123/':
                            continue_reply('123', 'abc123')
                        })
                else:
                    return choose_reply(
                        path, {
                            'problems/?id=123':
                            '[%s]' % complete_no_answer_reply('123', 'abc123'),
                            'problems/123/':
                            complete_reply('123', 'abc123')
                        })

            session.get = continue_then_complete

            return session

        session = global_mock_session()

        with mock.patch.object(Client, 'create_session', lambda self: session):
            with Client('endpoint', 'token') as client:
                solver = Solver(client, solver_data('abc123'))

                future = solver.sample_qubo({})
                future.result()

                # after third poll, back-off interval should be 4 x initial back-off
                self.assertEqual(future._poll_backoff,
                                 client.poll_backoff_min * 2**2)
    def test_exponential_backoff_polling(self):
        "After each poll, back-off should double"

        with Client('endpoint', 'token') as client:
            client.session = mock.Mock()
            # on submit, return status pending
            client.session.post = lambda path, _: choose_reply(
                path, {
                    'endpoint/problems/': '[%s]' % continue_reply(
                        '123', 'abc123')
                })

            # on first and second status poll, return pending
            # on third status poll, return completed
            def continue_then_complete(path, state={'count': 0}):
                state['count'] += 1
                if state['count'] < 3:
                    return choose_reply(
                        path, {
                            'endpoint/problems/?id=123':
                            '[%s]' % continue_reply('123', 'abc123'),
                            'endpoint/problems/123/':
                            continue_reply('123', 'abc123')
                        })
                else:
                    return choose_reply(
                        path, {
                            'endpoint/problems/?id=123':
                            '[%s]' % complete_no_answer_reply('123', 'abc123'),
                            'endpoint/problems/123/':
                            complete_reply('123', 'abc123')
                        })

            client.session.get = continue_then_complete

            solver = Solver(client, solver_data('abc123'))

            future = solver.sample_qubo({})
            future.result()

            # after third poll, back-off interval should be 4 x initial back-off
            self.assertEqual(future._poll_backoff,
                             Client._POLL_BACKOFF_MIN * 2**2)