using System; using System.Collections.Generic; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using StellaOps.Concelier.Core.Jobs; using StellaOps.Concelier.Connector.Common.Http; using StellaOps.Concelier.Connector.Distro.Alpine; using StellaOps.Concelier.Connector.Distro.Alpine.Configuration; using Xunit; using StellaOps.TestKit; namespace StellaOps.Concelier.Connector.Distro.Alpine.Tests; public sealed class AlpineDependencyInjectionRoutineTests { [Trait("Category", TestCategories.Unit)] [Fact] public void Register_ConfiguresOptionsAndScheduler() { var services = new ServiceCollection(); services.AddLogging(); services.AddOptions(); services.AddSourceCommon(); var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { ["concelier:sources:alpine:baseUri"] = "https://secdb.alpinelinux.org/", ["concelier:sources:alpine:releases:0"] = "v3.20", ["concelier:sources:alpine:repositories:0"] = "main", ["concelier:sources:alpine:maxDocumentsPerFetch"] = "5", ["concelier:sources:alpine:fetchTimeout"] = "00:00:30", ["concelier:sources:alpine:requestDelay"] = "00:00:00.100", ["concelier:sources:alpine:userAgent"] = "StellaOps.Tests.Alpine/1.0" }) .Build(); var routine = new AlpineDependencyInjectionRoutine(); routine.Register(services, configuration); services.Configure(_ => { }); using var provider = services.BuildServiceProvider(validateScopes: true); var options = provider.GetRequiredService>().Value; Assert.Equal(new Uri("https://secdb.alpinelinux.org/"), options.BaseUri); Assert.Equal(new[] { "v3.20" }, options.Releases); Assert.Equal(new[] { "main" }, options.Repositories); Assert.Equal(5, options.MaxDocumentsPerFetch); Assert.Equal(TimeSpan.FromSeconds(30), options.FetchTimeout); Assert.Equal(TimeSpan.FromMilliseconds(100), options.RequestDelay); Assert.Equal("StellaOps.Tests.Alpine/1.0", options.UserAgent); var schedulerOptions = provider.GetRequiredService>().Value; Assert.True(schedulerOptions.Definitions.TryGetValue(AlpineJobKinds.Fetch, out var fetchDefinition)); Assert.True(schedulerOptions.Definitions.TryGetValue(AlpineJobKinds.Parse, out var parseDefinition)); Assert.True(schedulerOptions.Definitions.TryGetValue(AlpineJobKinds.Map, out var mapDefinition)); Assert.Equal(typeof(AlpineFetchJob), fetchDefinition.JobType); Assert.Equal(TimeSpan.FromMinutes(5), fetchDefinition.Timeout); Assert.Equal(TimeSpan.FromMinutes(4), fetchDefinition.LeaseDuration); Assert.Equal("*/30 * * * *", fetchDefinition.CronExpression); Assert.True(fetchDefinition.Enabled); Assert.Equal(typeof(AlpineParseJob), parseDefinition.JobType); Assert.Equal(TimeSpan.FromMinutes(6), parseDefinition.Timeout); Assert.Equal(TimeSpan.FromMinutes(4), parseDefinition.LeaseDuration); Assert.Equal("7,37 * * * *", parseDefinition.CronExpression); Assert.True(parseDefinition.Enabled); Assert.Equal(typeof(AlpineMapJob), mapDefinition.JobType); Assert.Equal(TimeSpan.FromMinutes(8), mapDefinition.Timeout); Assert.Equal(TimeSpan.FromMinutes(4), mapDefinition.LeaseDuration); Assert.Equal("12,42 * * * *", mapDefinition.CronExpression); Assert.True(mapDefinition.Enabled); } }