From: Sarah Hoffmann Date: Wed, 31 Aug 2016 06:46:48 +0000 (+0200) Subject: environment for behave tests X-Git-Tag: v3.0.0~85^2~28 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/65bf6dbff71ecafa337ba318528bf353dfcf5623?ds=inline environment for behave tests --- diff --git a/test/behave/environment.py b/test/behave/environment.py new file mode 100644 index 00000000..10cb369f --- /dev/null +++ b/test/behave/environment.py @@ -0,0 +1,164 @@ +from behave import * +import logging +import os +import psycopg2 +import psycopg2.extras +import subprocess +from sys import version_info as python_version + +logger = logging.getLogger(__name__) + +userconfig = { + 'BASEURL' : 'http://localhost/nominatim', + 'BUILDDIR' : '../build', + 'REMOVE_TEMPLATE' : False, + 'KEEP_TEST_DB' : False, + 'TEMPLATE_DB' : 'test_template_nominatim', + 'TEST_DB' : 'test_nominatim', + 'TEST_SETTINGS_FILE' : '/tmp/nominatim_settings.php' +} + +class NominatimEnvironment(object): + """ Collects all functions for the execution of Nominatim functions. + """ + + def __init__(self, config): + self.build_dir = os.path.abspath(config['BUILDDIR']) + self.template_db = config['TEMPLATE_DB'] + self.test_db = config['TEST_DB'] + self.local_settings_file = config['TEST_SETTINGS_FILE'] + self.reuse_template = not config['REMOVE_TEMPLATE'] + self.keep_scenario_db = config['KEEP_TEST_DB'] + os.environ['NOMINATIM_SETTINGS'] = self.local_settings_file + + self.template_db_done = False + + def write_nominatim_config(self, dbname): + f = open(self.local_settings_file, 'w') + f.write("') + logger.debug("running osm2pgsql for template: %s\n%s\n%s" % (osm2pgsql, outstr, errstr)) + self.run_setup_script('create-functions', 'create-tables', + 'create-partition-tables', 'create-partition-functions', + 'load-data', 'create-search-indices') + + + + def setup_db(self, context): + self.setup_template_db() + self.write_nominatim_config(self.test_db) + conn = psycopg2.connect(database=self.template_db) + conn.set_isolation_level(0) + cur = conn.cursor() + cur.execute('DROP DATABASE IF EXISTS %s' % (self.test_db, )) + cur.execute('CREATE DATABASE %s TEMPLATE = %s' % (self.test_db, self.template_db)) + conn.close() + context.db = psycopg2.connect(database=self.test_db) + if python_version[0] < 3: + psycopg2.extras.register_hstore(context.db, globally=False, unicode=True) + else: + psycopg2.extras.register_hstore(context.db, globally=False) + + def teardown_db(self, context): + if 'db' in context: + context.db.close() + + if not self.keep_scenario_db: + self.db_drop_database(self.test_db) + + def run_setup_script(self, *args): + self.run_nominatim_script('setup', *args) + + def run_nominatim_script(self, script, *args): + cmd = [os.path.join(self.build_dir, 'utils', '%s.php' % script)] + cmd.extend(['--%s' % x for x in args]) + proc = subprocess.Popen(cmd, cwd=self.build_dir, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (outp, outerr) = proc.communicate() + logger.debug("run_nominatim_script: %s\n%s\n%s" % (cmd, outp, outerr)) + assert (proc.returncode == 0), "Script '%s' failed:\n%s\n%s\n" % (script, outp, outerr) + + +class OSMDataFactory(object): + + def __init__(self): + scriptpath = os.path.dirname(os.path.abspath(__file__)) + self.scene_path = os.environ.get('SCENE_PATH', + os.path.join(scriptpath, '..', 'scenes', 'data')) + + +def before_all(context): + for k,v in userconfig.items(): + context.config.userdata.setdefault(k, v) + print('config:', context.config.userdata) + # logging setup + context.config.setup_logging() + # Nominatim test setup + context.nominatim = NominatimEnvironment(context.config.userdata) + context.osm = OSMDataFactory() + +def after_all(context): + context.nominatim.cleanup() + + +def before_scenario(context, scenario): + if 'DB' in context.tags: + context.nominatim.setup_db(context) + +def after_scenario(context, scenario): + if 'DB' in context.tags: + context.nominatim.teardown_db(context) +