diff --git a/tests/src/python/test_qgsappstartup.py b/tests/src/python/test_qgsappstartup.py index 49914d1c8b7..7d2968f864e 100644 --- a/tests/src/python/test_qgsappstartup.py +++ b/tests/src/python/test_qgsappstartup.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- """QGIS Unit tests for QgsApplication. +From build dir: ctest -R PyQgsAppStartup -V + .. note:: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or @@ -16,7 +18,7 @@ from PyQt4 import QtCore import sys import os import time -import locale +# import locale import shutil import subprocess import tempfile @@ -38,30 +40,47 @@ class TestPyQgsAppStartup(unittest.TestCase): def tearDownClass(cls): shutil.rmtree(cls.TMP_DIR, ignore_errors=True) - def doTestOptionsPath(self, option, testDir, testFile, timeOut, env = {}): - """Run QGIS with the given option. Wait for testFile to be created. If time runs out, fail. + # TODO: refactor parameters to **kwargs to handle all startup combinations + def doTestStartup(self, option='', testDir='', testFile='', + loadPlugins=False, customization=False, + timeOut=10, env=None): + """Run QGIS with the given option. Wait for testFile to be created. + If time runs out, fail. """ + myTestFile = testFile + # from unicode to local - testDir = str(QtCore.QString( testDir ).toLocal8Bit()) - if not os.path.exists(testDir): - os.mkdir(testDir) - myTestFile = os.path.join(testDir, testFile) + if testDir: + testDir = str(QtCore.QString(testDir).toLocal8Bit()) + if not os.path.exists(testDir): + os.mkdir(testDir) + myTestFile = os.path.join(testDir, testFile) + # print 'myTestFile: ', myTestFile - if os.path.exists( myTestFile ): - os.remove( myTestFile ) + if os.path.exists(myTestFile): + os.remove(myTestFile) + + # whether to load plugins + plugins = '' if loadPlugins else '--noplugins' + + # whether to enable GUI customization + customize = '' if customization else '--nocustomization' # environnement variables = system variables + provided 'env' myenv = os.environ.copy() - myenv.update( env ) + if env is not None: + myenv.update(env) - p = subprocess.Popen( [ QGIS_BIN, "--nologo", option, testDir ], env = myenv ) + p = subprocess.Popen( + [QGIS_BIN, "--nologo", plugins, customize, option, testDir], + env=myenv) s = 0 ok = True - while not os.path.exists( myTestFile ): + while not os.path.exists(myTestFile): time.sleep(1) - s = s+1 + s += 1 if s > timeOut: ok = False break @@ -69,32 +88,65 @@ class TestPyQgsAppStartup(unittest.TestCase): p.terminate() return ok - def testOptionsPath( self ): + def testOptionsPath(self): subdir = 'QGIS' # Linux if sys.platform[:3] == 'dar': # Mac subdir = 'qgis.org' ini = os.path.join(subdir, 'QGIS2.ini') - for p in [ 'test_opts', 'test opts', 'test_optsé€' ]: - assert self.doTestOptionsPath( "--optionspath", os.path.join(self.TMP_DIR, p), ini, 5 ), "options path %s" % p + for p in ['test_opts', 'test opts', 'test_optsé€']: + assert self.doTestStartup(option="--optionspath", + testDir=os.path.join(self.TMP_DIR, p), + testFile=ini, + timeOut=5), "options path %s" % p - def testConfigPath( self ): - for p in [ 'test_config', 'test config', 'test_configé€' ]: - assert self.doTestOptionsPath( "--configpath", os.path.join(self.TMP_DIR, p), "qgis.db", 30 ), "config path %s" % p + def testConfigPath(self): + for p in ['test_config', 'test config', 'test_configé€']: + assert self.doTestStartup(option="--configpath", + testDir=os.path.join(self.TMP_DIR, p), + testFile="qgis.db", + timeOut=30), "config path %s" % p - def testPluginPath( self ): - for t in ['test_plugins', 'test plugins', 'test_pluginsé€' ]: + def testPluginPath(self): + for t in ['test_plugins', 'test plugins', 'test_pluginsé€']: # get a unicode test dir testDir = (os.path.join(self.TMP_DIR, t)).decode('utf-8') # copy from testdata - shutil.rmtree( testDir, ignore_errors = True ) - shutil.copytree( os.path.join(TEST_DATA_DIR, 'test_plugin_path'), testDir ) + shutil.rmtree(testDir, ignore_errors=True) + shutil.copytree(os.path.join(TEST_DATA_DIR, 'test_plugin_path'), + testDir) - # we use here a minimal plugin that writes to 'plugin_started.txt' when it is started - # if QGIS_PLUGINPATH is correctly parsed, this plugin is executed and the file is created - assert self.doTestOptionsPath( "--optionspath", testDir, "plugin_started.txt", 10, - { 'QGIS_PLUGINPATH' : str(QtCore.QString(testDir).toLocal8Bit()) } ) + # we use here a minimal plugin that writes to 'plugin_started.txt' + # when it is started. if QGIS_PLUGINPATH is correctly parsed, this + # plugin is executed and the file is created + assert self.doTestStartup( + option="--optionspath", + testDir=testDir, + testFile="plugin_started.txt", + timeOut=10, + env={'QGIS_PLUGINPATH': + str(QtCore.QString(testDir).toLocal8Bit())}) + + def testPyQgisStartupEnvVar(self): + # verify PYQGIS_STARTUP env variable file is run by embedded interpreter + # create a temp python module that writes out test file + testfile = 'pyqgis_startup.txt' + testfilepath = os.path.join(self.TMP_DIR, testfile) + testcode = [ + "f = open('{0}', 'w')\n".format(testfilepath), + "f.write('This is a test')\n", + "f.close()\n" + ] + testmod = os.path.join(self.TMP_DIR, 'pyqgis_startup.py') + f = open(testmod, 'w') + f.writelines(testcode) + f.close() + msg = 'Failed to create test file from executing PYQGIS_STARTUP file' + assert self.doTestStartup( + testFile=testfilepath, + timeOut=10, + env={'PYQGIS_STARTUP': testmod}), msg if __name__ == '__main__': @@ -117,6 +169,7 @@ if __name__ == '__main__': QGIS_BIN = b break + print '' print 'QGIS_BIN: ', QGIS_BIN assert 'qgis' in QGIS_BIN.lower() and os.path.exists(QGIS_BIN), \ 'QGIS binary not found, skipping test suite'