blob: 0c3524badb66b53e951072aa5b83d082a53533a3 [file] [log] [blame]
# -*- coding: utf-8 -*-
# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for summarize_build_stats."""
from __future__ import absolute_import
from __future__ import print_function
import doctest
import mock
from chromite.lib import cros_test_lib
from chromite.scripts.sysmon import prod_metrics
# pylint: disable=protected-access
def load_tests(loader, standard_tests, pattern):
del loader, pattern
standard_tests.addTests(doctest.DocTestSuite(prod_metrics))
return standard_tests
class TestModuleFunctions(cros_test_lib.TestCase):
"""Tests for prod_metrics module functions."""
def test__get_hostname(self):
self.assertEqual(prod_metrics._get_hostname(
{'hostname': 'foo.example.com'}), 'foo')
def test__get_hostname_of_hostname(self):
self.assertEqual(prod_metrics._get_hostname({'hostname': 'foo'}), 'foo')
def test__get_data_center(self):
self.assertEqual(prod_metrics._get_data_center(
{'hostname': 'foo.mtv.example.com'}), 'mtv')
def test__get_data_center_of_hostname(self):
with self.assertRaises(ValueError):
prod_metrics._get_data_center({'hostname': 'foo'})
class TestProdHostReporter(cros_test_lib.TestCase):
"""Tests for ProdHostReporter."""
def test_call(self):
"""Test ProdHostReporter reporting correctly."""
servers = [
prod_metrics.Server(hostname='sharanohiar',
data_center='mtv',
status='primary',
roles='shard',
created='2016-01-01 00:00:00',
modified='2016-01-02 00:00:00',
note=''),
]
source = mock.NonCallableMock(['get_servers'])
source.get_servers.side_effect = lambda: iter(servers)
sink1 = mock.NonCallableMock(['write_servers'])
sink2 = mock.NonCallableMock(['write_servers'])
reporter = prod_metrics._ProdHostReporter(source, [sink1, sink2])
reporter()
sink1.write_servers.assert_called_once_with(servers)
sink2.write_servers.assert_called_once_with(servers)
class TestAtestSource(cros_test_lib.TestCase):
"""Tests for AtestSource."""
def test_query_atest_for_servers(self):
"""Test _QueryAtestForServer()."""
source = prod_metrics._AtestSource('atest')
with mock.patch('subprocess.check_output') as check_output:
check_output.return_value = 'dummy atest output'
source._query_atest_for_servers()
check_output.assert_called_once_with(
['atest', 'server', 'list', '--json'])
def test_get_servers(self):
"""Test get_servers()."""
source = prod_metrics._AtestSource(atest_program='atest')
with mock.patch.object(source, '_query_atest_for_servers') as query:
query.return_value = (
'[{"status": "primary", "roles": ["shard"],'
' "date_modified": "2016-12-13 20:41:54",'
' "hostname": "chromeos-server71.cbf.corp.google.com",'
' "note": null,'' "date_created": "2016-12-13 20:41:54"}]')
got = list(source.get_servers())
self.assertEqual(got,
[prod_metrics.Server(
hostname='chromeos-server71',
data_center='cbf',
status='primary',
roles=('shard',),
created='2016-12-13 20:41:54',
modified='2016-12-13 20:41:54',
note=None)])
class TestTsMonSink(cros_test_lib.TestCase):
"""Tests for TsMonSink."""
def setUp(self):
patcher = mock.patch('infra_libs.ts_mon.common.interface.state.store',
autospec=True)
self.store = patcher.start()
self.addCleanup(patcher.stop)
def test_write_servers(self):
"""Test write_servers()."""
servers = [
prod_metrics.Server(
hostname='harvestasha-xp',
data_center='mtv',
status='primary',
roles=('scheduler', 'host_scheduler', 'suite_scheduler', 'afe'),
created='2014-12-11 22:48:43',
modified='2014-12-11 22:48:43',
note=''),
prod_metrics.Server(
hostname='harvestasha-vista',
data_center='mtv',
status='primary',
roles=('devserver',),
created='2015-01-05 13:32:49',
modified='2015-01-05 13:32:49',
note=''),
]
sink = prod_metrics._TsMonSink('prod_hosts/')
sink.write_servers(servers)
setter = self.store.set
calls = [
mock.call('prod_hosts/presence', ('mtv', 'harvestasha-xp'), None,
True, enforce_ge=mock.ANY),
mock.call('prod_hosts/roles', ('mtv', 'harvestasha-xp'), None,
'afe,host_scheduler,scheduler,suite_scheduler',
enforce_ge=mock.ANY),
mock.call('prod_hosts/presence', ('mtv', 'harvestasha-vista'), None,
True, enforce_ge=mock.ANY),
mock.call('prod_hosts/roles', ('mtv', 'harvestasha-vista'), None,
'devserver', enforce_ge=mock.ANY),
]
setter.assert_has_calls(calls)
self.assertEqual(len(setter.mock_calls), len(calls))