#!/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()