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