summaryrefslogtreecommitdiffstats
path: root/python/mozperftest/mozperftest/tests/test_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozperftest/mozperftest/tests/test_utils.py')
-rw-r--r--python/mozperftest/mozperftest/tests/test_utils.py233
1 files changed, 233 insertions, 0 deletions
diff --git a/python/mozperftest/mozperftest/tests/test_utils.py b/python/mozperftest/mozperftest/tests/test_utils.py
new file mode 100644
index 0000000000..75c4a431a6
--- /dev/null
+++ b/python/mozperftest/mozperftest/tests/test_utils.py
@@ -0,0 +1,233 @@
+#!/usr/bin/env python
+# 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 shutil
+import sys
+from datetime import date, timedelta
+from pathlib import Path
+from subprocess import CalledProcessError
+from unittest import mock
+
+import mozunit
+import pytest
+
+from mozperftest.tests.support import EXAMPLE_TESTS_DIR, requests_content, temp_file
+from mozperftest.utils import (
+ build_test_list,
+ checkout_python_script,
+ convert_day,
+ create_path,
+ download_file,
+ get_multi_tasks_url,
+ get_output_dir,
+ get_revision_namespace_url,
+ host_platform,
+ install_package,
+ load_class,
+ silence,
+)
+
+
+def test_silence():
+ with silence():
+ print("HIDDEN")
+
+
+def test_host_platform():
+ plat = host_platform()
+
+ # a bit useless... :)
+ if sys.platform.startswith("darwin"):
+ assert plat == "darwin"
+ else:
+ if sys.maxsize > 2 ** 32:
+ assert "64" in plat
+ else:
+ assert "64" not in plat
+
+
+def get_raise(*args, **kw):
+ raise Exception()
+
+
+@mock.patch("mozperftest.utils.requests.get", new=get_raise)
+def test_download_file_fails():
+ with temp_file() as target, silence(), pytest.raises(Exception):
+ download_file("http://I don't exist", Path(target), retry_sleep=0.1)
+
+
+@mock.patch("mozperftest.utils.requests.get", new=requests_content())
+def test_download_file_success():
+ with temp_file() as target:
+ download_file("http://content", Path(target), retry_sleep=0.1)
+ with open(target) as f:
+ assert f.read() == "some content"
+
+
+def _req(package):
+ class Req:
+ location = "nowhere"
+
+ @property
+ def satisfied_by(self):
+ return self
+
+ def check_if_exists(self, **kw):
+ pass
+
+ return Req()
+
+
+@mock.patch("pip._internal.req.constructors.install_req_from_line", new=_req)
+def test_install_package():
+ vem = mock.Mock()
+ vem.bin_path = "someplace"
+ with mock.patch("subprocess.check_call") as mock_check_call:
+ assert install_package(vem, "foo")
+ mock_check_call.assert_called_once_with(
+ [
+ vem.python_path,
+ "-m",
+ "pip",
+ "install",
+ "foo",
+ ]
+ )
+
+
+@mock.patch("pip._internal.req.constructors.install_req_from_line", new=_req)
+def test_install_package_failures():
+ vem = mock.Mock()
+ vem.bin_path = "someplace"
+
+ def check_call(*args):
+ raise CalledProcessError(1, "")
+
+ with pytest.raises(CalledProcessError):
+ with mock.patch("subprocess.check_call", new=check_call):
+ install_package(vem, "foo")
+
+ # we can also absorb the error, and just return False
+ assert not install_package(vem, "foo", ignore_failure=True)
+
+
+@mock.patch("mozperftest.utils.requests.get", requests_content())
+def test_build_test_list():
+ tests = [EXAMPLE_TESTS_DIR, "https://some/location/perftest_one.js"]
+ try:
+ files, tmp_dir = build_test_list(tests)
+ assert len(files) == 2
+ finally:
+ shutil.rmtree(tmp_dir)
+
+
+def test_convert_day():
+ day = "2020.06.08"
+ assert convert_day(day) == day
+ with pytest.raises(ValueError):
+ convert_day("2020-06-08")
+ today = date.today()
+ assert convert_day("today"), today.strftime("%Y.%m.%d")
+ yesterday = today - timedelta(days=1)
+ assert convert_day("yesterday") == yesterday.strftime("%Y.%m.%d")
+
+
+def test_revision_namespace_url():
+ route = "FakeBuildRoute"
+ day = "2020.06.08"
+ buildurl = get_revision_namespace_url(route, day=day)
+ assert day in buildurl and route in buildurl
+ assert buildurl.endswith(".revision")
+
+
+def test_multibuild_url():
+ route = "FakeBuildRoute"
+ day = "2020.06.08"
+ revision = "deadbeef"
+ buildurl = get_multi_tasks_url(route, revision, day=day)
+ assert all(item in buildurl for item in (route, day, revision))
+
+ with mock.patch("mozperftest.utils.date") as mockeddate:
+ mockeddate.today.return_value = mockeddate
+ mockeddate.strftime.return_value = "2020.07.09"
+ buildurl = get_multi_tasks_url(route, revision, day="today")
+ assert "2020.07.09" in buildurl and route in buildurl
+
+ with mock.patch("mozperftest.utils.timedelta"):
+ mockeddate.__sub__.return_value = mockeddate
+ mockeddate.strftime.return_value = "2020.08.09"
+ buildurl = get_multi_tasks_url(route, revision)
+ assert "2020.08.09" in buildurl and route in buildurl
+
+
+class ImportMe:
+ pass
+
+
+def test_load_class():
+
+ with pytest.raises(ImportError):
+ load_class("notimportable")
+
+ with pytest.raises(ImportError):
+ load_class("notim:por:table")
+
+ with pytest.raises(ImportError):
+ load_class("notim:portable")
+
+ with pytest.raises(ImportError):
+ load_class("mozperftest.tests.test_utils:NOEXIST")
+
+ klass = load_class("mozperftest.tests.test_utils:ImportMe")
+ assert klass is ImportMe
+
+
+class _Venv:
+ python_path = sys.executable
+
+
+def test_checkout_python_script():
+ with silence() as captured:
+ assert checkout_python_script(_Venv(), "lib2to3", ["--help"])
+
+ stdout, stderr = captured
+ stdout.seek(0)
+ assert stdout.read() == "=> lib2to3 [OK]\n"
+
+
+def test_run_python_script_failed():
+ with silence() as captured:
+ assert not checkout_python_script(_Venv(), "nothing")
+
+ stdout, stderr = captured
+ stdout.seek(0)
+ assert stdout.read().endswith("[FAILED]\n")
+
+
+def test_get_output_dir():
+ with temp_file() as temp_dir:
+ output_dir = get_output_dir(temp_dir)
+ assert output_dir.exists()
+ assert output_dir.is_dir()
+
+ output_dir = get_output_dir(output=temp_dir, folder="artifacts")
+ assert output_dir.exists()
+ assert output_dir.is_dir()
+ assert "artifacts" == output_dir.parts[-1]
+
+
+def test_create_path():
+ path = Path("path/doesnt/exist").resolve()
+ if path.exists():
+ shutil.rmtree(path.parent.parent)
+ try:
+ path = create_path(path)
+
+ assert path.exists()
+ finally:
+ shutil.rmtree(path.parent.parent)
+
+
+if __name__ == "__main__":
+ mozunit.main()