300 lines
11 KiB
Python
300 lines
11 KiB
Python
|
# Copyright 2015 Google Inc. All rights reserved.
|
||
|
#
|
||
|
# 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
|
||
|
#
|
||
|
# http://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.
|
||
|
|
||
|
import unittest2
|
||
|
|
||
|
|
||
|
class TestClient(unittest2.TestCase):
|
||
|
PROJECT = 'PROJECT'
|
||
|
TOPIC_NAME = 'topic_name'
|
||
|
TOPIC_PATH = 'projects/%s/topics/%s' % (PROJECT, TOPIC_NAME)
|
||
|
SUB_NAME = 'subscription_name'
|
||
|
SUB_PATH = 'projects/%s/subscriptions/%s' % (PROJECT, SUB_NAME)
|
||
|
|
||
|
def _getTargetClass(self):
|
||
|
from gcloud.pubsub.client import Client
|
||
|
return Client
|
||
|
|
||
|
def _makeOne(self, *args, **kw):
|
||
|
return self._getTargetClass()(*args, **kw)
|
||
|
|
||
|
def test_publisher_api_wo_gax(self):
|
||
|
from gcloud.pubsub.connection import _PublisherAPI
|
||
|
from gcloud.pubsub import client as MUT
|
||
|
from gcloud._testing import _Monkey
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
conn = client.connection = object()
|
||
|
|
||
|
with _Monkey(MUT, _USE_GAX=False):
|
||
|
api = client.publisher_api
|
||
|
|
||
|
self.assertIsInstance(api, _PublisherAPI)
|
||
|
self.assertTrue(api._connection is conn)
|
||
|
# API instance is cached
|
||
|
again = client.publisher_api
|
||
|
self.assertTrue(again is api)
|
||
|
|
||
|
def test_publisher_api_w_gax(self):
|
||
|
from gcloud.pubsub import client as MUT
|
||
|
from gcloud._testing import _Monkey
|
||
|
|
||
|
wrapped = object()
|
||
|
_called_with = []
|
||
|
|
||
|
def _generated_api(*args, **kw):
|
||
|
_called_with.append((args, kw))
|
||
|
return wrapped
|
||
|
|
||
|
class _GaxPublisherAPI(object):
|
||
|
|
||
|
def __init__(self, _wrapped):
|
||
|
self._wrapped = _wrapped
|
||
|
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
|
||
|
with _Monkey(MUT,
|
||
|
_USE_GAX=True,
|
||
|
GeneratedPublisherAPI=_generated_api,
|
||
|
GAXPublisherAPI=_GaxPublisherAPI):
|
||
|
api = client.publisher_api
|
||
|
|
||
|
self.assertIsInstance(api, _GaxPublisherAPI)
|
||
|
self.assertTrue(api._wrapped is wrapped)
|
||
|
# API instance is cached
|
||
|
again = client.publisher_api
|
||
|
self.assertTrue(again is api)
|
||
|
|
||
|
def test_subscriber_api_wo_gax(self):
|
||
|
from gcloud.pubsub.connection import _SubscriberAPI
|
||
|
from gcloud.pubsub import client as MUT
|
||
|
from gcloud._testing import _Monkey
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
conn = client.connection = object()
|
||
|
|
||
|
with _Monkey(MUT, _USE_GAX=False):
|
||
|
api = client.subscriber_api
|
||
|
|
||
|
self.assertIsInstance(api, _SubscriberAPI)
|
||
|
self.assertTrue(api._connection is conn)
|
||
|
# API instance is cached
|
||
|
again = client.subscriber_api
|
||
|
self.assertTrue(again is api)
|
||
|
|
||
|
def test_subscriber_api_w_gax(self):
|
||
|
from gcloud.pubsub import client as MUT
|
||
|
from gcloud._testing import _Monkey
|
||
|
|
||
|
wrapped = object()
|
||
|
_called_with = []
|
||
|
|
||
|
def _generated_api(*args, **kw):
|
||
|
_called_with.append((args, kw))
|
||
|
return wrapped
|
||
|
|
||
|
class _GaxSubscriberAPI(object):
|
||
|
|
||
|
def __init__(self, _wrapped):
|
||
|
self._wrapped = _wrapped
|
||
|
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
|
||
|
with _Monkey(MUT,
|
||
|
_USE_GAX=True,
|
||
|
GeneratedSubscriberAPI=_generated_api,
|
||
|
GAXSubscriberAPI=_GaxSubscriberAPI):
|
||
|
api = client.subscriber_api
|
||
|
|
||
|
self.assertIsInstance(api, _GaxSubscriberAPI)
|
||
|
self.assertTrue(api._wrapped is wrapped)
|
||
|
# API instance is cached
|
||
|
again = client.subscriber_api
|
||
|
self.assertTrue(again is api)
|
||
|
|
||
|
def test_iam_policy_api(self):
|
||
|
from gcloud.pubsub.connection import _IAMPolicyAPI
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
conn = client.connection = object()
|
||
|
api = client.iam_policy_api
|
||
|
self.assertIsInstance(api, _IAMPolicyAPI)
|
||
|
self.assertTrue(api._connection is conn)
|
||
|
# API instance is cached
|
||
|
again = client.iam_policy_api
|
||
|
self.assertTrue(again is api)
|
||
|
|
||
|
def test_list_topics_no_paging(self):
|
||
|
from gcloud.pubsub.topic import Topic
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
client.connection = object()
|
||
|
api = client._publisher_api = _FauxPublisherAPI()
|
||
|
api._list_topics_response = [{'name': self.TOPIC_PATH}], None
|
||
|
|
||
|
topics, next_page_token = client.list_topics()
|
||
|
|
||
|
self.assertEqual(len(topics), 1)
|
||
|
self.assertIsInstance(topics[0], Topic)
|
||
|
self.assertEqual(topics[0].name, self.TOPIC_NAME)
|
||
|
self.assertEqual(next_page_token, None)
|
||
|
|
||
|
self.assertEqual(api._listed_topics, (self.PROJECT, None, None))
|
||
|
|
||
|
def test_list_topics_with_paging(self):
|
||
|
from gcloud.pubsub.topic import Topic
|
||
|
TOKEN1 = 'TOKEN1'
|
||
|
TOKEN2 = 'TOKEN2'
|
||
|
SIZE = 1
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
client.connection = object()
|
||
|
api = client._publisher_api = _FauxPublisherAPI()
|
||
|
api._list_topics_response = [{'name': self.TOPIC_PATH}], TOKEN2
|
||
|
|
||
|
topics, next_page_token = client.list_topics(SIZE, TOKEN1)
|
||
|
|
||
|
self.assertEqual(len(topics), 1)
|
||
|
self.assertIsInstance(topics[0], Topic)
|
||
|
self.assertEqual(topics[0].name, self.TOPIC_NAME)
|
||
|
self.assertEqual(next_page_token, TOKEN2)
|
||
|
|
||
|
self.assertEqual(api._listed_topics, (self.PROJECT, 1, TOKEN1))
|
||
|
|
||
|
def test_list_topics_missing_key(self):
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
client.connection = object()
|
||
|
api = client._publisher_api = _FauxPublisherAPI()
|
||
|
api._list_topics_response = (), None
|
||
|
|
||
|
topics, next_page_token = client.list_topics()
|
||
|
|
||
|
self.assertEqual(len(topics), 0)
|
||
|
self.assertEqual(next_page_token, None)
|
||
|
|
||
|
self.assertEqual(api._listed_topics, (self.PROJECT, None, None))
|
||
|
|
||
|
def test_list_subscriptions_no_paging(self):
|
||
|
from gcloud.pubsub.subscription import Subscription
|
||
|
SUB_INFO = {'name': self.SUB_PATH, 'topic': self.TOPIC_PATH}
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
client.connection = object()
|
||
|
api = client._subscriber_api = _FauxSubscriberAPI()
|
||
|
api._list_subscriptions_response = [SUB_INFO], None
|
||
|
|
||
|
subscriptions, next_page_token = client.list_subscriptions()
|
||
|
|
||
|
self.assertEqual(len(subscriptions), 1)
|
||
|
self.assertIsInstance(subscriptions[0], Subscription)
|
||
|
self.assertEqual(subscriptions[0].name, self.SUB_NAME)
|
||
|
self.assertEqual(subscriptions[0].topic.name, self.TOPIC_NAME)
|
||
|
self.assertEqual(next_page_token, None)
|
||
|
|
||
|
self.assertEqual(api._listed_subscriptions,
|
||
|
(self.PROJECT, None, None))
|
||
|
|
||
|
def test_list_subscriptions_with_paging(self):
|
||
|
from gcloud.pubsub.subscription import Subscription
|
||
|
SUB_INFO = {'name': self.SUB_PATH, 'topic': self.TOPIC_PATH}
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
ACK_DEADLINE = 42
|
||
|
PUSH_ENDPOINT = 'https://push.example.com/endpoint'
|
||
|
SUB_INFO = {'name': self.SUB_PATH,
|
||
|
'topic': self.TOPIC_PATH,
|
||
|
'ackDeadlineSeconds': ACK_DEADLINE,
|
||
|
'pushConfig': {'pushEndpoint': PUSH_ENDPOINT}}
|
||
|
TOKEN1 = 'TOKEN1'
|
||
|
TOKEN2 = 'TOKEN2'
|
||
|
SIZE = 1
|
||
|
client.connection = object()
|
||
|
api = client._subscriber_api = _FauxSubscriberAPI()
|
||
|
api._list_subscriptions_response = [SUB_INFO], TOKEN2
|
||
|
|
||
|
subscriptions, next_page_token = client.list_subscriptions(
|
||
|
SIZE, TOKEN1)
|
||
|
|
||
|
self.assertEqual(len(subscriptions), 1)
|
||
|
self.assertIsInstance(subscriptions[0], Subscription)
|
||
|
self.assertEqual(subscriptions[0].name, self.SUB_NAME)
|
||
|
self.assertEqual(subscriptions[0].topic.name, self.TOPIC_NAME)
|
||
|
self.assertEqual(subscriptions[0].ack_deadline, ACK_DEADLINE)
|
||
|
self.assertEqual(subscriptions[0].push_endpoint, PUSH_ENDPOINT)
|
||
|
self.assertEqual(next_page_token, TOKEN2)
|
||
|
|
||
|
self.assertEqual(api._listed_subscriptions,
|
||
|
(self.PROJECT, SIZE, TOKEN1))
|
||
|
|
||
|
def test_list_subscriptions_w_missing_key(self):
|
||
|
PROJECT = 'PROJECT'
|
||
|
creds = _Credentials()
|
||
|
|
||
|
client = self._makeOne(project=PROJECT, credentials=creds)
|
||
|
client.connection = object()
|
||
|
api = client._subscriber_api = _FauxSubscriberAPI()
|
||
|
api._list_subscriptions_response = (), None
|
||
|
|
||
|
subscriptions, next_page_token = client.list_subscriptions()
|
||
|
|
||
|
self.assertEqual(len(subscriptions), 0)
|
||
|
self.assertEqual(next_page_token, None)
|
||
|
|
||
|
self.assertEqual(api._listed_subscriptions,
|
||
|
(self.PROJECT, None, None))
|
||
|
|
||
|
def test_topic(self):
|
||
|
PROJECT = 'PROJECT'
|
||
|
TOPIC_NAME = 'TOPIC_NAME'
|
||
|
creds = _Credentials()
|
||
|
|
||
|
client_obj = self._makeOne(project=PROJECT, credentials=creds)
|
||
|
new_topic = client_obj.topic(TOPIC_NAME)
|
||
|
self.assertEqual(new_topic.name, TOPIC_NAME)
|
||
|
self.assertTrue(new_topic._client is client_obj)
|
||
|
self.assertEqual(new_topic.project, PROJECT)
|
||
|
self.assertEqual(new_topic.full_name,
|
||
|
'projects/%s/topics/%s' % (PROJECT, TOPIC_NAME))
|
||
|
self.assertFalse(new_topic.timestamp_messages)
|
||
|
|
||
|
|
||
|
class _Credentials(object):
|
||
|
|
||
|
_scopes = None
|
||
|
|
||
|
@staticmethod
|
||
|
def create_scoped_required():
|
||
|
return True
|
||
|
|
||
|
def create_scoped(self, scope):
|
||
|
self._scopes = scope
|
||
|
return self
|
||
|
|
||
|
|
||
|
class _FauxPublisherAPI(object):
|
||
|
|
||
|
def list_topics(self, project, page_size, page_token):
|
||
|
self._listed_topics = (project, page_size, page_token)
|
||
|
return self._list_topics_response
|
||
|
|
||
|
|
||
|
class _FauxSubscriberAPI(object):
|
||
|
|
||
|
def list_subscriptions(self, project, page_size, page_token):
|
||
|
self._listed_subscriptions = (project, page_size, page_token)
|
||
|
return self._list_subscriptions_response
|