You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
8.4 KiB
227 lines
8.4 KiB
#!/usr/bin/python2 -u
|
|
#
|
|
# Copyright (c) 2011 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.
|
|
#
|
|
|
|
#pylint: disable-msg=C0111
|
|
|
|
import mox, os, shutil, tempfile, unittest
|
|
|
|
import common
|
|
from django.conf import settings
|
|
from autotest_lib.client.common_lib import global_config
|
|
from autotest_lib.frontend import database_settings_helper
|
|
from autotest_lib.frontend import setup_django_environment
|
|
from autotest_lib.frontend import setup_test_environment
|
|
from autotest_lib.frontend.afe import frontend_test_utils
|
|
from autotest_lib.frontend.afe import models as django_afe_models
|
|
from autotest_lib.frontend.tko import models as django_tko_models
|
|
from autotest_lib.tko import db as tko_db
|
|
from autotest_lib.tko.site_parse import StackTrace
|
|
|
|
# Have to import this after setup_django_environment and setup_test_environment.
|
|
# It creates a database connection, so the mocking has to be done first.
|
|
from django.db import connections
|
|
|
|
class stack_trace_test(unittest.TestCase):
|
|
|
|
|
|
def setUp(self):
|
|
setup_test_environment.set_up()
|
|
self._fake_results = tempfile.mkdtemp()
|
|
self._cros_src_dir = global_config.global_config.get_config_value(
|
|
'CROS', 'source_tree', default=None)
|
|
|
|
if not self._cros_src_dir:
|
|
self.fail('No Chrome OS source tree defined in global_config.ini')
|
|
|
|
self._stack_trace = StackTrace(
|
|
self._fake_results, self._cros_src_dir)
|
|
|
|
self._cache_dir = os.path.join(
|
|
self._cros_src_dir, 'chroot', self._stack_trace._CACHE_DIR)
|
|
|
|
# Ensure we don't obliterate a live cache directory by accident.
|
|
if os.path.exists(self._cache_dir):
|
|
self.fail(
|
|
'Symbol cache directory already exists. Cowardly refusing to'
|
|
' run. Please remove this directory manually to continue.')
|
|
|
|
|
|
def tearDown(self):
|
|
setup_test_environment.tear_down()
|
|
shutil.rmtree(self._fake_results)
|
|
if os.path.exists(self._cache_dir):
|
|
shutil.rmtree(self._cache_dir)
|
|
|
|
|
|
def _setup_basic_cache(self,
|
|
job_name='x86-alex-r16-R16-1166.0.0-a1-b1118_bvt',
|
|
mkdir=True):
|
|
# Ensure cache directory is present.
|
|
self._stack_trace._get_cache_dir()
|
|
board, rev, version = self._stack_trace._parse_job_name(job_name)
|
|
|
|
symbols_dir = os.path.join(
|
|
self._cache_dir, '-'.join([board, rev, version]))
|
|
if mkdir:
|
|
os.mkdir(symbols_dir)
|
|
|
|
chroot_symbols_dir = os.sep + os.path.relpath(
|
|
symbols_dir, self._stack_trace._chroot_dir)
|
|
|
|
return job_name, symbols_dir, chroot_symbols_dir
|
|
|
|
|
|
def test_get_job_name(self):
|
|
job_name = 'x86-alex-r16-R16-1166.0.0-a1-b1118_regression'
|
|
with open(os.path.join(self._fake_results, 'keyval'), 'w') as f:
|
|
f.write('label=%s' % job_name)
|
|
|
|
self.assertEqual(self._stack_trace._get_job_name(), job_name)
|
|
|
|
|
|
def test_parse_3_tuple_job_name(self):
|
|
job_name = 'x86-alex-r16-R16-1166.0.0-a1-b1118_regression'
|
|
board, rev, version = self._stack_trace._parse_job_name(job_name)
|
|
self.assertEqual(board, 'x86-alex')
|
|
self.assertEqual(rev, 'r16')
|
|
self.assertEqual(version, '1166.0.0')
|
|
|
|
|
|
def test_parse_4_tuple_job_name(self):
|
|
job_name = 'x86-mario-r15-0.15.1011.74-a1-b61_bvt'
|
|
board, rev, version = self._stack_trace._parse_job_name(job_name)
|
|
self.assertEqual(board, 'x86-mario')
|
|
self.assertEqual(rev, 'r15')
|
|
self.assertEqual(version, '0.15.1011.74')
|
|
|
|
|
|
def test_parse_4_tuple_au_job_name(self):
|
|
job_name = 'x86-alex-r15-0.15.1011.81_to_0.15.1011.82-a1-b69_mton_au'
|
|
board, rev, version = self._stack_trace._parse_job_name(job_name)
|
|
self.assertEqual(board, 'x86-alex')
|
|
self.assertEqual(rev, 'r15')
|
|
self.assertEqual(version, '0.15.1011.82')
|
|
|
|
|
|
def test_parse_3_tuple_au_job_name(self):
|
|
job_name = 'x86-alex-r16-1165.0.0_to_R16-1166.0.0-a1-b69_mton_au'
|
|
board, rev, version = self._stack_trace._parse_job_name(job_name)
|
|
self.assertEqual(board, 'x86-alex')
|
|
self.assertEqual(rev, 'r16')
|
|
self.assertEqual(version, '1166.0.0')
|
|
|
|
|
|
class database_selection_test(mox.MoxTestBase,
|
|
frontend_test_utils.FrontendTestMixin):
|
|
|
|
def setUp(self):
|
|
super(database_selection_test, self).setUp()
|
|
self._frontend_common_setup(fill_data=False)
|
|
|
|
|
|
def tearDown(self):
|
|
super(database_selection_test, self).tearDown()
|
|
self._frontend_common_teardown()
|
|
global_config.global_config.reset_config_values()
|
|
|
|
|
|
def assertQueries(self, database, assert_in, assert_not_in):
|
|
assert_in_found = False
|
|
for query in connections[database].queries:
|
|
sql = query['sql']
|
|
# Ignore CREATE TABLE statements as they are always executed
|
|
if 'INSERT INTO' in sql or 'SELECT' in sql:
|
|
self.assertNotIn(assert_not_in, sql)
|
|
if assert_in in sql:
|
|
assert_in_found = True
|
|
self.assertTrue(assert_in_found)
|
|
|
|
|
|
def testDjangoModels(self):
|
|
# If DEBUG=False connection.query will be empty
|
|
settings.DEBUG = True
|
|
|
|
afe_job = django_afe_models.Job.objects.create(created_on='2014-08-12')
|
|
# Machine has less dependencies than tko Job so it's easier to create
|
|
tko_job = django_tko_models.Machine.objects.create()
|
|
|
|
django_afe_models.Job.objects.get(pk=afe_job.id)
|
|
django_tko_models.Machine.objects.get(pk=tko_job.pk)
|
|
|
|
self.assertQueries('global', 'tko_machines', 'afe_jobs')
|
|
self.assertQueries('default', 'afe_jobs', 'tko_machines')
|
|
|
|
# Avoid unnecessary debug output from other tests
|
|
settings.DEBUG = True
|
|
|
|
|
|
def testRunOnShardWithoutGlobalConfigsFails(self):
|
|
global_config.global_config.override_config_value(
|
|
'SHARD', 'shard_hostname', 'host1')
|
|
from autotest_lib.frontend import settings
|
|
# settings module was already loaded during the imports of this file,
|
|
# so before the configuration setting was made, therefore reload it:
|
|
reload(database_settings_helper)
|
|
self.assertRaises(global_config.ConfigError,
|
|
reload, settings)
|
|
|
|
|
|
def testRunOnMasterWithoutGlobalConfigsWorks(self):
|
|
global_config.global_config.override_config_value(
|
|
'SHARD', 'shard_hostname', '')
|
|
from autotest_lib.frontend import settings
|
|
# settings module was already loaded during the imports of this file,
|
|
# so before the configuration setting was made, therefore reload it:
|
|
reload(database_settings_helper)
|
|
reload(settings)
|
|
|
|
|
|
def testTkoDatabase(self):
|
|
global_host = 'GLOBAL_HOST'
|
|
global_user = 'GLOBAL_USER'
|
|
global_db = 'GLOBAL_DB'
|
|
global_pw = 'GLOBAL_PW'
|
|
global_port = ''
|
|
local_host = 'LOCAL_HOST'
|
|
|
|
global_config.global_config.override_config_value(
|
|
'AUTOTEST_WEB', 'global_db_type', '')
|
|
|
|
global_config.global_config.override_config_value(
|
|
'AUTOTEST_WEB', 'global_db_host', global_host)
|
|
global_config.global_config.override_config_value(
|
|
'AUTOTEST_WEB', 'global_db_database', global_db)
|
|
global_config.global_config.override_config_value(
|
|
'AUTOTEST_WEB', 'global_db_user', global_user)
|
|
global_config.global_config.override_config_value(
|
|
'AUTOTEST_WEB', 'global_db_password', global_pw)
|
|
global_config.global_config.override_config_value(
|
|
'AUTOTEST_WEB', 'host', local_host)
|
|
|
|
class ConnectCalledException(Exception):
|
|
pass
|
|
|
|
# We're only interested in the parameters connect is called with here.
|
|
# Take the fast path out so we don't have to mock all the other calls
|
|
# that will later be made on the connection
|
|
def fake_connect(*args, **kwargs):
|
|
raise ConnectCalledException
|
|
|
|
tko_db.db_sql.connect = None
|
|
self.mox.StubOutWithMock(tko_db.db_sql, 'connect')
|
|
tko_db.db_sql.connect(
|
|
global_host, global_db, global_user, global_pw,
|
|
global_port).WithSideEffects(fake_connect)
|
|
|
|
self.mox.ReplayAll()
|
|
|
|
self.assertRaises(ConnectCalledException, tko_db.db_sql)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|