xref: /aosp_15_r20/external/autotest/frontend/setup_test_environment.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Lifrom django.core import management
2*9c5db199SXin Lifrom django.conf import settings
3*9c5db199SXin Liimport common
4*9c5db199SXin Li
5*9c5db199SXin Li# we need to set DATABASE_ENGINE now, at import time, before the Django database
6*9c5db199SXin Li# system gets initialized.
7*9c5db199SXin Li# django.conf.settings.LazySettings is buggy and requires us to get something
8*9c5db199SXin Li# from it before we set stuff on it.
9*9c5db199SXin Ligetattr(settings, 'DATABASES')
10*9c5db199SXin Lifor name in ['default', 'global', 'readonly', 'server']:
11*9c5db199SXin Li    if name not in settings.DATABASES:
12*9c5db199SXin Li        settings.DATABASES[name] = {}
13*9c5db199SXin Li    settings.DATABASES[name]['ENGINE'] = (
14*9c5db199SXin Li            'autotest_lib.frontend.db.backends.afe_sqlite')
15*9c5db199SXin Li    settings.DATABASES[name]['NAME'] = ':memory:'
16*9c5db199SXin Li
17*9c5db199SXin Li
18*9c5db199SXin Lifrom django.db import connections
19*9c5db199SXin Lifrom autotest_lib.frontend.afe import readonly_connection
20*9c5db199SXin Li
21*9c5db199SXin Liconnection = connections['default']
22*9c5db199SXin Liconnection_readonly = connections['readonly']
23*9c5db199SXin Liconnection_global = connections['global']
24*9c5db199SXin Liconnection_server = connections['server']
25*9c5db199SXin Li
26*9c5db199SXin Lidef run_syncdb(verbosity=0):
27*9c5db199SXin Li    """Call syncdb command to make sure database schema is uptodate.
28*9c5db199SXin Li
29*9c5db199SXin Li    @param verbosity: Level of verbosity of the command, default to 0.
30*9c5db199SXin Li    """
31*9c5db199SXin Li    management.call_command('syncdb', verbosity=verbosity, interactive=False)
32*9c5db199SXin Li    management.call_command('syncdb', verbosity=verbosity, interactive=False,
33*9c5db199SXin Li                             database='readonly')
34*9c5db199SXin Li    management.call_command('syncdb', verbosity=verbosity, interactive=False,
35*9c5db199SXin Li                             database='global')
36*9c5db199SXin Li    management.call_command('syncdb', verbosity=verbosity, interactive=False,
37*9c5db199SXin Li                             database='server')
38*9c5db199SXin Li
39*9c5db199SXin Li
40*9c5db199SXin Lidef destroy_test_database():
41*9c5db199SXin Li    """Close all connection to the test database.
42*9c5db199SXin Li    """
43*9c5db199SXin Li    connection.close()
44*9c5db199SXin Li    connection_readonly.close()
45*9c5db199SXin Li    connection_global.close()
46*9c5db199SXin Li    connection_server.close()
47*9c5db199SXin Li    # Django brilliantly ignores close() requests on in-memory DBs to keep us
48*9c5db199SXin Li    # naive users from accidentally destroying data.  So reach in and close
49*9c5db199SXin Li    # the real connection ourselves.
50*9c5db199SXin Li    # Note this depends on Django internals and will likely need to be changed
51*9c5db199SXin Li    # when we upgrade Django.
52*9c5db199SXin Li    for con in [connection, connection_global, connection_readonly,
53*9c5db199SXin Li                connection_server]:
54*9c5db199SXin Li        real_connection = con.connection
55*9c5db199SXin Li        if real_connection is not None:
56*9c5db199SXin Li            real_connection.close()
57*9c5db199SXin Li            con.connection = None
58*9c5db199SXin Li
59*9c5db199SXin Li
60*9c5db199SXin Lidef set_up():
61*9c5db199SXin Li    """Run setup before test starts.
62*9c5db199SXin Li    """
63*9c5db199SXin Li    run_syncdb()
64*9c5db199SXin Li    readonly_connection.set_globally_disabled(True)
65*9c5db199SXin Li
66*9c5db199SXin Li
67*9c5db199SXin Lidef tear_down():
68*9c5db199SXin Li    """Run cleanup after test is completed.
69*9c5db199SXin Li    """
70*9c5db199SXin Li    readonly_connection.set_globally_disabled(False)
71*9c5db199SXin Li    destroy_test_database()
72*9c5db199SXin Li
73*9c5db199SXin Li
74*9c5db199SXin Lidef print_queries():
75*9c5db199SXin Li    """
76*9c5db199SXin Li    Print all SQL queries executed so far.  Useful for debugging failing tests -
77*9c5db199SXin Li    you can call it from tearDown(), and then execute the single test case of
78*9c5db199SXin Li    interest from the command line.
79*9c5db199SXin Li    """
80*9c5db199SXin Li    for query in connection.queries:
81*9c5db199SXin Li        print(query['sql'] + ';\n')
82