Skip to content

Commit

Permalink
Fixed #15029 -- Moved to database backends the ability to decide if t…
Browse files Browse the repository at this point in the history
…wo 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
  • Loading branch information
ramiro committed Feb 2, 2011
1 parent 77030cc commit dc5f260
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 27 deletions.
14 changes: 14 additions & 0 deletions django/db/backends/creation.py
Expand Up @@ -476,3 +476,17 @@ def set_autocommit(self):
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']
)
10 changes: 10 additions & 0 deletions django/db/backends/oracle/creation.py
Expand Up @@ -259,3 +259,13 @@ def _get_test_db_name(self):
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'],
)
22 changes: 9 additions & 13 deletions 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
Expand Down Expand Up @@ -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:
Expand All @@ -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")
Expand Down Expand Up @@ -276,12 +273,11 @@ def setup_databases(self, **kwargs):
# 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']
Expand All @@ -292,7 +288,7 @@ def setup_databases(self, **kwargs):
# 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))
Expand Down
28 changes: 14 additions & 14 deletions tests/regressiontests/test_runner/tests.py
Expand Up @@ -33,17 +33,17 @@ 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'],
'bravo': ['charlie'],
}

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)
Expand All @@ -53,17 +53,17 @@ def test_simple_dependencies(self):

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'],
'bravo': ['charlie'],
}

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)
Expand All @@ -78,10 +78,10 @@ def test_chained_dependencies(self):

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'],
Expand All @@ -108,8 +108,8 @@ def test_multiple_dependencies(self):

def test_circular_dependencies(self):
raw = [
('s1', ['alpha']),
('s2', ['bravo']),
('s1', ('s1_db', ['alpha'])),
('s2', ('s2_db', ['bravo'])),
]
dependencies = {
'bravo': ['alpha'],
Expand Down

0 comments on commit dc5f260

Please sign in to comment.