Commit 0b8b9fbe authored by Ramiro Morales's avatar Ramiro Morales
Browse files

[1.2.X] Fixed #15029 -- Moved to database backends the ability to decide if...

[1.2.X] Fixed #15029 -- Moved to database backends the ability to decide if two DATABASES items are different when creating temporary databases for tests.

Backport of [15392] from trunk

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15395 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 837a2e27
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -468,3 +468,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']
        )
+10 −0
Original line number Diff line number Diff line
@@ -114,6 +114,16 @@ class DatabaseCreation(BaseDatabaseCreation):

        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'],
        )

    def _destroy_test_db(self, test_database_name, verbosity=1):
        """
        Destroy a test database, prompting the user for confirmation if the
+14 −15
Original line number Diff line number Diff line
@@ -240,7 +240,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:
@@ -254,10 +254,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")
@@ -309,26 +309,25 @@ class DjangoTestSuiteRunner(object):
                # the alias.
                mirrored_aliases[alias] = connection.settings_dict['TEST_MIRROR']
            else:
                # Store the (engine, name) pair. If we have two aliases
                # with the same pair, 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)
                # 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.
                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']
                else:
                    if alias != 'default':
                        dependencies[alias] = connection.settings_dict.get('TEST_DEPENDENCIES', ['default'])
                    if alias != DEFAULT_DB_ALIAS:
                        dependencies[alias] = connection.settings_dict.get('TEST_DEPENDENCIES', [DEFAULT_DB_ALIAS])

        # 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))
+14 −15
Original line number Diff line number Diff line
@@ -3,7 +3,6 @@ Tests for django test runner
"""
import StringIO
import unittest
import django
from django.core.exceptions import ImproperlyConfigured
from django.test import simple

@@ -33,9 +32,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 +42,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.assertTrue('s1' in ordered_sigs)
        self.assertTrue('s2' in ordered_sigs)
@@ -53,9 +52,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 +62,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.assertTrue('s1' in ordered_sigs)
        self.assertTrue('s2' in ordered_sigs)
@@ -78,10 +77,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 +107,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'],