2019-05-14 12:30:56 +03:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# 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/.
|
|
|
|
|
2020-11-19 01:23:26 +03:00
|
|
|
import json
|
2019-05-14 12:30:56 +03:00
|
|
|
import os
|
2020-11-19 01:23:26 +03:00
|
|
|
import pickle
|
2019-05-14 12:30:56 +03:00
|
|
|
import shutil
|
2019-06-04 13:49:42 +03:00
|
|
|
import time
|
2019-06-01 14:09:50 +03:00
|
|
|
from datetime import datetime, timezone
|
2019-05-14 12:30:56 +03:00
|
|
|
|
|
|
|
import hglib
|
|
|
|
import pytest
|
|
|
|
import responses
|
2020-11-19 01:23:26 +03:00
|
|
|
import zstandard
|
2019-06-01 14:09:50 +03:00
|
|
|
from dateutil.relativedelta import relativedelta
|
2019-05-14 12:30:56 +03:00
|
|
|
|
2021-01-06 15:44:14 +03:00
|
|
|
from bugbug import commit_features, repository, rust_code_analysis_server
|
2019-05-14 12:30:56 +03:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def fake_hg_repo(tmpdir):
|
|
|
|
tmp_path = tmpdir.strpath
|
|
|
|
dest = os.path.join(tmp_path, "repos")
|
|
|
|
local = os.path.join(dest, "local")
|
|
|
|
remote = os.path.join(dest, "remote")
|
|
|
|
for d in [local, remote]:
|
|
|
|
os.makedirs(d)
|
|
|
|
hglib.init(d)
|
|
|
|
|
|
|
|
os.environ["USER"] = "app"
|
|
|
|
hg = hglib.open(local)
|
|
|
|
|
|
|
|
responses.add_passthru("http://localhost:8000")
|
|
|
|
|
|
|
|
yield hg, local, remote
|
|
|
|
|
|
|
|
hg.close()
|
|
|
|
|
|
|
|
|
|
|
|
def copy_pushlog_database(remote, local):
|
|
|
|
shutil.copyfile(
|
|
|
|
os.path.join(remote, ".hg/pushlog2.db"), os.path.join(local, ".hg/pushlog2.db")
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def add_file(hg, repo_dir, name, contents):
|
|
|
|
path = os.path.join(repo_dir, name)
|
|
|
|
|
|
|
|
with open(path, "w") as f:
|
|
|
|
f.write(contents)
|
|
|
|
|
|
|
|
hg.add(files=[bytes(path, "ascii")])
|
|
|
|
|
|
|
|
|
2020-03-19 23:34:43 +03:00
|
|
|
def remove_file(hg, repo_dir, name):
|
|
|
|
path = os.path.join(repo_dir, name)
|
|
|
|
hg.remove(files=[bytes(path, "ascii")])
|
|
|
|
|
|
|
|
|
|
|
|
def commit(
|
|
|
|
hg,
|
|
|
|
commit_message=None,
|
|
|
|
date=datetime(2019, 4, 16, tzinfo=timezone.utc),
|
|
|
|
amend=False,
|
|
|
|
):
|
2019-06-01 14:09:50 +03:00
|
|
|
commit_message = (
|
|
|
|
commit_message
|
|
|
|
if commit_message is not None
|
|
|
|
else "Commit {}".format(
|
|
|
|
" ".join(
|
|
|
|
[elem.decode("ascii") for status in hg.status() for elem in status]
|
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
2019-05-14 12:30:56 +03:00
|
|
|
|
2019-06-01 14:09:50 +03:00
|
|
|
i, revision = hg.commit(
|
2020-03-19 23:34:43 +03:00
|
|
|
message=commit_message,
|
|
|
|
user="Moz Illa <milla@mozilla.org>",
|
|
|
|
date=date,
|
|
|
|
amend=amend,
|
2019-06-01 14:09:50 +03:00
|
|
|
)
|
2019-05-14 12:30:56 +03:00
|
|
|
|
|
|
|
return str(revision, "ascii")
|
|
|
|
|
|
|
|
|
2020-03-21 15:35:24 +03:00
|
|
|
def test_clone(fake_hg_repo):
|
|
|
|
hg, local, remote = fake_hg_repo
|
|
|
|
|
|
|
|
add_file(hg, local, "file1", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
commit(hg)
|
|
|
|
hg.push(dest=bytes(remote, "ascii"))
|
|
|
|
|
|
|
|
tmp_repo_dir = "ciao"
|
|
|
|
|
|
|
|
repository.clone(tmp_repo_dir, url=remote)
|
|
|
|
|
2020-04-22 14:29:02 +03:00
|
|
|
# Assert that we don't have the file from the remote repository, since we cloned
|
|
|
|
# without updating the working dir.
|
|
|
|
assert not os.path.exists(os.path.join(tmp_repo_dir, "file1"))
|
|
|
|
|
2020-03-21 15:35:24 +03:00
|
|
|
# Assert we have the commit from the remote repository.
|
|
|
|
remote_revs = repository.get_revs(hg)
|
|
|
|
with hglib.open(tmp_repo_dir) as tmp_hg:
|
|
|
|
assert repository.get_revs(tmp_hg) == remote_revs
|
|
|
|
|
|
|
|
# Commit in the temporary repository.
|
|
|
|
with hglib.open(tmp_repo_dir) as tmp_hg:
|
|
|
|
add_file(tmp_hg, tmp_repo_dir, "file1", "1\n2\n3\n")
|
|
|
|
commit(tmp_hg)
|
|
|
|
|
|
|
|
# Commit in the remote repository.
|
|
|
|
add_file(hg, local, "file1", "1\n2\n")
|
|
|
|
commit(hg)
|
|
|
|
hg.push(dest=bytes(remote, "ascii"))
|
|
|
|
|
|
|
|
# Repository already exists, it will just be cleaned and pulled.
|
|
|
|
repository.clone(tmp_repo_dir, url=remote)
|
|
|
|
# Assert we only have the commits from the remote repository.
|
|
|
|
remote_revs = repository.get_revs(hg)
|
|
|
|
with hglib.open(tmp_repo_dir) as tmp_hg:
|
|
|
|
assert repository.get_revs(tmp_hg) == remote_revs
|
|
|
|
|
2020-04-22 14:29:02 +03:00
|
|
|
repository.clone(f"{tmp_repo_dir}2", url=remote, update=True)
|
|
|
|
# Assert that we do have the file from the remote repository, since we cloned
|
|
|
|
# and updated the working dir.
|
2020-05-05 17:46:19 +03:00
|
|
|
assert os.path.exists(os.path.join(f"{tmp_repo_dir}2", "file1"))
|
2020-04-22 14:29:02 +03:00
|
|
|
|
2020-03-21 15:35:24 +03:00
|
|
|
|
2019-05-14 12:30:56 +03:00
|
|
|
def test_get_revs(fake_hg_repo):
|
|
|
|
hg, local, remote = fake_hg_repo
|
|
|
|
|
|
|
|
add_file(hg, local, "file1", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
revision1 = commit(hg)
|
|
|
|
|
2019-05-24 16:33:57 +03:00
|
|
|
revs = repository.get_revs(hg)
|
2019-05-14 12:30:56 +03:00
|
|
|
|
|
|
|
assert len(revs) == 1, "There should be one revision now"
|
|
|
|
assert revs[0].decode("ascii") == revision1
|
|
|
|
|
|
|
|
add_file(hg, local, "file2", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
revision2 = commit(hg)
|
|
|
|
|
2019-05-24 16:33:57 +03:00
|
|
|
revs = repository.get_revs(hg)
|
2019-05-14 12:30:56 +03:00
|
|
|
|
|
|
|
assert len(revs) == 2, "There should be two revisions now"
|
|
|
|
assert revs[0].decode("ascii") == revision1
|
|
|
|
assert revs[1].decode("ascii") == revision2
|
|
|
|
|
2019-06-03 17:02:01 +03:00
|
|
|
add_file(hg, local, "file3", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
revision3 = commit(hg)
|
|
|
|
|
|
|
|
revs = repository.get_revs(hg)
|
|
|
|
|
|
|
|
assert len(revs) == 3, "There should be three revisions now"
|
|
|
|
assert revs[0].decode("ascii") == revision1
|
|
|
|
assert revs[1].decode("ascii") == revision2
|
|
|
|
assert revs[2].decode("ascii") == revision3
|
|
|
|
|
|
|
|
revs = repository.get_revs(hg, revision2)
|
|
|
|
|
|
|
|
assert len(revs) == 2, "There should be two revisions after the first"
|
|
|
|
assert revs[0].decode("ascii") == revision2
|
|
|
|
assert revs[1].decode("ascii") == revision3
|
|
|
|
|
2019-07-27 02:13:01 +03:00
|
|
|
add_file(hg, local, "file4", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
commit(hg)
|
|
|
|
|
|
|
|
revs = repository.get_revs(hg, revision2, revision3)
|
|
|
|
|
|
|
|
assert (
|
|
|
|
len(revs) == 2
|
|
|
|
), "There should be two revision after the first and up to the third"
|
|
|
|
assert revs[0].decode("ascii") == revision2
|
|
|
|
assert revs[1].decode("ascii") == revision3
|
|
|
|
|
2019-05-14 12:30:56 +03:00
|
|
|
|
2019-08-01 18:06:50 +03:00
|
|
|
def test_hg_modified_files(fake_hg_repo):
|
|
|
|
hg, local, remote = fake_hg_repo
|
|
|
|
|
|
|
|
add_file(hg, local, "f1", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
revision1 = commit(hg, date=datetime(1991, 4, 16, tzinfo=timezone.utc))
|
|
|
|
|
|
|
|
add_file(hg, local, "f2", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
revision2 = commit(hg, "Bug 123 - Prova. r=moz,rev2")
|
|
|
|
|
|
|
|
hg.copy(
|
|
|
|
bytes(os.path.join(local, "f2"), "ascii"),
|
|
|
|
bytes(os.path.join(local, "f2copy"), "ascii"),
|
|
|
|
)
|
|
|
|
revision3 = commit(hg, "Copy")
|
|
|
|
|
|
|
|
hg.move(
|
|
|
|
bytes(os.path.join(local, "f2copy"), "ascii"),
|
|
|
|
bytes(os.path.join(local, "f2copymove"), "ascii"),
|
|
|
|
)
|
|
|
|
revision4 = commit(hg, "Move")
|
|
|
|
|
2020-03-19 23:34:43 +03:00
|
|
|
add_file(hg, local, "f3", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
commit(hg, "tmp")
|
|
|
|
remove_file(hg, local, "f3")
|
|
|
|
revision5 = commit(hg, "Empty", amend=True)
|
|
|
|
|
2019-08-01 18:06:50 +03:00
|
|
|
hg.push(dest=bytes(remote, "ascii"))
|
|
|
|
revs = repository.get_revs(hg, revision1)
|
|
|
|
commits = repository.hg_log(hg, revs)
|
|
|
|
|
2019-12-08 15:39:39 +03:00
|
|
|
repository.path_to_component = {}
|
|
|
|
|
2019-08-01 18:06:50 +03:00
|
|
|
for c in commits:
|
|
|
|
repository.hg_modified_files(hg, c)
|
|
|
|
|
|
|
|
assert commits[0].node == revision1
|
|
|
|
assert commits[0].files == ["f1"]
|
|
|
|
assert commits[0].file_copies == {}
|
|
|
|
|
|
|
|
assert commits[1].node == revision2
|
|
|
|
assert commits[1].files == ["f2"]
|
|
|
|
assert commits[1].file_copies == {}
|
|
|
|
|
|
|
|
assert commits[2].node == revision3
|
|
|
|
assert commits[2].files == ["f2copy"]
|
|
|
|
assert commits[2].file_copies == {"f2": "f2copy"}
|
|
|
|
|
|
|
|
assert commits[3].node == revision4
|
|
|
|
assert commits[3].files == ["f2copy", "f2copymove"]
|
|
|
|
assert commits[3].file_copies == {"f2copy": "f2copymove"}
|
|
|
|
|
2020-03-19 23:34:43 +03:00
|
|
|
assert commits[4].node == revision5
|
|
|
|
assert commits[4].files == []
|
|
|
|
assert commits[4].file_copies == {}
|
|
|
|
|
2019-08-01 18:06:50 +03:00
|
|
|
|
2019-06-01 14:09:50 +03:00
|
|
|
def test_hg_log(fake_hg_repo):
|
|
|
|
hg, local, remote = fake_hg_repo
|
|
|
|
|
|
|
|
add_file(hg, local, "file1", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
revision1 = commit(hg, date=datetime(1991, 4, 16, tzinfo=timezone.utc))
|
|
|
|
|
|
|
|
first_push_date = datetime.utcnow()
|
|
|
|
hg.push(dest=bytes(remote, "ascii"))
|
|
|
|
|
|
|
|
add_file(hg, local, "file2", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
revision2 = commit(hg, "Bug 123 - Prova. r=moz,rev2")
|
|
|
|
|
|
|
|
hg.copy(
|
|
|
|
bytes(os.path.join(local, "file2"), "ascii"),
|
|
|
|
bytes(os.path.join(local, "file2copy"), "ascii"),
|
|
|
|
)
|
|
|
|
revision3 = commit(hg)
|
|
|
|
|
|
|
|
hg.move(
|
|
|
|
bytes(os.path.join(local, "file2copy"), "ascii"),
|
|
|
|
bytes(os.path.join(local, "file2copymove"), "ascii"),
|
|
|
|
)
|
|
|
|
revision4 = commit(hg)
|
|
|
|
|
|
|
|
hg.backout(
|
|
|
|
rev=revision4,
|
|
|
|
message=f"Backout {revision4[:12]}",
|
|
|
|
user="sheriff",
|
|
|
|
date=datetime(2019, 4, 16, tzinfo=timezone.utc),
|
|
|
|
)
|
|
|
|
revision5 = hg.log(limit=1)[0][1].decode("ascii")
|
|
|
|
|
2019-07-02 12:23:45 +03:00
|
|
|
# Wait one second, to have a different pushdate.
|
|
|
|
time.sleep(1)
|
|
|
|
|
2019-06-01 14:09:50 +03:00
|
|
|
second_push_date = datetime.utcnow()
|
|
|
|
hg.push(dest=bytes(remote, "ascii"))
|
|
|
|
|
2019-07-02 12:23:45 +03:00
|
|
|
add_file(hg, local, "file3", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
revision6 = commit(hg)
|
|
|
|
|
2019-06-01 14:09:50 +03:00
|
|
|
copy_pushlog_database(remote, local)
|
|
|
|
|
|
|
|
revs = repository.get_revs(hg)
|
|
|
|
|
2019-07-02 12:23:45 +03:00
|
|
|
# Wait one second, to have a different pushdate.
|
|
|
|
time.sleep(1)
|
|
|
|
|
|
|
|
hg_log_date = datetime.utcnow()
|
|
|
|
|
2019-06-01 14:09:50 +03:00
|
|
|
commits = repository.hg_log(hg, revs)
|
2019-07-02 12:23:45 +03:00
|
|
|
assert len(commits) == 6, "hg log should return six commits"
|
2019-06-01 14:09:50 +03:00
|
|
|
|
|
|
|
assert commits[0].node == revision1
|
|
|
|
assert commits[0].author == "Moz Illa <milla@mozilla.org>"
|
|
|
|
assert commits[0].desc == "Commit A file1"
|
|
|
|
assert (
|
|
|
|
first_push_date - relativedelta(seconds=1)
|
|
|
|
<= commits[0].pushdate
|
|
|
|
<= first_push_date + relativedelta(seconds=1)
|
|
|
|
)
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[0].bug_id is None
|
2019-06-01 14:09:50 +03:00
|
|
|
assert commits[0].backedoutby == ""
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[0].author_email == "milla@mozilla.org"
|
2019-11-22 01:17:15 +03:00
|
|
|
assert commits[0].reviewers == []
|
2019-06-01 14:09:50 +03:00
|
|
|
|
|
|
|
assert commits[1].node == revision2
|
|
|
|
assert commits[1].author == "Moz Illa <milla@mozilla.org>"
|
|
|
|
assert commits[1].desc == "Bug 123 - Prova. r=moz,rev2"
|
|
|
|
assert (
|
|
|
|
second_push_date - relativedelta(seconds=1)
|
|
|
|
<= commits[1].pushdate
|
|
|
|
<= second_push_date + relativedelta(seconds=1)
|
|
|
|
)
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[1].bug_id == 123
|
2019-06-01 14:09:50 +03:00
|
|
|
assert commits[1].backedoutby == ""
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[1].author_email == "milla@mozilla.org"
|
2019-06-01 14:09:50 +03:00
|
|
|
assert set(commits[1].reviewers) == {"moz", "rev2"}
|
|
|
|
|
|
|
|
assert commits[2].node == revision3
|
|
|
|
assert commits[2].author == "Moz Illa <milla@mozilla.org>"
|
|
|
|
assert commits[2].desc == "Commit A file2copy"
|
|
|
|
assert (
|
|
|
|
second_push_date - relativedelta(seconds=1)
|
|
|
|
<= commits[2].pushdate
|
|
|
|
<= second_push_date + relativedelta(seconds=1)
|
|
|
|
)
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[2].bug_id is None
|
2019-06-01 14:09:50 +03:00
|
|
|
assert commits[2].backedoutby == ""
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[2].author_email == "milla@mozilla.org"
|
2019-11-22 01:17:15 +03:00
|
|
|
assert commits[2].reviewers == []
|
2019-06-01 14:09:50 +03:00
|
|
|
|
|
|
|
assert commits[3].node == revision4
|
|
|
|
assert commits[3].author == "Moz Illa <milla@mozilla.org>"
|
|
|
|
assert commits[3].desc == "Commit A file2copymove R file2copy"
|
|
|
|
assert (
|
|
|
|
second_push_date - relativedelta(seconds=1)
|
|
|
|
<= commits[3].pushdate
|
|
|
|
<= second_push_date + relativedelta(seconds=1)
|
|
|
|
)
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[3].bug_id is None
|
2019-06-01 14:09:50 +03:00
|
|
|
assert commits[3].backedoutby == revision5
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[3].author_email == "milla@mozilla.org"
|
2019-11-22 01:17:15 +03:00
|
|
|
assert commits[3].reviewers == []
|
2019-06-01 14:09:50 +03:00
|
|
|
|
|
|
|
assert commits[4].node == revision5
|
|
|
|
assert commits[4].author == "sheriff"
|
|
|
|
assert commits[4].desc == f"Backout {revision4[:12]}"
|
|
|
|
assert (
|
|
|
|
second_push_date - relativedelta(seconds=1)
|
|
|
|
<= commits[4].pushdate
|
|
|
|
<= second_push_date + relativedelta(seconds=1)
|
|
|
|
)
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[4].bug_id is None
|
2019-06-01 14:09:50 +03:00
|
|
|
assert commits[4].backedoutby == ""
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[4].author_email == "sheriff"
|
2019-11-22 01:17:15 +03:00
|
|
|
assert commits[4].reviewers == []
|
2019-06-01 14:09:50 +03:00
|
|
|
|
2019-07-02 12:23:45 +03:00
|
|
|
assert commits[5].node == revision6
|
|
|
|
assert commits[5].author == "Moz Illa <milla@mozilla.org>"
|
|
|
|
assert commits[5].desc == "Commit A file3"
|
|
|
|
assert (
|
|
|
|
hg_log_date - relativedelta(seconds=1)
|
|
|
|
<= commits[5].pushdate
|
|
|
|
<= hg_log_date + relativedelta(seconds=1)
|
|
|
|
)
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[5].bug_id is None
|
2019-07-02 12:23:45 +03:00
|
|
|
assert commits[5].backedoutby == ""
|
2019-08-01 18:06:50 +03:00
|
|
|
assert commits[5].author_email == "milla@mozilla.org"
|
2019-11-22 01:17:15 +03:00
|
|
|
assert commits[5].reviewers == []
|
2019-07-02 12:23:45 +03:00
|
|
|
|
2020-06-02 00:57:57 +03:00
|
|
|
commits = repository.hg_log(hg, revs[1] + b":" + revs[3])
|
2019-06-01 14:09:50 +03:00
|
|
|
assert len(commits) == 3, "hg log should return three commits"
|
|
|
|
assert commits[0].node == revision2
|
|
|
|
assert commits[1].node == revision3
|
|
|
|
assert commits[2].node == revision4
|
|
|
|
|
2020-06-02 00:57:57 +03:00
|
|
|
commits = repository.hg_log(hg, [revs[1], revs[2], revs[3]])
|
|
|
|
assert len(commits) == 3, "hg log should return three commits"
|
|
|
|
assert commits[0].node == revision2
|
|
|
|
assert commits[1].node == revision3
|
|
|
|
assert commits[2].node == revision4
|
|
|
|
|
|
|
|
commits = repository.hg_log(hg, [revs[1], revs[3]])
|
|
|
|
assert len(commits) == 2, "hg log should return two commits"
|
|
|
|
assert commits[0].node == revision2
|
|
|
|
assert commits[1].node == revision4
|
|
|
|
|
2020-12-09 04:04:32 +03:00
|
|
|
add_file(hg, local, "file4", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
revision7 = commit(hg, "Bug 123456 - Prova. r=me")
|
|
|
|
commits = repository.hg_log(hg, [revision7])
|
|
|
|
assert len(commits) == 1, "hg log should return one commit"
|
|
|
|
assert commits[0].node == revision7
|
|
|
|
assert commits[0].reviewers == []
|
|
|
|
|
2019-06-01 14:09:50 +03:00
|
|
|
|
2020-11-19 01:23:26 +03:00
|
|
|
def test_download_coverage_mapping() -> None:
|
|
|
|
cctx = zstandard.ZstdCompressor()
|
|
|
|
|
|
|
|
responses.add(
|
|
|
|
responses.HEAD,
|
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/project.relman.code-coverage.production.cron.latest/artifacts/public/commit_coverage.json.zst",
|
|
|
|
status=200,
|
|
|
|
headers={"ETag": "100"},
|
|
|
|
)
|
|
|
|
|
|
|
|
responses.add(
|
|
|
|
responses.GET,
|
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/project.relman.code-coverage.production.cron.latest/artifacts/public/commit_coverage.json.zst",
|
|
|
|
status=200,
|
|
|
|
body=cctx.compress(json.dumps({}).encode("ascii")),
|
|
|
|
)
|
|
|
|
|
|
|
|
repository.download_coverage_mapping()
|
|
|
|
|
|
|
|
responses.reset()
|
|
|
|
responses.add(
|
|
|
|
responses.HEAD,
|
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/project.relman.code-coverage.production.cron.latest/artifacts/public/commit_coverage.json.zst",
|
|
|
|
status=200,
|
|
|
|
headers={"ETag": "101"},
|
|
|
|
)
|
|
|
|
|
|
|
|
responses.add(
|
|
|
|
responses.GET,
|
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/project.relman.code-coverage.production.cron.latest/artifacts/public/commit_coverage.json.zst",
|
|
|
|
status=200,
|
|
|
|
body=cctx.compress(
|
|
|
|
json.dumps(
|
|
|
|
{
|
|
|
|
"revision1": {
|
|
|
|
"added": 7,
|
|
|
|
"covered": 3,
|
|
|
|
"unknown": 0,
|
|
|
|
},
|
|
|
|
"revision2": None,
|
|
|
|
}
|
|
|
|
).encode("ascii")
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
repository.download_coverage_mapping()
|
|
|
|
commit_to_coverage = repository.get_coverage_mapping()
|
|
|
|
assert pickle.loads(commit_to_coverage[b"revision1"]) == {
|
|
|
|
"added": 7,
|
|
|
|
"covered": 3,
|
|
|
|
"unknown": 0,
|
|
|
|
}
|
|
|
|
assert pickle.loads(commit_to_coverage[b"revision2"]) is None
|
|
|
|
|
|
|
|
responses.reset()
|
|
|
|
commit_to_coverage = repository.get_coverage_mapping()
|
|
|
|
assert pickle.loads(commit_to_coverage[b"revision1"]) == {
|
|
|
|
"added": 7,
|
|
|
|
"covered": 3,
|
|
|
|
"unknown": 0,
|
|
|
|
}
|
|
|
|
assert pickle.loads(commit_to_coverage[b"revision2"]) is None
|
|
|
|
repository.close_coverage_mapping()
|
|
|
|
|
|
|
|
responses.reset()
|
|
|
|
responses.add(
|
|
|
|
responses.HEAD,
|
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/project.relman.code-coverage.production.cron.latest/artifacts/public/commit_coverage.json.zst",
|
|
|
|
status=200,
|
|
|
|
headers={"ETag": "101"},
|
|
|
|
)
|
|
|
|
|
|
|
|
repository.download_coverage_mapping()
|
|
|
|
repository.get_coverage_mapping()
|
|
|
|
commit_to_coverage = repository.get_coverage_mapping()
|
|
|
|
assert pickle.loads(commit_to_coverage[b"revision1"]) == {
|
|
|
|
"added": 7,
|
|
|
|
"covered": 3,
|
|
|
|
"unknown": 0,
|
|
|
|
}
|
|
|
|
assert pickle.loads(commit_to_coverage[b"revision2"]) is None
|
|
|
|
repository.close_coverage_mapping()
|
|
|
|
|
|
|
|
|
2019-06-25 15:23:09 +03:00
|
|
|
def test_download_component_mapping():
|
|
|
|
responses.add(
|
|
|
|
responses.HEAD,
|
2019-11-20 03:16:01 +03:00
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.v2.mozilla-central.latest.source.source-bugzilla-info/artifacts/public/components.json",
|
2019-06-25 15:23:09 +03:00
|
|
|
status=200,
|
|
|
|
headers={"ETag": "100"},
|
|
|
|
)
|
|
|
|
|
|
|
|
responses.add(
|
|
|
|
responses.GET,
|
2019-11-20 03:16:01 +03:00
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.v2.mozilla-central.latest.source.source-bugzilla-info/artifacts/public/components.json",
|
2019-06-25 15:23:09 +03:00
|
|
|
status=200,
|
|
|
|
json={},
|
|
|
|
)
|
|
|
|
|
2020-03-19 19:02:50 +03:00
|
|
|
repository.download_component_mapping()
|
2019-06-25 15:23:09 +03:00
|
|
|
|
|
|
|
responses.reset()
|
|
|
|
responses.add(
|
|
|
|
responses.HEAD,
|
2019-11-20 03:16:01 +03:00
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.v2.mozilla-central.latest.source.source-bugzilla-info/artifacts/public/components.json",
|
2019-06-25 15:23:09 +03:00
|
|
|
status=200,
|
|
|
|
headers={"ETag": "101"},
|
|
|
|
)
|
|
|
|
|
|
|
|
responses.add(
|
|
|
|
responses.GET,
|
2019-11-20 03:16:01 +03:00
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.v2.mozilla-central.latest.source.source-bugzilla-info/artifacts/public/components.json",
|
2019-06-25 15:23:09 +03:00
|
|
|
status=200,
|
|
|
|
json={
|
|
|
|
"AUTHORS": ["mozilla.org", "Licensing"],
|
|
|
|
"Cargo.lock": ["Firefox Build System", "General"],
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
repository.download_component_mapping()
|
2020-03-19 19:02:50 +03:00
|
|
|
repository.get_component_mapping()
|
2020-03-19 01:39:28 +03:00
|
|
|
assert repository.path_to_component[b"AUTHORS"] == b"mozilla.org::Licensing"
|
|
|
|
assert (
|
|
|
|
repository.path_to_component[b"Cargo.lock"] == b"Firefox Build System::General"
|
|
|
|
)
|
2019-06-25 15:23:09 +03:00
|
|
|
|
2020-03-13 21:55:00 +03:00
|
|
|
responses.reset()
|
2020-03-19 19:02:50 +03:00
|
|
|
repository.get_component_mapping()
|
2020-03-19 01:39:28 +03:00
|
|
|
assert repository.path_to_component[b"AUTHORS"] == b"mozilla.org::Licensing"
|
|
|
|
assert (
|
|
|
|
repository.path_to_component[b"Cargo.lock"] == b"Firefox Build System::General"
|
|
|
|
)
|
|
|
|
repository.close_component_mapping()
|
2020-03-13 21:55:00 +03:00
|
|
|
|
2019-06-25 15:23:09 +03:00
|
|
|
responses.reset()
|
|
|
|
responses.add(
|
|
|
|
responses.HEAD,
|
2019-11-20 03:16:01 +03:00
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.v2.mozilla-central.latest.source.source-bugzilla-info/artifacts/public/components.json",
|
2019-06-25 15:23:09 +03:00
|
|
|
status=200,
|
|
|
|
headers={"ETag": "101"},
|
|
|
|
)
|
|
|
|
|
2020-03-19 19:02:50 +03:00
|
|
|
repository.download_component_mapping()
|
|
|
|
repository.get_component_mapping()
|
2020-03-19 01:39:28 +03:00
|
|
|
assert repository.path_to_component[b"AUTHORS"] == b"mozilla.org::Licensing"
|
|
|
|
assert (
|
|
|
|
repository.path_to_component[b"Cargo.lock"] == b"Firefox Build System::General"
|
|
|
|
)
|
|
|
|
repository.close_component_mapping()
|
2019-06-25 15:23:09 +03:00
|
|
|
|
|
|
|
|
2020-03-13 19:18:37 +03:00
|
|
|
@pytest.mark.parametrize("use_single_process", [True, False])
|
|
|
|
def test_download_commits(fake_hg_repo, use_single_process):
|
2019-06-03 16:52:17 +03:00
|
|
|
hg, local, remote = fake_hg_repo
|
|
|
|
|
2019-12-10 15:22:55 +03:00
|
|
|
# Allow using the local code analysis server.
|
2019-12-11 17:46:44 +03:00
|
|
|
responses.add_passthru("http://127.0.0.1")
|
2019-12-10 15:22:55 +03:00
|
|
|
|
2019-06-03 16:52:17 +03:00
|
|
|
responses.add(
|
|
|
|
responses.HEAD,
|
2019-11-20 03:16:01 +03:00
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.v2.mozilla-central.latest.source.source-bugzilla-info/artifacts/public/components.json",
|
2019-06-03 16:52:17 +03:00
|
|
|
status=200,
|
|
|
|
headers={"ETag": "123"},
|
|
|
|
)
|
|
|
|
|
|
|
|
responses.add(
|
|
|
|
responses.GET,
|
2019-11-20 03:16:01 +03:00
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.v2.mozilla-central.latest.source.source-bugzilla-info/artifacts/public/components.json",
|
2019-06-03 16:52:17 +03:00
|
|
|
status=200,
|
|
|
|
json={
|
|
|
|
"file1": ["Firefox", "Menus"],
|
|
|
|
"file2": ["Firefox", "General"],
|
|
|
|
"file3": ["Core", "General"],
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
# Remove the mock DB generated by the mock_data fixture.
|
|
|
|
os.remove("data/commits.json")
|
|
|
|
|
2020-04-22 14:27:23 +03:00
|
|
|
add_file(hg, local, ".hg-annotate-ignore-revs", "not_existing_hash\n")
|
2019-06-03 16:52:17 +03:00
|
|
|
|
|
|
|
add_file(hg, local, "file1", "1\n2\n3\n4\n5\n6\n7\n")
|
2020-11-19 01:23:26 +03:00
|
|
|
revision1 = commit(hg, date=datetime(1991, 4, 16, tzinfo=timezone.utc))
|
2019-06-03 16:52:17 +03:00
|
|
|
hg.push(dest=bytes(remote, "ascii"))
|
|
|
|
copy_pushlog_database(remote, local)
|
|
|
|
|
2020-11-19 01:23:26 +03:00
|
|
|
responses.add(
|
|
|
|
responses.HEAD,
|
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/project.relman.code-coverage.production.cron.latest/artifacts/public/commit_coverage.json.zst",
|
|
|
|
status=200,
|
|
|
|
headers={"ETag": "123"},
|
|
|
|
)
|
|
|
|
|
|
|
|
cctx = zstandard.ZstdCompressor()
|
|
|
|
coverage_mapping = {revision1: None}
|
|
|
|
|
|
|
|
def request_callback(request):
|
|
|
|
return 200, {}, cctx.compress(json.dumps(coverage_mapping).encode("ascii"))
|
|
|
|
|
|
|
|
responses.add_callback(
|
|
|
|
responses.GET,
|
|
|
|
"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/project.relman.code-coverage.production.cron.latest/artifacts/public/commit_coverage.json.zst",
|
|
|
|
callback=request_callback,
|
|
|
|
)
|
|
|
|
|
2020-03-21 14:56:49 +03:00
|
|
|
commits = repository.download_commits(
|
|
|
|
local, rev_start=0, use_single_process=use_single_process
|
|
|
|
)
|
2019-06-06 19:55:17 +03:00
|
|
|
assert len(commits) == 0
|
2019-06-03 16:52:17 +03:00
|
|
|
commits = list(repository.get_commits())
|
|
|
|
assert len(commits) == 0
|
|
|
|
|
2019-06-05 02:02:57 +03:00
|
|
|
# Wait one second, to have a different pushdate.
|
|
|
|
time.sleep(1)
|
|
|
|
|
2019-06-03 16:52:17 +03:00
|
|
|
add_file(hg, local, "file2", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
revision2 = commit(hg, "Bug 123 - Prova. r=moz,rev2")
|
|
|
|
hg.push(dest=bytes(remote, "ascii"))
|
|
|
|
copy_pushlog_database(remote, local)
|
|
|
|
|
2020-11-19 01:23:26 +03:00
|
|
|
coverage_mapping = {
|
|
|
|
revision1: None,
|
|
|
|
revision2: {
|
|
|
|
"added": 7,
|
|
|
|
"covered": 3,
|
|
|
|
"unknown": 0,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
os.remove("data/coverage_mapping.json.zst.etag")
|
|
|
|
|
2020-03-21 14:56:49 +03:00
|
|
|
commits = repository.download_commits(
|
|
|
|
local, rev_start=0, use_single_process=use_single_process
|
|
|
|
)
|
2019-06-06 19:55:17 +03:00
|
|
|
assert len(commits) == 1
|
2019-06-03 16:52:17 +03:00
|
|
|
commits = list(repository.get_commits())
|
|
|
|
assert len(commits) == 1
|
|
|
|
assert commits[0]["node"] == revision2
|
2019-06-03 20:29:08 +03:00
|
|
|
assert commits[0]["touched_prev_total_author_sum"] == 0
|
2019-06-04 13:49:42 +03:00
|
|
|
assert commits[0]["seniority_author"] > 0
|
2020-11-19 01:23:26 +03:00
|
|
|
assert commits[0]["cov_added"] == 7
|
|
|
|
assert commits[0]["cov_covered"] == 3
|
|
|
|
assert commits[0]["cov_unknown"] == 0
|
2019-06-04 13:49:42 +03:00
|
|
|
|
|
|
|
# Wait one second, to have a different pushdate.
|
|
|
|
time.sleep(1)
|
2019-06-03 16:52:17 +03:00
|
|
|
|
|
|
|
add_file(hg, local, "file3", "1\n2\n3\n4\n5\n6\n7\n")
|
|
|
|
revision3 = commit(hg, "Bug 456 - Prova. r=moz")
|
|
|
|
hg.push(dest=bytes(remote, "ascii"))
|
|
|
|
copy_pushlog_database(remote, local)
|
|
|
|
|
2020-03-13 19:18:37 +03:00
|
|
|
commits = repository.download_commits(
|
2020-03-21 14:56:49 +03:00
|
|
|
local, rev_start=revision3, use_single_process=use_single_process
|
2020-03-13 19:18:37 +03:00
|
|
|
)
|
2019-06-06 19:55:17 +03:00
|
|
|
assert len(commits) == 1
|
2019-06-03 16:52:17 +03:00
|
|
|
commits = list(repository.get_commits())
|
|
|
|
assert len(commits) == 2
|
|
|
|
assert commits[0]["node"] == revision2
|
2019-06-03 20:29:08 +03:00
|
|
|
assert commits[0]["touched_prev_total_author_sum"] == 0
|
2019-06-04 13:49:42 +03:00
|
|
|
assert commits[0]["seniority_author"] > 0
|
2020-11-19 01:23:26 +03:00
|
|
|
assert commits[0]["cov_added"] == 7
|
|
|
|
assert commits[0]["cov_covered"] == 3
|
|
|
|
assert commits[0]["cov_unknown"] == 0
|
2019-06-03 16:52:17 +03:00
|
|
|
assert commits[1]["node"] == revision3
|
2019-06-03 20:29:08 +03:00
|
|
|
assert commits[1]["touched_prev_total_author_sum"] == 1
|
2019-06-04 13:49:42 +03:00
|
|
|
assert commits[1]["seniority_author"] > commits[0]["seniority_author"]
|
2020-11-19 01:23:26 +03:00
|
|
|
assert commits[1]["cov_added"] is None
|
|
|
|
assert commits[1]["cov_covered"] is None
|
|
|
|
assert commits[1]["cov_unknown"] is None
|
2019-06-03 16:52:17 +03:00
|
|
|
|
2019-06-06 19:55:17 +03:00
|
|
|
os.remove("data/commits.json")
|
2020-03-04 17:41:56 +03:00
|
|
|
shutil.rmtree("data/commit_experiences.lmdb")
|
2020-03-13 19:18:37 +03:00
|
|
|
commits = repository.download_commits(
|
2020-03-21 14:56:49 +03:00
|
|
|
local, rev_start=f"children({revision2})", use_single_process=use_single_process
|
2020-03-13 19:18:37 +03:00
|
|
|
)
|
2019-06-06 19:55:17 +03:00
|
|
|
assert len(commits) == 1
|
|
|
|
assert len(list(repository.get_commits())) == 1
|
|
|
|
|
|
|
|
os.remove("data/commits.json")
|
2020-03-04 17:41:56 +03:00
|
|
|
shutil.rmtree("data/commit_experiences.lmdb")
|
2020-03-21 14:56:49 +03:00
|
|
|
commits = repository.download_commits(
|
|
|
|
local,
|
|
|
|
revs=[revision2.encode("ascii"), revision3.encode("ascii")],
|
|
|
|
use_single_process=use_single_process,
|
|
|
|
)
|
|
|
|
assert len(commits) == 2
|
|
|
|
assert len(list(repository.get_commits())) == 2
|
|
|
|
|
|
|
|
os.remove("data/commits.json")
|
|
|
|
shutil.rmtree("data/commit_experiences.lmdb")
|
|
|
|
commits = repository.download_commits(
|
|
|
|
local, rev_start=0, use_single_process=use_single_process
|
|
|
|
)
|
2019-06-06 19:55:17 +03:00
|
|
|
assert len(list(repository.get_commits())) == 2
|
|
|
|
|
2020-07-14 15:59:56 +03:00
|
|
|
os.remove("data/commits.json")
|
|
|
|
shutil.rmtree("data/commit_experiences.lmdb")
|
|
|
|
commits = repository.download_commits(
|
2020-08-27 17:19:02 +03:00
|
|
|
local,
|
|
|
|
revs=[],
|
|
|
|
use_single_process=use_single_process,
|
2020-07-14 15:59:56 +03:00
|
|
|
)
|
|
|
|
assert len(commits) == 0
|
|
|
|
assert len(list(repository.get_commits())) == 0
|
|
|
|
|
2019-06-03 16:52:17 +03:00
|
|
|
|
2019-05-14 12:30:56 +03:00
|
|
|
def test_get_directories():
|
|
|
|
assert repository.get_directories("") == []
|
|
|
|
assert repository.get_directories("Makefile") == []
|
|
|
|
assert repository.get_directories("dom/aFile.jsm") == ["dom"]
|
|
|
|
assert set(
|
|
|
|
repository.get_directories("tools/code-coverage/CodeCoverageHandler.cpp")
|
|
|
|
) == {"tools", "tools/code-coverage"}
|
|
|
|
|
|
|
|
assert repository.get_directories([""]) == []
|
|
|
|
assert repository.get_directories(["Makefile"]) == []
|
|
|
|
assert repository.get_directories(["dom/aFile.jsm"]) == ["dom"]
|
|
|
|
assert set(
|
|
|
|
repository.get_directories(["tools/code-coverage/CodeCoverageHandler.cpp"])
|
|
|
|
) == {"tools", "tools/code-coverage"}
|
|
|
|
assert set(
|
|
|
|
repository.get_directories(
|
|
|
|
["dom/aFile.jsm", "tools/code-coverage/CodeCoverageHandler.cpp"]
|
|
|
|
)
|
|
|
|
) == {"dom", "tools", "tools/code-coverage"}
|
|
|
|
|
|
|
|
|
2020-04-29 14:40:07 +03:00
|
|
|
@pytest.fixture
|
|
|
|
def ignored_commits_to_test(fake_hg_repo):
|
2020-04-22 14:27:23 +03:00
|
|
|
hg, local, remote = fake_hg_repo
|
2019-05-29 12:24:11 +03:00
|
|
|
|
2020-03-19 01:39:28 +03:00
|
|
|
repository.path_to_component = {}
|
|
|
|
|
2020-04-22 14:27:23 +03:00
|
|
|
add_file(
|
|
|
|
hg,
|
|
|
|
local,
|
|
|
|
".hg-annotate-ignore-revs",
|
|
|
|
"commit1\ncommit2\n8ba995b74e18334ab3707f27e9eb8f4e37ba3d29\n",
|
|
|
|
)
|
|
|
|
commit(hg)
|
2019-05-29 12:24:11 +03:00
|
|
|
|
2020-04-28 22:29:49 +03:00
|
|
|
def create_commit(node, desc, bug_id, backsout, backedoutby):
|
2019-05-29 12:24:11 +03:00
|
|
|
return repository.Commit(
|
|
|
|
node=node,
|
|
|
|
author="author",
|
|
|
|
desc=desc,
|
|
|
|
pushdate=datetime(2019, 1, 1),
|
2019-08-01 18:06:50 +03:00
|
|
|
bug_id=bug_id,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=backsout,
|
2019-05-29 12:24:11 +03:00
|
|
|
backedoutby=backedoutby,
|
|
|
|
author_email="author@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer1", "reviewer2"],
|
2019-08-01 18:06:50 +03:00
|
|
|
).set_files(["dom/file1.cpp"], {})
|
2019-05-29 12:24:11 +03:00
|
|
|
|
|
|
|
commits = [
|
2020-04-28 22:29:49 +03:00
|
|
|
create_commit("commit", "", 123, [], ""),
|
|
|
|
create_commit("commit_backout", "", 123, ["commit_backedout"], ""),
|
|
|
|
create_commit("commit_backedout", "", 123, [], "commit_backout"),
|
|
|
|
create_commit("commit_no_bug", "", None, [], ""),
|
2019-05-29 12:24:11 +03:00
|
|
|
create_commit(
|
|
|
|
"8ba995b74e18334ab3707f27e9eb8f4e37ba3d29",
|
|
|
|
"commit in .hg-annotate-ignore-revs",
|
|
|
|
123,
|
2020-04-28 22:29:49 +03:00
|
|
|
[],
|
2019-05-29 12:24:11 +03:00
|
|
|
"",
|
|
|
|
),
|
|
|
|
create_commit(
|
2020-04-28 22:29:49 +03:00
|
|
|
"commit_with_ignore_in_desc", "prova\nignore-this-changeset\n", 123, [], ""
|
2019-05-29 12:24:11 +03:00
|
|
|
),
|
|
|
|
]
|
|
|
|
|
2020-04-29 14:40:07 +03:00
|
|
|
return hg, local, commits
|
|
|
|
|
|
|
|
|
|
|
|
def test_set_commits_to_ignore(ignored_commits_to_test):
|
|
|
|
hg, local, commits = ignored_commits_to_test
|
|
|
|
|
2020-04-22 14:27:23 +03:00
|
|
|
repository.set_commits_to_ignore(hg, local, commits)
|
2020-04-29 14:40:07 +03:00
|
|
|
|
|
|
|
assert set(commit.node for commit in commits if commit.ignored) == {
|
|
|
|
"8ba995b74e18334ab3707f27e9eb8f4e37ba3d29",
|
|
|
|
"commit_with_ignore_in_desc",
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def test_filter_commits(ignored_commits_to_test):
|
|
|
|
hg, local, commits = ignored_commits_to_test
|
|
|
|
|
|
|
|
repository.set_commits_to_ignore(hg, local, commits)
|
|
|
|
|
|
|
|
commits = [commit.to_dict() for commit in commits]
|
|
|
|
|
|
|
|
assert set(commit["node"] for commit in repository.filter_commits(commits)) == {
|
|
|
|
"commit_backedout",
|
|
|
|
"commit",
|
|
|
|
}
|
|
|
|
|
|
|
|
assert set(
|
|
|
|
commit["node"]
|
|
|
|
for commit in repository.filter_commits(commits, include_no_bug=True)
|
|
|
|
) == {"commit_backedout", "commit", "commit_no_bug"}
|
|
|
|
|
|
|
|
assert set(
|
|
|
|
commit["node"]
|
|
|
|
for commit in repository.filter_commits(commits, include_backouts=True)
|
|
|
|
) == {"commit_backedout", "commit", "commit_backout"}
|
|
|
|
|
|
|
|
assert set(
|
|
|
|
commit["node"]
|
|
|
|
for commit in repository.filter_commits(commits, include_ignored=True)
|
|
|
|
) == {
|
|
|
|
"commit_backedout",
|
|
|
|
"commit",
|
|
|
|
"8ba995b74e18334ab3707f27e9eb8f4e37ba3d29",
|
|
|
|
"commit_with_ignore_in_desc",
|
|
|
|
}
|
|
|
|
|
|
|
|
assert set(
|
|
|
|
commit["node"]
|
|
|
|
for commit in repository.filter_commits(
|
|
|
|
commits, include_no_bug=True, include_ignored=True
|
|
|
|
)
|
|
|
|
) == {
|
|
|
|
"commit_backedout",
|
|
|
|
"commit",
|
2019-05-29 12:24:11 +03:00
|
|
|
"commit_no_bug",
|
|
|
|
"8ba995b74e18334ab3707f27e9eb8f4e37ba3d29",
|
|
|
|
"commit_with_ignore_in_desc",
|
|
|
|
}
|
|
|
|
|
2020-04-29 14:40:07 +03:00
|
|
|
assert set(
|
|
|
|
commit["node"]
|
|
|
|
for commit in repository.filter_commits(
|
|
|
|
commits, include_no_bug=True, include_backouts=True, include_ignored=True
|
|
|
|
)
|
|
|
|
) == {
|
|
|
|
"commit_backedout",
|
|
|
|
"commit",
|
|
|
|
"commit_no_bug",
|
2020-04-28 22:30:42 +03:00
|
|
|
"commit_backout",
|
|
|
|
"8ba995b74e18334ab3707f27e9eb8f4e37ba3d29",
|
|
|
|
"commit_with_ignore_in_desc",
|
|
|
|
}
|
|
|
|
|
2019-05-29 12:24:11 +03:00
|
|
|
|
2020-07-17 16:29:17 +03:00
|
|
|
def test_calculate_experiences() -> None:
|
2019-08-01 18:06:50 +03:00
|
|
|
repository.path_to_component = {
|
2020-03-19 01:39:28 +03:00
|
|
|
b"dom/file1.cpp": memoryview(b"Core::DOM"),
|
|
|
|
b"dom/file1copied.cpp": memoryview(b"Core::DOM"),
|
|
|
|
b"dom/file2.cpp": memoryview(b"Core::Layout"),
|
|
|
|
b"apps/file1.jsm": memoryview(b"Firefox::Boh"),
|
|
|
|
b"apps/file2.jsm": memoryview(b"Firefox::Boh"),
|
2019-08-01 18:06:50 +03:00
|
|
|
}
|
|
|
|
|
2019-05-28 13:59:55 +03:00
|
|
|
commits = {
|
|
|
|
"commit1": repository.Commit(
|
2019-05-14 12:30:56 +03:00
|
|
|
node="commit1",
|
|
|
|
author="author1",
|
|
|
|
desc="commit1",
|
|
|
|
pushdate=datetime(2019, 1, 1),
|
2019-08-01 18:06:50 +03:00
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2019-05-14 12:30:56 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author1@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer1", "reviewer2"],
|
2019-08-01 18:06:50 +03:00
|
|
|
).set_files(["dom/file1.cpp", "apps/file1.jsm"], {}),
|
2019-05-28 13:59:55 +03:00
|
|
|
"commitbackedout": repository.Commit(
|
|
|
|
node="commitbackedout",
|
|
|
|
author="author1",
|
|
|
|
desc="commitbackedout",
|
|
|
|
pushdate=datetime(2019, 1, 1),
|
2019-08-01 18:06:50 +03:00
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2019-05-28 13:59:55 +03:00
|
|
|
backedoutby="commitbackout",
|
|
|
|
author_email="author1@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer1", "reviewer2"],
|
2019-08-01 18:06:50 +03:00
|
|
|
).set_files(["dom/file1.cpp", "apps/file1.jsm"], {}),
|
2019-05-28 13:59:55 +03:00
|
|
|
"commit2": repository.Commit(
|
2019-05-14 12:30:56 +03:00
|
|
|
node="commit2",
|
|
|
|
author="author2",
|
|
|
|
desc="commit2",
|
|
|
|
pushdate=datetime(2019, 1, 1),
|
2019-08-01 18:06:50 +03:00
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2019-05-14 12:30:56 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author2@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer1"],
|
2019-08-01 18:06:50 +03:00
|
|
|
).set_files(["dom/file1.cpp"], {}),
|
2019-05-29 12:24:11 +03:00
|
|
|
"commit2refactoring": repository.Commit(
|
|
|
|
node="commit2refactoring",
|
|
|
|
author="author2",
|
|
|
|
desc="commit2refactoring",
|
|
|
|
pushdate=datetime(2019, 1, 1),
|
2019-08-01 18:06:50 +03:00
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2019-05-29 12:24:11 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author2@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer1"],
|
2019-08-01 18:06:50 +03:00
|
|
|
ignored=True,
|
|
|
|
).set_files(["dom/file1.cpp"], {}),
|
2019-05-28 13:59:55 +03:00
|
|
|
"commit3": repository.Commit(
|
2019-05-14 12:30:56 +03:00
|
|
|
node="commit3",
|
|
|
|
author="author1",
|
|
|
|
desc="commit3",
|
|
|
|
pushdate=datetime(2019, 1, 1),
|
2019-08-01 18:06:50 +03:00
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2019-05-14 12:30:56 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author1@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer2"],
|
2019-08-01 18:06:50 +03:00
|
|
|
).set_files(["dom/file2.cpp", "apps/file1.jsm"], {}),
|
2019-05-28 13:59:55 +03:00
|
|
|
"commit4": repository.Commit(
|
2019-05-14 12:30:56 +03:00
|
|
|
node="commit4",
|
|
|
|
author="author2",
|
|
|
|
desc="commit4",
|
|
|
|
pushdate=datetime(2020, 1, 1),
|
2019-08-01 18:06:50 +03:00
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2019-05-14 12:30:56 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author2@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer1", "reviewer2"],
|
2019-08-01 18:06:50 +03:00
|
|
|
).set_files(["dom/file1.cpp", "apps/file2.jsm"], {}),
|
2019-05-28 13:59:55 +03:00
|
|
|
"commit5": repository.Commit(
|
2019-05-14 12:30:56 +03:00
|
|
|
node="commit5",
|
|
|
|
author="author3",
|
|
|
|
desc="commit5",
|
|
|
|
pushdate=datetime(2020, 1, 2),
|
2019-08-01 18:06:50 +03:00
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2019-05-14 12:30:56 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author3@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer3"],
|
2019-08-01 18:06:50 +03:00
|
|
|
).set_files(["dom/file1.cpp"], {"dom/file1.cpp": "dom/file1copied.cpp"}),
|
2019-05-28 13:59:55 +03:00
|
|
|
"commit6": repository.Commit(
|
2019-05-14 12:30:56 +03:00
|
|
|
node="commit6",
|
|
|
|
author="author3",
|
|
|
|
desc="commit6",
|
|
|
|
pushdate=datetime(2020, 1, 3),
|
2019-08-01 18:06:50 +03:00
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2019-05-14 12:30:56 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author3@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer3"],
|
2019-08-01 18:06:50 +03:00
|
|
|
).set_files(["dom/file1.cpp", "dom/file1copied.cpp"], {}),
|
2019-05-28 13:59:55 +03:00
|
|
|
}
|
2019-05-14 12:30:56 +03:00
|
|
|
|
2020-07-28 16:37:08 +03:00
|
|
|
repository.calculate_experiences(commits.values(), datetime(2019, 1, 1))
|
2019-05-28 13:59:55 +03:00
|
|
|
|
|
|
|
assert commits["commit1"].seniority_author == 0
|
|
|
|
assert commits["commitbackedout"].seniority_author == 0
|
|
|
|
assert commits["commit2"].seniority_author == 0
|
|
|
|
assert commits["commit3"].seniority_author == 0
|
2019-06-04 13:49:42 +03:00
|
|
|
assert commits["commit4"].seniority_author == 86400.0 * 365
|
2019-05-28 13:59:55 +03:00
|
|
|
assert commits["commit5"].seniority_author == 0
|
2019-06-04 13:49:42 +03:00
|
|
|
assert commits["commit6"].seniority_author == 86400.0
|
2019-05-28 13:59:55 +03:00
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_author_sum == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_author_sum == 0
|
|
|
|
assert commits["commit3"].touched_prev_total_author_sum == 1
|
|
|
|
assert commits["commit4"].touched_prev_total_author_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_total_author_sum == 0
|
|
|
|
assert commits["commit6"].touched_prev_total_author_sum == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit3"].touched_prev_90_days_author_sum == 1
|
|
|
|
assert commits["commit4"].touched_prev_90_days_author_sum == 0
|
2020-03-04 16:27:59 +03:00
|
|
|
assert commits["commit5"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit6"].touched_prev_90_days_author_sum == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_sum == 4
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_max == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_min == 2
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_sum == 0
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_max == 0
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_min == 0
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_sum == 1
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_max == 1
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_min == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_sum == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_max == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_min == 0
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_sum == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_max == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_min == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_file_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_file_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_file_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_file_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_file_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_file_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_file_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_file_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_file_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_total_file_sum == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_file_max == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_file_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_total_file_sum == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_file_max == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_file_min == 3
|
|
|
|
assert commits["commit6"].touched_prev_total_file_sum == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_file_max == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_file_min == 3
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_min == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_sum == 2
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_max == 2
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_sum == 3
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_max == 3
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_min == 2
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_sum == 4
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_max == 4
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_min == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_sum == 5
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_max == 5
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_min == 5
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_sum == 2
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_max == 2
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_min == 2
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_component_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_component_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_component_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_component_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_component_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_component_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_component_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_component_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_component_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_total_component_sum == 3
|
|
|
|
assert commits["commit4"].touched_prev_total_component_max == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_component_min == 2
|
|
|
|
assert commits["commit5"].touched_prev_total_component_sum == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_component_max == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_component_min == 3
|
|
|
|
assert commits["commit6"].touched_prev_total_component_sum == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_component_max == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_component_min == 4
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_min == 2
|
|
|
|
|
|
|
|
commits["commit1"].pushdate = datetime(2020, 1, 4)
|
|
|
|
commits["commit1"].node = "commit1copy"
|
|
|
|
commits["commitbackedout"].pushdate = datetime(2020, 1, 4)
|
|
|
|
commits["commitbackedout"].node = "commitbackedoutcopy"
|
|
|
|
commits["commit2"].pushdate = datetime(2020, 1, 4)
|
|
|
|
commits["commit2"].node = "commit2copy"
|
|
|
|
commits["commit2refactoring"].pushdate = datetime(2020, 1, 4)
|
|
|
|
commits["commit2refactoring"].node = "commit2refactoringcopy"
|
|
|
|
commits["commit3"].pushdate = datetime(2020, 1, 4)
|
|
|
|
commits["commit3"].node = "commit3copy"
|
|
|
|
commits["commit4"].pushdate = datetime(2021, 1, 4)
|
|
|
|
commits["commit4"].node = "commit4copy"
|
|
|
|
commits["commit5"].pushdate = datetime(2021, 1, 5)
|
|
|
|
commits["commit5"].node = "commit5copy"
|
|
|
|
commits["commit6"].pushdate = datetime(2021, 1, 6)
|
|
|
|
commits["commit6"].node = "commit6copy"
|
|
|
|
|
2020-07-28 16:37:08 +03:00
|
|
|
repository.calculate_experiences(commits.values(), datetime(2019, 1, 1))
|
2020-03-04 16:27:59 +03:00
|
|
|
|
|
|
|
assert commits["commit1"].seniority_author == 86400.0 * 368
|
|
|
|
assert commits["commitbackedout"].seniority_author == 86400.0 * 368
|
|
|
|
assert commits["commit2"].seniority_author == 86400.0 * 368
|
|
|
|
assert commits["commit3"].seniority_author == 86400.0 * 368
|
|
|
|
assert commits["commit4"].seniority_author == 86400.0 * 734
|
|
|
|
assert commits["commit5"].seniority_author == 86400.0 * 369
|
|
|
|
assert commits["commit6"].seniority_author == 86400.0 * 370
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_author_sum == 2
|
|
|
|
assert commits["commit2"].touched_prev_total_author_sum == 2
|
|
|
|
assert commits["commit3"].touched_prev_total_author_sum == 3
|
|
|
|
assert commits["commit4"].touched_prev_total_author_sum == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_author_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_total_author_sum == 3
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_author_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_author_sum == 1
|
|
|
|
assert commits["commit4"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit6"].touched_prev_90_days_author_sum == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_sum == 6
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_max == 3
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_min == 3
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_sum == 4
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_max == 4
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_min == 4
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_sum == 4
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_max == 4
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_min == 4
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_sum == 10
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_max == 5
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_min == 5
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_sum == 2
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_max == 2
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_min == 2
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_sum == 3
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_max == 3
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_min == 3
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_sum == 2
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_max == 1
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_min == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_sum == 2
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_max == 2
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_min == 2
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_sum == 2
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_max == 2
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_min == 2
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_sum == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_max == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_min == 0
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_sum == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_max == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_min == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_file_sum == 6
|
|
|
|
assert commits["commit1"].touched_prev_total_file_max == 5
|
|
|
|
assert commits["commit1"].touched_prev_total_file_min == 2
|
|
|
|
assert commits["commit2"].touched_prev_total_file_sum == 6
|
|
|
|
assert commits["commit2"].touched_prev_total_file_max == 6
|
|
|
|
assert commits["commit2"].touched_prev_total_file_min == 6
|
|
|
|
assert commits["commit3"].touched_prev_total_file_sum == 3
|
|
|
|
assert commits["commit3"].touched_prev_total_file_max == 3
|
|
|
|
assert commits["commit3"].touched_prev_total_file_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_total_file_sum == 7
|
|
|
|
assert commits["commit4"].touched_prev_total_file_max == 7
|
|
|
|
assert commits["commit4"].touched_prev_total_file_min == 1
|
|
|
|
assert commits["commit5"].touched_prev_total_file_sum == 8
|
|
|
|
assert commits["commit5"].touched_prev_total_file_max == 8
|
|
|
|
assert commits["commit5"].touched_prev_total_file_min == 8
|
|
|
|
assert commits["commit6"].touched_prev_total_file_sum == 9
|
|
|
|
assert commits["commit6"].touched_prev_total_file_max == 9
|
|
|
|
assert commits["commit6"].touched_prev_total_file_min == 8
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_sum == 3
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_max == 3
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_sum == 4
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_max == 4
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_min == 4
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_min == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_sum == 6
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_max == 6
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_min == 3
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_sum == 7
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_max == 7
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_min == 7
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_sum == 8
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_max == 8
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_min == 4
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_sum == 9
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_max == 9
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_min == 5
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_sum == 10
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_max == 10
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_min == 10
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_sum == 11
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_max == 11
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_min == 11
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_sum == 3
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_max == 3
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_min == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_sum == 4
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_max == 4
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_min == 4
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_sum == 5
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_max == 5
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_min == 2
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_min == 2
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_component_sum == 6
|
|
|
|
assert commits["commit1"].touched_prev_total_component_max == 5
|
|
|
|
assert commits["commit1"].touched_prev_total_component_min == 3
|
|
|
|
assert commits["commit2"].touched_prev_total_component_sum == 6
|
|
|
|
assert commits["commit2"].touched_prev_total_component_max == 6
|
|
|
|
assert commits["commit2"].touched_prev_total_component_min == 6
|
|
|
|
assert commits["commit3"].touched_prev_total_component_sum == 4
|
|
|
|
assert commits["commit3"].touched_prev_total_component_max == 4
|
|
|
|
assert commits["commit3"].touched_prev_total_component_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_total_component_sum == 9
|
|
|
|
assert commits["commit4"].touched_prev_total_component_max == 7
|
|
|
|
assert commits["commit4"].touched_prev_total_component_min == 5
|
|
|
|
assert commits["commit5"].touched_prev_total_component_sum == 8
|
|
|
|
assert commits["commit5"].touched_prev_total_component_max == 8
|
|
|
|
assert commits["commit5"].touched_prev_total_component_min == 8
|
|
|
|
assert commits["commit6"].touched_prev_total_component_sum == 9
|
|
|
|
assert commits["commit6"].touched_prev_total_component_max == 9
|
|
|
|
assert commits["commit6"].touched_prev_total_component_min == 9
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_sum == 3
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_max == 3
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_min == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_sum == 4
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_max == 4
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_min == 4
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_sum == 2
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_max == 2
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_min == 2
|
|
|
|
|
2020-03-04 17:41:56 +03:00
|
|
|
with pytest.raises(
|
2020-07-28 16:37:08 +03:00
|
|
|
Exception, match=r"Can't get a day \(368\) from earlier than start day \(644\)"
|
2020-03-04 17:41:56 +03:00
|
|
|
):
|
2020-07-28 16:37:08 +03:00
|
|
|
repository.calculate_experiences(commits.values(), datetime(2019, 1, 1))
|
2020-03-04 17:41:56 +03:00
|
|
|
|
2020-03-04 16:27:59 +03:00
|
|
|
|
2020-07-17 16:29:17 +03:00
|
|
|
def test_calculate_experiences_no_save() -> None:
|
2020-03-04 16:27:59 +03:00
|
|
|
repository.path_to_component = {
|
2020-03-19 01:39:28 +03:00
|
|
|
b"dom/file1.cpp": memoryview(b"Core::DOM"),
|
|
|
|
b"dom/file1copied.cpp": memoryview(b"Core::DOM"),
|
|
|
|
b"dom/file2.cpp": memoryview(b"Core::Layout"),
|
|
|
|
b"apps/file1.jsm": memoryview(b"Firefox::Boh"),
|
|
|
|
b"apps/file2.jsm": memoryview(b"Firefox::Boh"),
|
2020-03-04 16:27:59 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
commits = {
|
|
|
|
"commit1": repository.Commit(
|
|
|
|
node="commit1",
|
|
|
|
author="author1",
|
|
|
|
desc="commit1",
|
|
|
|
pushdate=datetime(2019, 1, 1),
|
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2020-03-04 16:27:59 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author1@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer1", "reviewer2"],
|
2020-03-04 16:27:59 +03:00
|
|
|
).set_files(["dom/file1.cpp", "apps/file1.jsm"], {}),
|
|
|
|
"commitbackedout": repository.Commit(
|
|
|
|
node="commitbackedout",
|
|
|
|
author="author1",
|
|
|
|
desc="commitbackedout",
|
|
|
|
pushdate=datetime(2019, 1, 1),
|
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2020-03-04 16:27:59 +03:00
|
|
|
backedoutby="commitbackout",
|
|
|
|
author_email="author1@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer1", "reviewer2"],
|
2020-03-04 16:27:59 +03:00
|
|
|
).set_files(["dom/file1.cpp", "apps/file1.jsm"], {}),
|
|
|
|
"commit2": repository.Commit(
|
|
|
|
node="commit2",
|
|
|
|
author="author2",
|
|
|
|
desc="commit2",
|
|
|
|
pushdate=datetime(2019, 1, 1),
|
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2020-03-04 16:27:59 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author2@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer1"],
|
2020-03-04 16:27:59 +03:00
|
|
|
).set_files(["dom/file1.cpp"], {}),
|
|
|
|
"commit2refactoring": repository.Commit(
|
|
|
|
node="commit2refactoring",
|
|
|
|
author="author2",
|
|
|
|
desc="commit2refactoring",
|
|
|
|
pushdate=datetime(2019, 1, 1),
|
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2020-03-04 16:27:59 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author2@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer1"],
|
2020-03-04 16:27:59 +03:00
|
|
|
ignored=True,
|
|
|
|
).set_files(["dom/file1.cpp"], {}),
|
|
|
|
"commit3": repository.Commit(
|
|
|
|
node="commit3",
|
|
|
|
author="author1",
|
|
|
|
desc="commit3",
|
|
|
|
pushdate=datetime(2019, 1, 1),
|
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2020-03-04 16:27:59 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author1@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer2"],
|
2020-03-04 16:27:59 +03:00
|
|
|
).set_files(["dom/file2.cpp", "apps/file1.jsm"], {}),
|
|
|
|
"commit4": repository.Commit(
|
|
|
|
node="commit4",
|
|
|
|
author="author2",
|
|
|
|
desc="commit4",
|
|
|
|
pushdate=datetime(2020, 1, 1),
|
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2020-03-04 16:27:59 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author2@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer1", "reviewer2"],
|
2020-03-04 16:27:59 +03:00
|
|
|
).set_files(["dom/file1.cpp", "apps/file2.jsm"], {}),
|
|
|
|
"commit5": repository.Commit(
|
|
|
|
node="commit5",
|
|
|
|
author="author3",
|
|
|
|
desc="commit5",
|
|
|
|
pushdate=datetime(2020, 1, 2),
|
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2020-03-04 16:27:59 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author3@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer3"],
|
2020-03-04 16:27:59 +03:00
|
|
|
).set_files(["dom/file1.cpp"], {"dom/file1.cpp": "dom/file1copied.cpp"}),
|
|
|
|
"commit6": repository.Commit(
|
|
|
|
node="commit6",
|
|
|
|
author="author3",
|
|
|
|
desc="commit6",
|
|
|
|
pushdate=datetime(2020, 1, 3),
|
|
|
|
bug_id=123,
|
2020-04-28 22:29:49 +03:00
|
|
|
backsout=[],
|
2020-03-04 16:27:59 +03:00
|
|
|
backedoutby="",
|
|
|
|
author_email="author3@mozilla.org",
|
2020-07-17 16:29:17 +03:00
|
|
|
reviewers=["reviewer3"],
|
2020-03-04 16:27:59 +03:00
|
|
|
).set_files(["dom/file1.cpp", "dom/file1copied.cpp"], {}),
|
|
|
|
}
|
|
|
|
|
2020-07-28 16:37:08 +03:00
|
|
|
repository.calculate_experiences(commits.values(), datetime(2019, 1, 1), save=False)
|
2020-03-04 16:27:59 +03:00
|
|
|
|
|
|
|
assert commits["commit1"].seniority_author == 0
|
|
|
|
assert commits["commitbackedout"].seniority_author == 0
|
|
|
|
assert commits["commit2"].seniority_author == 0
|
|
|
|
assert commits["commit3"].seniority_author == 0
|
|
|
|
assert commits["commit4"].seniority_author == 86400.0 * 365
|
|
|
|
assert commits["commit5"].seniority_author == 0
|
|
|
|
assert commits["commit6"].seniority_author == 86400.0
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_author_sum == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_author_sum == 0
|
|
|
|
assert commits["commit3"].touched_prev_total_author_sum == 1
|
|
|
|
assert commits["commit4"].touched_prev_total_author_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_total_author_sum == 0
|
|
|
|
assert commits["commit6"].touched_prev_total_author_sum == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit3"].touched_prev_90_days_author_sum == 1
|
|
|
|
assert commits["commit4"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit6"].touched_prev_90_days_author_sum == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_sum == 4
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_max == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_min == 2
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_sum == 0
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_max == 0
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_min == 0
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_sum == 1
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_max == 1
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_min == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_sum == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_max == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_min == 0
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_sum == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_max == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_min == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_file_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_file_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_file_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_file_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_file_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_file_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_file_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_file_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_file_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_total_file_sum == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_file_max == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_file_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_total_file_sum == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_file_max == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_file_min == 3
|
|
|
|
assert commits["commit6"].touched_prev_total_file_sum == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_file_max == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_file_min == 3
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_min == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_sum == 2
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_max == 2
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_sum == 3
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_max == 3
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_min == 2
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_sum == 4
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_max == 4
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_min == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_sum == 5
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_max == 5
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_min == 5
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_sum == 2
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_max == 2
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_min == 2
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_component_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_component_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_component_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_component_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_component_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_component_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_component_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_component_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_component_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_total_component_sum == 3
|
|
|
|
assert commits["commit4"].touched_prev_total_component_max == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_component_min == 2
|
|
|
|
assert commits["commit5"].touched_prev_total_component_sum == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_component_max == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_component_min == 3
|
|
|
|
assert commits["commit6"].touched_prev_total_component_sum == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_component_max == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_component_min == 4
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_min == 2
|
|
|
|
|
2020-07-28 16:37:08 +03:00
|
|
|
repository.calculate_experiences(commits.values(), datetime(2019, 1, 1), save=False)
|
2020-03-04 16:27:59 +03:00
|
|
|
|
|
|
|
assert commits["commit1"].seniority_author == 0
|
|
|
|
assert commits["commitbackedout"].seniority_author == 0
|
|
|
|
assert commits["commit2"].seniority_author == 0
|
|
|
|
assert commits["commit3"].seniority_author == 0
|
|
|
|
assert commits["commit4"].seniority_author == 86400.0 * 365
|
|
|
|
assert commits["commit5"].seniority_author == 0
|
|
|
|
assert commits["commit6"].seniority_author == 86400.0
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_author_sum == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_author_sum == 0
|
|
|
|
assert commits["commit3"].touched_prev_total_author_sum == 1
|
|
|
|
assert commits["commit4"].touched_prev_total_author_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_total_author_sum == 0
|
|
|
|
assert commits["commit6"].touched_prev_total_author_sum == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit3"].touched_prev_90_days_author_sum == 1
|
|
|
|
assert commits["commit4"].touched_prev_90_days_author_sum == 0
|
2019-05-28 13:59:55 +03:00
|
|
|
assert commits["commit5"].touched_prev_90_days_author_sum == 0
|
|
|
|
assert commits["commit6"].touched_prev_90_days_author_sum == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_reviewer_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_reviewer_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_reviewer_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_sum == 4
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_max == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_reviewer_min == 2
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_sum == 0
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_max == 0
|
|
|
|
assert commits["commit5"].touched_prev_total_reviewer_min == 0
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_sum == 1
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_max == 1
|
|
|
|
assert commits["commit6"].touched_prev_total_reviewer_min == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_reviewer_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_reviewer_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_reviewer_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_reviewer_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_sum == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_max == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_reviewer_min == 0
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_sum == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_max == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_reviewer_min == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_file_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_file_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_file_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_file_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_file_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_file_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_file_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_file_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_file_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_total_file_sum == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_file_max == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_file_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_total_file_sum == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_file_max == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_file_min == 3
|
|
|
|
assert commits["commit6"].touched_prev_total_file_sum == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_file_max == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_file_min == 3
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_file_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_file_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_file_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_file_min == 1
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_directory_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_directory_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_sum == 2
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_max == 2
|
|
|
|
assert commits["commit3"].touched_prev_total_directory_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_sum == 3
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_max == 3
|
|
|
|
assert commits["commit4"].touched_prev_total_directory_min == 2
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_sum == 4
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_max == 4
|
|
|
|
assert commits["commit5"].touched_prev_total_directory_min == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_sum == 5
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_max == 5
|
|
|
|
assert commits["commit6"].touched_prev_total_directory_min == 5
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_directory_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_directory_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_sum == 2
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_max == 2
|
|
|
|
assert commits["commit3"].touched_prev_90_days_directory_min == 1
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_directory_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_directory_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_directory_min == 2
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_total_component_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_component_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_total_component_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_total_component_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_component_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_total_component_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_component_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_component_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_total_component_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_total_component_sum == 3
|
|
|
|
assert commits["commit4"].touched_prev_total_component_max == 2
|
|
|
|
assert commits["commit4"].touched_prev_total_component_min == 2
|
|
|
|
assert commits["commit5"].touched_prev_total_component_sum == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_component_max == 3
|
|
|
|
assert commits["commit5"].touched_prev_total_component_min == 3
|
|
|
|
assert commits["commit6"].touched_prev_total_component_sum == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_component_max == 4
|
|
|
|
assert commits["commit6"].touched_prev_total_component_min == 4
|
|
|
|
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_sum == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_max == 0
|
|
|
|
assert commits["commit1"].touched_prev_90_days_component_min == 0
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_sum == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_max == 1
|
|
|
|
assert commits["commit2"].touched_prev_90_days_component_min == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_sum == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_max == 1
|
|
|
|
assert commits["commit3"].touched_prev_90_days_component_min == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_sum == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_max == 0
|
|
|
|
assert commits["commit4"].touched_prev_90_days_component_min == 0
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_sum == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_max == 1
|
|
|
|
assert commits["commit5"].touched_prev_90_days_component_min == 1
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_sum == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_max == 2
|
|
|
|
assert commits["commit6"].touched_prev_90_days_component_min == 2
|
2019-12-17 12:10:19 +03:00
|
|
|
|
|
|
|
|
|
|
|
def test_get_touched_functions():
|
|
|
|
# Allow using the local code analysis server.
|
|
|
|
responses.add_passthru("http://127.0.0.1")
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
code_analysis_server = rust_code_analysis_server.RustCodeAnalysisServer()
|
2019-12-17 12:10:19 +03:00
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
metrics = code_analysis_server.metrics(
|
2019-12-17 12:10:19 +03:00
|
|
|
"file.cpp",
|
|
|
|
"""void func1() {
|
|
|
|
int i = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void func2() {
|
|
|
|
int i = 2;
|
|
|
|
}""",
|
2020-04-09 17:24:33 +03:00
|
|
|
unit=False,
|
2019-12-17 12:10:19 +03:00
|
|
|
)
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
# No function touched.
|
2020-08-27 17:19:02 +03:00
|
|
|
touched_functions = repository.get_touched_functions(
|
|
|
|
metrics["spaces"],
|
|
|
|
[],
|
|
|
|
[],
|
|
|
|
)
|
2020-04-09 17:24:33 +03:00
|
|
|
|
2019-12-17 12:10:19 +03:00
|
|
|
assert touched_functions == set()
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
metrics = code_analysis_server.metrics(
|
2019-12-17 12:10:19 +03:00
|
|
|
"file.cpp",
|
|
|
|
"""void func1() {
|
|
|
|
int i = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void func2() {
|
|
|
|
int i = 2;
|
|
|
|
}""",
|
2020-04-09 17:24:33 +03:00
|
|
|
unit=False,
|
2019-12-17 12:10:19 +03:00
|
|
|
)
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
# A function touched by adding a line.
|
2020-08-27 17:19:02 +03:00
|
|
|
touched_functions = repository.get_touched_functions(
|
|
|
|
metrics["spaces"],
|
|
|
|
[],
|
|
|
|
[1],
|
|
|
|
)
|
2020-04-09 17:24:33 +03:00
|
|
|
|
2019-12-17 12:10:19 +03:00
|
|
|
assert touched_functions == {("func1", 1, 3)}
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
metrics = code_analysis_server.metrics(
|
2019-12-17 12:10:19 +03:00
|
|
|
"file.cpp",
|
|
|
|
"""void func1() {
|
|
|
|
int i = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void func3() {
|
|
|
|
int i = 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
void func4() {
|
|
|
|
int i = 4;
|
|
|
|
}""",
|
2020-04-09 17:24:33 +03:00
|
|
|
unit=False,
|
|
|
|
)
|
|
|
|
|
|
|
|
# A function touched by removing a line, another function touched by adding a line.
|
|
|
|
touched_functions = repository.get_touched_functions(
|
2020-08-27 17:19:02 +03:00
|
|
|
metrics["spaces"],
|
|
|
|
[2, 5, 6, 7, 8],
|
|
|
|
[6],
|
2019-12-17 12:10:19 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
assert touched_functions == {("func3", 5, 7), ("func1", 1, 3)}
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
metrics = code_analysis_server.metrics(
|
2019-12-17 12:10:19 +03:00
|
|
|
"file.cpp",
|
|
|
|
"""void func1() {
|
|
|
|
int i = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void func2() {
|
|
|
|
int i = 2;
|
|
|
|
}""",
|
2020-04-09 17:24:33 +03:00
|
|
|
unit=False,
|
2019-12-17 12:10:19 +03:00
|
|
|
)
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
# A function touched by replacing a line.
|
2020-08-27 17:19:02 +03:00
|
|
|
touched_functions = repository.get_touched_functions(
|
|
|
|
metrics["spaces"],
|
|
|
|
[6],
|
|
|
|
[6],
|
|
|
|
)
|
2020-04-09 17:24:33 +03:00
|
|
|
|
2019-12-17 12:10:19 +03:00
|
|
|
assert touched_functions == {("func2", 5, 7)}
|
2019-12-19 14:15:40 +03:00
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
metrics = code_analysis_server.metrics(
|
2019-12-19 14:15:40 +03:00
|
|
|
"file.js",
|
|
|
|
"""let j = 0;
|
|
|
|
|
|
|
|
function func() {
|
|
|
|
let i = 0;
|
|
|
|
}""",
|
2020-04-09 17:24:33 +03:00
|
|
|
unit=False,
|
2019-12-19 14:15:40 +03:00
|
|
|
)
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
# top-level and a JavaScript function touched.
|
2020-08-27 17:19:02 +03:00
|
|
|
touched_functions = repository.get_touched_functions(
|
|
|
|
metrics["spaces"],
|
|
|
|
[],
|
|
|
|
[1, 4],
|
|
|
|
)
|
2020-04-09 17:24:33 +03:00
|
|
|
|
2019-12-19 14:15:40 +03:00
|
|
|
assert touched_functions == {("func", 3, 5)}
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
metrics = code_analysis_server.metrics(
|
2019-12-19 14:15:40 +03:00
|
|
|
"file.jsm",
|
|
|
|
"""function outer_func() {
|
|
|
|
let i = 0;
|
|
|
|
let f = function() {
|
|
|
|
let j = 0;
|
|
|
|
}();
|
|
|
|
}""",
|
2020-04-09 17:24:33 +03:00
|
|
|
unit=False,
|
2019-12-19 14:15:40 +03:00
|
|
|
)
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
# An anonymous function touched inside another function.
|
2020-08-27 17:19:02 +03:00
|
|
|
touched_functions = repository.get_touched_functions(
|
|
|
|
metrics["spaces"],
|
|
|
|
[],
|
|
|
|
[4],
|
|
|
|
)
|
2020-04-09 17:24:33 +03:00
|
|
|
|
2019-12-19 14:15:40 +03:00
|
|
|
assert touched_functions == {("outer_func", 1, 6)}
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
metrics = code_analysis_server.metrics(
|
2019-12-19 14:15:40 +03:00
|
|
|
"file.jsm",
|
|
|
|
"""function outer_func() {
|
|
|
|
let i = 0;
|
|
|
|
function inner_func() {
|
|
|
|
let j = 0;
|
|
|
|
}
|
|
|
|
}""",
|
2020-04-09 17:24:33 +03:00
|
|
|
unit=False,
|
2019-12-19 14:15:40 +03:00
|
|
|
)
|
|
|
|
|
2020-04-09 17:24:33 +03:00
|
|
|
# A function touched inside another function.
|
2020-08-27 17:19:02 +03:00
|
|
|
touched_functions = repository.get_touched_functions(
|
|
|
|
metrics["spaces"],
|
|
|
|
[],
|
|
|
|
[4],
|
|
|
|
)
|
2020-04-09 17:24:33 +03:00
|
|
|
|
2019-12-19 14:15:40 +03:00
|
|
|
assert touched_functions == {("outer_func", 1, 6), ("inner_func", 3, 5)}
|
2020-07-10 22:54:44 +03:00
|
|
|
|
|
|
|
|
|
|
|
def test_get_commits():
|
|
|
|
# By default get_commits utilizes the following parameters:
|
|
|
|
# include_no_bug: bool = False
|
|
|
|
# include_backouts: bool = False
|
|
|
|
# include_ignored: bool = False
|
|
|
|
|
|
|
|
BACKOUT_COMMIT = "ec01c146f756b74d18e4892b4fd3aecba00da93e"
|
|
|
|
IGNORED_COMMIT = "7f27080ffee35521c42fe9d4025caabef7b6258c"
|
|
|
|
NOBUG_COMMIT = "75966ee1fe658b1767d7459256175c0662d14c25"
|
|
|
|
NOBUG_IGNORED_COMMIT = "75276e64701bfde7cf2dd1f851adfea6a92d5747"
|
|
|
|
NOBUG_IGNORED_BACKOUT_COMMIT = "46c1c161cbe189a59d8274e011085d76163db7f4"
|
|
|
|
|
|
|
|
retrieved_commits = list(repository.get_commits())
|
|
|
|
excluded_commits = [
|
|
|
|
IGNORED_COMMIT,
|
|
|
|
BACKOUT_COMMIT,
|
|
|
|
NOBUG_COMMIT,
|
|
|
|
NOBUG_IGNORED_COMMIT,
|
|
|
|
NOBUG_IGNORED_BACKOUT_COMMIT,
|
|
|
|
]
|
|
|
|
# 10 mock commits, 1 ignored, 1 backouts, 1 no_bug, 1 no_bug and ignored, 1 no_bug, ignored, and backouts
|
|
|
|
assert len(retrieved_commits) == 5
|
|
|
|
assert not any(
|
|
|
|
excluded_commit in {c["node"] for c in retrieved_commits}
|
|
|
|
for excluded_commit in excluded_commits
|
|
|
|
)
|
|
|
|
|
|
|
|
retrieved_commits = list(repository.get_commits(include_backouts=True))
|
|
|
|
assert len(retrieved_commits) == 6
|
|
|
|
assert BACKOUT_COMMIT in (c["node"] for c in retrieved_commits)
|
|
|
|
|
|
|
|
retrieved_commits = list(repository.get_commits(include_ignored=True))
|
|
|
|
assert len(retrieved_commits) == 6
|
|
|
|
assert IGNORED_COMMIT in (c["node"] for c in retrieved_commits)
|
|
|
|
|
|
|
|
retrieved_commits = list(repository.get_commits(include_no_bug=True))
|
|
|
|
assert len(retrieved_commits) == 6
|
|
|
|
assert NOBUG_COMMIT in (c["node"] for c in retrieved_commits)
|
|
|
|
|
|
|
|
retrieved_commits = list(
|
|
|
|
repository.get_commits(include_ignored=True, include_backouts=True)
|
|
|
|
)
|
|
|
|
included_commits = {IGNORED_COMMIT, BACKOUT_COMMIT}
|
|
|
|
assert len(retrieved_commits) == 7
|
|
|
|
assert included_commits.issubset({c["node"] for c in retrieved_commits})
|
|
|
|
|
|
|
|
retrieved_commits = list(
|
|
|
|
repository.get_commits(include_ignored=True, include_no_bug=True)
|
|
|
|
)
|
|
|
|
included_commits = {IGNORED_COMMIT, NOBUG_COMMIT}
|
|
|
|
assert len(retrieved_commits) == 8
|
|
|
|
assert included_commits.issubset({c["node"] for c in retrieved_commits})
|
|
|
|
|
|
|
|
retrieved_commits = list(
|
|
|
|
repository.get_commits(include_no_bug=True, include_backouts=True)
|
|
|
|
)
|
|
|
|
included_commits = {BACKOUT_COMMIT, NOBUG_COMMIT}
|
|
|
|
assert len(retrieved_commits) == 7
|
|
|
|
assert included_commits.issubset({c["node"] for c in retrieved_commits})
|
|
|
|
|
|
|
|
retrieved_commits = list(
|
|
|
|
repository.get_commits(
|
|
|
|
include_ignored=True, include_backouts=True, include_no_bug=True
|
|
|
|
)
|
|
|
|
)
|
|
|
|
included_commits = {
|
|
|
|
IGNORED_COMMIT,
|
|
|
|
BACKOUT_COMMIT,
|
|
|
|
NOBUG_COMMIT,
|
|
|
|
NOBUG_IGNORED_COMMIT,
|
|
|
|
NOBUG_IGNORED_BACKOUT_COMMIT,
|
|
|
|
}
|
|
|
|
assert len(retrieved_commits) == 10
|
|
|
|
assert included_commits.issubset({c["node"] for c in retrieved_commits})
|
2020-10-05 12:21:14 +03:00
|
|
|
|
|
|
|
|
|
|
|
def test_get_revision_id():
|
|
|
|
commit = {
|
|
|
|
"desc": "My desc",
|
|
|
|
}
|
|
|
|
assert repository.get_revision_id(commit) is None
|
|
|
|
|
|
|
|
commit = {
|
|
|
|
"desc": "Bug 1667333: Remove unnecessary prefs for mime type checking r=necko-reviewers,evilpie,valentin\n\nDifferential Revision: https://phabricator.services.mozilla.com/D91406",
|
|
|
|
}
|
|
|
|
assert repository.get_revision_id(commit) == 91406
|
2021-01-06 15:44:14 +03:00
|
|
|
|
|
|
|
|
|
|
|
def test_commit_dict_matches_expected():
|
|
|
|
commit = repository.Commit(
|
|
|
|
node="commit",
|
|
|
|
author="author",
|
|
|
|
desc="commit",
|
|
|
|
pushdate=datetime(2021, 1, 1),
|
|
|
|
bug_id=123,
|
|
|
|
backsout=[],
|
|
|
|
backedoutby="",
|
|
|
|
author_email="author@mozilla.org",
|
|
|
|
reviewers=["reviewer"],
|
|
|
|
).set_files([], {})
|
|
|
|
|
|
|
|
# Ensure the fields expected by commit_features functions are actually present in the commit dict.
|
|
|
|
commit_features.source_code_file_metrics()(commit.to_dict())
|