| #!/usr/bin/env vpython3 |
| |
| # Copyright (c) 2022 The WebRTC project authors. All Rights Reserved. |
| # |
| # Use of this source code is governed by a BSD-style license |
| # that can be found in the LICENSE file in the root of the source |
| # tree. An additional intellectual property rights grant can be found |
| # in the file PATENTS. All contributing project authors may |
| # be found in the AUTHORS file in the root of the source tree. |
| |
| import os |
| import sys |
| import unittest |
| |
| from unittest.mock import MagicMock |
| |
| |
| # This tests requires the webrtc_dashboard_upload target to be built before |
| # running the tests. |
| def _ConfigurePythonPath(): |
| # We just yank the python scripts we require into the PYTHONPATH. You could |
| # also imagine a solution where we use for instance |
| # protobuf:py_proto_runtime to copy catapult and protobuf code to out/. |
| # This is the convention in Chromium and WebRTC python scripts. We do need |
| # to build histogram_pb2 however, so that's why we add out/ to sys.path |
| # below. |
| # |
| # It would be better if there was an equivalent to py_binary in GN, but |
| # there's not. |
| script_dir = os.path.dirname(os.path.realpath(__file__)) |
| checkout_root = os.path.abspath(os.path.join(script_dir, os.pardir, |
| os.pardir)) |
| |
| sys.path.insert( |
| 0, os.path.join(checkout_root, 'third_party', 'catapult', 'tracing')) |
| sys.path.insert( |
| 0, os.path.join(checkout_root, 'third_party', 'protobuf', 'python')) |
| |
| # The webrtc_dashboard_upload gn rule will build the protobuf stub for |
| # python, so put it in the path for this script before we attempt to import |
| # it. |
| histogram_proto_path = os.path.join(os.path.join('../../out/Default'), |
| 'pyproto', 'tracing', 'tracing', 'proto') |
| sys.path.insert(0, histogram_proto_path) |
| |
| # Fail early in case the proto hasn't been built. |
| from tracing.proto import histogram_proto |
| if not histogram_proto.HAS_PROTO: |
| raise ImportError('Could not find histogram_pb2. You need to build the ' |
| 'webrtc_dashboard_upload target before invoking this ' |
| 'script. Expected to find ' |
| 'histogram_pb2.py in %s.' % histogram_proto_path) |
| |
| |
| def _CreateHistogram(name='hist', |
| master=None, |
| bot=None, |
| benchmark=None, |
| benchmark_description=None, |
| commit_position=None, |
| samples=None): |
| hists = [catapult_uploader.histogram.Histogram(name, 'count')] |
| if samples: |
| for s in samples: |
| hists[0].AddSample(s) |
| histograms = catapult_uploader.histogram_set.HistogramSet(hists) |
| if master: |
| histograms.AddSharedDiagnosticToAllHistograms( |
| catapult_uploader.reserved_infos.MASTERS.name, |
| catapult_uploader.generic_set.GenericSet([master])) |
| if bot: |
| histograms.AddSharedDiagnosticToAllHistograms( |
| catapult_uploader.reserved_infos.BOTS.name, |
| catapult_uploader.generic_set.GenericSet([bot])) |
| if commit_position: |
| histograms.AddSharedDiagnosticToAllHistograms( |
| catapult_uploader.reserved_infos.CHROMIUM_COMMIT_POSITIONS.name, |
| catapult_uploader.generic_set.GenericSet([commit_position])) |
| if benchmark: |
| histograms.AddSharedDiagnosticToAllHistograms( |
| catapult_uploader.reserved_infos.BENCHMARKS.name, |
| catapult_uploader.generic_set.GenericSet([benchmark])) |
| if benchmark_description: |
| histograms.AddSharedDiagnosticToAllHistograms( |
| catapult_uploader.reserved_infos.BENCHMARK_DESCRIPTIONS.name, |
| catapult_uploader.generic_set.GenericSet([benchmark_description])) |
| return histograms |
| |
| |
| class CatapultUploaderTest(unittest.TestCase): |
| def setUp(self): |
| mock = MagicMock(return_value=[200, None]) |
| catapult_uploader.httplib2.Http.request = mock |
| |
| self.histogram = _CreateHistogram( |
| master='master', |
| bot='bot', |
| benchmark='benchmark', |
| commit_position=123, |
| benchmark_description='Benchmark description.', |
| samples=[1, 2, 3]) |
| |
| def testSendHistogramsSet(self): |
| url = 'http://notlocalhost' |
| # pylint: disable=protected-access |
| response, content = catapult_uploader._SendHistogramSet(url, self.histogram) |
| self.assertEqual(response, 200) |
| self.assertEqual(content, None) |
| |
| def testSendHistogramsSetLocalhost(self): |
| url = 'http://localhost' |
| # pylint: disable=protected-access |
| response, content = catapult_uploader._SendHistogramSet(url, self.histogram) |
| self.assertEqual(response, 200) |
| self.assertEqual(content, None) |
| |
| |
| if (__name__) == '__main__': |
| _ConfigurePythonPath() |
| import catapult_uploader |
| |
| unittest.main() |