public void MultiPassResolutionDoesNotIntroduceConflictingRequirements() { var a = new Service { ProjectName = "Test", ServiceName = "A", DesiredLevel = ServiceDesiredLevel.Recommended, Requires = new List<string> { "Test/B" }, }; var b = new Service { ProjectName = "Test", ServiceName = "B", }; var c = new Service { ProjectName = "Test", ServiceName = "C", Conflicts = new List<string> { "Test/A", "Test/B" }, }; var services = new List<Service> { a, b, c }; var manager = new ServiceManager("Windows"); manager.EnableService("Test/C"); manager.EnableDefaultAndExplicitServices(services); // This should not throw an exception. var enabled = manager.ResolveServices(services); Assert.DoesNotContain(a, enabled); Assert.DoesNotContain(b, enabled); Assert.Contains(c, enabled); }
private List<Service> LoadServices(List<XmlDocument> documents) { var services = new List<Service>(); foreach (var doc in documents) { if (doc.DocumentElement == null) { continue; } // Add project default service. This is used to enable service-aware projects // based on <Reference> tags. var defaultService = new Service { ProjectName = doc.DocumentElement.GetAttribute("Name"), DesiredLevel = ServiceDesiredLevel.Unused }; services.Add(defaultService); var declaredServices = doc.DocumentElement.ChildNodes.OfType<XmlElement>() .FirstOrDefault( x => string.Equals(x.Name, "Services", StringComparison.InvariantCultureIgnoreCase)); if (declaredServices != null) { services.AddRange( declaredServices.ChildNodes.OfType<XmlElement>() .Where(x => string.Equals(x.Name, "Service", StringComparison.InvariantCultureIgnoreCase)) .Where(this.ContainsActivePlatform) .Select( serviceElement => new Service { Declaration = serviceElement, ProjectName = doc.DocumentElement.GetAttribute("Name"), ServiceName = serviceElement.GetAttribute("Name"), Requires = { defaultService.FullName }, DesiredLevel = ServiceDesiredLevel.Unused })); } var declaredDependencies = doc.DocumentElement.ChildNodes.OfType<XmlElement>() .FirstOrDefault( x => string.Equals(x.Name, "Dependencies", StringComparison.InvariantCultureIgnoreCase)); if (declaredDependencies != null) { foreach (var usage in declaredDependencies.ChildNodes.OfType<XmlElement>().Where(x => x.Name == "Uses")) { if (this.ContainsActivePlatform(usage)) { defaultService.Requires.Add( this.AbsolutizeServiceReference( doc.DocumentElement.GetAttribute("Name"), usage.GetAttribute("Name"))); } } foreach (var usage in declaredDependencies.ChildNodes.OfType<XmlElement>().Where(x => x.Name == "Recommends")) { if (this.ContainsActivePlatform(usage)) { defaultService.Recommends.Add( this.AbsolutizeServiceReference( doc.DocumentElement.GetAttribute("Name"), usage.GetAttribute("Name"))); } } } } return services; }
private static List<XmlElement> SelectElementsFromService(Service service, string name) { return service.Declaration.ChildNodes.OfType<XmlElement>() .Where(x => string.Equals(x.Name, name)) .ToList(); }