Bug 1404401 - ignore presence of target_task_config.json in tests; r=ahal
authorDustin J. Mitchell <dustin@mozilla.com>
Thu, 12 Oct 2017 17:58:14 +0000
changeset 385970 5e80ad94e2a5e14943b5f096a759c33291e88c8c
parent 385969 84946a59ea8a5fae6d77053c5dc8b94ecf2e16e2
child 385971 692787b51f8e9a3a2350ca9eac6a167945cf0ba0
push id32672
push userarchaeopteryx@coole-files.de
push dateFri, 13 Oct 2017 09:00:05 +0000
treeherdermozilla-central@3efcb26e5f37 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersahal
bugs1404401
milestone58.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1404401 - ignore presence of target_task_config.json in tests; r=ahal I *think* the modifications to MockedOpen are correct, but I'm not sure.. MozReview-Commit-ID: 6vTZBtdQ1dz
config/mozunit.py
taskcluster/taskgraph/test/test_decision.py
--- a/config/mozunit.py
+++ b/config/mozunit.py
@@ -130,16 +130,19 @@ class MockedOpen(object):
     Context manager diverting the open builtin such that opening files
     can open "virtual" file instances given when creating a MockedOpen.
 
     with MockedOpen({'foo': 'foo', 'bar': 'bar'}):
         f = open('foo', 'r')
 
     will thus open the virtual file instance for the file 'foo' to f.
 
+    If the content of a file is given as None, then that file will be
+    represented as not existing (even if it does, actually, exist).
+
     MockedOpen also masks writes, so that creating or replacing files
     doesn't touch the file system, while subsequently opening the file
     will return the recorded content.
 
     with MockedOpen():
         f = open('foo', 'w')
         f.write('foo')
     self.assertRaises(Exception,f.open('foo', 'r'))
@@ -149,17 +152,20 @@ class MockedOpen(object):
         for name, content in files.iteritems():
             self.files[normcase(os.path.abspath(name))] = content
 
     def __call__(self, name, mode='r'):
         absname = normcase(os.path.abspath(name))
         if 'w' in mode:
             file = MockedFile(self, absname)
         elif absname in self.files:
-            file = MockedFile(self, absname, self.files[absname])
+            content = self.files[absname]
+            if content is None:
+                raise IOError(2, 'No such file or directory')
+            file = MockedFile(self, absname, content)
         elif 'a' in mode:
             file = MockedFile(self, absname, self.open(name, 'r').read())
         else:
             file = self.open(name, mode)
         if 'a' in mode:
             file.seek(0, os.SEEK_END)
         return file
 
@@ -178,41 +184,40 @@ class MockedOpen(object):
         import __builtin__
         __builtin__.open = self.open
         os.path.exists = self._orig_path_exists
         os.path.isdir = self._orig_path_isdir
         os.path.isfile = self._orig_path_isfile
 
     def _wrapped_exists(self, p):
         return (self._wrapped_isfile(p) or
-                self._wrapped_isdir(p) or
-                self._orig_path_exists(p))
+                self._wrapped_isdir(p))
 
     def _wrapped_isfile(self, p):
         p = normcase(p)
         if p in self.files:
-            return True
+            return self.files[p] is not None
 
         abspath = normcase(os.path.abspath(p))
         if abspath in self.files:
-            return True
+            return self.files[abspath] is not None
 
         return self._orig_path_isfile(p)
 
     def _wrapped_isdir(self, p):
         p = normcase(p)
         p = p if p.endswith(('/', '\\')) else p + os.sep
         if any(f.startswith(p) for f in self.files):
             return True
 
         abspath = normcase(os.path.abspath(p) + os.sep)
         if any(f.startswith(abspath) for f in self.files):
             return True
 
-        return self._orig_path_exists(p)
+        return self._orig_path_isdir(p)
 
 
 def main(*args, **kwargs):
     runwith = kwargs.pop('runwith', 'pytest')
 
     if runwith == 'unittest':
         unittest.main(testRunner=MozTestRunner(), *args, **kwargs)
     else:
--- a/taskcluster/taskgraph/test/test_decision.py
+++ b/taskcluster/taskgraph/test/test_decision.py
@@ -41,58 +41,62 @@ class TestDecision(unittest.TestCase):
         finally:
             if os.path.exists(tmpdir):
                 shutil.rmtree(tmpdir)
             decision.ARTIFACTS_DIR = 'artifacts'
 
 
 class TestGetDecisionParameters(unittest.TestCase):
 
+    ttc_file = os.path.join(os.getcwd(), 'try_task_config.json')
+
     def setUp(self):
         self.options = {
             'base_repository': 'https://hg.mozilla.org/mozilla-unified',
             'head_repository': 'https://hg.mozilla.org/mozilla-central',
             'head_rev': 'abcd',
             'head_ref': 'ef01',
             'message': '',
             'project': 'mozilla-central',
             'pushlog_id': 143,
             'pushdate': 1503691511,
             'owner': 'nobody@mozilla.com',
             'level': 3,
         }
 
     def test_simple_options(self):
-        params = decision.get_decision_parameters(self.options)
+        with MockedOpen({self.ttc_file: None}):
+            params = decision.get_decision_parameters(self.options)
         self.assertEqual(params['pushlog_id'], 143)
         self.assertEqual(params['build_date'], 1503691511)
         self.assertEqual(params['moz_build_date'], '20170825200511')
         self.assertEqual(params['try_mode'], None)
         self.assertEqual(params['try_options'], None)
         self.assertEqual(params['try_task_config'], None)
 
     def test_no_email_owner(self):
         self.options['owner'] = 'ffxbld'
-        params = decision.get_decision_parameters(self.options)
+        with MockedOpen({self.ttc_file: None}):
+            params = decision.get_decision_parameters(self.options)
         self.assertEqual(params['owner'], 'ffxbld@noreply.mozilla.org')
 
     def test_try_options(self):
         self.options['message'] = 'try: -b do -t all'
         self.options['project'] = 'try'
-        params = decision.get_decision_parameters(self.options)
+        with MockedOpen({self.ttc_file: None}):
+            params = decision.get_decision_parameters(self.options)
         self.assertEqual(params['try_mode'], 'try_option_syntax')
         self.assertEqual(params['try_options']['build_types'], 'do')
         self.assertEqual(params['try_options']['unittests'], 'all')
         self.assertEqual(params['try_task_config'], None)
 
     def test_try_task_config(self):
         ttc = {'tasks': ['a', 'b'], 'templates': {}}
-        ttc_file = os.path.join(os.getcwd(), 'try_task_config.json')
         self.options['project'] = 'try'
-        with MockedOpen({ttc_file: json.dumps(ttc)}):
+        with MockedOpen({self.ttc_file: json.dumps(ttc)}):
             params = decision.get_decision_parameters(self.options)
             self.assertEqual(params['try_mode'], 'try_task_config')
             self.assertEqual(params['try_options'], None)
             self.assertEqual(params['try_task_config'], ttc)
 
 
 if __name__ == '__main__':
     main()