using GitHub.Runner.Worker; using GitHub.Runner.Worker.Container; using Xunit; using Moq; using GitHub.Runner.Worker.Container.ContainerHooks; using System.Threading.Tasks; using System.Collections.Generic; using System.Runtime.CompilerServices; using GitHub.DistributedTask.WebApi; using System; namespace GitHub.Runner.Common.Tests.Worker { public sealed class ContainerOperationProviderL0 { private TestHostContext _hc; private Mock _ec; private Mock _dockerManager; private Mock _containerHookManager; private ContainerOperationProvider containerOperationProvider; private Mock serverQueue; private Mock pagingLogger; private List healthyDockerStatus = new() { "healthy" }; private List emptyDockerStatus = new() { string.Empty }; private List unhealthyDockerStatus = new() { "unhealthy" }; private List dockerLogs = new() { "log1", "log2", "log3" }; List containers = new(); [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] public async void RunServiceContainersHealthcheck_UnhealthyServiceContainer_AssertFailedTask() { //Arrange Setup(); _dockerManager.Setup(x => x.DockerInspect(_ec.Object, It.IsAny(), It.IsAny())).Returns(Task.FromResult(unhealthyDockerStatus)); //Act try { await containerOperationProvider.RunContainersHealthcheck(_ec.Object, containers); } catch (InvalidOperationException) { //Assert Assert.Equal(TaskResult.Failed, _ec.Object.Result ?? TaskResult.Failed); } } [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] public async void RunServiceContainersHealthcheck_UnhealthyServiceContainer_AssertExceptionThrown() { //Arrange Setup(); _dockerManager.Setup(x => x.DockerInspect(_ec.Object, It.IsAny(), It.IsAny())).Returns(Task.FromResult(unhealthyDockerStatus)); //Act and Assert await Assert.ThrowsAsync(() => containerOperationProvider.RunContainersHealthcheck(_ec.Object, containers)); } [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] public async void RunServiceContainersHealthcheck_healthyServiceContainer_AssertSucceededTask() { //Arrange Setup(); _dockerManager.Setup(x => x.DockerInspect(_ec.Object, It.IsAny(), It.IsAny())).Returns(Task.FromResult(healthyDockerStatus)); //Act await containerOperationProvider.RunContainersHealthcheck(_ec.Object, containers); //Assert Assert.Equal(TaskResult.Succeeded, _ec.Object.Result ?? TaskResult.Succeeded); } [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] public async void RunServiceContainersHealthcheck_healthyServiceContainerWithoutHealthcheck_AssertSucceededTask() { //Arrange Setup(); _dockerManager.Setup(x => x.DockerInspect(_ec.Object, It.IsAny(), It.IsAny())).Returns(Task.FromResult(emptyDockerStatus)); //Act await containerOperationProvider.RunContainersHealthcheck(_ec.Object, containers); //Assert Assert.Equal(TaskResult.Succeeded, _ec.Object.Result ?? TaskResult.Succeeded); } private void Setup([CallerMemberName] string testName = "") { containers.Add(new ContainerInfo() { ContainerImage = "ubuntu:16.04" }); _hc = new TestHostContext(this, testName); _ec = new Mock(); serverQueue = new Mock(); pagingLogger = new Mock(); _dockerManager = new Mock(); _containerHookManager = new Mock(); containerOperationProvider = new ContainerOperationProvider(); _hc.SetSingleton(_dockerManager.Object); _hc.SetSingleton(serverQueue.Object); _hc.SetSingleton(pagingLogger.Object); _hc.SetSingleton(_dockerManager.Object); _hc.SetSingleton(_containerHookManager.Object); _ec.Setup(x => x.Global).Returns(new GlobalContext()); containerOperationProvider.Initialize(_hc); } } }