ansible-test - use pwsh to generate stubs (#74271)
This commit is contained in:
parent
d8e6f21d9f
commit
e875e91363
3 changed files with 55 additions and 10 deletions
2
changelogs/fragments/coverage-pwsh-stubs.yml
Normal file
2
changelogs/fragments/coverage-pwsh-stubs.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- ansible-test - Use pwsh to generate correct coverage line counts for stub files to get a more accurate coverage result
|
38
test/lib/ansible_test/_data/coverage_stub.ps1
Normal file
38
test/lib/ansible_test/_data/coverage_stub.ps1
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Gets the lines to hit from a sourcefile for coverage stubs.
|
||||||
|
#>
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory, ValueFromRemainingArguments)]
|
||||||
|
[String[]]
|
||||||
|
$Path
|
||||||
|
)
|
||||||
|
|
||||||
|
$stubInfo = @(foreach ($sourcePath in $Path) {
|
||||||
|
# Default is to just no lines for missing files
|
||||||
|
[Collections.Generic.HashSet[int]]$lines = @()
|
||||||
|
|
||||||
|
if (Test-Path -LiteralPath $sourcePath) {
|
||||||
|
$code = [ScriptBlock]::Create([IO.File]::ReadAllText($sourcePath))
|
||||||
|
|
||||||
|
# We set our breakpoints with this predicate so our stubs should match
|
||||||
|
# that logic.
|
||||||
|
$predicate = {
|
||||||
|
$args[0] -is [System.Management.Automation.Language.CommandBaseAst]
|
||||||
|
}
|
||||||
|
$cmds = $code.Ast.FindAll($predicate, $true)
|
||||||
|
|
||||||
|
# We only care about unique lines not multiple commands on 1 line.
|
||||||
|
$lines = @(foreach ($cmd in $cmds) {
|
||||||
|
$cmd.Extent.StartLineNumber
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
[PSCustomObject]@{
|
||||||
|
Path = $sourcePath
|
||||||
|
Lines = $lines
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
ConvertTo-Json -InputObject $stubInfo -Depth 2 -Compress
|
|
@ -3,6 +3,7 @@ from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import json
|
||||||
|
|
||||||
from ...target import (
|
from ...target import (
|
||||||
walk_compile_targets,
|
walk_compile_targets,
|
||||||
|
@ -14,11 +15,14 @@ from ...io import (
|
||||||
)
|
)
|
||||||
|
|
||||||
from ...util import (
|
from ...util import (
|
||||||
|
ANSIBLE_TEST_DATA_ROOT,
|
||||||
display,
|
display,
|
||||||
|
find_executable,
|
||||||
)
|
)
|
||||||
|
|
||||||
from ...util_common import (
|
from ...util_common import (
|
||||||
ResultType,
|
ResultType,
|
||||||
|
run_command,
|
||||||
write_json_file,
|
write_json_file,
|
||||||
write_json_test_results,
|
write_json_test_results,
|
||||||
)
|
)
|
||||||
|
@ -64,7 +68,7 @@ def _command_coverage_combine_python(args):
|
||||||
|
|
||||||
counter = 0
|
counter = 0
|
||||||
sources = _get_coverage_targets(args, walk_compile_targets)
|
sources = _get_coverage_targets(args, walk_compile_targets)
|
||||||
groups = _build_stub_groups(args, sources, lambda line_count: set())
|
groups = _build_stub_groups(args, sources, lambda s: dict((name, set()) for name in s))
|
||||||
|
|
||||||
collection_search_re, collection_sub_re = get_collection_path_regexes()
|
collection_search_re, collection_sub_re = get_collection_path_regexes()
|
||||||
|
|
||||||
|
@ -137,11 +141,13 @@ def _command_coverage_combine_powershell(args):
|
||||||
"""
|
"""
|
||||||
coverage_files = get_powershell_coverage_files()
|
coverage_files = get_powershell_coverage_files()
|
||||||
|
|
||||||
def _default_stub_value(lines):
|
def _default_stub_value(source_paths):
|
||||||
val = {}
|
cmd = ['pwsh', os.path.join(ANSIBLE_TEST_DATA_ROOT, 'coverage_stub.ps1')]
|
||||||
for line in range(lines):
|
cmd.extend(source_paths)
|
||||||
val[line] = 0
|
|
||||||
return val
|
stubs = json.loads(run_command(args, cmd, capture=True, always=True)[0])
|
||||||
|
|
||||||
|
return dict((d['Path'], dict((line, 0) for line in d['Lines'])) for d in stubs)
|
||||||
|
|
||||||
counter = 0
|
counter = 0
|
||||||
sources = _get_coverage_targets(args, walk_powershell_targets)
|
sources = _get_coverage_targets(args, walk_powershell_targets)
|
||||||
|
@ -236,7 +242,7 @@ def _build_stub_groups(args, sources, default_stub_value):
|
||||||
"""
|
"""
|
||||||
:type args: CoverageConfig
|
:type args: CoverageConfig
|
||||||
:type sources: List[tuple[str, int]]
|
:type sources: List[tuple[str, int]]
|
||||||
:type default_stub_value: Func[int]
|
:type default_stub_value: Func[List[str]]
|
||||||
:rtype: dict
|
:rtype: dict
|
||||||
"""
|
"""
|
||||||
groups = {}
|
groups = {}
|
||||||
|
@ -248,7 +254,7 @@ def _build_stub_groups(args, sources, default_stub_value):
|
||||||
stub_line_count = 0
|
stub_line_count = 0
|
||||||
|
|
||||||
for source, source_line_count in sources:
|
for source, source_line_count in sources:
|
||||||
stub_group.append((source, source_line_count))
|
stub_group.append(source)
|
||||||
stub_line_count += source_line_count
|
stub_line_count += source_line_count
|
||||||
|
|
||||||
if stub_line_count > stub_line_limit:
|
if stub_line_count > stub_line_limit:
|
||||||
|
@ -260,8 +266,7 @@ def _build_stub_groups(args, sources, default_stub_value):
|
||||||
if not stub_group:
|
if not stub_group:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
groups['=stub-%02d' % (stub_index + 1)] = dict((source, default_stub_value(line_count))
|
groups['=stub-%02d' % (stub_index + 1)] = default_stub_value(stub_group)
|
||||||
for source, line_count in stub_group)
|
|
||||||
|
|
||||||
return groups
|
return groups
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue