summaryrefslogtreecommitdiffstats
path: root/testing/mochitest/tests/python/test_create_directories.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/mochitest/tests/python/test_create_directories.py')
-rw-r--r--testing/mochitest/tests/python/test_create_directories.py221
1 files changed, 221 insertions, 0 deletions
diff --git a/testing/mochitest/tests/python/test_create_directories.py b/testing/mochitest/tests/python/test_create_directories.py
new file mode 100644
index 0000000000..ffbed625a5
--- /dev/null
+++ b/testing/mochitest/tests/python/test_create_directories.py
@@ -0,0 +1,221 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import os
+import unittest.mock as mock
+from argparse import Namespace
+from collections import defaultdict
+from textwrap import dedent
+
+import mozunit
+import pytest
+import six
+from conftest import setup_args
+from manifestparser import TestManifest
+
+
+# Directly running runTests() is likely not working nor a good idea
+# So at least we try to minimize with just:
+# - getActiveTests()
+# - create manifests list
+# - parseAndCreateTestsDirs()
+#
+# Hopefully, breaking the runTests() calls to parseAndCreateTestsDirs() will
+# anyway trigger other tests failures so it would be spotted, and we at least
+# ensure some coverage of handling the manifest content, creation of the
+# directories and cleanup
+@pytest.fixture
+def prepareRunTests(setup_test_harness, parser):
+ setup_test_harness(*setup_args)
+ runtests = pytest.importorskip("runtests")
+ md = runtests.MochitestDesktop("plain", {"log_tbpl": "-"})
+
+ options = vars(parser.parse_args([]))
+
+ def inner(**kwargs):
+ opts = options.copy()
+ opts.update(kwargs)
+
+ manifest = opts.get("manifestFile")
+ if isinstance(manifest, six.string_types):
+ md.testRootAbs = os.path.dirname(manifest)
+ elif isinstance(manifest, TestManifest):
+ md.testRootAbs = manifest.rootdir
+
+ md._active_tests = None
+ md.prefs_by_manifest = defaultdict(set)
+ tests = md.getActiveTests(Namespace(**opts))
+ manifests = set(t["manifest"] for t in tests)
+ for m in sorted(manifests):
+ md.parseAndCreateTestsDirs(m)
+ return md
+
+ return inner
+
+
+@pytest.fixture
+def create_manifest(tmpdir, build_obj):
+ def inner(string, name="manifest.ini"):
+ manifest = tmpdir.join(name)
+ manifest.write(string, ensure=True)
+ # pylint --py3k: W1612
+ path = six.text_type(manifest)
+ return TestManifest(manifests=(path,), strict=False, rootdir=tmpdir.strpath)
+
+ return inner
+
+
+def create_manifest_empty(create_manifest):
+ manifest = create_manifest(
+ dedent(
+ """
+ [DEFAULT]
+ [files/test_pass.html]
+ [files/test_fail.html]
+ """
+ )
+ )
+
+ return {
+ "runByManifest": True,
+ "manifestFile": manifest,
+ }
+
+
+def create_manifest_one(create_manifest):
+ manifest = create_manifest(
+ dedent(
+ """
+ [DEFAULT]
+ test-directories =
+ .snap_firefox_current_real
+ [files/test_pass.html]
+ [files/test_fail.html]
+ """
+ )
+ )
+
+ return {
+ "runByManifest": True,
+ "manifestFile": manifest,
+ }
+
+
+def create_manifest_mult(create_manifest):
+ manifest = create_manifest(
+ dedent(
+ """
+ [DEFAULT]
+ test-directories =
+ .snap_firefox_current_real
+ .snap_firefox_current_real2
+ [files/test_pass.html]
+ [files/test_fail.html]
+ """
+ )
+ )
+
+ return {
+ "runByManifest": True,
+ "manifestFile": manifest,
+ }
+
+
+def test_no_entry(prepareRunTests, create_manifest):
+ options = create_manifest_empty(create_manifest)
+ with mock.patch("os.makedirs") as mock_os_makedirs:
+ _ = prepareRunTests(**options)
+ mock_os_makedirs.assert_not_called()
+
+
+def test_one_entry(prepareRunTests, create_manifest):
+ options = create_manifest_one(create_manifest)
+ with mock.patch("os.makedirs") as mock_os_makedirs:
+ md = prepareRunTests(**options)
+ mock_os_makedirs.assert_called_once_with(".snap_firefox_current_real")
+
+ opts = mock.Mock(pidFile="") # so cleanup() does not check it
+ with mock.patch("os.path.exists") as mock_os_path_exists, mock.patch(
+ "shutil.rmtree"
+ ) as mock_shutil_rmtree:
+ md.cleanup(opts, False)
+ mock_os_path_exists.assert_called_once_with(".snap_firefox_current_real")
+ mock_shutil_rmtree.assert_called_once_with(".snap_firefox_current_real")
+
+
+def test_one_entry_already_exists(prepareRunTests, create_manifest):
+ options = create_manifest_one(create_manifest)
+ with mock.patch(
+ "os.path.exists", return_value=True
+ ) as mock_os_path_exists, mock.patch("os.makedirs") as mock_os_makedirs:
+ with pytest.raises(FileExistsError):
+ _ = prepareRunTests(**options)
+ mock_os_path_exists.assert_called_once_with(".snap_firefox_current_real")
+ mock_os_makedirs.assert_not_called()
+
+
+def test_mult_entry(prepareRunTests, create_manifest):
+ options = create_manifest_mult(create_manifest)
+ with mock.patch("os.makedirs") as mock_os_makedirs:
+ md = prepareRunTests(**options)
+ assert mock_os_makedirs.call_count == 2
+ mock_os_makedirs.assert_has_calls(
+ [
+ mock.call(".snap_firefox_current_real"),
+ mock.call(".snap_firefox_current_real2"),
+ ]
+ )
+
+ opts = mock.Mock(pidFile="") # so cleanup() does not check it
+ with mock.patch("os.path.exists") as mock_os_path_exists, mock.patch(
+ "shutil.rmtree"
+ ) as mock_shutil_rmtree:
+ md.cleanup(opts, False)
+
+ assert mock_os_path_exists.call_count == 2
+ mock_os_path_exists.assert_has_calls(
+ [
+ mock.call(".snap_firefox_current_real"),
+ mock.call().__bool__(),
+ mock.call(".snap_firefox_current_real2"),
+ mock.call().__bool__(),
+ ]
+ )
+
+ assert mock_os_makedirs.call_count == 2
+ mock_shutil_rmtree.assert_has_calls(
+ [
+ mock.call(".snap_firefox_current_real"),
+ mock.call(".snap_firefox_current_real2"),
+ ]
+ )
+
+
+def test_mult_entry_one_already_exists(prepareRunTests, create_manifest):
+ options = create_manifest_mult(create_manifest)
+ with mock.patch(
+ "os.path.exists", side_effect=[True, False]
+ ) as mock_os_path_exists, mock.patch("os.makedirs") as mock_os_makedirs:
+ with pytest.raises(FileExistsError):
+ _ = prepareRunTests(**options)
+ mock_os_path_exists.assert_called_once_with(".snap_firefox_current_real")
+ mock_os_makedirs.assert_not_called()
+
+ with mock.patch(
+ "os.path.exists", side_effect=[False, True]
+ ) as mock_os_path_exists, mock.patch("os.makedirs") as mock_os_makedirs:
+ with pytest.raises(FileExistsError):
+ _ = prepareRunTests(**options)
+ assert mock_os_path_exists.call_count == 2
+ mock_os_path_exists.assert_has_calls(
+ [
+ mock.call(".snap_firefox_current_real"),
+ mock.call(".snap_firefox_current_real2"),
+ ]
+ )
+ mock_os_makedirs.assert_not_called()
+
+
+if __name__ == "__main__":
+ mozunit.main()