Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Unified Diff: infra_libs/ts_mon/common/test/monitors_test.py

Issue 2213143002: Add infra_libs as a bootstrap dependency. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Removed the ugly import hack Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: infra_libs/ts_mon/common/test/monitors_test.py
diff --git a/infra_libs/ts_mon/common/test/monitors_test.py b/infra_libs/ts_mon/common/test/monitors_test.py
deleted file mode 100644
index fa05991983898d1fe9156429dd78714168cf6299..0000000000000000000000000000000000000000
--- a/infra_libs/ts_mon/common/test/monitors_test.py
+++ /dev/null
@@ -1,297 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import base64
-import httplib2
-import json
-import os
-import tempfile
-import unittest
-
-from googleapiclient import errors
-import mock
-
-from infra_libs import httplib2_utils
-from infra_libs.ts_mon.common import interface
-from infra_libs.ts_mon.common import monitors
-from infra_libs.ts_mon.common import pb_to_popo
-from infra_libs.ts_mon.common import targets
-from infra_libs.ts_mon.protos import metrics_pb2
-import infra_libs
-
-
-class MonitorTest(unittest.TestCase):
-
- def test_send(self):
- m = monitors.Monitor()
- metric1 = metrics_pb2.MetricsData(name='m1')
- with self.assertRaises(NotImplementedError):
- m.send(metric1)
-
-class HttpsMonitorTest(unittest.TestCase):
-
- def setUp(self):
- super(HttpsMonitorTest, self).setUp()
-
- def message(self, pb):
- pb = monitors.Monitor._wrap_proto(pb)
- return json.dumps({'resource': pb_to_popo.convert(pb) })
-
- def _test_send(self, http):
- mon = monitors.HttpsMonitor('endpoint', ':gce', http=http)
- resp = mock.MagicMock(spec=httplib2.Response, status=200)
- mon._http.request = mock.MagicMock(return_value=[resp, ""])
-
- metric1 = metrics_pb2.MetricsData(name='m1')
- mon.send(metric1)
- metric2 = metrics_pb2.MetricsData(name='m2')
- mon.send([metric1, metric2])
- collection = metrics_pb2.MetricsCollection(data=[metric1, metric2])
- mon.send(collection)
-
- mon._http.request.assert_has_calls([
- mock.call('endpoint', method='POST', body=self.message(metric1)),
- mock.call('endpoint', method='POST',
- body=self.message([metric1, metric2])),
- mock.call('endpoint', method='POST', body=self.message(collection)),
- ])
-
- def test_default_send(self):
- self._test_send(None)
-
- def test_http_send(self):
- self._test_send(httplib2.Http())
-
- def test_instrumented_http_send(self):
- self._test_send(httplib2_utils.InstrumentedHttp('test'))
-
- @mock.patch('infra_libs.ts_mon.common.monitors.HttpsMonitor.'
- '_load_credentials', autospec=True)
- def test_send_resp_failure(self, _load_creds):
- mon = monitors.HttpsMonitor('endpoint', '/path/to/creds.p8.json')
- resp = mock.MagicMock(spec=httplib2.Response, status=400)
- mon._http.request = mock.MagicMock(return_value=[resp, ""])
-
- metric1 = metrics_pb2.MetricsData(name='m1')
- mon.send(metric1)
-
- mon._http.request.assert_called_once_with('endpoint', method='POST',
- body=self.message(metric1))
-
- @mock.patch('infra_libs.ts_mon.common.monitors.HttpsMonitor.'
- '_load_credentials', autospec=True)
- def test_send_http_failure(self, _load_creds):
- mon = monitors.HttpsMonitor('endpoint', '/path/to/creds.p8.json')
- mon._http.request = mock.MagicMock(side_effect=ValueError())
-
- metric1 = metrics_pb2.MetricsData(name='m1')
- mon.send(metric1)
-
- mon._http.request.assert_called_once_with('endpoint', method='POST',
- body=self.message(metric1))
-
-
-class PubSubMonitorTest(unittest.TestCase):
-
- def setUp(self):
- super(PubSubMonitorTest, self).setUp()
- interface.state.target = targets.TaskTarget(
- 'test_service', 'test_job', 'test_region', 'test_host')
-
- @mock.patch('infra_libs.httplib2_utils.InstrumentedHttp', autospec=True)
- @mock.patch('infra_libs.ts_mon.common.monitors.discovery', autospec=True)
- @mock.patch('infra_libs.ts_mon.common.monitors.GoogleCredentials',
- autospec=True)
- def test_init_service_account(self, gc, discovery, instrumented_http):
- m_open = mock.mock_open(read_data='{"type": "service_account"}')
- creds = gc.from_stream.return_value
- scoped_creds = creds.create_scoped.return_value
- http_mock = instrumented_http.return_value
- metric1 = metrics_pb2.MetricsData(name='m1')
- with mock.patch('infra_libs.ts_mon.common.monitors.open', m_open,
- create=True):
- mon = monitors.PubSubMonitor('/path/to/creds.p8.json', 'myproject',
- 'mytopic')
- mon.send(metric1)
-
- m_open.assert_called_once_with('/path/to/creds.p8.json', 'r')
- creds.create_scoped.assert_called_once_with(monitors.PubSubMonitor._SCOPES)
- scoped_creds.authorize.assert_called_once_with(http_mock)
- discovery.build.assert_called_once_with('pubsub', 'v1', http=http_mock)
- self.assertEquals(mon._topic, 'projects/myproject/topics/mytopic')
-
- @mock.patch('infra_libs.httplib2_utils.InstrumentedHttp', autospec=True)
- @mock.patch('infra_libs.ts_mon.common.monitors.discovery', autospec=True)
- @mock.patch('infra_libs.ts_mon.common.monitors.gce.AppAssertionCredentials',
- autospec=True)
- def test_init_gce_credential(self, aac, discovery, instrumented_http):
- creds = aac.return_value
- http_mock = instrumented_http.return_value
- metric1 = metrics_pb2.MetricsData(name='m1')
- mon = monitors.PubSubMonitor(':gce', 'myproject', 'mytopic')
- mon.send(metric1)
-
- aac.assert_called_once_with(monitors.PubSubMonitor._SCOPES)
- creds.authorize.assert_called_once_with(http_mock)
- discovery.build.assert_called_once_with('pubsub', 'v1', http=http_mock)
- self.assertEquals(mon._topic, 'projects/myproject/topics/mytopic')
-
- @mock.patch('infra_libs.httplib2_utils.InstrumentedHttp', autospec=True)
- @mock.patch('infra_libs.ts_mon.common.monitors.discovery', autospec=True)
- @mock.patch('infra_libs.ts_mon.common.monitors.Storage', autospec=True)
- def test_init_storage(self, storage, discovery, instrumented_http):
- storage_inst = mock.Mock()
- storage.return_value = storage_inst
- creds = storage_inst.get.return_value
-
- m_open = mock.mock_open(read_data='{}')
- http_mock = instrumented_http.return_value
- metric1 = metrics_pb2.MetricsData(name='m1')
- with mock.patch('infra_libs.ts_mon.common.monitors.open', m_open,
- create=True):
- mon = monitors.PubSubMonitor('/path/to/creds.p8.json', 'myproject',
- 'mytopic')
- mon.send(metric1)
-
- m_open.assert_called_once_with('/path/to/creds.p8.json', 'r')
- storage_inst.get.assert_called_once_with()
- creds.authorize.assert_called_once_with(http_mock)
- discovery.build.assert_called_once_with('pubsub', 'v1', http=http_mock)
- self.assertEquals(mon._topic, 'projects/myproject/topics/mytopic')
-
- @mock.patch('infra_libs.ts_mon.common.monitors.PubSubMonitor.'
- '_load_credentials', autospec=True)
- @mock.patch('googleapiclient.discovery.build', autospec=True)
- def test_send(self, _discovery, _load_creds):
- mon = monitors.PubSubMonitor('/path/to/creds.p8.json', 'myproject',
- 'mytopic')
- mon._api = mock.MagicMock()
- topic = 'projects/myproject/topics/mytopic'
-
- metric1 = metrics_pb2.MetricsData(name='m1')
- mon.send(metric1)
- metric2 = metrics_pb2.MetricsData(name='m2')
- mon.send([metric1, metric2])
- collection = metrics_pb2.MetricsCollection(data=[metric1, metric2])
- mon.send(collection)
-
- def message(pb):
- pb = monitors.Monitor._wrap_proto(pb)
- return {'messages': [{'data': base64.b64encode(pb.SerializeToString())}]}
- publish = mon._api.projects.return_value.topics.return_value.publish
- publish.assert_has_calls([
- mock.call(topic=topic, body=message(metric1)),
- mock.call().execute(num_retries=5),
- mock.call(topic=topic, body=message([metric1, metric2])),
- mock.call().execute(num_retries=5),
- mock.call(topic=topic, body=message(collection)),
- mock.call().execute(num_retries=5),
- ])
-
- @mock.patch('infra_libs.ts_mon.common.monitors.PubSubMonitor.'
- '_load_credentials', autospec=True)
- @mock.patch('googleapiclient.discovery.build', autospec=True)
- def test_send_uninitialized(self, discovery, _load_creds):
- """Test initialization retry logic, and also un-instrumented http path."""
- discovery.side_effect = EnvironmentError() # Fail initialization.
- mon = monitors.PubSubMonitor('/path/to/creds.p8.json', 'myproject',
- 'mytopic', use_instrumented_http=False)
-
- metric1 = metrics_pb2.MetricsData(name='m1')
- mon.send(metric1)
- self.assertIsNone(mon._api)
-
- # Another retry: initialization succeeds.
- discovery.side_effect = None
- mon.send(metric1)
-
- def message(pb):
- pb = monitors.Monitor._wrap_proto(pb)
- return {'messages': [{'data': base64.b64encode(pb.SerializeToString())}]}
-
- topic = 'projects/myproject/topics/mytopic'
-
- publish = mon._api.projects.return_value.topics.return_value.publish
- publish.assert_has_calls([
- mock.call(topic=topic, body=message(metric1)),
- mock.call().execute(num_retries=5),
- ])
-
- @mock.patch('infra_libs.ts_mon.common.monitors.PubSubMonitor.'
- '_load_credentials', autospec=True)
- @mock.patch('googleapiclient.discovery.build', autospec=True)
- def test_send_fails(self, _discovery, _load_creds):
- # Test for an occasional flake of .publish().execute().
- mon = monitors.PubSubMonitor('/path/to/creds.p8.json', 'myproject',
- 'mytopic')
- mon._api = mock.MagicMock()
- topic = 'projects/myproject/topics/mytopic'
-
- metric1 = metrics_pb2.MetricsData(name='m1')
- mon.send(metric1)
-
- publish = mon._api.projects.return_value.topics.return_value.publish
- publish.side_effect = ValueError()
-
- metric2 = metrics_pb2.MetricsData(name='m2')
- mon.send([metric1, metric2])
- collection = metrics_pb2.MetricsCollection(data=[metric1, metric2])
- publish.side_effect = errors.HttpError(
- mock.Mock(status=404, reason='test'), '')
- mon.send(collection)
-
- # Test that all caught exceptions are specified without errors.
- # When multiple exceptions are specified in the 'except' clause,
- # they are evaluated lazily, and may contain syntax errors.
- # Throwing an uncaught exception forces all exception specs to be
- # evaluated, catching more runtime errors.
- publish.side_effect = Exception('uncaught')
- with self.assertRaises(Exception):
- mon.send(collection)
-
- def message(pb):
- pb = monitors.Monitor._wrap_proto(pb)
- return {'messages': [{'data': base64.b64encode(pb.SerializeToString())}]}
- publish.assert_has_calls([
- mock.call(topic=topic, body=message(metric1)),
- mock.call().execute(num_retries=5),
- mock.call(topic=topic, body=message([metric1, metric2])),
- mock.call(topic=topic, body=message(collection)),
- ])
-
-
-
-class DebugMonitorTest(unittest.TestCase):
-
- def test_send_file(self):
- with infra_libs.temporary_directory() as temp_dir:
- filename = os.path.join(temp_dir, 'out')
- m = monitors.DebugMonitor(filename)
- metric1 = metrics_pb2.MetricsData(name='m1')
- m.send(metric1)
- metric2 = metrics_pb2.MetricsData(name='m2')
- m.send([metric1, metric2])
- collection = metrics_pb2.MetricsCollection(data=[metric1, metric2])
- m.send(collection)
- with open(filename) as fh:
- output = fh.read()
- self.assertEquals(output.count('data {\n name: "m1"\n}'), 3)
- self.assertEquals(output.count('data {\n name: "m2"\n}'), 2)
-
- def test_send_log(self):
- m = monitors.DebugMonitor()
- metric1 = metrics_pb2.MetricsData(name='m1')
- m.send(metric1)
- metric2 = metrics_pb2.MetricsData(name='m2')
- m.send([metric1, metric2])
- collection = metrics_pb2.MetricsCollection(data=[metric1, metric2])
- m.send(collection)
-
-
-class NullMonitorTest(unittest.TestCase):
-
- def test_send(self):
- m = monitors.NullMonitor()
- metric1 = metrics_pb2.MetricsData(name='m1')
- m.send(metric1)

Powered by Google App Engine
This is Rietveld 408576698