Bug 1275020 - Allow session tests to control life cycle of Firefox; r=maja_zf draft
authorAndré Reinald <areinald@mozilla.com>
Tue, 09 Aug 2016 11:34:49 +0200
changeset 398525 8d11496bb99d4942145da348abe7f6321d05462f
parent 398515 317ba5d343e0edcaa343ee54f0d37faa2fd8ad2e
child 527690 f8ffd203c705a3f5280288c2cfaa2742940fae4a
push id25562
push userareinald@mozilla.com
push dateTue, 09 Aug 2016 09:36:09 +0000
reviewersmaja_zf
bugs1275020
milestone51.0a1
Bug 1275020 - Allow session tests to control life cycle of Firefox; r=maja_zf MozReview-Commit-ID: Lxyyk6pllbJ
testing/marionette/harness/session/session_test.py
testing/marionette/harness/session/tests/test_session.py
--- a/testing/marionette/harness/session/session_test.py
+++ b/testing/marionette/harness/session/session_test.py
@@ -226,32 +226,42 @@ class CommonTestCase(unittest.TestCase):
     def id(self):
         # TBPL starring requires that the "test name" field of a failure message
         # not differ over time. The test name to be used is passed to
         # mozlog via the test id, so this is overriden to maintain
         # consistency.
         return self.test_name
 
     def setUp(self):
-        # Convert the marionette weakref to an object, just for the
-        # duration of the test; this is deleted in tearDown() to prevent
-        # a persistent circular reference which in turn would prevent
-        # proper garbage collection.
         self.start_time = time.time()
         self.pingServer = PingServer()
         self.pingServer.start()
         self.marionette = Marionette(bin=self.binary, profile=self.profile)
         if self.marionette.session is None:
             self.marionette.start_session()
         if self.marionette.timeout is not None:
             self.marionette.timeouts(self.marionette.TIMEOUT_SEARCH, self.marionette.timeout)
             self.marionette.timeouts(self.marionette.TIMEOUT_SCRIPT, self.marionette.timeout)
             self.marionette.timeouts(self.marionette.TIMEOUT_PAGE, self.marionette.timeout)
         else:
             self.marionette.timeouts(self.marionette.TIMEOUT_PAGE, 30000)
+        self.marionette.quit_in_app()
+
+    def start_session(self):
+        self.marionette.start_session(session_id=self.marionette.session_id)
+        self.marionette.reset_timeouts()
+
+        if self.marionette.session.get('processId'):
+            # In some cases Firefox restarts itself by spawning into a new process group.
+            # As long as mozprocess cannot track that behavior (bug 1284864) we assist by
+            # informing about the new process id.
+            self.marionette.instance.runner.process_handler.check_for_detached(self.session['processId'])
+
+    def stop_session(self):
+        self.marionette.quit_in_app()
 
     def tearDown(self):
         self.marionette.cleanup()
         self.pingServer.stop()
 
     def cleanTest(self):
         self._deleteSession()
 
--- a/testing/marionette/harness/session/tests/test_session.py
+++ b/testing/marionette/harness/session/tests/test_session.py
@@ -11,43 +11,53 @@ from session.session_test import Session
 class TestHelloWorld(TC):
     def setUp(self):
         TC.setUp(self)
 
     def tearDown(self):
         TC.tearDown(self)
 
     def test_malformed_packet(self):
+        TC.start_session()
         req = ["error", "message", "stacktrace"]
         ps = []
         for p in [p for i in range(0, len(req) + 1) for p in itertools.permutations(req, i)]:
             ps.append(dict((x, None) for x in p))
 
         for p in filter(lambda p: len(p) < 3, ps):
             self.assertRaises(KeyError, self.marionette._handle_error, p)
+        TC.stop_session()
 
     def test_known_error_code(self):
+        TC.start_session()
         with self.assertRaises(errors.NoSuchElementException):
             self.marionette._handle_error(
                 {"error": errors.NoSuchElementException.code[0],
                  "message": None,
                  "stacktrace": None})
+        TC.stop_session()
 
     def test_known_error_status(self):
+        TC.start_session()
         with self.assertRaises(errors.NoSuchElementException):
             self.marionette._handle_error(
                 {"error": errors.NoSuchElementException.status,
                  "message": None,
                  "stacktrace": None})
+        TC.stop_session()
 
     def test_unknown_error_code(self):
+        TC.start_session()
         with self.assertRaises(errors.MarionetteException):
             self.marionette._handle_error(
                 {"error": 123456,
                  "message": None,
                  "stacktrace": None})
+        TC.stop_session()
 
     def test_unknown_error_status(self):
+        TC.start_session()
         with self.assertRaises(errors.MarionetteException):
             self.marionette._handle_error(
                 {"error": "barbera",
                  "message": None,
                  "stacktrace": None})
+        TC.stop_session()