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);
        }
示例#2
0
        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;
        }
示例#3
0
 private static List<XmlElement> SelectElementsFromService(Service service, string name)
 {
     return service.Declaration.ChildNodes.OfType<XmlElement>()
         .Where(x => string.Equals(x.Name, name))
         .ToList();
 }