testenv: Support test overlaying a directory to look for templates

This way tests which require a very specific config file can override
specific template files used by object classes.

Change-Id: I65d1b1e826d2d430ee83810d998b98d0ccaa07cd
diff --git a/src/osmo_gsm_tester/core/template.py b/src/osmo_gsm_tester/core/template.py
index 82985ef..8178c13 100644
--- a/src/osmo_gsm_tester/core/template.py
+++ b/src/osmo_gsm_tester/core/template.py
@@ -31,6 +31,8 @@
     return os.path.join(os.path.dirname(os.path.dirname(__file__)), 'templates')
 
 def set_templates_dir(*templates_dirs):
+    '''Set a lit of directories to look for templates. It must be called
+       everytime a template file is updated.'''
     global _lookup
     global _logger
     if not templates_dirs:
diff --git a/src/osmo_gsm_tester/obj/stp_osmo.py b/src/osmo_gsm_tester/obj/stp_osmo.py
index 1382016..83a2f75 100644
--- a/src/osmo_gsm_tester/obj/stp_osmo.py
+++ b/src/osmo_gsm_tester/obj/stp_osmo.py
@@ -35,7 +35,6 @@
 
     def start(self):
         self.log('Starting osmo-stp')
-        self.run_dir = util.Dir(self.testenv.test().get_run_dir().new_dir(self.name()))
         self.configure()
 
         inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-stp')))
@@ -61,6 +60,7 @@
         self.process.launch()
 
     def configure(self):
+        self.run_dir = util.Dir(self.testenv.test().get_run_dir().new_dir(self.name()))
         self.config_file = self.run_dir.new_file('osmo-stp.cfg')
         self.dbg(config_file=self.config_file)
 
diff --git a/src/osmo_gsm_tester/testenv.py b/src/osmo_gsm_tester/testenv.py
index f3ac02e..7ca854b 100644
--- a/src/osmo_gsm_tester/testenv.py
+++ b/src/osmo_gsm_tester/testenv.py
@@ -24,6 +24,7 @@
 import sys
 
 from .core import process
+from .core import template
 from .core import log as log_module
 from .core import process as process_module
 from .core import resource
@@ -139,6 +140,7 @@
         self.suite_run.reserved_resources.put_all()
         MainLoop.unregister_poll_func(self.poll)
         self.test_import_modules_cleanup()
+        self.set_overlay_template_dir(None)
 
     def config_suite_specific(self):
         return self.suite_run.config_suite_specific()
@@ -146,6 +148,14 @@
     def config_test_specific(self):
         return self.suite_run.config_suite_specific().get(self._test.module_name(), {})
 
+    def set_overlay_template_dir(self, template_dir=None):
+        '''Overlay a directory on top of default one when looking for
+           directories. It must be called everytime a template file is updated.'''
+        if template_dir is None:
+            template.set_templates_dir(template.default_templates_dir())
+        else:
+            template.set_templates_dir(template_dir, template.default_templates_dir())
+
     def prompt(self, *msgs, **msg_details):
         'ask for user interaction. Do not use in tests that should run automatically!'
         if msg_details: