blob: ba425544121cddeead7f6d19b8132cc79b44cb58 [file] [log] [blame]
Christoffer Jansson1b083a92022-02-15 14:52:31 +01001#!/usr/bin/env vpython3
2
3# Copyright (c) 2022 The WebRTC project authors. All Rights Reserved.
4#
5# Use of this source code is governed by a BSD-style license
6# that can be found in the LICENSE file in the root of the source
7# tree. An additional intellectual property rights grant can be found
8# in the file PATENTS. All contributing project authors may
9# be found in the AUTHORS file in the root of the source tree.
10
11import os
12import sys
13import unittest
14
15from unittest.mock import MagicMock
16
17
18# This tests requires the webrtc_dashboard_upload target to be built before
19# running the tests.
20def _ConfigurePythonPath():
21 # We just yank the python scripts we require into the PYTHONPATH. You could
22 # also imagine a solution where we use for instance
23 # protobuf:py_proto_runtime to copy catapult and protobuf code to out/.
24 # This is the convention in Chromium and WebRTC python scripts. We do need
25 # to build histogram_pb2 however, so that's why we add out/ to sys.path
26 # below.
27 #
28 # It would be better if there was an equivalent to py_binary in GN, but
29 # there's not.
30 script_dir = os.path.dirname(os.path.realpath(__file__))
31 checkout_root = os.path.abspath(os.path.join(script_dir, os.pardir,
32 os.pardir))
33
34 sys.path.insert(
35 0, os.path.join(checkout_root, 'third_party', 'catapult', 'tracing'))
36 sys.path.insert(
37 0, os.path.join(checkout_root, 'third_party', 'protobuf', 'python'))
38
39 # The webrtc_dashboard_upload gn rule will build the protobuf stub for
40 # python, so put it in the path for this script before we attempt to import
41 # it.
42 histogram_proto_path = os.path.join(os.path.join('../../out/Default'),
43 'pyproto', 'tracing', 'tracing', 'proto')
44 sys.path.insert(0, histogram_proto_path)
45
46 # Fail early in case the proto hasn't been built.
47 from tracing.proto import histogram_proto
48 if not histogram_proto.HAS_PROTO:
49 raise ImportError('Could not find histogram_pb2. You need to build the '
50 'webrtc_dashboard_upload target before invoking this '
51 'script. Expected to find '
52 'histogram_pb2.py in %s.' % histogram_proto_path)
53
54
55def _CreateHistogram(name='hist',
56 master=None,
57 bot=None,
58 benchmark=None,
59 benchmark_description=None,
60 commit_position=None,
61 samples=None):
62 hists = [catapult_uploader.histogram.Histogram(name, 'count')]
63 if samples:
64 for s in samples:
65 hists[0].AddSample(s)
66 histograms = catapult_uploader.histogram_set.HistogramSet(hists)
67 if master:
68 histograms.AddSharedDiagnosticToAllHistograms(
69 catapult_uploader.reserved_infos.MASTERS.name,
70 catapult_uploader.generic_set.GenericSet([master]))
71 if bot:
72 histograms.AddSharedDiagnosticToAllHistograms(
73 catapult_uploader.reserved_infos.BOTS.name,
74 catapult_uploader.generic_set.GenericSet([bot]))
75 if commit_position:
76 histograms.AddSharedDiagnosticToAllHistograms(
77 catapult_uploader.reserved_infos.CHROMIUM_COMMIT_POSITIONS.name,
78 catapult_uploader.generic_set.GenericSet([commit_position]))
79 if benchmark:
80 histograms.AddSharedDiagnosticToAllHistograms(
81 catapult_uploader.reserved_infos.BENCHMARKS.name,
82 catapult_uploader.generic_set.GenericSet([benchmark]))
83 if benchmark_description:
84 histograms.AddSharedDiagnosticToAllHistograms(
85 catapult_uploader.reserved_infos.BENCHMARK_DESCRIPTIONS.name,
86 catapult_uploader.generic_set.GenericSet([benchmark_description]))
87 return histograms
88
89
90class CatapultUploaderTest(unittest.TestCase):
91 def setUp(self):
92 mock = MagicMock(return_value=[200, None])
93 catapult_uploader.httplib2.Http.request = mock
94
95 self.histogram = _CreateHistogram(
96 master='master',
97 bot='bot',
98 benchmark='benchmark',
99 commit_position=123,
100 benchmark_description='Benchmark description.',
101 samples=[1, 2, 3])
102
103 def testSendHistogramsSet(self):
104 url = 'http://notlocalhost'
105 # pylint: disable=protected-access
106 response, content = catapult_uploader._SendHistogramSet(url, self.histogram)
107 self.assertEqual(response, 200)
108 self.assertEqual(content, None)
109
110 def testSendHistogramsSetLocalhost(self):
111 url = 'http://localhost'
112 # pylint: disable=protected-access
113 response, content = catapult_uploader._SendHistogramSet(url, self.histogram)
114 self.assertEqual(response, 200)
115 self.assertEqual(content, None)
116
117
118if (__name__) == '__main__':
119 _ConfigurePythonPath()
120 import catapult_uploader
121
122 unittest.main()