1
# Copyright 2010 Canonical Ltd. This software is licensed under the
1
# Copyright 2010-2011 Canonical Ltd. This software is licensed under the
2
2
# GNU Affero General Public License version 3 (see the file LICENSE).
6
from canonical.config import (
6
from canonical.config import DatabaseConfig
11
7
from canonical.launchpad.readonly import read_only_file_exists
12
8
from canonical.launchpad.tests.readonly import (
13
9
remove_read_only_file,
22
18
layer = DatabaseLayer
24
def test_overlay(self):
25
# The dbconfig option overlays the database configurations of a
26
# chosen config section over the base section.
28
AttributeError, getattr, config.database, 'dbuser')
30
AttributeError, getattr, config.launchpad, 'main_master')
31
self.assertEquals('launchpad_main', config.launchpad.dbuser)
32
self.assertEquals('librarian', config.librarian.dbuser)
34
dbconfig.setConfigSection('librarian')
36
'dbname=%s host=localhost' % DatabaseLayer._db_fixture.dbname)
37
self.assertEquals(expected_db, dbconfig.rw_main_master)
38
self.assertEquals('librarian', dbconfig.dbuser)
40
dbconfig.setConfigSection('launchpad')
41
self.assertEquals(expected_db, dbconfig.rw_main_master)
42
self.assertEquals('launchpad_main', dbconfig.dbuser)
44
20
def test_override(self):
45
# dbuser and isolation_level can be overridden at runtime, without
46
# requiring a custom config overlay.
21
# dbuser and isolation_level can be overridden at runtime.
47
22
dbc = DatabaseConfig()
48
dbc.setConfigSection('launchpad')
49
23
self.assertEqual('launchpad_main', dbc.dbuser)
50
24
self.assertEqual('serializable', dbc.isolation_level)
67
41
def test_reset(self):
68
42
# reset() removes any overrides.
69
43
dbc = DatabaseConfig()
70
dbc.setConfigSection('launchpad')
71
44
self.assertEqual('launchpad_main', dbc.dbuser)
72
45
dbc.override(dbuser='not_launchpad')
73
46
self.assertEqual('not_launchpad', dbc.dbuser)
75
48
self.assertEqual('launchpad_main', dbc.dbuser)
77
def test_required_values(self):
78
# Some variables are required to have a value, such as dbuser. So we
79
# get a ValueError if they are not set.
81
AttributeError, getattr, config.codehosting, 'dbuser')
82
dbconfig.setConfigSection('codehosting')
83
self.assertRaises(ValueError, getattr, dbconfig, 'dbuser')
84
dbconfig.setConfigSection('launchpad')
86
50
def test_main_master_and_main_slave(self):
87
51
# DatabaseConfig provides two extra properties: main_master and
88
52
# main_slave, which return the value of either
89
53
# rw_main_master/rw_main_slave or ro_main_master/ro_main_slave,
90
54
# depending on whether or not we're in read-only mode.
55
dbc = DatabaseConfig()
91
56
self.assertFalse(read_only_file_exists())
92
self.assertEquals(dbconfig.rw_main_master, dbconfig.main_master)
93
self.assertEquals(dbconfig.rw_main_slave, dbconfig.main_slave)
57
self.assertEquals(dbc.rw_main_master, dbc.main_master)
58
self.assertEquals(dbc.rw_main_slave, dbc.main_slave)
95
60
touch_read_only_file()
97
62
self.assertTrue(read_only_file_exists())
99
dbconfig.ro_main_master, dbconfig.main_master)
64
dbc.ro_main_master, dbc.main_master)
100
65
self.assertEquals(
101
dbconfig.ro_main_slave, dbconfig.main_slave)
66
dbc.ro_main_slave, dbc.main_slave)
103
68
remove_read_only_file()