Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 72 additions & 9 deletions azure-pipelines/end-to-end-tests-dir/test-features.ps1
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
. $PSScriptRoot/../end-to-end-tests-prelude.ps1

function New-TestPortsRootArg() {
Param([Parameter(Mandatory=$true,ValueFromRemainingArguments=$true)][string[]]$Ports)
$name = $Ports[0]
$result = "$TestingRoot/$name"
New-Item -ItemType Directory -Force $result | Out-Null
foreach ($port in $Ports) {
Copy-Item -Recurse -Path "$PSScriptRoot/../e2e-ports/$port" -Destination $result
}

return "--x-builtin-ports-root=$result"
}

$ciFeatureBaseline = "$PSScriptRoot/../e2e-assets/ci-feature-baseline/conflicting-features.txt"
$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs "--x-builtin-ports-root=$PSScriptRoot/../e2e-ports" vcpkg-empty-featureful-port --ci-feature-baseline $ciFeatureBaseline
Throw-IfNotFailed
Expand Down Expand Up @@ -94,6 +106,17 @@ $($ciFeatureBaseline):6:29: error: vcpkg-empty-featureful-port[core,a-default-fe
Throw-IfNonContains -Expected $expected -Actual $output

$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs "--x-builtin-ports-root=$PSScriptRoot/../e2e-ports" vcpkg-self-cascade
Throw-IfFailed
Throw-IfNonContains -Expected "Feature Test [1/2] vcpkg-self-cascade[core]:$Triplet" -Actual $output
Throw-IfNonContains -Expected "Feature Test [2/2] vcpkg-self-cascade[core,cascade]:$Triplet" -Actual $output
Throw-IfNonContains -Expected @"
Skipping testing of vcpkg-self-cascade[cascade,core,never]:$Triplet@0 because the following dependencies are not supported on $($Triplet):
vcpkg-self-cascade[never]:$Triplet only supports windows & !windows
"@ -Actual $output
Throw-IfNonContains -Expected "All feature tests passed." -Actual $output

$vcpkgSelfCascadePortsArg = New-TestPortsRootArg vcpkg-self-cascade
$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs $vcpkgSelfCascadePortsArg --all
Throw-IfNotFailed
Throw-IfNonContains -Expected "Feature Test [1/2] vcpkg-self-cascade[core]:$Triplet" -Actual $output
Throw-IfNonContains -Expected "Feature Test [2/2] vcpkg-self-cascade[core,cascade]:$Triplet" -Actual $output
Expand All @@ -104,10 +127,12 @@ vcpkg-self-cascade[never]:$Triplet only supports windows & !windows
Throw-IfNonContains -Expected "error: vcpkg-self-cascade[core,cascade]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-self-cascade[never]:$Triplet only supports windows & !windows" -Actual $output

$ciFeatureBaseline = "$PSScriptRoot/../e2e-assets/ci-feature-baseline/vcpkg-self-cascade.txt"
Run-VcpkgAndCaptureOutput x-test-features @commonArgs "--x-builtin-ports-root=$PSScriptRoot/../e2e-ports" vcpkg-self-cascade --ci-feature-baseline $ciFeatureBaseline
Run-VcpkgAndCaptureOutput x-test-features @commonArgs $vcpkgSelfCascadePortsArg --all --ci-feature-baseline $ciFeatureBaseline
Throw-IfFailed

$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs "--x-builtin-ports-root=$PSScriptRoot/../e2e-ports" vcpkg-requires-feature
$vcpkgRequiresFeatureArg = New-TestPortsRootArg vcpkg-requires-feature vcpkg-fail-if-depended-upon

$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs $vcpkgRequiresFeatureArg vcpkg-requires-feature
Throw-IfNotFailed
# is-a-default-feature should not be printed here, but we don't currently have a good way to filter out what the
# specific dependency is when extras are brought in indirectly.
Expand All @@ -118,7 +143,25 @@ error: vcpkg-requires-feature[core,a]:$Triplet build failed but was expected to
error: vcpkg-requires-feature[core,b]:$Triplet build failed but was expected to pass
error: vcpkg-requires-feature[core,c]:$Triplet build failed but was expected to pass
error: vcpkg-requires-feature[core,fails]:$Triplet build failed but was expected to pass
error: vcpkg-requires-feature[core,cascades]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[core]:$Triplet
"@
Throw-IfNonContains -Expected $expected -Actual $output
Throw-IfContains -Expected "was unexpectedly a cascading failure" -Actual $Output

$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs $vcpkgRequiresFeatureArg --all
Throw-IfNotFailed
# is-a-default-feature should not be printed here, but we don't currently have a good way to filter out what the
# specific dependency is when extras are brought in indirectly.
# Also, note that there are no 'notes' explaining what might be fixable because there is no feature baseline.
$expected = @"
error: vcpkg-fail-if-depended-upon[core]:$Triplet build failed but was expected to pass
error: vcpkg-fail-if-depended-upon[core,a]:$Triplet build failed but was expected to pass
error: vcpkg-fail-if-depended-upon[core,b]:$Triplet build failed but was expected to pass
error: vcpkg-fail-if-depended-upon[core,is-a-default-feature]:$Triplet build failed but was expected to pass
error: vcpkg-fail-if-depended-upon[core,a,b,is-a-default-feature]:$Triplet build failed but was expected to pass
error: vcpkg-requires-feature[core]:$Triplet build failed but was expected to pass
error: vcpkg-requires-feature[core,c]:$Triplet build failed but was expected to pass
error: vcpkg-requires-feature[core,fails]:$Triplet build failed but was expected to pass
error: vcpkg-requires-feature[core,cascades]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[core,is-a-default-feature]:$Triplet@0
error: vcpkg-requires-feature[core,a,b,b-required,c,cascades,fails]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[core,is-a-default-feature]:$Triplet@0
"@
Throw-IfNonContains -Expected $expected -Actual $output
Expand All @@ -131,7 +174,19 @@ $($ciFeatureBaseline): error: vcpkg-requires-feature[core,fails,b-required]:$Tri
note: if vcpkg-requires-feature[fails] succeeds when built with other features but not alone, consider adding ``vcpkg-requires-feature[core,fails,b-required]:$Triplet=combination-fails``
note: if vcpkg-requires-feature[fails] always fails, consider adding ``vcpkg-requires-feature[fails]:$Triplet=feature-fails``, which will mark this test as failing, and remove vcpkg-requires-feature[fails] from combined feature testing
note: if some features are required, consider effectively always enabling those parts in portfile.cmake for vcpkg-requires-feature, or consider adding ``vcpkg-requires-feature[required-feature]=options`` to include 'required-feature' in all tests
$($ciFeatureBaseline): error: vcpkg-requires-feature[core,cascades,b-required]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[core]:$Triplet
"@

Throw-IfNonContains -Expected $expected -Actual $output
Throw-IfContains -Expected "was unexpectedly a cascading failure" -Actual $Output

$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs $vcpkgRequiresFeatureArg --all --ci-feature-baseline $ciFeatureBaseline
Throw-IfNotFailed
$expected = @"
$($ciFeatureBaseline): error: vcpkg-requires-feature[core,fails,b-required]:$Triplet build failed but was expected to pass
note: if vcpkg-requires-feature[fails] succeeds when built with other features but not alone, consider adding ``vcpkg-requires-feature[core,fails,b-required]:$Triplet=combination-fails``
note: if vcpkg-requires-feature[fails] always fails, consider adding ``vcpkg-requires-feature[fails]:$Triplet=feature-fails``, which will mark this test as failing, and remove vcpkg-requires-feature[fails] from combined feature testing
note: if some features are required, consider effectively always enabling those parts in portfile.cmake for vcpkg-requires-feature, or consider adding ``vcpkg-requires-feature[required-feature]=options`` to include 'required-feature' in all tests
$($ciFeatureBaseline): error: vcpkg-requires-feature[core,cascades,b-required]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[core,is-a-default-feature]:$Triplet@0
$($ciFeatureBaseline): error: vcpkg-requires-feature[core,a,b,b-required,c,cascades,fails]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[core,is-a-default-feature]:$Triplet@0
"@
Throw-IfNonContains -Expected $expected -Actual $output
Expand Down Expand Up @@ -205,23 +260,31 @@ $output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs "--x-builtin-por
Throw-IfFailed
Throw-IfNonContains -Expected "Feature Test [6/6] vcpkg-mutually-incompatible-features[core,a,b]:$Triplet" -Actual $output

$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs "--x-builtin-ports-root=$PSScriptRoot/../e2e-ports" vcpkg-depends-on-fail-core
$vcpkgDependsOnFailCoreArg = New-TestPortsRootArg vcpkg-depends-on-fail-core vcpkg-fail-if-depended-upon

$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs $vcpkgDependsOnFailCoreArg vcpkg-depends-on-fail-core
Throw-IfFailed
Throw-IfContains -Expected "was unexpectedly a cascading failure" -Actual $Output

$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs $vcpkgDependsOnFailCoreArg --all
Throw-IfNotFailed
$expected = @"
error: vcpkg-depends-on-fail-core[core]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[a,core]:$Triplet
error: vcpkg-depends-on-fail-core[core,x]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[a,core,is-a-default-feature]:$Triplet@0
"@
Throw-IfNonContains -Expected $expected -Actual $output

$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs "--x-builtin-ports-root=$PSScriptRoot/../e2e-ports" vcpkg-depends-on-fail-feature
$vcpkgDependsOnFailFeatureArg = New-TestPortsRootArg vcpkg-depends-on-fail-feature vcpkg-fail-if-depended-upon

$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs $vcpkgDependsOnFailFeatureArg --all
Throw-IfNotFailed
$expected = @"
error: vcpkg-depends-on-fail-feature[core,x]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[b,core]:$Triplet
"@
Throw-IfNonContains -Expected $expected -Actual $output

$ciFeatureBaseline = "$PSScriptRoot/../e2e-assets/ci-feature-baseline/unexpected-cascade-combination-fail.txt"
$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs "--x-builtin-ports-root=$PSScriptRoot/../e2e-ports" vcpkg-depends-on-fail-core --ci-feature-baseline $ciFeatureBaseline
$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs $vcpkgDependsOnFailCoreArg --all --ci-feature-baseline $ciFeatureBaseline
Throw-IfNotFailed
$expected = @"
$($ciFeatureBaseline): error: vcpkg-depends-on-fail-core[core]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[a,core]:$Triplet
Expand All @@ -230,7 +293,7 @@ $($ciFeatureBaseline):1:28: error: vcpkg-depends-on-fail-core[core,x]:$Triplet w
Throw-IfNonContains -Expected $expected -Actual $output

$ciFeatureBaseline = "$PSScriptRoot/../e2e-assets/ci-feature-baseline/unexpected-cascade-port-fail.txt"
$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs "--x-builtin-ports-root=$PSScriptRoot/../e2e-ports" vcpkg-depends-on-fail-core --ci-feature-baseline $ciFeatureBaseline
$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs $vcpkgDependsOnFailCoreArg --all --ci-feature-baseline $ciFeatureBaseline
Throw-IfNotFailed
$expected = @"
$($ciFeatureBaseline):1:1: error: vcpkg-depends-on-fail-core[core]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[a,core]:$Triplet
Expand All @@ -241,7 +304,7 @@ $($ciFeatureBaseline):1:1: note: consider changing this to =cascade instead
Throw-IfNonContains -Expected $expected -Actual $output

$ciFeatureBaseline = "$PSScriptRoot/../e2e-assets/ci-feature-baseline/unexpected-cascade-feature-fail.txt"
$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs "--x-builtin-ports-root=$PSScriptRoot/../e2e-ports" vcpkg-depends-on-fail-feature --ci-feature-baseline $ciFeatureBaseline
$output = Run-VcpkgAndCaptureOutput x-test-features @commonArgs $vcpkgDependsOnFailFeatureArg --all --ci-feature-baseline $ciFeatureBaseline
Throw-IfNotFailed
$expected = @"
$($ciFeatureBaseline):1:31: error: vcpkg-depends-on-fail-feature[core,x]:$Triplet was unexpectedly a cascading failure because the following dependencies are unavailable: vcpkg-fail-if-depended-upon[b,core]:$Triplet
Expand Down
14 changes: 14 additions & 0 deletions azure-pipelines/end-to-end-tests-prelude.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,20 @@ function Throw-IfNonEndsWith {
}
}

function Throw-IfContains {
Param(
[string]$Actual,
[string]$Expected
)
if ($Actual.Contains($Expected)) {
Set-Content -Value $Expected -LiteralPath "$TestingRoot/expected.txt"
Set-Content -Value $Actual -LiteralPath "$TestingRoot/actual.txt"
git diff --no-index -- "$TestingRoot/expected.txt" "$TestingRoot/actual.txt"
Write-Stack
throw "Expected '$Expected' to not be in '$Actual'"
}
}

function Throw-IfNonContains {
Param(
[string]$Actual,
Expand Down
3 changes: 2 additions & 1 deletion include/vcpkg/ci-feature-baseline.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ namespace vcpkg

enum class CiFeatureBaselineOutcome
{
Pass,
ImplicitPass,
ExplicitPass,
PortMarkedFail,
PortMarkedCascade,
FeatureFail,
Expand Down
10 changes: 9 additions & 1 deletion src/vcpkg/ci-feature-baseline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -389,9 +389,17 @@ namespace vcpkg
}
}
}

if (auto pstate = baseline->state.get())
{
if (pstate->value == CiFeatureBaselineState::Pass)
{
return Located<CiFeatureBaselineOutcome>{SourceLoc{}, CiFeatureBaselineOutcome::ExplicitPass};
}
}
}

return Located<CiFeatureBaselineOutcome>{SourceLoc{}, CiFeatureBaselineOutcome::Pass};
return Located<CiFeatureBaselineOutcome>{SourceLoc{}, CiFeatureBaselineOutcome::ImplicitPass};
}

StringLiteral to_string_literal(CiFeatureBaselineState state)
Expand Down
18 changes: 14 additions & 4 deletions src/vcpkg/commands.test-features.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ namespace
}

void handle_cascade_feature_test_result(std::vector<DiagnosticLine>& diagnostics,
bool enforce_marked_cascades,
const FullPackageSpec& spec,
const std::string* ci_feature_baseline_file_name,
const CiFeatureBaselineEntry* baseline,
Expand All @@ -180,7 +181,14 @@ namespace
auto outcome = expected_outcome(baseline, spec.features);
switch (outcome.value)
{
case CiFeatureBaselineOutcome::Pass:
case CiFeatureBaselineOutcome::ImplicitPass:
if (!enforce_marked_cascades)
{
break;
}

[[fallthrough]];
case CiFeatureBaselineOutcome::ExplicitPass:
case CiFeatureBaselineOutcome::ConfigurationFail:
add_build_cascade_diagnostic(
diagnostics, spec, ci_feature_baseline_file_name, outcome.loc, std::move(cascade_reason));
Expand Down Expand Up @@ -221,7 +229,8 @@ namespace
auto outcome = expected_outcome(baseline, spec.features);
switch (outcome.value)
{
case CiFeatureBaselineOutcome::Pass:
case CiFeatureBaselineOutcome::ImplicitPass:
case CiFeatureBaselineOutcome::ExplicitPass:
if (ci_feature_baseline_file_name)
{
diagnostics.push_back(
Expand Down Expand Up @@ -732,7 +741,7 @@ namespace vcpkg
.append_raw(Strings::join("\n", out))
.append_raw('\n'));
handle_cascade_feature_test_result(
diagnostics, spec, ci_feature_baseline_file_name, baseline, Strings::join(", ", out));
diagnostics, all_ports, spec, ci_feature_baseline_file_name, baseline, Strings::join(", ", out));
continue;
}

Expand All @@ -746,7 +755,7 @@ namespace vcpkg
{
msg::println(msgDependencyWillFail, msg::feature_spec = iter->display_name());
handle_cascade_feature_test_result(
diagnostics, spec, ci_feature_baseline_file_name, baseline, iter->display_name());
diagnostics, all_ports, spec, ci_feature_baseline_file_name, baseline, iter->display_name());
continue;
}

Expand Down Expand Up @@ -835,6 +844,7 @@ namespace vcpkg

handle_cascade_feature_test_result(
diagnostics,
all_ports,
spec,
ci_feature_baseline_file_name,
baseline,
Expand Down
Loading