blob: 3c604ceb5ac4c8e7e612e1aeff986fa07adbfc08 [file] [log] [blame]
Michael Tang0f553bd2017-06-16 17:38:45 -07001#!/usr/bin/env python2
Michael Tang97d188c2016-06-25 11:18:42 -07002# Copyright 2016 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
Michael Tang0f553bd2017-06-16 17:38:45 -07006"""Unit test for pubsub_utils.py"""
7
8from __future__ import print_function
Michael Tang97d188c2016-06-25 11:18:42 -07009import os
10import unittest
11
12import mox
13
14from apiclient import discovery
15from oauth2client.client import ApplicationDefaultCredentialsError
16from oauth2client.client import GoogleCredentials
17from googleapiclient.errors import UnknownApiNameOrVersion
18
Michael Tang97d188c2016-06-25 11:18:42 -070019import pubsub_utils
20
Michael Tang0f553bd2017-06-16 17:38:45 -070021_TEST_CLOUD_SERVICE_ACCOUNT_FILE = '/tmp/test-credential'
22
Michael Tang97d188c2016-06-25 11:18:42 -070023
24class MockedPubSub(object):
25 """A mocked PubSub handle."""
26 def __init__(self, test, topic, msg, retry, ret_val=None,
Michael Tang0f553bd2017-06-16 17:38:45 -070027 raise_except=False):
Michael Tang97d188c2016-06-25 11:18:42 -070028 self.test = test
29 self.topic = topic
30 self.msg = msg
31 self.retry = retry
32 self.ret_val = ret_val
33 self.raise_except = raise_except
34
35 def projects(self):
36 """Mocked PubSub projects."""
37 return self
38
39 def topics(self):
40 """Mocked PubSub topics."""
41 return self
42
43 def publish(self, topic, body):
44 """Mocked PubSub publish method.
45
46 @param topic: PubSub topic string.
47 @param body: PubSub notification body.
48 """
49 self.test.assertEquals(self.topic, topic)
50 self.test.assertEquals(self.msg, body['messages'][0])
51 return self
52
53 def execute(self, num_retries):
54 """Mocked PubSub execute method.
55
56 @param num_retries: Number of retries.
57 """
Michael Tang0f553bd2017-06-16 17:38:45 -070058 self.test.assertEquals(self.retry, num_retries)
Michael Tang97d188c2016-06-25 11:18:42 -070059 if self.raise_except:
60 raise Exception()
Michael Tang0f553bd2017-06-16 17:38:45 -070061 return self.ret_val
Michael Tang97d188c2016-06-25 11:18:42 -070062
63
64def _create_sample_message():
65 """Creates a sample pubsub message."""
66 msg_payload = {'data': 'sample data'}
67 msg_attributes = {}
68 msg_attributes['var'] = 'value'
69 msg_payload['attributes'] = msg_attributes
70
71 return msg_payload
72
73
74class PubSubTests(mox.MoxTestBase):
75 """Tests for pubsub related functios."""
76
Michael Tang0f553bd2017-06-16 17:38:45 -070077 def test_pubsub_with_no_service_account(self):
Michael Tang97d188c2016-06-25 11:18:42 -070078 """Test getting the pubsub service"""
79 self.mox.StubOutWithMock(os.path, 'isfile')
Michael Tang97d188c2016-06-25 11:18:42 -070080 self.mox.ReplayAll()
Michael Tang56cbe942017-05-19 09:30:49 -070081 with self.assertRaises(pubsub_utils.PubSubException):
82 pubsub_utils.PubSubClient()
Michael Tang97d188c2016-06-25 11:18:42 -070083 self.mox.VerifyAll()
84
Michael Tang0f553bd2017-06-16 17:38:45 -070085 def test_pubsub_with_non_existing_service_account(self):
86 """Test getting the pubsub service"""
87 self.mox.StubOutWithMock(os.path, 'isfile')
88 os.path.isfile(_TEST_CLOUD_SERVICE_ACCOUNT_FILE).AndReturn(False)
89 self.mox.ReplayAll()
90 with self.assertRaises(pubsub_utils.PubSubException):
91 pubsub_utils.PubSubClient(_TEST_CLOUD_SERVICE_ACCOUNT_FILE)
92 self.mox.VerifyAll()
93
Michael Tang56cbe942017-05-19 09:30:49 -070094 def test_pubsub_with_corrupted_service_account(self):
95 """Test pubsub with corrupted service account."""
Michael Tang97d188c2016-06-25 11:18:42 -070096 self.mox.StubOutWithMock(os.path, 'isfile')
97 self.mox.StubOutWithMock(GoogleCredentials, 'from_stream')
Michael Tang0f553bd2017-06-16 17:38:45 -070098 os.path.isfile(_TEST_CLOUD_SERVICE_ACCOUNT_FILE).AndReturn(True)
Michael Tang97d188c2016-06-25 11:18:42 -070099 GoogleCredentials.from_stream(
Michael Tang0f553bd2017-06-16 17:38:45 -0700100 _TEST_CLOUD_SERVICE_ACCOUNT_FILE).AndRaise(
101 ApplicationDefaultCredentialsError())
Michael Tang97d188c2016-06-25 11:18:42 -0700102 self.mox.ReplayAll()
Michael Tang56cbe942017-05-19 09:30:49 -0700103 with self.assertRaises(pubsub_utils.PubSubException):
Michael Tang0f553bd2017-06-16 17:38:45 -0700104 pubsub_utils.PubSubClient(_TEST_CLOUD_SERVICE_ACCOUNT_FILE)
Michael Tang97d188c2016-06-25 11:18:42 -0700105 self.mox.VerifyAll()
106
Michael Tang56cbe942017-05-19 09:30:49 -0700107 def test_pubsub_with_invalid_service_account(self):
108 """Test pubsubwith invalid service account."""
Michael Tang97d188c2016-06-25 11:18:42 -0700109 self.mox.StubOutWithMock(os.path, 'isfile')
110 self.mox.StubOutWithMock(GoogleCredentials, 'from_stream')
Michael Tang0f553bd2017-06-16 17:38:45 -0700111 os.path.isfile(_TEST_CLOUD_SERVICE_ACCOUNT_FILE).AndReturn(True)
Michael Tang97d188c2016-06-25 11:18:42 -0700112 credentials = self.mox.CreateMock(GoogleCredentials)
113 GoogleCredentials.from_stream(
Michael Tang0f553bd2017-06-16 17:38:45 -0700114 _TEST_CLOUD_SERVICE_ACCOUNT_FILE).AndReturn(credentials)
Michael Tang97d188c2016-06-25 11:18:42 -0700115 credentials.create_scoped_required().AndReturn(True)
116 credentials.create_scoped(pubsub_utils.PUBSUB_SCOPES).AndReturn(
Michael Tang0f553bd2017-06-16 17:38:45 -0700117 credentials)
Michael Tang97d188c2016-06-25 11:18:42 -0700118 self.mox.StubOutWithMock(discovery, 'build')
Michael Tang0f553bd2017-06-16 17:38:45 -0700119 discovery.build(
120 pubsub_utils.PUBSUB_SERVICE_NAME,
121 pubsub_utils.PUBSUB_VERSION,
122 credentials=credentials).AndRaise(UnknownApiNameOrVersion())
Michael Tang97d188c2016-06-25 11:18:42 -0700123 self.mox.ReplayAll()
Michael Tang56cbe942017-05-19 09:30:49 -0700124 with self.assertRaises(pubsub_utils.PubSubException):
125 msg = _create_sample_message()
Michael Tang0f553bd2017-06-16 17:38:45 -0700126 pubsub_client = pubsub_utils.PubSubClient(
127 _TEST_CLOUD_SERVICE_ACCOUNT_FILE)
Michael Tang56cbe942017-05-19 09:30:49 -0700128 pubsub_client.publish_notifications('test_topic', [msg])
Michael Tang97d188c2016-06-25 11:18:42 -0700129 self.mox.VerifyAll()
130
Michael Tang56cbe942017-05-19 09:30:49 -0700131 def test_publish_notifications(self):
Michael Tang97d188c2016-06-25 11:18:42 -0700132 """Test getting the pubsub service"""
133 self.mox.StubOutWithMock(os.path, 'isfile')
134 self.mox.StubOutWithMock(GoogleCredentials, 'from_stream')
Michael Tang0f553bd2017-06-16 17:38:45 -0700135 os.path.isfile(_TEST_CLOUD_SERVICE_ACCOUNT_FILE).AndReturn(True)
Michael Tang97d188c2016-06-25 11:18:42 -0700136 credentials = self.mox.CreateMock(GoogleCredentials)
137 GoogleCredentials.from_stream(
Michael Tang0f553bd2017-06-16 17:38:45 -0700138 _TEST_CLOUD_SERVICE_ACCOUNT_FILE).AndReturn(credentials)
Michael Tang97d188c2016-06-25 11:18:42 -0700139 credentials.create_scoped_required().AndReturn(True)
140 credentials.create_scoped(pubsub_utils.PUBSUB_SCOPES).AndReturn(
Michael Tang0f553bd2017-06-16 17:38:45 -0700141 credentials)
Michael Tang97d188c2016-06-25 11:18:42 -0700142 self.mox.StubOutWithMock(discovery, 'build')
Michael Tang56cbe942017-05-19 09:30:49 -0700143 msg = _create_sample_message()
Michael Tang0f553bd2017-06-16 17:38:45 -0700144 discovery.build(
145 pubsub_utils.PUBSUB_SERVICE_NAME,
146 pubsub_utils.PUBSUB_VERSION,
147 credentials=credentials).AndReturn(MockedPubSub(
148 self,
149 'test_topic',
150 msg,
151 pubsub_utils.DEFAULT_PUBSUB_NUM_RETRIES,
152 # use tuple ('123') instead of list just for easy to
153 # write the test.
154 ret_val={'messageIds': ('123')}))
Michael Tang97d188c2016-06-25 11:18:42 -0700155
156 self.mox.ReplayAll()
Michael Tang0f553bd2017-06-16 17:38:45 -0700157 pubsub_client = pubsub_utils.PubSubClient(
158 _TEST_CLOUD_SERVICE_ACCOUNT_FILE)
159 msg_ids = pubsub_client.publish_notifications('test_topic', [msg])
160 self.assertEquals(('123'), msg_ids)
161
Michael Tang97d188c2016-06-25 11:18:42 -0700162 self.mox.VerifyAll()
163
164
165if __name__ == '__main__':
166 unittest.main()