Esempio n. 1
0
        async ValueTask <int> RunProject(
            XunitProject project,
            _IMessageSink reporterMessageHandler)
        {
            XElement?assembliesElement = null;
            var      clockTime         = Stopwatch.StartNew();
            var      xmlTransformers   = TransformFactory.GetXmlTransformers(project);
            var      needsXml          = xmlTransformers.Count > 0;

            if (needsXml)
            {
                assembliesElement = new XElement("assemblies");
            }

            var originalWorkingFolder = Directory.GetCurrentDirectory();

            var assembly        = project.Assemblies.Single();
            var assemblyElement = await ExecuteAssembly(
                assembly,
                needsXml,
                reporterMessageHandler
                );

            if (assemblyElement != null)
            {
                assembliesElement?.Add(assemblyElement);
            }

            clockTime.Stop();

            if (assembliesElement != null)
            {
                assembliesElement.Add(new XAttribute("timestamp", DateTime.Now.ToString(CultureInfo.InvariantCulture)));
            }

            testExecutionSummaries.ElapsedClockTime = clockTime.Elapsed;
            reporterMessageHandler.OnMessage(testExecutionSummaries);

            Directory.SetCurrentDirectory(originalWorkingFolder);

            if (assembliesElement != null)
            {
                xmlTransformers.ForEach(transformer => transformer(assembliesElement));
            }

            return(failed ? 1 : testExecutionSummaries.SummariesByAssemblyUniqueID.Sum(s => s.Summary.Failed + s.Summary.Errors));
        }
Esempio n. 2
0
        async ValueTask <int> RunProject(
            XunitProject project,
            _IMessageSink reporterMessageHandler)
        {
            XElement?assembliesElement = null;
            var      clockTime         = Stopwatch.StartNew();
            var      xmlTransformers   = TransformFactory.GetXmlTransformers(project);
            var      needsXml          = xmlTransformers.Count > 0;
            // TODO: Parallelize the ones that will parallelize, and then run the rest sequentially?
            var parallelizeAssemblies = project.All(assembly => assembly.Configuration.ParallelizeAssemblyOrDefault);

            if (needsXml)
            {
                assembliesElement = new XElement("assemblies");
            }

            var originalWorkingFolder = Directory.GetCurrentDirectory();

            if (parallelizeAssemblies)
            {
                var tasks = project.Assemblies.Select(
                    assembly => Task.Run(
                        () => ExecuteAssembly(
                            assembly,
                            needsXml,
                            reporterMessageHandler
                            ).AsTask()
                        )
                    );

                var results = Task.WhenAll(tasks).GetAwaiter().GetResult();
                foreach (var assemblyElement in results.WhereNotNull())
                {
                    assembliesElement?.Add(assemblyElement);
                }
            }
            else
            {
                foreach (var assembly in project.Assemblies)
                {
                    var assemblyElement = await ExecuteAssembly(
                        assembly,
                        needsXml,
                        reporterMessageHandler
                        );

                    if (assemblyElement != null)
                    {
                        assembliesElement?.Add(assemblyElement);
                    }
                }
            }

            clockTime.Stop();

            if (assembliesElement != null)
            {
                assembliesElement.Add(new XAttribute("timestamp", DateTime.Now.ToString(CultureInfo.InvariantCulture)));
            }

            if (completionMessages.Count > 0)
            {
                var summaries = new TestExecutionSummaries {
                    ElapsedClockTime = clockTime.Elapsed
                };
                foreach (var completionMessage in completionMessages.OrderBy(kvp => kvp.Key))
                {
                    summaries.Add(completionMessage.Key, completionMessage.Value);
                }
                reporterMessageHandler.OnMessage(summaries);
            }

            Directory.SetCurrentDirectory(originalWorkingFolder);

            if (assembliesElement != null)
            {
                xmlTransformers.ForEach(transformer => transformer(assembliesElement));
            }

            return(failed ? 1 : completionMessages.Values.Sum(summary => summary.Failed + summary.Errors));
        }