Fix L0 tests, add/update runner release yaml. (#214)

This commit is contained in:
Tingluo Huang
2019-12-09 16:11:00 -05:00
committed by GitHub
parent d81a7656a4
commit 3ed80b7c10
12 changed files with 995 additions and 1372 deletions

View File

@@ -1,448 +1,443 @@
// using GitHub.DistributedTask.WebApi;
// using GitHub.Runner.Worker;
// using Moq;
// using System;
// using System.Collections.Generic;
// using System.Globalization;
// using System.Linq;
// using System.Runtime.CompilerServices;
// using System.Threading.Tasks;
// using Xunit;
// using GitHub.DistributedTask.Expressions2;
// using GitHub.DistributedTask.Pipelines.ContextData;
using GitHub.DistributedTask.WebApi;
using GitHub.Runner.Worker;
using Moq;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using Xunit;
using GitHub.DistributedTask.Expressions2;
using GitHub.DistributedTask.Pipelines.ContextData;
using GitHub.DistributedTask.ObjectTemplating.Tokens;
// namespace GitHub.Runner.Common.Tests.Worker
// {
// public sealed class StepsRunnerL0
// {
// private Mock<IExecutionContext> _ec;
// private StepsRunner _stepsRunner;
// private Variables _variables;
// private Dictionary<string, PipelineContextData> _contexts;
// private TestHostContext CreateTestContext([CallerMemberName] String testName = "")
// {
// var hc = new TestHostContext(this, testName);
// var expressionManager = new ExpressionManager();
// expressionManager.Initialize(hc);
// hc.SetSingleton<IExpressionManager>(expressionManager);
// Dictionary<string, VariableValue> variablesToCopy = new Dictionary<string, VariableValue>();
// variablesToCopy.Add(Constants.Variables.Agent.RetainDefaultEncoding, new VariableValue("true", false));
// _variables = new Variables(
// hostContext: hc,
// copy: variablesToCopy);
// _ec = new Mock<IExecutionContext>();
// _ec.SetupAllProperties();
// _ec.Setup(x => x.Variables).Returns(_variables);
namespace GitHub.Runner.Common.Tests.Worker
{
public sealed class StepsRunnerL0
{
private Mock<IExecutionContext> _ec;
private StepsRunner _stepsRunner;
private Variables _variables;
private DictionaryContextData _contexts;
private JobContext _jobContext;
private StepsContext _stepContext;
private TestHostContext CreateTestContext([CallerMemberName] String testName = "")
{
var hc = new TestHostContext(this, testName);
var expressionManager = new ExpressionManager();
expressionManager.Initialize(hc);
hc.SetSingleton<IExpressionManager>(expressionManager);
Dictionary<string, VariableValue> variablesToCopy = new Dictionary<string, VariableValue>();
_variables = new Variables(
hostContext: hc,
copy: variablesToCopy);
_ec = new Mock<IExecutionContext>();
_ec.SetupAllProperties();
_ec.Setup(x => x.Variables).Returns(_variables);
// _contexts = new Dictionary<string, PipelineContextData>();
// _contexts["github"] = new DictionaryContextData();
// _contexts["runner"] = new DictionaryContextData();
// _contexts["actions"] = new DictionaryContextData();
// _ec.Setup(x => x.ExpressionValues).Returns(_contexts);
_contexts = new DictionaryContextData();
_jobContext = new JobContext();
_contexts["github"] = new DictionaryContextData();
_contexts["runner"] = new DictionaryContextData();
_contexts["job"] = _jobContext;
_ec.Setup(x => x.ExpressionValues).Returns(_contexts);
_ec.Setup(x => x.JobContext).Returns(_jobContext);
// var _stepContext = new StepsContext();
// _ec.Setup(x => x.StepsContext).Returns(_stepContext);
// _stepsRunner = new StepsRunner();
// _stepsRunner.Initialize(hc);
// return hc;
// }
_stepContext = new StepsContext();
_ec.Setup(x => x.StepsContext).Returns(_stepContext);
// [Fact]
// [Trait("Level", "L0")]
// [Trait("Category", "Worker")]
// public async Task RunNormalStepsAllStepPass()
// {
// using (TestHostContext hc = CreateTestContext())
// {
// // Arrange.
// var variableSets = new[]
// {
// new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded) },
// new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.SucceededOrFailed) },
// new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Always) }
// };
// foreach (var variableSet in variableSets)
// {
// _ec.Object.Result = null;
_ec.Setup(x => x.PostJobSteps).Returns(new Stack<IStep>());
// // Act.
// await _stepsRunner.RunAsync(
// jobContext: _ec.Object,
// steps: variableSet.Select(x => x.Object).ToList());
_stepsRunner = new StepsRunner();
_stepsRunner.Initialize(hc);
return hc;
}
// // Assert.
// Assert.Equal(TaskResult.Succeeded, _ec.Object.Result ?? TaskResult.Succeeded);
// Assert.Equal(2, variableSet.Length);
// variableSet[0].Verify(x => x.RunAsync());
// variableSet[1].Verify(x => x.RunAsync());
// }
// }
// }
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Worker")]
public async Task RunNormalStepsAllStepPass()
{
using (TestHostContext hc = CreateTestContext())
{
// Arrange.
var variableSets = new[]
{
new[] { CreateStep(TaskResult.Succeeded, "success()"), CreateStep(TaskResult.Succeeded, "success()") },
new[] { CreateStep(TaskResult.Succeeded, "success()"), CreateStep(TaskResult.Succeeded, "success() || failure()") },
new[] { CreateStep(TaskResult.Succeeded, "success()"), CreateStep(TaskResult.Succeeded, "always()") }
};
foreach (var variableSet in variableSets)
{
_ec.Object.Result = null;
// [Fact]
// [Trait("Level", "L0")]
// [Trait("Category", "Worker")]
// public async Task RunNormalStepsContinueOnError()
// {
// using (TestHostContext hc = CreateTestContext())
// {
// // Arrange.
// var variableSets = new[]
// {
// new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded, true), CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded) },
// new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded, true), CreateStep(TaskResult.Succeeded, ExpressionManager.SucceededOrFailed) },
// new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded, true), CreateStep(TaskResult.Succeeded, ExpressionManager.Always) },
// new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded, true), CreateStep(TaskResult.Failed, ExpressionManager.Succeeded, true) },
// new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded, true), CreateStep(TaskResult.Failed, ExpressionManager.SucceededOrFailed, true) },
// new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded, true), CreateStep(TaskResult.Failed, ExpressionManager.Always, true) }
// };
// foreach (var variableSet in variableSets)
// {
// _ec.Object.Result = null;
_ec.Setup(x => x.JobSteps).Returns(new Queue<IStep>(variableSet.Select(x => x.Object).ToList()));
// // Act.
// await _stepsRunner.RunAsync(
// jobContext: _ec.Object,
// steps: variableSet.Select(x => x.Object).ToList());
// Act.
await _stepsRunner.RunAsync(jobContext: _ec.Object);
// // Assert.
// Assert.Equal(TaskResult.SucceededWithIssues, _ec.Object.Result);
// Assert.Equal(2, variableSet.Length);
// variableSet[0].Verify(x => x.RunAsync());
// variableSet[1].Verify(x => x.RunAsync());
// }
// }
// }
// Assert.
Assert.Equal(TaskResult.Succeeded, _ec.Object.Result ?? TaskResult.Succeeded);
Assert.Equal(2, variableSet.Length);
variableSet[0].Verify(x => x.RunAsync());
variableSet[1].Verify(x => x.RunAsync());
}
}
}
// [Fact]
// [Trait("Level", "L0")]
// [Trait("Category", "Worker")]
// public async Task RunsAfterFailureBasedOnCondition()
// {
// using (TestHostContext hc = CreateTestContext())
// {
// // Arrange.
// var variableSets = new[]
// {
// new
// {
// Steps = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded) },
// Expected = false,
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.SucceededOrFailed) },
// Expected = true,
// },
// };
// foreach (var variableSet in variableSets)
// {
// _ec.Object.Result = null;
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Worker")]
public async Task RunNormalStepsContinueOnError()
{
using (TestHostContext hc = CreateTestContext())
{
// Arrange.
var variableSets = new[]
{
new[] { CreateStep(TaskResult.Failed, "success()", true), CreateStep(TaskResult.Succeeded, "success()") },
new[] { CreateStep(TaskResult.Failed, "success()", true), CreateStep(TaskResult.Succeeded, "success() || failure()") },
new[] { CreateStep(TaskResult.Failed, "success()", true), CreateStep(TaskResult.Succeeded, "always()") },
new[] { CreateStep(TaskResult.Failed, "success()", true), CreateStep(TaskResult.Failed, "success()", true) },
new[] { CreateStep(TaskResult.Failed, "success()", true), CreateStep(TaskResult.Failed, "success() || failure()", true) },
new[] { CreateStep(TaskResult.Failed, "success()", true), CreateStep(TaskResult.Failed, "always()", true) }
};
foreach (var variableSet in variableSets)
{
_ec.Object.Result = null;
// // Act.
// await _stepsRunner.RunAsync(
// jobContext: _ec.Object,
// steps: variableSet.Steps.Select(x => x.Object).ToList());
_ec.Setup(x => x.JobSteps).Returns(new Queue<IStep>(variableSet.Select(x => x.Object).ToList()));
// // Assert.
// Assert.Equal(TaskResult.Failed, _ec.Object.Result ?? TaskResult.Succeeded);
// Assert.Equal(2, variableSet.Steps.Length);
// variableSet.Steps[0].Verify(x => x.RunAsync());
// variableSet.Steps[1].Verify(x => x.RunAsync(), variableSet.Expected ? Times.Once() : Times.Never());
// }
// }
// }
// Act.
await _stepsRunner.RunAsync(jobContext: _ec.Object);
// [Fact]
// [Trait("Level", "L0")]
// [Trait("Category", "Worker")]
// public async Task RunsAlwaysSteps()
// {
// using (TestHostContext hc = CreateTestContext())
// {
// // Arrange.
// var variableSets = new[]
// {
// new
// {
// Steps = new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Always) },
// Expected = TaskResult.Succeeded,
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Always) },
// Expected = TaskResult.Failed,
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Always) },
// Expected = TaskResult.Failed,
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded), CreateStep(TaskResult.Failed, ExpressionManager.Always) },
// Expected = TaskResult.Failed,
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded), CreateStep(TaskResult.Failed, ExpressionManager.Always, true) },
// Expected = TaskResult.SucceededWithIssues,
// },
// };
// foreach (var variableSet in variableSets)
// {
// _ec.Object.Result = null;
// Assert.
Assert.Equal(TaskResult.Succeeded, _ec.Object.Result ?? TaskResult.Succeeded);
Assert.Equal(2, variableSet.Length);
variableSet[0].Verify(x => x.RunAsync());
variableSet[1].Verify(x => x.RunAsync());
}
}
}
// // Act.
// await _stepsRunner.RunAsync(
// jobContext: _ec.Object,
// steps: variableSet.Steps.Select(x => x.Object).ToList());
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Worker")]
public async Task RunsAfterFailureBasedOnCondition()
{
using (TestHostContext hc = CreateTestContext())
{
// Arrange.
var variableSets = new[]
{
new
{
Steps = new[] { CreateStep(TaskResult.Failed, "success()"), CreateStep(TaskResult.Succeeded, "success()") },
Expected = false,
},
new
{
Steps = new[] { CreateStep(TaskResult.Failed, "success()"), CreateStep(TaskResult.Succeeded, "success() || failure()") },
Expected = true,
},
};
foreach (var variableSet in variableSets)
{
_ec.Object.Result = null;
// // Assert.
// Assert.Equal(variableSet.Expected, _ec.Object.Result ?? TaskResult.Succeeded);
// Assert.Equal(2, variableSet.Steps.Length);
// variableSet.Steps[0].Verify(x => x.RunAsync());
// variableSet.Steps[1].Verify(x => x.RunAsync());
// }
// }
// }
_ec.Setup(x => x.JobSteps).Returns(new Queue<IStep>(variableSet.Steps.Select(x => x.Object).ToList()));
// [Fact]
// [Trait("Level", "L0")]
// [Trait("Category", "Worker")]
// public async Task SetsJobResultCorrectly()
// {
// using (TestHostContext hc = CreateTestContext())
// {
// // Arrange.
// var variableSets = new[]
// {
// new
// {
// Steps = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded) },
// Expected = TaskResult.Failed
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.SucceededOrFailed) },
// Expected = TaskResult.Failed
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Always) },
// Expected = TaskResult.Failed
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded, continueOnError: true), CreateStep(TaskResult.Failed, ExpressionManager.Succeeded) },
// Expected = TaskResult.Failed
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded, continueOnError: true), CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded) },
// Expected = TaskResult.SucceededWithIssues
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded, continueOnError: true), CreateStep(TaskResult.Failed, ExpressionManager.Succeeded, continueOnError: true) },
// Expected = TaskResult.SucceededWithIssues
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.SucceededOrFailed) },
// Expected = TaskResult.Succeeded
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded), CreateStep(TaskResult.Failed, ExpressionManager.Succeeded) },
// Expected = TaskResult.Failed
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded), CreateStep(TaskResult.SucceededWithIssues, ExpressionManager.Succeeded) },
// Expected = TaskResult.SucceededWithIssues
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.SucceededWithIssues, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded) },
// Expected = TaskResult.SucceededWithIssues
// },
// new
// {
// Steps = new[] { CreateStep(TaskResult.SucceededWithIssues, ExpressionManager.Succeeded), CreateStep(TaskResult.Failed, ExpressionManager.Succeeded) },
// Expected = TaskResult.Failed
// },
// // Abandoned
// // Canceled
// // Failed
// // Skipped
// // Succeeded
// // SucceededWithIssues
// };
// foreach (var variableSet in variableSets)
// {
// _ec.Object.Result = null;
// Act.
await _stepsRunner.RunAsync(jobContext: _ec.Object);
// // Act.
// await _stepsRunner.RunAsync(
// jobContext: _ec.Object,
// steps: variableSet.Steps.Select(x => x.Object).ToList());
// Assert.
Assert.Equal(TaskResult.Failed, _ec.Object.Result ?? TaskResult.Succeeded);
Assert.Equal(2, variableSet.Steps.Length);
variableSet.Steps[0].Verify(x => x.RunAsync());
variableSet.Steps[1].Verify(x => x.RunAsync(), variableSet.Expected ? Times.Once() : Times.Never());
}
}
}
// // Assert.
// Assert.True(
// variableSet.Expected == (_ec.Object.Result ?? TaskResult.Succeeded),
// $"Expected '{variableSet.Expected}'. Actual '{_ec.Object.Result}'. Steps: {FormatSteps(variableSet.Steps)}");
// }
// }
// }
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Worker")]
public async Task RunsAlwaysSteps()
{
using (TestHostContext hc = CreateTestContext())
{
// Arrange.
var variableSets = new[]
{
new
{
Steps = new[] { CreateStep(TaskResult.Succeeded, "success()"), CreateStep(TaskResult.Succeeded, "always()") },
Expected = TaskResult.Succeeded,
},
new
{
Steps = new[] { CreateStep(TaskResult.Failed, "success()"), CreateStep(TaskResult.Succeeded, "always()") },
Expected = TaskResult.Failed,
},
new
{
Steps = new[] { CreateStep(TaskResult.Failed, "success()"), CreateStep(TaskResult.Succeeded, "always()") },
Expected = TaskResult.Failed,
},
new
{
Steps = new[] { CreateStep(TaskResult.Succeeded, "success()"), CreateStep(TaskResult.Failed, "always()") },
Expected = TaskResult.Failed,
},
new
{
Steps = new[] { CreateStep(TaskResult.Succeeded, "success()"), CreateStep(TaskResult.Failed, "always()", true) },
Expected = TaskResult.Succeeded,
},
};
foreach (var variableSet in variableSets)
{
_ec.Object.Result = null;
// [Fact]
// [Trait("Level", "L0")]
// [Trait("Category", "Worker")]
// public async Task SkipsAfterFailureOnlyBaseOnCondition()
// {
// using (TestHostContext hc = CreateTestContext())
// {
// // Arrange.
// var variableSets = new[]
// {
// new
// {
// Step = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded) },
// Expected = false
// },
// new
// {
// Step = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.SucceededOrFailed) },
// Expected = true
// },
// new
// {
// Step = new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Always) },
// Expected = true
// }
// };
// foreach (var variableSet in variableSets)
// {
// _ec.Object.Result = null;
_ec.Setup(x => x.JobSteps).Returns(new Queue<IStep>(variableSet.Steps.Select(x => x.Object).ToList()));
// // Act.
// await _stepsRunner.RunAsync(
// jobContext: _ec.Object,
// steps: variableSet.Step.Select(x => x.Object).ToList());
// Act.
await _stepsRunner.RunAsync(jobContext: _ec.Object);
// // Assert.
// Assert.Equal(2, variableSet.Step.Length);
// variableSet.Step[0].Verify(x => x.RunAsync());
// variableSet.Step[1].Verify(x => x.RunAsync(), variableSet.Expected ? Times.Once() : Times.Never());
// }
// }
// }
// Assert.
Assert.Equal(variableSet.Expected, _ec.Object.Result ?? TaskResult.Succeeded);
Assert.Equal(2, variableSet.Steps.Length);
variableSet.Steps[0].Verify(x => x.RunAsync());
variableSet.Steps[1].Verify(x => x.RunAsync());
}
}
}
// [Fact]
// [Trait("Level", "L0")]
// [Trait("Category", "Worker")]
// public async Task AlwaysMeansAlways()
// {
// using (TestHostContext hc = CreateTestContext())
// {
// // Arrange.
// var variableSets = new[]
// {
// new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Always) },
// new[] { CreateStep(TaskResult.SucceededWithIssues, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Always) },
// new[] { CreateStep(TaskResult.Failed, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Always) },
// new[] { CreateStep(TaskResult.Canceled, ExpressionManager.Succeeded), CreateStep(TaskResult.Succeeded, ExpressionManager.Always) }
// };
// foreach (var variableSet in variableSets)
// {
// _ec.Object.Result = null;
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Worker")]
public async Task SetsJobResultCorrectly()
{
using (TestHostContext hc = CreateTestContext())
{
// Arrange.
var variableSets = new[]
{
new
{
Steps = new[] { CreateStep(TaskResult.Failed, "success()"), CreateStep(TaskResult.Succeeded, "success()") },
Expected = TaskResult.Failed
},
new
{
Steps = new[] { CreateStep(TaskResult.Failed, "success()"), CreateStep(TaskResult.Succeeded, "success() || failure()") },
Expected = TaskResult.Failed
},
new
{
Steps = new[] { CreateStep(TaskResult.Failed, "success()"), CreateStep(TaskResult.Succeeded, "always()") },
Expected = TaskResult.Failed
},
new
{
Steps = new[] { CreateStep(TaskResult.Failed, "success()", continueOnError: true), CreateStep(TaskResult.Failed, "success()") },
Expected = TaskResult.Failed
},
new
{
Steps = new[] { CreateStep(TaskResult.Failed, "success()", continueOnError: true), CreateStep(TaskResult.Succeeded, "success()") },
Expected = TaskResult.Succeeded
},
new
{
Steps = new[] { CreateStep(TaskResult.Failed, "success()", continueOnError: true), CreateStep(TaskResult.Failed, "success()", continueOnError: true) },
Expected = TaskResult.Succeeded
},
new
{
Steps = new[] { CreateStep(TaskResult.Succeeded, "success() || failure()") },
Expected = TaskResult.Succeeded
},
new
{
Steps = new[] { CreateStep(TaskResult.Succeeded, "success()"), CreateStep(TaskResult.Failed, "success()") },
Expected = TaskResult.Failed
},
new
{
Steps = new[] { CreateStep(TaskResult.Succeeded, "success()"), CreateStep(TaskResult.Succeeded, "success()") },
Expected = TaskResult.Succeeded
},
// Abandoned
// Canceled
// Failed
// Skipped
// Succeeded
};
foreach (var variableSet in variableSets)
{
_ec.Object.Result = null;
// // Act.
// await _stepsRunner.RunAsync(
// jobContext: _ec.Object,
// steps: variableSet.Select(x => x.Object).ToList());
_ec.Setup(x => x.JobSteps).Returns(new Queue<IStep>(variableSet.Steps.Select(x => x.Object).ToList()));
// // Assert.
// Assert.Equal(2, variableSet.Length);
// variableSet[0].Verify(x => x.RunAsync());
// variableSet[1].Verify(x => x.RunAsync(), Times.Once());
// }
// }
// }
// Act.
await _stepsRunner.RunAsync(jobContext: _ec.Object);
// [Fact]
// [Trait("Level", "L0")]
// [Trait("Category", "Worker")]
// public async Task TreatsConditionErrorAsFailure()
// {
// using (TestHostContext hc = CreateTestContext())
// {
// var expressionManager = new Mock<IExpressionManager>();
// expressionManager.Object.Initialize(hc);
// hc.SetSingleton<IExpressionManager>(expressionManager.Object);
// expressionManager.Setup(x => x.Evaluate(It.IsAny<IExecutionContext>(), It.IsAny<IExpressionNode>(), It.IsAny<bool>())).Throws(new Exception());
// Assert.
Assert.True(
variableSet.Expected == (_ec.Object.Result ?? TaskResult.Succeeded),
$"Expected '{variableSet.Expected}'. Actual '{_ec.Object.Result}'. Steps: {FormatSteps(variableSet.Steps)}");
}
}
}
// // Arrange.
// var variableSets = new[]
// {
// new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded) },
// new[] { CreateStep(TaskResult.Succeeded, ExpressionManager.Succeeded) },
// };
// foreach (var variableSet in variableSets)
// {
// _ec.Object.Result = null;
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Worker")]
public async Task SkipsAfterFailureOnlyBaseOnCondition()
{
using (TestHostContext hc = CreateTestContext())
{
// Arrange.
var variableSets = new[]
{
new
{
Step = new[] { CreateStep(TaskResult.Failed, "success()"), CreateStep(TaskResult.Succeeded, "success()") },
Expected = false
},
new
{
Step = new[] { CreateStep(TaskResult.Failed, "success()"), CreateStep(TaskResult.Succeeded, "success() || failure()") },
Expected = true
},
new
{
Step = new[] { CreateStep(TaskResult.Failed, "success()"), CreateStep(TaskResult.Succeeded, "always()") },
Expected = true
}
};
foreach (var variableSet in variableSets)
{
_ec.Object.Result = null;
// // Act.
// await _stepsRunner.RunAsync(
// jobContext: _ec.Object,
// steps: variableSet.Select(x => x.Object).ToList());
_ec.Setup(x => x.JobSteps).Returns(new Queue<IStep>(variableSet.Step.Select(x => x.Object).ToList()));
// // Assert.
// Assert.Equal(TaskResult.Failed, _ec.Object.Result ?? TaskResult.Succeeded);
// }
// }
// }
// Act.
await _stepsRunner.RunAsync(jobContext: _ec.Object);
// private Mock<IStep> CreateStep(TaskResult result, IExpressionNode condition, Boolean continueOnError = false)
// {
// // Setup the step.
// var step = new Mock<IStep>();
// step.Setup(x => x.Condition).Returns(condition);
// step.Setup(x => x.ContinueOnError).Returns(continueOnError);
// step.Setup(x => x.Enabled).Returns(true);
// step.Setup(x => x.RunAsync()).Returns(Task.CompletedTask);
// Assert.
Assert.Equal(2, variableSet.Step.Length);
variableSet.Step[0].Verify(x => x.RunAsync());
variableSet.Step[1].Verify(x => x.RunAsync(), variableSet.Expected ? Times.Once() : Times.Never());
}
}
}
// // Setup the step execution context.
// var stepContext = new Mock<IExecutionContext>();
// stepContext.SetupAllProperties();
// stepContext.Setup(x => x.Variables).Returns(_variables);
// stepContext.Setup(x => x.ExpressionValues).Returns(_contexts);
// stepContext.Setup(x => x.Complete(It.IsAny<TaskResult?>(), It.IsAny<string>(), It.IsAny<string>()))
// .Callback((TaskResult? r, string currentOperation, string resultCode) =>
// {
// if (r != null)
// {
// stepContext.Object.Result = r;
// }
// });
// stepContext.Object.Result = result;
// step.Setup(x => x.ExecutionContext).Returns(stepContext.Object);
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Worker")]
public async Task AlwaysMeansAlways()
{
using (TestHostContext hc = CreateTestContext())
{
// Arrange.
var variableSets = new[]
{
new[] { CreateStep(TaskResult.Succeeded, "success()"), CreateStep(TaskResult.Succeeded, "always()") },
new[] { CreateStep(TaskResult.Failed, "success()"), CreateStep(TaskResult.Succeeded, "always()") },
new[] { CreateStep(TaskResult.Canceled, "success()"), CreateStep(TaskResult.Succeeded, "always()") }
};
foreach (var variableSet in variableSets)
{
_ec.Object.Result = null;
// return step;
// }
_ec.Setup(x => x.JobSteps).Returns(new Queue<IStep>(variableSet.Select(x => x.Object).ToList()));
// private string FormatSteps(IEnumerable<Mock<IStep>> steps)
// {
// return String.Join(
// " ; ",
// steps.Select(x => String.Format(
// CultureInfo.InvariantCulture,
// "Returns={0},Condition=[{1}],ContinueOnError={2},Enabled={3}",
// x.Object.ExecutionContext.Result,
// x.Object.Condition,
// x.Object.ContinueOnError,
// x.Object.Enabled)));
// }
// }
// }
// Act.
await _stepsRunner.RunAsync(jobContext: _ec.Object);
// Assert.
Assert.Equal(2, variableSet.Length);
variableSet[0].Verify(x => x.RunAsync());
variableSet[1].Verify(x => x.RunAsync(), Times.Once());
}
}
}
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Worker")]
public async Task TreatsConditionErrorAsFailure()
{
using (TestHostContext hc = CreateTestContext())
{
var expressionManager = new Mock<IExpressionManager>();
expressionManager.Object.Initialize(hc);
hc.SetSingleton<IExpressionManager>(expressionManager.Object);
expressionManager.Setup(x => x.Evaluate(It.IsAny<IExecutionContext>(), It.IsAny<string>(), It.IsAny<bool>())).Throws(new Exception());
// Arrange.
var variableSets = new[]
{
new[] { CreateStep(TaskResult.Succeeded, "success()") },
new[] { CreateStep(TaskResult.Succeeded, "success()") },
};
foreach (var variableSet in variableSets)
{
_ec.Object.Result = null;
_ec.Setup(x => x.JobSteps).Returns(new Queue<IStep>(variableSet.Select(x => x.Object).ToList()));
// Act.
await _stepsRunner.RunAsync(jobContext: _ec.Object);
// Assert.
Assert.Equal(TaskResult.Failed, _ec.Object.Result ?? TaskResult.Succeeded);
}
}
}
private Mock<IStep> CreateStep(TaskResult result, string condition, Boolean continueOnError = false)
{
// Setup the step.
var step = new Mock<IStep>();
step.Setup(x => x.Condition).Returns(condition);
step.Setup(x => x.ContinueOnError).Returns(new BooleanToken(null, null, null, continueOnError));
step.Setup(x => x.RunAsync()).Returns(Task.CompletedTask);
// Setup the step execution context.
var stepContext = new Mock<IExecutionContext>();
stepContext.SetupAllProperties();
stepContext.Setup(x => x.Variables).Returns(_variables);
stepContext.Setup(x => x.ExpressionValues).Returns(_contexts);
stepContext.Setup(x => x.JobContext).Returns(_jobContext);
stepContext.Setup(x => x.StepsContext).Returns(_stepContext);
stepContext.Setup(x => x.Complete(It.IsAny<TaskResult?>(), It.IsAny<string>(), It.IsAny<string>()))
.Callback((TaskResult? r, string currentOperation, string resultCode) =>
{
if (r != null)
{
stepContext.Object.Result = r;
}
});
stepContext.Object.Result = result;
step.Setup(x => x.ExecutionContext).Returns(stepContext.Object);
return step;
}
private string FormatSteps(IEnumerable<Mock<IStep>> steps)
{
return String.Join(
" ; ",
steps.Select(x => String.Format(
CultureInfo.InvariantCulture,
"Returns={0},Condition=[{1}],ContinueOnError={2}",
x.Object.ExecutionContext.Result,
x.Object.Condition,
x.Object.ContinueOnError)));
}
}
}