Bug 1292300 - Make mock_runner fixture do more work; r?maja_zf draft
authorAnjana Vakil <anjanavakil@gmail.com>
Tue, 09 Aug 2016 17:30:50 +0200
changeset 400677 0b00e32a56de86801349441142d4b226ec8a404c
parent 400444 6e191a55c3d23e83e6a2e72e4e80c1dc21516493
child 400678 c2d255be0c87680d304b7583f9b52625bbab398f
child 400712 5f8f20682b5a4bf4aaa1dc93090eb6836ffc4a9a
push id26242
push userbmo:anjanavakil@gmail.com
push dateMon, 15 Aug 2016 13:31:12 +0000
reviewersmaja_zf
bugs1292300
milestone51.0a1
Bug 1292300 - Make mock_runner fixture do more work; r?maja_zf Remove some duplication in various tests by doing more of that work in the `mock_runner` fixture, including: - monkeypatch mozversion in the fixture so we don't have to patch mozversion.get_version in various places - mock additional attributes needed for certain tests Use the improved mock_runner fixture wherever `runner.run_tests` is called. MozReview-Commit-ID: GQlBR0Geic6
testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py
--- a/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py
+++ b/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py
@@ -130,24 +130,27 @@ def mach_parsed_kwargs(logger):
 def runner(mach_parsed_kwargs):
     """
     MarionetteTestRunner instance initialized with default options.
     """
     return MarionetteTestRunner(**mach_parsed_kwargs)
 
 
 @pytest.fixture()
-def mock_runner(runner, mock_marionette):
+def mock_runner(runner, mock_marionette, monkeypatch):
     """
     MarionetteTestRunner instance with mocked-out
-    self.marionette and other properties.
+    self.marionette and other properties,
+    to enable testing runner.run_tests().
     """
     runner.driverclass = mock_marionette
-    runner._set_baseurl = Mock()
-    runner.run_test_set = Mock()
+    for attr in ['_set_baseurl', 'run_test_set', '_capabilities']:
+        setattr(runner, attr, Mock())
+    runner._appName = 'fake_app'
+    monkeypatch.setattr('marionette.runner.base.mozversion', Mock())
     return runner
 
 
 @pytest.fixture
 def harness_class(request):
     """
     Mock based on MarionetteHarness whose run method just returns a number of
     failures according to the supplied test parameter
@@ -362,108 +365,100 @@ def test_add_test_directory(runner):
         with patch('os.walk') as walk:
             walk.return_value = dir_contents
             runner.add_test(test_dir)
     assert isdir.called and walk.called
     for test in runner.tests:
         assert test_dir in test['filepath']
     assert len(runner.tests) == 4
 
-def test_add_test_manifest(runner):
-    runner._appName = 'fake_app'
+def test_add_test_manifest(mock_runner):
     manifest = "/path/to/fake/manifest.ini"
     active_tests = [{'expected': 'pass',
                      'path': u'/path/to/fake/test_expected_pass.py'},
                     {'expected': 'fail',
                      'path': u'/path/to/fake/test_expected_fail.py'},
                     {'disabled': 'skip-if: true # "testing disabled test"',
                      'expected': 'pass',
                      'path': u'/path/to/fake/test_disabled.py'}]
     with patch.multiple('marionette.runner.base.TestManifest',
                         read=DEFAULT, active_tests=DEFAULT) as mocks:
             mocks['active_tests'].return_value = active_tests
             with pytest.raises(IOError) as err:
-                runner.add_test(manifest)
+                mock_runner.add_test(manifest)
             assert "does not exist" in err.value.message
             assert mocks['read'].call_count == mocks['active_tests'].call_count == 1
             args, kwargs = mocks['active_tests'].call_args
-            assert kwargs['app'] == runner._appName
-            runner.tests, runner.manifest_skipped_tests = [], []
+            assert kwargs['app'] == mock_runner._appName
+            mock_runner.tests, mock_runner.manifest_skipped_tests = [], []
             with patch('marionette.runner.base.os.path.exists', return_value=True):
-                runner.add_test(manifest)
+                mock_runner.add_test(manifest)
             assert mocks['read'].call_count == mocks['active_tests'].call_count == 2
-    assert len(runner.tests) == 2
-    assert len(runner.manifest_skipped_tests) == 1
-    for test in runner.tests:
+    assert len(mock_runner.tests) == 2
+    assert len(mock_runner.manifest_skipped_tests) == 1
+    for test in mock_runner.tests:
         assert test['filepath'].endswith(('test_expected_pass.py', 'test_expected_fail.py'))
         if test['filepath'].endswith('test_expected_fail.py'):
             assert test['expected'] == 'fail'
         else:
             assert test['expected'] == 'pass'
 
 
 def test_cleanup_with_manifest(mock_runner):
-    mock_runner._appName = 'fake_app'
     with patch.multiple('marionette.runner.base.TestManifest',
                         read=DEFAULT, active_tests=DEFAULT) as mocks:
         mocks['active_tests'].return_value = [{'expected':'pass', 'path':'test_something.py'}]
-        with patch('marionette.runner.base.mozversion.get_version'):
-            with patch('marionette.runner.base.os.path.exists', return_value=True):
-                mock_runner.run_tests(['fake_manifest.ini'])
+        with patch('marionette.runner.base.os.path.exists', return_value=True):
+            mock_runner.run_tests(['fake_manifest.ini'])
     assert mock_runner.marionette is None
     assert mock_runner.httpd is None
 
 def test_cleanup_empty_manifest(mock_runner):
-    mock_runner._appName = 'fake_app'
     with patch.multiple('marionette.runner.base.TestManifest',
                         read=DEFAULT, active_tests=DEFAULT) as mocks:
         mocks['active_tests'].return_value = []
-        with patch('marionette.runner.base.mozversion.get_version'):
-            with pytest.raises(Exception) as exc:
-                mock_runner.run_tests(['fake_empty_manifest.ini'])
+        with pytest.raises(Exception) as exc:
+            mock_runner.run_tests(['fake_empty_manifest.ini'])
     assert "no tests to run" in exc.value.message
     assert mock_runner.marionette is None
     assert mock_runner.httpd is None
 
 
-def test_reset_test_stats(runner):
+def test_reset_test_stats(mock_runner):
     def reset_successful(runner):
         stats = ['passed', 'failed', 'unexpected_successes', 'todo', 'skipped', 'failures']
         return all([((s in vars(runner)) and (not vars(runner)[s])) for s in stats])
-    assert reset_successful(runner)
-    runner.passed = 1
-    runner.failed = 1
-    runner.failures.append(['TEST-UNEXPECTED-FAIL'])
-    assert not reset_successful(runner)
-    with pytest.raises(Exception):
-        runner.run_tests([u'test_fake_thing.py'])
-    assert reset_successful(runner)
+    assert reset_successful(mock_runner)
+    mock_runner.passed = 1
+    mock_runner.failed = 1
+    mock_runner.failures.append(['TEST-UNEXPECTED-FAIL'])
+    assert not reset_successful(mock_runner)
+    mock_runner.run_tests([u'test_fake_thing.py'])
+    assert reset_successful(mock_runner)
 
 
 def test_initialize_test_run(mock_runner):
     tests = [u'test_fake_thing.py']
     mock_runner.reset_test_stats = Mock()
-    with patch('marionette.runner.base.mozversion.get_version'):
-        mock_runner.run_tests(tests)
+    mock_runner.run_tests(tests)
     assert mock_runner.reset_test_stats.called
     with pytest.raises(AssertionError) as test_exc:
         mock_runner.run_tests([])
     assert "len(tests)" in str(test_exc.traceback[-1].statement)
     with pytest.raises(AssertionError) as hndl_exc:
         mock_runner.test_handlers = []
         mock_runner.run_tests(tests)
     assert "test_handlers" in str(hndl_exc.traceback[-1].statement)
     assert mock_runner.reset_test_stats.call_count == 1
 
 
 def test_add_tests(mock_runner):
     assert len(mock_runner.tests) == 0
     fake_tests = ["test_" + i + ".py" for i in "abc"]
-    with patch('marionette.runner.base.mozversion.get_version'):
-        mock_runner.run_tests(fake_tests)
+    mock_runner.run_tests(fake_tests)
     assert len(mock_runner.tests) == 3
     for (test_name, added_test) in zip(fake_tests, mock_runner.tests):
         assert added_test['filepath'].endswith(test_name)
 
 
 def test_catch_invalid_test_names(runner):
     good_tests = [u'test_ok.py', u'test_is_ok.py', u'test_is_ok.js', u'testIsOk.js']
     bad_tests = [u'bad_test.py', u'testbad.py', u'_test_bad.py', u'testBad.notjs',