# Copyright 2020 The Cirq Developers
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Tests for EngineClient."""
import datetime
from unittest import mock
import pytest
from google.api_core import exceptions
from google.protobuf.field_mask_pb2 import FieldMask
from google.protobuf.timestamp_pb2 import Timestamp
from cirq.google.engine.engine_client import EngineClient, EngineException
from cirq.google.engine.client import quantum
from cirq.google.engine.client.quantum_v1alpha1 import enums as qenums
from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes


def setup_mock_(client_constructor):
    grpc_client = mock.Mock()
    client_constructor.return_value = grpc_client
    return grpc_client


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_create_program(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumProgram(name='projects/proj/programs/prog')
    grpc_client.create_quantum_program.return_value = result

    code = qtypes.any_pb2.Any()
    labels = {'hello': 'world'}
    client = EngineClient()
    assert client.create_program('proj', 'prog', code, 'A program',
                                 labels) == ('prog', result)
    assert grpc_client.create_quantum_program.call_args[0] == (
        'projects/proj',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              code=code,
                              description='A program',
                              labels=labels), False)

    assert client.create_program('proj', 'prog', code,
                                 'A program') == ('prog', result)
    assert grpc_client.create_quantum_program.call_args[0] == (
        'projects/proj',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              code=code,
                              description='A program'), False)

    assert client.create_program('proj', 'prog', code,
                                 labels=labels) == ('prog', result)
    assert grpc_client.create_quantum_program.call_args[0] == (
        'projects/proj',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              code=code,
                              labels=labels), False)

    assert client.create_program('proj', 'prog', code) == ('prog', result)
    assert grpc_client.create_quantum_program.call_args[0] == (
        'projects/proj',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              code=code), False)

    assert client.create_program('proj', program_id=None,
                                 code=code) == ('prog', result)
    assert grpc_client.create_quantum_program.call_args[0] == (
        'projects/proj', qtypes.QuantumProgram(code=code), False)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_get_program(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumProgram(name='projects/proj/programs/prog')
    grpc_client.get_quantum_program.return_value = result

    client = EngineClient()
    assert client.get_program('proj', 'prog', False) == result
    assert grpc_client.get_quantum_program.call_args[0] == (
        'projects/proj/programs/prog', False)

    assert client.get_program('proj', 'prog', True) == result
    assert grpc_client.get_quantum_program.call_args[0] == (
        'projects/proj/programs/prog', True)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_list_program(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    results = [
        qtypes.QuantumProgram(name='projects/proj/programs/prog1'),
        qtypes.QuantumProgram(name='projects/proj/programs/prog2')
    ]
    grpc_client.list_quantum_programs.return_value = results

    client = EngineClient()
    assert client.list_programs(project_id='proj') == results
    assert grpc_client.list_quantum_programs.call_args[0] == ('projects/proj',)
    assert grpc_client.list_quantum_programs.call_args[1] == {
        'filter_': '',
    }


# yapf: disable
@pytest.mark.parametrize(
    'expected_filter, created_after, created_before, labels',
    [
        ('',
            None,
            None,
            None),
        ('create_time >= 2020-09-01',
            datetime.date(2020, 9, 1),
            None,
            None),
        ('create_time >= 1598918400',
            datetime.datetime(2020, 9, 1, 0, 0, 0,
                              tzinfo=datetime.timezone.utc),
            None,
            None),
        ('create_time <= 2020-10-01',
            None,
            datetime.date(2020, 10, 1),
            None),
        ('create_time >= 2020-09-01 AND create_time <= 1598918410',
            datetime.date(2020, 9, 1),
            datetime.datetime(2020, 9, 1, 0, 0, 10,
                            tzinfo=datetime.timezone.utc),
            None),
        ('labels.color:red AND labels.shape:*',
            None,
            None,
            {
            'color': 'red',
            'shape': '*'
            },
        ),
        ('create_time >= 2020-08-01 AND '
         'create_time <= 1598918400 AND '
         'labels.color:red AND labels.shape:*',
            datetime.date(2020, 8, 1),
            datetime.datetime(2020, 9, 1, tzinfo=datetime.timezone.utc),
            {
            'color': 'red',
            'shape': '*'
            },
        ),
    ])
# yapf: enable
@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_list_program_filters(client_constructor, expected_filter,
                              created_before, created_after, labels):
    grpc_client = setup_mock_(client_constructor)
    client = EngineClient()
    client.list_programs(project_id='proj',
                         created_before=created_before,
                         created_after=created_after,
                         has_labels=labels)
    assert grpc_client.list_quantum_programs.call_args[1] == {
        'filter_': expected_filter,
    }


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_list_program_filters_invalid_type(client_constructor):
    with pytest.raises(ValueError, match=""):
        EngineClient().list_programs(project_id='proj',
                                     created_before="Unsupported date/time")


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_set_program_description(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumProgram(name='projects/proj/programs/prog')
    grpc_client.update_quantum_program.return_value = result

    client = EngineClient()
    assert client.set_program_description('proj', 'prog', 'A program') == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              description='A program'),
        qtypes.field_mask_pb2.FieldMask(paths=['description']))

    assert client.set_program_description('proj', 'prog', '') == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog'),
        qtypes.field_mask_pb2.FieldMask(paths=['description']))


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_set_program_labels(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    grpc_client.get_quantum_program.return_value = qtypes.QuantumProgram(
        labels={
            'color': 'red',
            'weather': 'sun',
            'run': '1'
        },
        label_fingerprint='hash')
    result = qtypes.QuantumProgram(name='projects/proj/programs/prog')
    grpc_client.update_quantum_program.return_value = result

    client = EngineClient()
    labels = {'hello': 'world', 'color': 'blue', 'run': '1'}
    assert client.set_program_labels('proj', 'prog', labels) == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              labels=labels,
                              label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))

    assert client.set_program_labels('proj', 'prog', {}) == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_add_program_labels(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    existing = qtypes.QuantumProgram(labels={
        'color': 'red',
        'weather': 'sun',
        'run': '1'
    },
                                     label_fingerprint='hash')
    grpc_client.get_quantum_program.return_value = existing
    result = qtypes.QuantumProgram(name='projects/proj/programs/prog')
    grpc_client.update_quantum_program.return_value = result

    client = EngineClient()
    assert client.add_program_labels('proj', 'prog',
                                     {'color': 'red'}) == existing
    assert grpc_client.update_quantum_program.call_count == 0

    assert client.add_program_labels('proj', 'prog',
                                     {'hello': 'world'}) == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              labels={
                                  'color': 'red',
                                  'weather': 'sun',
                                  'run': '1',
                                  'hello': 'world'
                              },
                              label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))

    assert client.add_program_labels('proj', 'prog', {
        'hello': 'world',
        'color': 'blue'
    }) == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              labels={
                                  'color': 'blue',
                                  'weather': 'sun',
                                  'run': '1',
                                  'hello': 'world'
                              },
                              label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_remove_program_labels(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    existing = qtypes.QuantumProgram(labels={
        'color': 'red',
        'weather': 'sun',
        'run': '1'
    },
                                     label_fingerprint='hash')
    grpc_client.get_quantum_program.return_value = existing
    result = qtypes.QuantumProgram(name='projects/proj/programs/prog')
    grpc_client.update_quantum_program.return_value = result

    client = EngineClient()
    assert client.remove_program_labels('proj', 'prog', ['other']) == existing
    assert grpc_client.update_quantum_program.call_count == 0

    assert client.remove_program_labels('proj', 'prog',
                                        ['hello', 'weather']) == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              labels={
                                  'color': 'red',
                                  'run': '1',
                              },
                              label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))

    assert client.remove_program_labels('proj', 'prog',
                                        ['color', 'weather', 'run']) == result
    assert grpc_client.update_quantum_program.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumProgram(name='projects/proj/programs/prog',
                              label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_delete_program(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    client = EngineClient()
    assert not client.delete_program('proj', 'prog')
    assert grpc_client.delete_quantum_program.call_args[0] == (
        'projects/proj/programs/prog', False)

    assert not client.delete_program('proj', 'prog', delete_jobs=True)
    assert grpc_client.delete_quantum_program.call_args[0] == (
        'projects/proj/programs/prog', True)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_create_job(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0')
    grpc_client.create_quantum_job.return_value = result

    run_context = qtypes.any_pb2.Any()
    labels = {'hello': 'world'}
    client = EngineClient()
    assert client.create_job('proj', 'prog', 'job0', ['processor0'],
                             run_context, 10, 'A job',
                             labels) == ('job0', result)
    assert grpc_client.create_quantum_job.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumJob(
            name='projects/proj/programs/prog/jobs/job0',
            run_context=run_context,
            scheduling_config=qtypes.SchedulingConfig(
                priority=10,
                processor_selector=qtypes.SchedulingConfig.ProcessorSelector(
                    processor_names=['projects/proj/processors/processor0'])),
            description='A job',
            labels=labels), False)

    assert client.create_job(
        'proj',
        'prog',
        'job0',
        ['processor0'],
        run_context,
        10,
        'A job',
    ) == ('job0', result)
    assert grpc_client.create_quantum_job.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumJob(
            name='projects/proj/programs/prog/jobs/job0',
            run_context=run_context,
            scheduling_config=qtypes.SchedulingConfig(
                priority=10,
                processor_selector=qtypes.SchedulingConfig.ProcessorSelector(
                    processor_names=['projects/proj/processors/processor0'])),
            description='A job'), False)

    assert client.create_job('proj',
                             'prog',
                             'job0', ['processor0'],
                             run_context,
                             10,
                             labels=labels) == ('job0', result)
    assert grpc_client.create_quantum_job.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumJob(
            name='projects/proj/programs/prog/jobs/job0',
            run_context=run_context,
            scheduling_config=qtypes.SchedulingConfig(
                priority=10,
                processor_selector=qtypes.SchedulingConfig.ProcessorSelector(
                    processor_names=['projects/proj/processors/processor0'])),
            labels=labels), False)

    assert client.create_job('proj', 'prog', 'job0', ['processor0'],
                             run_context, 10) == ('job0', result)
    assert grpc_client.create_quantum_job.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumJob(
            name='projects/proj/programs/prog/jobs/job0',
            run_context=run_context,
            scheduling_config=qtypes.SchedulingConfig(
                priority=10,
                processor_selector=qtypes.SchedulingConfig.ProcessorSelector(
                    processor_names=['projects/proj/processors/processor0'])),
        ), False)

    assert client.create_job('proj',
                             'prog',
                             job_id=None,
                             processor_ids=['processor0'],
                             run_context=run_context,
                             priority=10) == ('job0', result)
    assert grpc_client.create_quantum_job.call_args[0] == (
        'projects/proj/programs/prog',
        qtypes.QuantumJob(
            run_context=run_context,
            scheduling_config=qtypes.SchedulingConfig(
                priority=10,
                processor_selector=qtypes.SchedulingConfig.ProcessorSelector(
                    processor_names=['projects/proj/processors/processor0'])),
        ), False)

    with pytest.raises(ValueError, match='priority must be between 0 and 1000'):
        client.create_job('proj',
                          'prog',
                          job_id=None,
                          processor_ids=['processor0'],
                          run_context=run_context,
                          priority=5000)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_get_job(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0')
    grpc_client.get_quantum_job.return_value = result

    client = EngineClient()
    assert client.get_job('proj', 'prog', 'job0', False) == result
    assert grpc_client.get_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0', False)

    assert client.get_job('proj', 'prog', 'job0', True) == result
    assert grpc_client.get_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0', True)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_set_job_description(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0')
    grpc_client.update_quantum_job.return_value = result

    client = EngineClient()
    assert client.set_job_description('proj', 'prog', 'job0', 'A job') == result
    assert grpc_client.update_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0',
        qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0',
                          description='A job'),
        qtypes.field_mask_pb2.FieldMask(paths=['description']))

    assert client.set_job_description('proj', 'prog', 'job0', '') == result
    assert grpc_client.update_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0',
        qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0'),
        qtypes.field_mask_pb2.FieldMask(paths=['description']))


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_set_job_labels(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    grpc_client.get_quantum_job.return_value = qtypes.QuantumJob(
        labels={
            'color': 'red',
            'weather': 'sun',
            'run': '1'
        },
        label_fingerprint='hash')
    result = qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0')
    grpc_client.update_quantum_job.return_value = result

    client = EngineClient()
    labels = {'hello': 'world', 'color': 'blue', 'run': '1'}
    assert client.set_job_labels('proj', 'prog', 'job0', labels) == result
    assert grpc_client.update_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0',
        qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0',
                          labels=labels,
                          label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))

    assert client.set_job_labels('proj', 'prog', 'job0', {}) == result
    assert grpc_client.update_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0',
        qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0',
                          label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_add_job_labels(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    existing = qtypes.QuantumJob(labels={
        'color': 'red',
        'weather': 'sun',
        'run': '1'
    },
                                 label_fingerprint='hash')
    grpc_client.get_quantum_job.return_value = existing
    result = qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0')
    grpc_client.update_quantum_job.return_value = result

    client = EngineClient()
    assert client.add_job_labels('proj', 'prog', 'job0',
                                 {'color': 'red'}) == existing
    assert grpc_client.update_quantum_job.call_count == 0

    assert client.add_job_labels('proj', 'prog', 'job0',
                                 {'hello': 'world'}) == result
    assert grpc_client.update_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0',
        qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0',
                          labels={
                              'color': 'red',
                              'weather': 'sun',
                              'run': '1',
                              'hello': 'world'
                          },
                          label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))

    assert client.add_job_labels('proj', 'prog', 'job0', {
        'hello': 'world',
        'color': 'blue'
    }) == result
    assert grpc_client.update_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0',
        qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0',
                          labels={
                              'color': 'blue',
                              'weather': 'sun',
                              'run': '1',
                              'hello': 'world'
                          },
                          label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_remove_job_labels(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    existing = qtypes.QuantumJob(labels={
        'color': 'red',
        'weather': 'sun',
        'run': '1'
    },
                                 label_fingerprint='hash')
    grpc_client.get_quantum_job.return_value = existing
    result = qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0')
    grpc_client.update_quantum_job.return_value = result

    client = EngineClient()
    assert client.remove_job_labels('proj', 'prog', 'job0',
                                    ['other']) == existing
    assert grpc_client.update_quantum_program.call_count == 0

    assert client.remove_job_labels('proj', 'prog', 'job0',
                                    ['hello', 'weather']) == result
    assert grpc_client.update_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0',
        qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0',
                          labels={
                              'color': 'red',
                              'run': '1',
                          },
                          label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))

    assert client.remove_job_labels('proj', 'prog', 'job0',
                                    ['color', 'weather', 'run']) == result
    assert grpc_client.update_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0',
        qtypes.QuantumJob(name='projects/proj/programs/prog/jobs/job0',
                          label_fingerprint='hash'),
        qtypes.field_mask_pb2.FieldMask(paths=['labels']))


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_delete_job(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    client = EngineClient()
    assert not client.delete_job('proj', 'prog', 'job0')
    assert grpc_client.delete_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0',)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_cancel_job(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    client = EngineClient()
    assert not client.cancel_job('proj', 'prog', 'job0')
    assert grpc_client.cancel_quantum_job.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0',)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_job_results(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumResult(
        parent='projects/proj/programs/prog/jobs/job0')
    grpc_client.get_quantum_result.return_value = result

    client = EngineClient()
    assert client.get_job_results('proj', 'prog', 'job0') == result
    assert grpc_client.get_quantum_result.call_args[0] == (
        'projects/proj/programs/prog/jobs/job0',)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_list_jobs(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    results = [
        qtypes.QuantumJob(name='projects/proj/programs/prog1/jobs/job1'),
        qtypes.QuantumJob(name='projects/proj/programs/prog1/jobs/job2')
    ]
    grpc_client.list_quantum_jobs.return_value = results

    client = EngineClient()
    assert client.list_jobs(project_id='proj', program_id='prog1') == results
    assert grpc_client.list_quantum_jobs.call_args[0] == (
        'projects/proj/programs/prog1',)
    assert grpc_client.list_quantum_jobs.call_args[1] == {
        'filter_': '',
    }

    assert client.list_jobs(project_id='proj') == results
    assert grpc_client.list_quantum_jobs.call_args[0] == (
        'projects/proj/programs/-',)
    assert grpc_client.list_quantum_jobs.call_args[1] == {
        'filter_': '',
    }


# yapf: disable
@pytest.mark.parametrize(
    'expected_filter, '
        'created_after, '
        'created_before, '
        'labels, '
        'execution_states',
    [
        ('',
            None,
            None,
            None,
            None),
        ('create_time >= 2020-09-01',
            datetime.date(2020, 9, 1),
            None,
            None,
            None),
        ('create_time >= 1598918400',
            datetime.datetime(2020, 9, 1, 0, 0, 0,
                              tzinfo=datetime.timezone.utc),
            None,
            None,
            None),
        ('create_time <= 2020-10-01',
            None,
            datetime.date(2020, 10, 1),
            None,
            None),
        ('create_time >= 2020-09-01 AND create_time <= 1598918410',
            datetime.date(2020, 9, 1),
            datetime.datetime(2020, 9, 1, 0, 0, 10,
                            tzinfo=datetime.timezone.utc),
            None,
            None),
        ('labels.color:red AND labels.shape:*',
            None,
            None,
            {
            'color': 'red',
            'shape': '*'
            },
            None
        ),
        ('(execution_status.state = FAILURE OR '
         'execution_status.state = CANCELLED)',
            None,
            None,
            None,
            [quantum.enums.ExecutionStatus.State.FAILURE,
             quantum.enums.ExecutionStatus.State.CANCELLED,]
        ),
        ('create_time >= 2020-08-01 AND '
         'create_time <= 1598918400 AND '
         'labels.color:red AND labels.shape:* AND '
         '(execution_status.state = SUCCESS)',
            datetime.date(2020, 8, 1),
            datetime.datetime(2020, 9, 1, tzinfo=datetime.timezone.utc),
            {
            'color': 'red',
            'shape': '*'
            },
            [quantum.enums.ExecutionStatus.State.SUCCESS,],
        ),
    ])
# yapf: enable
@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_list_jobs_filters(client_constructor, expected_filter, created_before,
                           created_after, labels, execution_states):
    grpc_client = setup_mock_(client_constructor)
    client = EngineClient()
    client.list_jobs(project_id='proj',
                     program_id='prog',
                     created_before=created_before,
                     created_after=created_after,
                     has_labels=labels,
                     execution_states=execution_states)
    assert grpc_client.list_quantum_jobs.call_args[1] == {
        'filter_': expected_filter,
    }


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_list_processors(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    results = [
        qtypes.QuantumProcessor(name='projects/proj/processor/processor0'),
        qtypes.QuantumProcessor(name='projects/proj/processor/processor1')
    ]
    grpc_client.list_quantum_processors.return_value = results

    client = EngineClient()
    assert client.list_processors('proj') == results
    assert grpc_client.list_quantum_processors.call_args[0] == (
        'projects/proj',)
    assert grpc_client.list_quantum_processors.call_args[1] == {
        'filter_': '',
    }


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_get_processor(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumProcessor(name='projects/proj/processors/processor0')
    grpc_client.get_quantum_processor.return_value = result

    client = EngineClient()
    assert client.get_processor('proj', 'processor0') == result
    assert grpc_client.get_quantum_processor.call_args[0] == (
        'projects/proj/processors/processor0',)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_list_calibrations(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    results = [
        qtypes.QuantumCalibration(
            name='projects/proj/processor/processor0/calibrations/123456'),
        qtypes.QuantumCalibration(
            name='projects/proj/processor/processor1/calibrations/224466')
    ]
    grpc_client.list_quantum_calibrations.return_value = results

    client = EngineClient()
    assert client.list_calibrations('proj', 'processor0') == results
    assert grpc_client.list_quantum_calibrations.call_args[0] == (
        'projects/proj/processors/processor0',)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_get_calibration(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumCalibration(
        name='projects/proj/processors/processor0/calibrations/123456')
    grpc_client.get_quantum_calibration.return_value = result

    client = EngineClient()
    assert client.get_calibration('proj', 'processor0', 123456) == result
    assert grpc_client.get_quantum_calibration.call_args[0] == (
        'projects/proj/processors/processor0/calibrations/123456',)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_get_current_calibration(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    result = qtypes.QuantumCalibration(
        name='projects/proj/processors/processor0/calibrations/123456')
    grpc_client.get_quantum_calibration.return_value = result

    client = EngineClient()
    assert client.get_current_calibration('proj', 'processor0') == result
    assert grpc_client.get_quantum_calibration.call_args[0] == (
        'projects/proj/processors/processor0/calibrations/current',)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_get_current_calibration_does_not_exist(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    grpc_client.get_quantum_calibration.side_effect = exceptions.NotFound(
        'not found')

    client = EngineClient()
    assert client.get_current_calibration('proj', 'processor0') is None
    assert grpc_client.get_quantum_calibration.call_args[0] == (
        'projects/proj/processors/processor0/calibrations/current',)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_get_current_calibration_error(client_constructor):
    grpc_client = setup_mock_(client_constructor)

    grpc_client.get_quantum_calibration.side_effect = exceptions.BadRequest(
        'boom')

    client = EngineClient()
    with pytest.raises(EngineException, match='boom'):
        client.get_current_calibration('proj', 'processor0')


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_api_doesnt_retry_not_found_errors(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    grpc_client.get_quantum_program.side_effect = exceptions.NotFound(
        'not found')

    client = EngineClient()
    with pytest.raises(EngineException, match='not found'):
        client.get_program('proj', 'prog', False)
    assert grpc_client.get_quantum_program.call_count == 1


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_api_retry_5xx_errors(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    grpc_client.get_quantum_program.side_effect = exceptions.ServiceUnavailable(
        'internal error')

    client = EngineClient(max_retry_delay_seconds=1)
    with pytest.raises(TimeoutError,
                       match='Reached max retry attempts.*internal error'):
        client.get_program('proj', 'prog', False)
    assert grpc_client.get_quantum_program.call_count > 1


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_create_reservation(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    start = datetime.datetime.fromtimestamp(1000000000)
    end = datetime.datetime.fromtimestamp(1000003600)
    users = ['jeff@google.com']
    result = qtypes.QuantumReservation(
        name='projects/proj/processors/processor0/reservations/papar-party-44',
        start_time=Timestamp(seconds=1000000000),
        end_time=Timestamp(seconds=1000003600),
        whitelisted_users=users,
    )
    grpc_client.create_quantum_reservation.return_value = result

    client = EngineClient()
    assert client.create_reservation('proj', 'processor0', start, end,
                                     users) == result
    assert grpc_client.create_quantum_reservation.call_count == 1
    kwargs = grpc_client.create_quantum_reservation.call_args[1]
    # The outgoing argument will not have the resource name
    result.name = ''
    assert kwargs == {
        'parent': 'projects/proj/processors/processor0',
        'quantum_reservation': result
    }


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_cancel_reservation(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    name = 'projects/proj/processors/processor0/reservations/papar-party-44'
    result = qtypes.QuantumReservation(
        name=name,
        start_time=Timestamp(seconds=1000000000),
        end_time=Timestamp(seconds=1000002000),
        whitelisted_users=['jeff@google.com'],
    )
    grpc_client.cancel_quantum_reservation.return_value = result

    client = EngineClient()
    assert (client.cancel_reservation('proj', 'processor0',
                                      'papar-party-44') == result)
    kwargs = grpc_client.cancel_quantum_reservation.call_args[1]
    assert kwargs == {
        'name': name,
    }


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_delete_reservation(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    name = 'projects/proj/processors/processor0/reservations/papar-party-44'
    result = qtypes.QuantumReservation(
        name=name,
        start_time=Timestamp(seconds=1000000000),
        end_time=Timestamp(seconds=1000002000),
        whitelisted_users=['jeff@google.com'],
    )
    grpc_client.delete_quantum_reservation.return_value = result

    client = EngineClient()
    assert (client.delete_reservation('proj', 'processor0',
                                      'papar-party-44') == result)
    kwargs = grpc_client.delete_quantum_reservation.call_args[1]
    assert kwargs == {
        'name': name,
    }


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_get_reservation(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    name = 'projects/proj/processors/processor0/reservations/papar-party-44'
    result = qtypes.QuantumReservation(
        name=name,
        start_time=Timestamp(seconds=1000000000),
        end_time=Timestamp(seconds=1000002000),
        whitelisted_users=['jeff@google.com'],
    )
    grpc_client.get_quantum_reservation.return_value = result

    client = EngineClient()
    assert (client.get_reservation('proj', 'processor0',
                                   'papar-party-44') == result)
    kwargs = grpc_client.get_quantum_reservation.call_args[1]
    assert kwargs == {
        'name': name,
    }


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_get_reservation_not_found(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    name = 'projects/proj/processors/processor0/reservations/papar-party-44'
    grpc_client.get_quantum_reservation.side_effect = exceptions.NotFound(
        'not found')

    client = EngineClient()
    assert (client.get_reservation('proj', 'processor0',
                                   'papar-party-44') == None)
    kwargs = grpc_client.get_quantum_reservation.call_args[1]
    assert kwargs == {
        'name': name,
    }


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_get_reservation_exception(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    grpc_client.get_quantum_reservation.side_effect = exceptions.BadRequest(
        'boom')

    client = EngineClient()
    with pytest.raises(EngineException, match='boom'):
        client.get_reservation('proj', 'processor0', 'goog')


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_list_reservation(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    name = 'projects/proj/processors/processor0/reservations/papar-party-44'
    results = [
        qtypes.QuantumReservation(
            name=name,
            start_time=Timestamp(seconds=1000000000),
            end_time=Timestamp(seconds=1000002000),
            whitelisted_users=['jeff@google.com'],
        ),
        qtypes.QuantumReservation(
            name=name,
            start_time=Timestamp(seconds=1200000000),
            end_time=Timestamp(seconds=1200002000),
            whitelisted_users=['dstrain@google.com'],
        ),
    ]
    grpc_client.list_quantum_reservations.return_value = results

    client = EngineClient()
    assert (client.list_reservations('proj', 'processor0') == results)


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_update_reservation(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    name = 'projects/proj/processors/processor0/reservations/papar-party-44'
    result = qtypes.QuantumReservation(
        name=name,
        start_time=Timestamp(seconds=1000001000),
        end_time=Timestamp(seconds=1000002000),
        whitelisted_users=['jeff@google.com'],
    )
    grpc_client.update_quantum_reservation.return_value = result

    client = EngineClient()
    assert (client.update_reservation(
        'proj',
        'processor0',
        'papar-party-44',
        start=datetime.datetime.fromtimestamp(1000001000),
        end=datetime.datetime.fromtimestamp(1000002000),
        whitelisted_users=['jeff@google.com'],
    ) == result)
    kwargs = grpc_client.update_quantum_reservation.call_args[1]
    assert kwargs == {
        'name':
        name,
        'quantum_reservation':
        result,
        'update_mask':
        FieldMask(paths=['start_time', 'end_time', 'whitelisted_users'])
    }


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_update_reservation_remove_all_users(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    name = 'projects/proj/processors/processor0/reservations/papar-party-44'
    result = qtypes.QuantumReservation(
        name=name,
        whitelisted_users=[],
    )
    grpc_client.update_quantum_reservation.return_value = result

    client = EngineClient()
    assert (client.update_reservation(
        'proj',
        'processor0',
        'papar-party-44',
        whitelisted_users=[],
    ) == result)
    kwargs = grpc_client.update_quantum_reservation.call_args[1]
    assert kwargs == {
        'name': name,
        'quantum_reservation': result,
        'update_mask': FieldMask(paths=['whitelisted_users'])
    }


@mock.patch.object(quantum, 'QuantumEngineServiceClient', autospec=True)
def test_list_time_slots(client_constructor):
    grpc_client = setup_mock_(client_constructor)
    results = [
        qtypes.QuantumTimeSlot(
            processor_name='potofgold',
            start_time=Timestamp(seconds=1000020000),
            end_time=Timestamp(seconds=1000040000),
            slot_type=qenums.QuantumTimeSlot.TimeSlotType.MAINTENANCE,
            maintenance_config=qtypes.QuantumTimeSlot.MaintenanceConfig(
                title='Testing',
                description='Testing some new configuration.',
            ),
        ),
        qtypes.QuantumTimeSlot(
            processor_name='potofgold',
            start_time=Timestamp(seconds=1000010000),
            end_time=Timestamp(seconds=1000020000),
            slot_type=qenums.QuantumTimeSlot.TimeSlotType.RESERVATION,
            reservation_config=qtypes.QuantumTimeSlot.ReservationConfig(
                project_id='super_secret_quantum'),
        )
    ]
    grpc_client.list_quantum_time_slots.return_value = results

    client = EngineClient()
    assert (client.list_time_slots('proj', 'processor0') == results)

[((33, 1, 33, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((80, 1, 80, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((97, 1, 97, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((161, 1, 161, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((175, 1, 175, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((182, 1, 182, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((204, 1, 204, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((236, 1, 236, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((286, 1, 286, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((325, 1, 325, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((339, 1, 339, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((439, 1, 439, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((456, 1, 456, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((478, 1, 478, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((510, 1, 510, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((560, 1, 560, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((600, 1, 600, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((610, 1, 610, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((620, 1, 620, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((634, 1, 634, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((726, 1, 726, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((742, 1, 742, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((761, 1, 761, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((774, 1, 774, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((792, 1, 792, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((806, 1, 806, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((820, 1, 820, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((833, 1, 833, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((845, 1, 845, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((857, 1, 857, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((870, 1, 870, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((897, 1, 897, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((918, 1, 918, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((939, 1, 939, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((960, 1, 960, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((976, 1, 976, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((987, 1, 987, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((1011, 1, 1011, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((1043, 1, 1043, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((1068, 1, 1068, 72), 'unittest.mock.patch.object', 'mock.patch.object', (), '', False, 'from unittest import mock\n'), ((28, 18, 28, 29), 'unittest.mock.Mock', 'mock.Mock', ({}, {}), '()', False, 'from unittest import mock\n'), ((37, 13, 37, 70), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((40, 11, 40, 31), 'cirq.google.engine.client.quantum_v1alpha1.types.any_pb2.Any', 'qtypes.any_pb2.Any', ({}, {}), '()', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((42, 13, 42, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((84, 13, 84, 70), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((87, 13, 87, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((107, 13, 107, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((165, 13, 165, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((186, 13, 186, 70), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((189, 13, 189, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((208, 51, 214, 33), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((215, 13, 215, 70), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((218, 13, 218, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((240, 15, 245, 62), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((247, 13, 247, 70), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((250, 13, 250, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((290, 15, 295, 62), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((297, 13, 297, 70), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((300, 13, 300, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((329, 13, 329, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((343, 13, 343, 76), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((346, 18, 346, 38), 'cirq.google.engine.client.quantum_v1alpha1.types.any_pb2.Any', 'qtypes.any_pb2.Any', ({}, {}), '()', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((348, 13, 348, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((443, 13, 443, 76), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((446, 13, 446, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((460, 13, 460, 76), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((463, 13, 463, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((482, 47, 488, 33), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((489, 13, 489, 76), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((492, 13, 492, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((514, 15, 519, 58), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((521, 13, 521, 76), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((524, 13, 524, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((564, 15, 569, 58), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((571, 13, 571, 76), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((574, 13, 574, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((604, 13, 604, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((614, 13, 614, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((624, 13, 625, 55), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumResult', 'qtypes.QuantumResult', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((628, 13, 628, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((644, 13, 644, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((730, 13, 730, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((752, 13, 752, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((765, 13, 765, 80), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProcessor', 'qtypes.QuantumProcessor', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((768, 13, 768, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((786, 13, 786, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((796, 13, 797, 71), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumCalibration', 'qtypes.QuantumCalibration', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((800, 13, 800, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((810, 13, 811, 71), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumCalibration', 'qtypes.QuantumCalibration', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((814, 13, 814, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((824, 54, 825, 20), 'google.api_core.exceptions.NotFound', 'exceptions.NotFound', ({(825, 8, 825, 19): '"""not found"""'}, {}), "('not found')", False, 'from google.api_core import exceptions\n'), ((827, 13, 827, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((837, 54, 838, 15), 'google.api_core.exceptions.BadRequest', 'exceptions.BadRequest', ({(838, 8, 838, 14): '"""boom"""'}, {}), "('boom')", False, 'from google.api_core import exceptions\n'), ((840, 13, 840, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((848, 50, 849, 20), 'google.api_core.exceptions.NotFound', 'exceptions.NotFound', ({(849, 8, 849, 19): '"""not found"""'}, {}), "('not found')", False, 'from google.api_core import exceptions\n'), ((851, 13, 851, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((860, 50, 861, 25), 'google.api_core.exceptions.ServiceUnavailable', 'exceptions.ServiceUnavailable', ({(861, 8, 861, 24): '"""internal error"""'}, {}), "('internal error')", False, 'from google.api_core import exceptions\n'), ((863, 13, 863, 52), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', (), '', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((873, 12, 873, 55), 'datetime.datetime.fromtimestamp', 'datetime.datetime.fromtimestamp', ({(873, 44, 873, 54): '1000000000'}, {}), '(1000000000)', False, 'import datetime\n'), ((874, 10, 874, 53), 'datetime.datetime.fromtimestamp', 'datetime.datetime.fromtimestamp', ({(874, 42, 874, 52): '1000003600'}, {}), '(1000003600)', False, 'import datetime\n'), ((884, 13, 884, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((909, 13, 909, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((930, 13, 930, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((951, 13, 951, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((964, 54, 965, 20), 'google.api_core.exceptions.NotFound', 'exceptions.NotFound', ({(965, 8, 965, 19): '"""not found"""'}, {}), "('not found')", False, 'from google.api_core import exceptions\n'), ((967, 13, 967, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((979, 54, 980, 15), 'google.api_core.exceptions.BadRequest', 'exceptions.BadRequest', ({(980, 8, 980, 14): '"""boom"""'}, {}), "('boom')", False, 'from google.api_core import exceptions\n'), ((982, 13, 982, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((1007, 13, 1007, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((1023, 13, 1023, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((1047, 13, 1050, 5), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumReservation', 'qtypes.QuantumReservation', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((1053, 13, 1053, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((1093, 13, 1093, 27), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((102, 8, 102, 66), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((103, 8, 103, 66), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((177, 9, 177, 44), 'pytest.raises', 'pytest.raises', (), '', False, 'import pytest\n'), ((430, 9, 430, 79), 'pytest.raises', 'pytest.raises', (), '', False, 'import pytest\n'), ((639, 8, 639, 72), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((640, 8, 640, 72), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((747, 8, 747, 74), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProcessor', 'qtypes.QuantumProcessor', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((748, 8, 748, 74), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProcessor', 'qtypes.QuantumProcessor', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((779, 8, 780, 74), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumCalibration', 'qtypes.QuantumCalibration', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((781, 8, 782, 74), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumCalibration', 'qtypes.QuantumCalibration', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((841, 9, 841, 53), 'pytest.raises', 'pytest.raises', (), '', False, 'import pytest\n'), ((852, 9, 852, 58), 'pytest.raises', 'pytest.raises', (), '', False, 'import pytest\n'), ((864, 9, 865, 74), 'pytest.raises', 'pytest.raises', (), '', False, 'import pytest\n'), ((983, 9, 983, 53), 'pytest.raises', 'pytest.raises', (), '', False, 'import pytest\n'), ((47, 8, 50, 44), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((56, 8, 58, 54), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((64, 8, 66, 44), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((71, 8, 72, 40), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((77, 25, 77, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((124, 12, 124, 37), 'datetime.date', 'datetime.date', ({(124, 26, 124, 30): '(2020)', (124, 32, 124, 33): '(9)', (124, 35, 124, 36): '(1)'}, {}), '(2020, 9, 1)', False, 'import datetime\n'), ((128, 12, 129, 59), 'datetime.datetime', 'datetime.datetime', (), '', False, 'import datetime\n'), ((134, 12, 134, 38), 'datetime.date', 'datetime.date', ({(134, 26, 134, 30): '(2020)', (134, 32, 134, 34): '(10)', (134, 36, 134, 37): '(1)'}, {}), '(2020, 10, 1)', False, 'import datetime\n'), ((137, 12, 137, 37), 'datetime.date', 'datetime.date', ({(137, 26, 137, 30): '(2020)', (137, 32, 137, 33): '(9)', (137, 35, 137, 36): '(1)'}, {}), '(2020, 9, 1)', False, 'import datetime\n'), ((138, 12, 139, 57), 'datetime.datetime', 'datetime.datetime', (), '', False, 'import datetime\n'), ((152, 12, 152, 37), 'datetime.date', 'datetime.date', ({(152, 26, 152, 30): '(2020)', (152, 32, 152, 33): '(8)', (152, 35, 152, 36): '(1)'}, {}), '(2020, 8, 1)', False, 'import datetime\n'), ((153, 12, 153, 71), 'datetime.datetime', 'datetime.datetime', (), '', False, 'import datetime\n'), ((193, 8, 194, 54), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((195, 8, 195, 62), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((200, 8, 200, 65), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((201, 8, 201, 62), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((223, 8, 225, 55), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((226, 8, 226, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((231, 8, 232, 55), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((233, 8, 233, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((259, 8, 266, 55), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((267, 8, 267, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((275, 8, 282, 55), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((283, 8, 283, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((308, 8, 313, 55), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((314, 8, 314, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((320, 8, 321, 55), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumProgram', 'qtypes.QuantumProgram', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((322, 8, 322, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((467, 8, 468, 46), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((469, 8, 469, 62), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((474, 8, 474, 71), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((475, 8, 475, 62), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((497, 8, 499, 51), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((500, 8, 500, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((505, 8, 506, 51), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((507, 8, 507, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((533, 8, 540, 51), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((541, 8, 541, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((549, 8, 556, 51), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((557, 8, 557, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((583, 8, 588, 51), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((589, 8, 589, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((595, 8, 596, 51), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumJob', 'qtypes.QuantumJob', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((597, 8, 597, 57), 'cirq.google.engine.client.quantum_v1alpha1.types.field_mask_pb2.FieldMask', 'qtypes.field_mask_pb2.FieldMask', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((674, 12, 674, 37), 'datetime.date', 'datetime.date', ({(674, 26, 674, 30): '(2020)', (674, 32, 674, 33): '(9)', (674, 35, 674, 36): '(1)'}, {}), '(2020, 9, 1)', False, 'import datetime\n'), ((679, 12, 680, 59), 'datetime.datetime', 'datetime.datetime', (), '', False, 'import datetime\n'), ((686, 12, 686, 38), 'datetime.date', 'datetime.date', ({(686, 26, 686, 30): '(2020)', (686, 32, 686, 34): '(10)', (686, 36, 686, 37): '(1)'}, {}), '(2020, 10, 1)', False, 'import datetime\n'), ((690, 12, 690, 37), 'datetime.date', 'datetime.date', ({(690, 26, 690, 30): '(2020)', (690, 32, 690, 33): '(9)', (690, 35, 690, 36): '(1)'}, {}), '(2020, 9, 1)', False, 'import datetime\n'), ((691, 12, 692, 57), 'datetime.datetime', 'datetime.datetime', (), '', False, 'import datetime\n'), ((716, 12, 716, 37), 'datetime.date', 'datetime.date', ({(716, 26, 716, 30): '(2020)', (716, 32, 716, 33): '(8)', (716, 35, 716, 36): '(1)'}, {}), '(2020, 8, 1)', False, 'import datetime\n'), ((717, 12, 717, 71), 'datetime.datetime', 'datetime.datetime', (), '', False, 'import datetime\n'), ((878, 19, 878, 48), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((879, 17, 879, 46), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((903, 19, 903, 48), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((904, 17, 904, 46), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((924, 19, 924, 48), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((925, 17, 925, 46), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((945, 19, 945, 48), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((946, 17, 946, 46), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((1017, 19, 1017, 48), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((1018, 17, 1018, 46), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((1039, 8, 1039, 72), 'google.protobuf.field_mask_pb2.FieldMask', 'FieldMask', (), '', False, 'from google.protobuf.field_mask_pb2 import FieldMask\n'), ((1064, 23, 1064, 61), 'google.protobuf.field_mask_pb2.FieldMask', 'FieldMask', (), '', False, 'from google.protobuf.field_mask_pb2 import FieldMask\n'), ((178, 8, 178, 22), 'cirq.google.engine.engine_client.EngineClient', 'EngineClient', ({}, {}), '()', False, 'from cirq.google.engine.engine_client import EngineClient, EngineException\n'), ((994, 23, 994, 52), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((995, 21, 995, 50), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((1000, 23, 1000, 52), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((1001, 21, 1001, 50), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((1028, 14, 1028, 57), 'datetime.datetime.fromtimestamp', 'datetime.datetime.fromtimestamp', ({(1028, 46, 1028, 56): '(1000001000)'}, {}), '(1000001000)', False, 'import datetime\n'), ((1029, 12, 1029, 55), 'datetime.datetime.fromtimestamp', 'datetime.datetime.fromtimestamp', ({(1029, 44, 1029, 54): '(1000002000)'}, {}), '(1000002000)', False, 'import datetime\n'), ((1074, 23, 1074, 52), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((1075, 21, 1075, 50), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((1077, 31, 1080, 13), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumTimeSlot.MaintenanceConfig', 'qtypes.QuantumTimeSlot.MaintenanceConfig', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((1084, 23, 1084, 52), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((1085, 21, 1085, 50), 'google.protobuf.timestamp_pb2.Timestamp', 'Timestamp', (), '', False, 'from google.protobuf.timestamp_pb2 import Timestamp\n'), ((1087, 31, 1088, 50), 'cirq.google.engine.client.quantum_v1alpha1.types.QuantumTimeSlot.ReservationConfig', 'qtypes.QuantumTimeSlot.ReservationConfig', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((359, 35, 360, 76), 'cirq.google.engine.client.quantum_v1alpha1.types.SchedulingConfig.ProcessorSelector', 'qtypes.SchedulingConfig.ProcessorSelector', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((380, 35, 381, 76), 'cirq.google.engine.client.quantum_v1alpha1.types.SchedulingConfig.ProcessorSelector', 'qtypes.SchedulingConfig.ProcessorSelector', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((397, 35, 398, 76), 'cirq.google.engine.client.quantum_v1alpha1.types.SchedulingConfig.ProcessorSelector', 'qtypes.SchedulingConfig.ProcessorSelector', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((410, 35, 411, 76), 'cirq.google.engine.client.quantum_v1alpha1.types.SchedulingConfig.ProcessorSelector', 'qtypes.SchedulingConfig.ProcessorSelector', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n'), ((426, 35, 427, 76), 'cirq.google.engine.client.quantum_v1alpha1.types.SchedulingConfig.ProcessorSelector', 'qtypes.SchedulingConfig.ProcessorSelector', (), '', True, 'from cirq.google.engine.client.quantum_v1alpha1 import types as qtypes\n')]