From dc5f2607deb35022523fef17dcd8479ca812e887 Mon Sep 17 00:00:00 2001 From: Ramiro Morales Date: Wed, 2 Feb 2011 14:02:14 +0000 Subject: [PATCH] Fixed #15029 -- Moved to database backends the ability to decide if two DATABASES items are different when creating temporary databases for tests. hG: Enter commit message. Lines beginning with 'HG:' are removed. git-svn-id: http://code.djangoproject.com/svn/django/trunk@15392 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/backends/creation.py | 14 +++++++++++ django/db/backends/oracle/creation.py | 10 ++++++++ django/test/simple.py | 22 +++++++---------- tests/regressiontests/test_runner/tests.py | 28 +++++++++++----------- 4 files changed, 47 insertions(+), 27 deletions(-) diff --git a/django/db/backends/creation.py b/django/db/backends/creation.py index b92412abe4..ef594b7bfc 100644 --- a/django/db/backends/creation.py +++ b/django/db/backends/creation.py @@ -476,3 +476,17 @@ class BaseDatabaseCreation(object): def sql_table_creation_suffix(self): "SQL to append to the end of the test table creation statements" return '' + + def test_db_signature(self): + """ + Returns a tuple with elements of self.connection.settings_dict (a + DATABASES setting value) that uniquely identify a database + accordingly to the RDBMS particularities. + """ + settings_dict = self.connection.settings_dict + return ( + settings_dict['HOST'], + settings_dict['PORT'], + settings_dict['ENGINE'], + settings_dict['NAME'] + ) diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py index bda70397c2..08b130229f 100644 --- a/django/db/backends/oracle/creation.py +++ b/django/db/backends/oracle/creation.py @@ -259,3 +259,13 @@ class DatabaseCreation(BaseDatabaseCreation): names as handled by Django haven't real counterparts in Oracle. """ return self.connection.settings_dict['NAME'] + + def test_db_signature(self): + settings_dict = self.connection.settings_dict + return ( + settings_dict['HOST'], + settings_dict['PORT'], + settings_dict['ENGINE'], + settings_dict['NAME'], + settings_dict['TEST_USER'], + ) diff --git a/django/test/simple.py b/django/test/simple.py index 1b26ebbe74..c1230678a7 100644 --- a/django/test/simple.py +++ b/django/test/simple.py @@ -1,6 +1,3 @@ -import sys -import signal - from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.db.models import get_app, get_apps @@ -203,7 +200,7 @@ def dependency_ordered(test_databases, dependencies): deferred = [] while test_databases: - signature, aliases = test_databases.pop() + signature, (db_name, aliases) = test_databases.pop() dependencies_satisfied = True for alias in aliases: if alias in dependencies: @@ -217,10 +214,10 @@ def dependency_ordered(test_databases, dependencies): resolved_databases.add(alias) if dependencies_satisfied: - ordered_test_databases.append((signature, aliases)) + ordered_test_databases.append((signature, (db_name, aliases))) changed = True else: - deferred.append((signature, aliases)) + deferred.append((signature, (db_name, aliases))) if not changed: raise ImproperlyConfigured("Circular dependency in TEST_DEPENDENCIES") @@ -276,12 +273,11 @@ class DjangoTestSuiteRunner(object): # Store a tuple with DB parameters that uniquely identify it. # If we have two aliases with the same values for that tuple, # we only need to create the test database once. - test_databases.setdefault(( - connection.settings_dict['HOST'], - connection.settings_dict['PORT'], - connection.settings_dict['ENGINE'], - connection.settings_dict['NAME'], - ), []).append(alias) + item = test_databases.setdefault( + connection.creation.test_db_signature(), + (connection.settings_dict['NAME'], []) + ) + item[1].append(alias) if 'TEST_DEPENDENCIES' in connection.settings_dict: dependencies[alias] = connection.settings_dict['TEST_DEPENDENCIES'] @@ -292,7 +288,7 @@ class DjangoTestSuiteRunner(object): # Second pass -- actually create the databases. old_names = [] mirrors = [] - for (host, port, engine, db_name), aliases in dependency_ordered(test_databases.items(), dependencies): + for signature, (db_name, aliases) in dependency_ordered(test_databases.items(), dependencies): # Actually create the database for the first connection connection = connections[aliases[0]] old_names.append((connection, db_name, True)) diff --git a/tests/regressiontests/test_runner/tests.py b/tests/regressiontests/test_runner/tests.py index b34c455a31..dfdd57498c 100644 --- a/tests/regressiontests/test_runner/tests.py +++ b/tests/regressiontests/test_runner/tests.py @@ -33,9 +33,9 @@ class DependencyOrderingTests(unittest.TestCase): def test_simple_dependencies(self): raw = [ - ('s1', ['alpha']), - ('s2', ['bravo']), - ('s3', ['charlie']), + ('s1', ('s1_db', ['alpha'])), + ('s2', ('s2_db', ['bravo'])), + ('s3', ('s3_db', ['charlie'])), ] dependencies = { 'alpha': ['charlie'], @@ -43,7 +43,7 @@ class DependencyOrderingTests(unittest.TestCase): } ordered = simple.dependency_ordered(raw, dependencies=dependencies) - ordered_sigs = [sig for sig,aliases in ordered] + ordered_sigs = [sig for sig,value in ordered] self.assertIn('s1', ordered_sigs) self.assertIn('s2', ordered_sigs) @@ -53,9 +53,9 @@ class DependencyOrderingTests(unittest.TestCase): def test_chained_dependencies(self): raw = [ - ('s1', ['alpha']), - ('s2', ['bravo']), - ('s3', ['charlie']), + ('s1', ('s1_db', ['alpha'])), + ('s2', ('s2_db', ['bravo'])), + ('s3', ('s3_db', ['charlie'])), ] dependencies = { 'alpha': ['bravo'], @@ -63,7 +63,7 @@ class DependencyOrderingTests(unittest.TestCase): } ordered = simple.dependency_ordered(raw, dependencies=dependencies) - ordered_sigs = [sig for sig,aliases in ordered] + ordered_sigs = [sig for sig,value in ordered] self.assertIn('s1', ordered_sigs) self.assertIn('s2', ordered_sigs) @@ -78,10 +78,10 @@ class DependencyOrderingTests(unittest.TestCase): def test_multiple_dependencies(self): raw = [ - ('s1', ['alpha']), - ('s2', ['bravo']), - ('s3', ['charlie']), - ('s4', ['delta']), + ('s1', ('s1_db', ['alpha'])), + ('s2', ('s2_db', ['bravo'])), + ('s3', ('s3_db', ['charlie'])), + ('s4', ('s4_db', ['delta'])), ] dependencies = { 'alpha': ['bravo','delta'], @@ -108,8 +108,8 @@ class DependencyOrderingTests(unittest.TestCase): def test_circular_dependencies(self): raw = [ - ('s1', ['alpha']), - ('s2', ['bravo']), + ('s1', ('s1_db', ['alpha'])), + ('s2', ('s2_db', ['bravo'])), ] dependencies = { 'bravo': ['alpha'],