private void Setup([CallerMemberName] string name = "") { _ecTokenSource?.Dispose(); _ecTokenSource = new CancellationTokenSource(); // Test host context. _hc = new TestHostContext(this, name); var actionInputs = new MappingToken(null, null, null); actionInputs.Add(new StringToken(null, null, null, "input1"), new StringToken(null, null, null, "input1")); actionInputs.Add(new StringToken(null, null, null, "input2"), new StringToken(null, null, null, "")); actionInputs.Add(new StringToken(null, null, null, "input3"), new StringToken(null, null, null, "github")); var actionDefinition = new Definition() { Directory = _hc.GetDirectory(WellKnownDirectory.Work), Data = new ActionDefinitionData() { Name = name, Description = name, Inputs = actionInputs, Execution = new ScriptActionExecutionData() } }; // Mocks. _actionManager = new Mock <IActionManager>(); _actionManager.Setup(x => x.LoadAction(It.IsAny <IExecutionContext>(), It.IsAny <ActionStep>())).Returns(actionDefinition); _handlerFactory = new Mock <IHandlerFactory>(); _defaultStepHost = new Mock <IDefaultStepHost>(); _actionManifestManager = new ActionManifestManager(); _actionManifestManager.Initialize(_hc); var githubContext = new GitHubContext(); githubContext.Add("event", JToken.Parse("{\"foo\":\"bar\"}").ToPipelineContextData()); _context.Add("github", githubContext); #if OS_WINDOWS _context["env"] = new DictionaryContextData(); #else _context["env"] = new CaseSensitiveDictionaryContextData(); #endif _ec = new Mock <IExecutionContext>(); _ec.Setup(x => x.ExpressionValues).Returns(_context); _ec.Setup(x => x.ExpressionFunctions).Returns(new List <IFunctionInfo>()); _ec.Setup(x => x.IntraActionState).Returns(new Dictionary <string, string>()); _ec.Setup(x => x.EnvironmentVariables).Returns(new Dictionary <string, string>()); _ec.Setup(x => x.FileTable).Returns(new List <String>()); _ec.Setup(x => x.SetGitHubContext(It.IsAny <string>(), It.IsAny <string>())); _ec.Setup(x => x.GetGitHubContext(It.IsAny <string>())).Returns("{\"foo\":\"bar\"}"); _ec.Setup(x => x.CancellationToken).Returns(_ecTokenSource.Token); _ec.Setup(x => x.Variables).Returns(new Variables(_hc, new Dictionary <string, VariableValue>())); _ec.Setup(x => x.Write(It.IsAny <string>(), It.IsAny <string>())).Callback((string tag, string message) => { _hc.GetTrace().Info($"[{tag}]{message}"); }); _ec.Setup(x => x.AddIssue(It.IsAny <Issue>(), It.IsAny <string>())).Callback((Issue issue, string message) => { _hc.GetTrace().Info($"[{issue.Type}]{issue.Message ?? message}"); }); _hc.SetSingleton <IActionManager>(_actionManager.Object); _hc.SetSingleton <IHandlerFactory>(_handlerFactory.Object); _hc.SetSingleton <IActionManifestManager>(_actionManifestManager); _hc.EnqueueInstance <IDefaultStepHost>(_defaultStepHost.Object); // Instance to test. _actionRunner = new ActionRunner(); _actionRunner.Initialize(_hc); _actionRunner.ExecutionContext = _ec.Object; }
public void RegisterPostJobAction_ShareState() { using (TestHostContext hc = CreateTestContext()) { // Arrange: Create a job request message. TaskOrchestrationPlanReference plan = new TaskOrchestrationPlanReference(); TimelineReference timeline = new TimelineReference(); Guid jobId = Guid.NewGuid(); string jobName = "some job name"; var jobRequest = new Pipelines.AgentJobRequestMessage(plan, timeline, jobId, jobName, jobName, null, null, null, new Dictionary <string, VariableValue>(), new List <MaskHint>(), new Pipelines.JobResources(), new Pipelines.ContextData.DictionaryContextData(), new Pipelines.WorkspaceOptions(), new List <Pipelines.ActionStep>(), null); jobRequest.Resources.Repositories.Add(new Pipelines.RepositoryResource() { Alias = Pipelines.PipelineConstants.SelfAlias, Id = "github", Version = "sha1" }); jobRequest.ContextData["github"] = new Pipelines.ContextData.DictionaryContextData(); jobRequest.Variables["ACTIONS_STEP_DEBUG"] = "true"; // Arrange: Setup the paging logger. var pagingLogger1 = new Mock <IPagingLogger>(); var pagingLogger2 = new Mock <IPagingLogger>(); var pagingLogger3 = new Mock <IPagingLogger>(); var pagingLogger4 = new Mock <IPagingLogger>(); var pagingLogger5 = new Mock <IPagingLogger>(); var jobServerQueue = new Mock <IJobServerQueue>(); jobServerQueue.Setup(x => x.QueueTimelineRecordUpdate(It.IsAny <Guid>(), It.IsAny <TimelineRecord>())); jobServerQueue.Setup(x => x.QueueWebConsoleLine(It.IsAny <Guid>(), It.IsAny <string>())).Callback((Guid id, string msg) => { hc.GetTrace().Info(msg); }); var actionRunner1 = new ActionRunner(); actionRunner1.Initialize(hc); var actionRunner2 = new ActionRunner(); actionRunner2.Initialize(hc); hc.EnqueueInstance(pagingLogger1.Object); hc.EnqueueInstance(pagingLogger2.Object); hc.EnqueueInstance(pagingLogger3.Object); hc.EnqueueInstance(pagingLogger4.Object); hc.EnqueueInstance(pagingLogger5.Object); hc.EnqueueInstance(actionRunner1 as IActionRunner); hc.EnqueueInstance(actionRunner2 as IActionRunner); hc.SetSingleton(jobServerQueue.Object); var jobContext = new Runner.Worker.ExecutionContext(); jobContext.Initialize(hc); // Act. jobContext.InitializeJob(jobRequest, CancellationToken.None); var action1 = jobContext.CreateChild(Guid.NewGuid(), "action_1", "action_1", null, null); action1.IntraActionState["state"] = "1"; var action2 = jobContext.CreateChild(Guid.NewGuid(), "action_2", "action_2", null, null); action2.IntraActionState["state"] = "2"; var postRunner1 = hc.CreateService <IActionRunner>(); postRunner1.Action = new Pipelines.ActionStep() { Name = "post1", DisplayName = "Test 1", Reference = new Pipelines.RepositoryPathReference() { Name = "actions/action" } }; postRunner1.Stage = ActionRunStage.Post; postRunner1.Condition = "always()"; postRunner1.DisplayName = "post1"; var postRunner2 = hc.CreateService <IActionRunner>(); postRunner2.Action = new Pipelines.ActionStep() { Name = "post2", DisplayName = "Test 2", Reference = new Pipelines.RepositoryPathReference() { Name = "actions/action" } }; postRunner2.Stage = ActionRunStage.Post; postRunner2.Condition = "always()"; postRunner2.DisplayName = "post2"; action1.RegisterPostJobStep("post1", postRunner1); action2.RegisterPostJobStep("post2", postRunner2); Assert.NotNull(jobContext.JobSteps); Assert.NotNull(jobContext.PostJobSteps); Assert.Null(action1.JobSteps); Assert.Null(action2.JobSteps); Assert.Null(action1.PostJobSteps); Assert.Null(action2.PostJobSteps); var post1 = jobContext.PostJobSteps.Pop(); var post2 = jobContext.PostJobSteps.Pop(); Assert.Equal("post2", (post1 as IActionRunner).Action.Name); Assert.Equal("post1", (post2 as IActionRunner).Action.Name); Assert.Equal(ActionRunStage.Post, (post1 as IActionRunner).Stage); Assert.Equal(ActionRunStage.Post, (post2 as IActionRunner).Stage); Assert.Equal("always()", (post1 as IActionRunner).Condition); Assert.Equal("always()", (post2 as IActionRunner).Condition); Assert.Equal("2", (post1 as IActionRunner).ExecutionContext.IntraActionState["state"]); Assert.Equal("1", (post2 as IActionRunner).ExecutionContext.IntraActionState["state"]); } }