# 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 json
import os
import shutil
import tempfile
from unittest.mock import patch
import pytest
from mozunit import MockedOpen, main
from taskgraph.util.yaml import load_yaml
from gecko_taskgraph import decision
from gecko_taskgraph.parameters import register_parameters
FAKE_GRAPH_CONFIG = {"product-dir" : "browser" , "taskgraph" : {}}
TTC_FILE = os.path.join(os.getcwd(), "try_task_config.json" )
@pytest.fixture(scope="module" , autouse=True )
def register():
register_parameters()
@pytest.fixture(scope="module" )
def options():
return {
"base_repository" : "https://hg.mozilla.org/mozilla-unified " ,
"head_repository" : "https://hg.mozilla.org/mozilla-central " ,
"head_rev" : "abcd" ,
"head_ref" : "ef01" ,
"head_tag" : "" ,
"message" : "" ,
"project" : "mozilla-central" ,
"pushlog_id" : "143" ,
"pushdate" : 1503691511,
"owner" : "nobody@mozilla.com" ,
"repository_type" : "hg" ,
"tasks_for" : "hg-push" ,
"level" : "3" ,
}
def test_write_artifact_json():
data = [{"some" : "data" }]
tmpdir = tempfile.mkdtemp()
try :
decision.ARTIFACTS_DIR = os.path.join(tmpdir, "artifacts" )
decision.write_artifact("artifact.json" , data)
with open(os.path.join(decision.ARTIFACTS_DIR, "artifact.json" )) as f:
assert json.load(f) == data
finally :
if os.path.exists(tmpdir):
shutil.rmtree(tmpdir)
decision.ARTIFACTS_DIR = "artifacts"
def test_write_artifact_yml():
data = [{"some" : "data" }]
tmpdir = tempfile.mkdtemp()
try :
decision.ARTIFACTS_DIR = os.path.join(tmpdir, "artifacts" )
decision.write_artifact("artifact.yml" , data)
assert load_yaml(decision.ARTIFACTS_DIR, "artifact.yml" ) == data
finally :
if os.path.exists(tmpdir):
shutil.rmtree(tmpdir)
decision.ARTIFACTS_DIR = "artifacts"
@patch("gecko_taskgraph.decision.get_hg_revision_branch" )
@patch("gecko_taskgraph.decision.get_hg_commit_message" )
@patch("gecko_taskgraph.decision._determine_more_accurate_base_rev" )
@patch("gecko_taskgraph.decision.get_changed_files" )
@pytest.mark.parametrize(
"extra_options,commit_msg,ttc,expected" ,
(
pytest.param(
{},
None ,
None ,
{
"pushlog_id" : "143" ,
"build_date" : 1503691511,
"files_changed" : ["bar/baz.md" , "foo.txt" ],
"hg_branch" : "default" ,
"moz_build_date" : "20170825200511" ,
"try_mode" : None ,
"try_options" : None ,
"try_task_config" : {},
},
id="simple_options" ,
),
pytest.param(
{"owner" : "ffxbld" },
None ,
None ,
{
"owner" : "ffxbld@noreply.mozilla.org" ,
},
id="no_email_owner" ,
),
pytest.param(
{"project" : "try" },
"try: -b do -t all --artifact" ,
None ,
{
"try_mode" : "try_option_syntax" ,
"try_options" : {
"build_types" : "do" ,
"include_nightly" : False ,
"interactive" : False ,
"jobs" : None ,
"no_retry" : False ,
"notifications" : None ,
"platforms" : "all" ,
"raptor" : "none" ,
"raptor_trigger_tests" : 1,
"tag" : None ,
"talos" : "all" ,
"talos_trigger_tests" : 1,
"taskcluster_worker" : False ,
"trigger_tests" : 1,
"unittests" : "all" ,
},
"try_task_config" : {
"gecko-profile" : False ,
"use-artifact-builds" : True ,
"env" : {},
},
},
id="try_options" ,
),
pytest.param(
{
"project" : "try" ,
},
"Fuzzy query=foo" ,
{"tasks" : ["a" , "b" ]},
{
"try_mode" : "try_task_config" ,
"try_options" : None ,
"try_task_config" : {"tasks" : ["a" , "b" ]},
},
id="try_task_config" ,
),
),
)
def test_get_decision_parameters(
mock_get_changed_files,
mock_determine_more_accurate_base_rev,
mock_get_hg_commit_message,
mock_get_hg_revision_branch,
options,
extra_options,
commit_msg,
ttc,
expected,
):
mock_get_hg_revision_branch.return_value = "default"
mock_get_hg_commit_message.return_value = commit_msg or "commit message"
mock_determine_more_accurate_base_rev.return_value = "baserev"
mock_get_changed_files.return_value = ["foo.txt" , "bar/baz.md" ]
options.update(extra_options)
contents = None
if ttc:
contents = json.dumps(ttc)
with MockedOpen({TTC_FILE: contents}):
params = decision.get_decision_parameters(FAKE_GRAPH_CONFIG, options)
for key in expected:
assert params[key] == expected[key], f"key {key} does not match!"
@pytest.mark.parametrize(
"msg, expected" ,
(
pytest.param("" , "" , id="empty" ),
pytest.param("abc | def" , "" , id="no_try_syntax" ),
pytest.param("try: -f -o -o" , "try: -f -o -o" , id="initial_try_syntax" ),
pytest.param(
"some stuff\ntry: -f -o -o\nabc\ndef" ,
"try: -f -o -o" ,
id="embedded_try_syntax_multiline" ,
),
),
)
def test_try_syntax_from_message(msg, expected):
assert decision.try_syntax_from_message(msg) == expected
if __name__ == "__main__" :
main()
quality 97%
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland