Odoo18-Base/odoo/addons/base/tests/test_configmanager.py
2025-01-06 10:57:38 +07:00

527 lines
19 KiB
Python

import unittest
import odoo
from odoo.tests import TransactionCase
from odoo.tools import file_path, file_open, file_open_temporary_directory
from odoo.tools.config import conf, configmanager, _get_default_datadir
IS_POSIX = 'workers' in odoo.tools.config.options
ROOT_PATH = odoo.tools.config.options['root_path'].removesuffix('/odoo')
class TestConfigManager(TransactionCase):
maxDiff = None
def setUp(self):
super().setUp()
# _parse_config() as the side-effect of changing those two
# values, make sure the original value is restored at the end.
self.patch(conf, 'addons_paths', odoo.conf.addons_paths)
self.patch(conf, 'server_wide_modules', odoo.conf.server_wide_modules)
def test_01_default_config(self):
config = configmanager(fname=file_path('base/tests/config/empty.conf'))
default_values = {
# options not exposed on the command line
'admin_passwd': 'admin',
'csv_internal_sep': ',',
'publisher_warranty_url': 'http://services.odoo.com/publisher-warranty/',
'reportgz': False,
'root_path': f'{ROOT_PATH}/odoo',
'websocket_rate_limit_burst': 10,
'websocket_rate_limit_delay': 0.2,
'websocket_keep_alive_timeout': 3600,
# common
'config': None,
'save': None,
'init': {},
'update': {},
'without_demo': False,
'demo': {},
'import_partial': '',
'pidfile': '',
'addons_path': f'{ROOT_PATH}/odoo/addons,{ROOT_PATH}/addons',
'upgrade_path': '',
'server_wide_modules': 'base,web',
'data_dir': _get_default_datadir(),
# HTTP
'http_interface': '',
'http_port': 8069,
'gevent_port': 8072,
'http_enable': True,
'proxy_mode': False,
'x_sendfile': False,
# web
'dbfilter': '',
# testing
'test_file': '',
'test_enable': False,
'test_tags': None,
'screencasts': '',
'screenshots': '/tmp/odoo_tests',
# logging
'logfile': '',
'syslog': False,
'log_handler': [':INFO'],
'log_db': False,
'log_db_level': 'warning',
'log_level': 'info',
# SMTP
'email_from': False,
'from_filter': False,
'smtp_server': 'localhost',
'smtp_port': 25,
'smtp_ssl': False,
'smtp_user': False,
'smtp_password': False,
'smtp_ssl_certificate_filename': False,
'smtp_ssl_private_key_filename': False,
# database
'db_name': False,
'db_user': False,
'db_password': False,
'pg_path': '',
'db_host': False,
'db_port': False,
'db_sslmode': 'prefer',
'db_maxconn': 64,
'db_maxconn_gevent': False,
'db_template': 'template0',
'db_replica_host': False,
'db_replica_port': False,
# i18n
'load_language': None,
'language': None,
'translate_out': '',
'translate_in': '',
'overwrite_existing_translations': False,
'translate_modules': ['all'],
# security
'list_db': True,
# advanced
'dev_mode': [],
'shell_interface': None,
'stop_after_init': False,
'osv_memory_count_limit': 0,
'transient_age_limit': 1.0,
'max_cron_threads': 2,
'unaccent': False,
'geoip_city_db': '/usr/share/GeoIP/GeoLite2-City.mmdb',
'geoip_country_db': '/usr/share/GeoIP/GeoLite2-Country.mmdb',
}
if IS_POSIX:
# multiprocessing
default_values.update(
{
'workers': 0,
'limit_memory_soft': 2048 * 1024 * 1024,
'limit_memory_soft_gevent': False,
'limit_memory_hard': 2560 * 1024 * 1024,
'limit_memory_hard_gevent': False,
'limit_time_cpu': 60,
'limit_time_real': 120,
'limit_time_real_cron': -1,
'limit_request': 2**16,
}
)
config._parse_config()
self.assertEqual(config.options, default_values, "Options don't match")
def test_02_config_file(self):
values = {
# options not exposed on the command line
'admin_passwd': 'Tigrou007',
'csv_internal_sep': '@',
'publisher_warranty_url': 'http://example.com', # blacklist for save, read from the config file
'reportgz': True,
'root_path': f'{ROOT_PATH}/odoo', # blacklist for save, ignored from the config file
'websocket_rate_limit_burst': '1',
'websocket_rate_limit_delay': '2',
'websocket_keep_alive_timeout': '600',
# common
'config': '/tmp/config', # blacklist for save, read from the config file
'save': True, # blacklist for save, read from the config file
'init': {}, # blacklist for save, ignored from the config file
'update': {}, # blacklist for save, ignored from the config file
'without_demo': True,
'demo': {}, # blacklist for save, ignored from the config file
'import_partial': '/tmp/import-partial',
'pidfile': '/tmp/pidfile',
'addons_path': '/tmp/odoo',
'upgrade_path': '/tmp/upgrade',
'server_wide_modules': 'base,mail',
'data_dir': '/tmp/data-dir',
# HTTP
'http_interface': '10.0.0.254',
'http_port': 6942,
'gevent_port': 8012,
'http_enable': False,
'proxy_mode': True,
'x_sendfile': True,
# web
'dbfilter': '.*',
# testing
'test_file': '/tmp/file-file',
'test_enable': True,
'test_tags': ':TestMantra.test_is_extra_mile_done',
'screencasts': '/tmp/screencasts',
'screenshots': '/tmp/screenshots',
# logging
'logfile': '/tmp/odoo.log',
'syslog': False,
'log_handler': [':DEBUG'],
'log_db': 'logdb',
'log_db_level': 'debug',
'log_level': 'debug',
# SMTP
'email_from': 'admin@example.com',
'from_filter': '.*',
'smtp_server': 'smtp.localhost',
'smtp_port': 1299,
'smtp_ssl': True,
'smtp_user': 'spongebob',
'smtp_password': 'Tigrou0072',
'smtp_ssl_certificate_filename': '/tmp/tlscert',
'smtp_ssl_private_key_filename': '/tmp/tlskey',
# database
'db_name': 'horizon',
'db_user': 'kiwi',
'db_password': 'Tigrou0073',
'pg_path': '/tmp/pg_path',
'db_host': 'db.localhost',
'db_port': 4269,
'db_sslmode': 'verify-full',
'db_maxconn': 42,
'db_maxconn_gevent': 100,
'db_template': 'backup1706',
'db_replica_host': 'db2.localhost',
'db_replica_port': 2038,
# i18n
'load_language': 'fr_FR', # blacklist for save, read from the config file
'language': 'fr_FR', # blacklist for save, read from the config file
'translate_out': '/tmp/translate_out.csv', # blacklist for save, read from the config file
'translate_in': '/tmp/translate_in.csv', # blacklist for save, read from the config file
'overwrite_existing_translations': True, # blacklist for save, read from the config file
'translate_modules': ['all'], # ignored from the config file
# security
'list_db': False,
# advanced
'dev_mode': [], # blacklist for save, ignored from the config file
'shell_interface': 'ipython', # blacklist for save, read from the config file
'stop_after_init': True, # blacklist for save, read from the config file
'osv_memory_count_limit': 71,
'transient_age_limit': 4.0,
'max_cron_threads': 4,
'unaccent': True,
'geoip_city_db': '/tmp/city.db',
'geoip_country_db': '/tmp/country.db',
}
if IS_POSIX:
# multiprocessing
values.update(
{
'workers': 92,
'limit_memory_soft': 1048576,
'limit_memory_soft_gevent': 1048577,
'limit_memory_hard': 1048578,
'limit_memory_hard_gevent': 1048579,
'limit_time_cpu': 60,
'limit_time_real': 61,
'limit_time_real_cron': 62,
'limit_request': 100,
}
)
config_path = file_path('base/tests/config/non_default.conf')
config = configmanager(fname=config_path)
self.assertEqual(config.rcfile, config_path, "Config file path doesn't match")
config._parse_config()
self.assertEqual(config.options, values, "Options don't match")
self.assertEqual(config.rcfile, config_path)
self.assertNotEqual(config.rcfile, config['config']) # funny
@unittest.skipIf(not IS_POSIX, 'this test is POSIX only')
def test_03_save_default_options(self):
with file_open_temporary_directory(self.env) as temp_dir:
config_path = f'{temp_dir}/save.conf'
config = configmanager(fname=config_path)
config._parse_config(['--config', config_path, '--save'])
with (file_open(config_path, env=self.env) as config_file,
file_open('base/tests/config/save_posix.conf', env=self.env) as save_file):
config_content = config_file.read().rstrip()
save_content = save_file.read().format(
root_path=ROOT_PATH,
homedir=config._normalize('~'),
empty_dict=r'{}',
)
self.assertEqual(config_content.splitlines(), save_content.splitlines())
def test_04_odoo16_config_file(self):
# test that loading the Odoo 16.0 generated default config works
# with a modern version
config = configmanager(fname=file_path('base/tests/config/16.0.conf'))
assert_options = {
# options taken from the configuration file
'admin_passwd': 'admin',
'csv_internal_sep': ',',
'db_host': False,
'db_maxconn': 64,
'db_name': False,
'db_password': False,
'db_port': False,
'db_sslmode': 'prefer',
'db_template': 'template0',
'db_user': False,
'dbfilter': '',
'demo': {},
'email_from': False,
'geoip_city_db': '/usr/share/GeoIP/GeoLite2-City.mmdb',
'http_enable': True,
'http_interface': '',
'http_port': 8069,
'import_partial': '',
'list_db': True,
'load_language': None,
'log_db': False,
'log_db_level': 'warning',
'log_handler': [':INFO'],
'log_level': 'info',
'logfile': '',
'max_cron_threads': 2,
'osv_memory_count_limit': 0,
'overwrite_existing_translations': False,
'pg_path': '',
'pidfile': '',
'proxy_mode': False,
'reportgz': False,
'screencasts': '',
'screenshots': '/tmp/odoo_tests',
'server_wide_modules': 'base,web',
'smtp_password': False,
'smtp_port': 25,
'smtp_server': 'localhost',
'smtp_ssl': False,
'smtp_user': False,
'syslog': False,
'test_enable': False,
'test_file': '',
'test_tags': None,
'transient_age_limit': 1.0,
'translate_modules': ['all'],
'unaccent': False,
'update': {},
'upgrade_path': '',
'without_demo': False,
# options that are not taken from the file (also in 14.0)
'addons_path': f'{ROOT_PATH}/odoo/addons,{ROOT_PATH}/addons',
'config': None,
'data_dir': _get_default_datadir(),
'dev_mode': [],
'init': {},
'language': None,
'publisher_warranty_url': 'http://services.odoo.com/publisher-warranty/',
'save': None,
'shell_interface': None,
'stop_after_init': False,
'root_path': f'{ROOT_PATH}/odoo',
'translate_in': '',
'translate_out': '',
# new options since 14.0
'db_maxconn_gevent': False,
'db_replica_host': False,
'db_replica_port': False,
'geoip_country_db': '/usr/share/GeoIP/GeoLite2-Country.mmdb',
'from_filter': False,
'gevent_port': 8072,
'smtp_ssl_certificate_filename': False,
'smtp_ssl_private_key_filename': False,
'websocket_keep_alive_timeout': '3600',
'websocket_rate_limit_burst': '10',
'websocket_rate_limit_delay': '0.2',
'x_sendfile': False,
}
if IS_POSIX:
# multiprocessing
assert_options.update(
{
'workers': 0,
'limit_memory_soft': 2048 * 1024 * 1024,
'limit_memory_soft_gevent': False,
'limit_memory_hard': 2560 * 1024 * 1024,
'limit_memory_hard_gevent': False,
'limit_time_cpu': 60,
'limit_time_real': 120,
'limit_time_real_cron': -1,
'limit_request': 1 << 16,
}
)
config._parse_config()
with self.assertNoLogs('py.warnings'):
config._warn_deprecated_options()
self.assertEqual(config.options, assert_options, "Options don't match")
def test_05_repeat_parse_config(self):
"""Emulate multiple calls to parse_config()"""
config = configmanager()
config._parse_config()
config._warn_deprecated_options()
config._parse_config()
config._warn_deprecated_options()
def test_06_cli(self):
config = configmanager(fname=file_path('base/tests/config/empty.conf'))
with file_open('base/tests/config/cli') as file:
config._parse_config(file.read().split())
values = {
# options not exposed on the command line
'admin_passwd': 'admin',
'csv_internal_sep': ',',
'publisher_warranty_url': 'http://services.odoo.com/publisher-warranty/',
'reportgz': False,
'root_path': f'{ROOT_PATH}/odoo',
'websocket_rate_limit_burst': 10,
'websocket_rate_limit_delay': .2,
'websocket_keep_alive_timeout': 3600,
# common
'config': None,
'save': None,
'init': {'hr': 1, 'stock': 1},
'update': {'account': 1, 'website': 1},
'without_demo': 'rigolo',
'demo': {},
'import_partial': '/tmp/import-partial',
'pidfile': '/tmp/pidfile',
'addons_path': f'{ROOT_PATH}/odoo/addons,{ROOT_PATH}/addons',
'upgrade_path': '',
'server_wide_modules': 'base,mail',
'data_dir': '/tmp/data-dir',
# HTTP
'http_interface': '10.0.0.254',
'http_port': 6942,
'gevent_port': 8012,
'http_enable': False,
'proxy_mode': True,
'x_sendfile': True,
# web
'dbfilter': '.*',
# testing
'test_file': '/tmp/file-file',
'test_enable': True,
'test_tags': ':TestMantra.test_is_extra_mile_done',
'screencasts': '/tmp/screencasts',
'screenshots': '/tmp/screenshots',
# logging
'logfile': '/tmp/odoo.log',
'syslog': False,
'log_handler': [
':INFO',
'odoo.tools.config:DEBUG',
':WARNING',
'odoo.http:DEBUG',
'odoo.sql_db:DEBUG',
],
'log_db': 'logdb',
'log_db_level': 'debug',
'log_level': 'debug',
# SMTP
'email_from': 'admin@example.com',
'from_filter': '.*',
'smtp_server': 'smtp.localhost',
'smtp_port': 1299,
'smtp_ssl': True,
'smtp_user': 'spongebob',
'smtp_password': 'Tigrou0072',
'smtp_ssl_certificate_filename': '/tmp/tlscert',
'smtp_ssl_private_key_filename': '/tmp/tlskey',
# database
'db_name': 'horizon',
'db_user': 'kiwi',
'db_password': 'Tigrou0073',
'pg_path': '/tmp/pg_path',
'db_host': 'db.localhost',
'db_port': 4269,
'db_sslmode': 'verify-full',
'db_maxconn': 42,
'db_maxconn_gevent': 100,
'db_template': 'backup1706',
'db_replica_host': 'db2.localhost',
'db_replica_port': 2038,
# i18n
'load_language': 'fr_FR',
'language': 'fr_FR',
'translate_out': '/tmp/translate_out.csv',
'translate_in': '/tmp/translate_in.csv',
'overwrite_existing_translations': True,
'translate_modules': ['hr', 'mail', 'stock'],
# security
'list_db': False,
# advanced
'dev_mode': ['xml', 'reload'],
'shell_interface': 'ipython',
'stop_after_init': True,
'osv_memory_count_limit': 71,
'transient_age_limit': 4.0,
'max_cron_threads': 4,
'unaccent': True,
'geoip_city_db': '/tmp/city.db',
'geoip_country_db': '/tmp/country.db',
}
if IS_POSIX:
# multiprocessing
values.update(
{
'workers': 92,
'limit_memory_soft': 1048576,
'limit_memory_soft_gevent': 1048577,
'limit_memory_hard': 1048578,
'limit_memory_hard_gevent': 1048579,
'limit_time_cpu': 60,
'limit_time_real': 61,
'limit_time_real_cron': 62,
'limit_request': 100,
}
)
self.assertEqual(config.options, values)