# 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()
Messung V0.5 C=89 H=96 G=92
¤ Dauer der Verarbeitung: 0.2 Sekunden
¤
*© Formatika GbR, Deutschland