Beispiel #1
0
        public async Task <IEnumerable <CoverageFile> > ParseSourceFiles()
        {
            return(await coverageFileBuilder.Build(await options.Lcov.SelectMany(ParseFile)));

            async Task <IEnumerable <FileCoverageData> > ParseFile(string fileName)
            {
                var fileInfo = fileProvider.GetFileInfo(fileName);

                if (!fileInfo.Exists)
                {
                    throw new PublishCoverallsException($"{fileName} was not found when parsing lcov report");
                }

                var lines = await fileInfo.ReadAllLines();

                {
                    FileCoverageDataBuilder coverageBuilder = null;
                    var files = new List <FileCoverageData>();
                    foreach (var line in lines)
                    {
                        var matches = Regex.Match(line, "^SF:(.*)");
                        if (matches.Success)
                        {
                            coverageBuilder = new FileCoverageDataBuilder(matches.Groups[1].Value);
                            continue;
                        }
                        matches = Regex.Match(line, @"^DA:(\d+),(\d+)");
                        if (matches.Success)
                        {
                            if (coverageBuilder != null)
                            {
                                var lineNumber     = int.Parse(matches.Groups[1].Value);
                                var coverageNumber = int.Parse(matches.Groups[2].Value);
                                coverageBuilder.RecordCoverage(lineNumber, coverageNumber);
                            }
                            continue;
                        }
                        if (line.Equals("end_of_record"))
                        {
                            if (coverageBuilder != null)
                            {
                                files.Add(coverageBuilder.CreateFile());
                                coverageBuilder = null;
                            }
                        }
                    }
                    return(files);
                }
            }
        }
Beispiel #2
0
        public async Task <IEnumerable <CoverageFile> > ParseSourceFiles()
        {
            return(await coverageFileBuilder.Build(await options.VsCoverage.SelectMany(ParseFile)));

            async Task <IEnumerable <FileCoverageData> > ParseFile(string fileName)
            {
                var fileInfo = fileProvider.GetFileInfo(fileName);

                if (!fileInfo.Exists)
                {
                    throw new PublishCoverallsException($"{fileName} was not found when parsing visual studio coverage");
                }

                var document = await fileInfo.ReadXml();

                if (document.Root == null)
                {
                    return(Enumerable.Empty <FileCoverageData>());
                }

                var builderBySourceId = new Dictionary <string, FileCoverageDataBuilder>();
                var builders          = new List <FileCoverageDataBuilder>();

                foreach (var sourceFile in document.Root.Elements("SourceFileNames"))
                {
                    var idElement       = sourceFile.Element("SourceFileID");
                    var fileNameElement = sourceFile.Element("SourceFileName");
                    if (idElement != null && fileNameElement != null)
                    {
                        var builder = new FileCoverageDataBuilder(fileNameElement.Value);
                        builderBySourceId.Add(idElement.Value, builder);
                        builders.Add(builder);
                    }
                }

                foreach (var module in document.Root.Elements("Module"))
                {
                    var namespaceTable = module.Element("NamespaceTable");
                    if (namespaceTable == null)
                    {
                        continue;
                    }

                    foreach (var lines in namespaceTable.Elements("Class")
                             .Elements("Method")
                             .Elements("Lines"))
                    {
                        var sourceFileIdElement    = lines.Element("SourceFileID");
                        var sourceStartLineElement = lines.Element("LnStart");
                        var sourceEndLineElement   = lines.Element("LnEnd");
                        var coveredElement         = lines.Element("Coverage");

                        if (sourceFileIdElement == null ||
                            sourceStartLineElement == null ||
                            sourceEndLineElement == null ||
                            coveredElement == null ||
                            !builderBySourceId.TryGetValue(sourceFileIdElement.Value, out var coverageBuilder))
                        {
                            continue;
                        }

                        var sourceStartLine = int.Parse(sourceStartLineElement.Value);
                        var sourceEndLine   = int.Parse(sourceEndLineElement.Value);

                        // A value of 2 means completely covered
                        var covered = coveredElement.Value == "2";

                        for (var lineNumber = sourceStartLine; lineNumber <= sourceEndLine; lineNumber++)
                        {
                            coverageBuilder.RecordCoverage(lineNumber, covered ? 1 : 0);
                        }
                    }
                }

                return(builders.Select(b => b.CreateFile()));
            }
        }
Beispiel #3
0
        public async Task <IEnumerable <CoverageFile> > ParseSourceFiles()
        {
            return(await coverageFileBuilder.Build(await options.OpenCover.SelectMany(ParseFile)));

            async Task <IEnumerable <FileCoverageData> > ParseFile(string fileName)
            {
                var fileInfo = fileProvider.GetFileInfo(fileName);

                if (!fileInfo.Exists)
                {
                    throw new PublishCoverallsException($"{fileName} was not found when parsing open cover report");
                }

                var document = await fileInfo.ReadXml();

                if (document.Root == null)
                {
                    return(Enumerable.Empty <FileCoverageData>());
                }

                var files    = new List <FileCoverageData>();
                var xElement = document.Root?.Element("Modules");

                if (xElement != null)
                {
                    foreach (var module in xElement.Elements("Module"))
                    {
                        var attribute = module.Attribute("skippedDueTo");
                        if (string.IsNullOrEmpty(attribute?.Value))
                        {
                            var filesElement = module.Element("Files");
                            if (filesElement != null)
                            {
                                foreach (var file in filesElement.Elements("File"))
                                {
                                    var fileid   = file.Attribute("uid")?.Value;
                                    var fullPath = file.Attribute("fullPath")?.Value;

                                    var coverageBuilder = new FileCoverageDataBuilder(fullPath);

                                    var classesElement = module.Element("Classes");
                                    if (classesElement != null)
                                    {
                                        foreach (var @class in classesElement.Elements("Class"))
                                        {
                                            var methods = @class.Element("Methods");
                                            if (methods != null)
                                            {
                                                foreach (var method in methods.Elements("Method"))
                                                {
                                                    var sequencePointsElement = method.Element("SequencePoints");
                                                    if (sequencePointsElement != null)
                                                    {
                                                        foreach (
                                                            var sequencePoint in
                                                            sequencePointsElement.Elements("SequencePoint"))
                                                        {
                                                            var sequenceFileid = sequencePoint.Attribute("fileid").Value;
                                                            if (fileid == sequenceFileid)
                                                            {
                                                                var sourceLine =
                                                                    int.Parse(sequencePoint.Attribute("sl").Value);
                                                                var visitCount =
                                                                    int.Parse(sequencePoint.Attribute("vc").Value);

                                                                coverageBuilder.RecordCoverage(sourceLine, visitCount);
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    files.Add(coverageBuilder.CreateFile());
                                }
                            }
                        }
                    }
                }

                return(files);
            }
        }
Beispiel #4
0
        public async Task <IEnumerable <CoverageFile> > ParseSourceFiles()
        {
            return(await coverageFileBuilder.Build(await options.DynamicCodeCoverage.SelectMany(ParseFile)));

            async Task <IEnumerable <FileCoverageData> > ParseFile(string fileName)
            {
                var fileInfo = fileProvider.GetFileInfo(fileName);

                if (!fileInfo.Exists)
                {
                    throw new PublishCoverallsException($"{fileName} was not found when parsing dynamic coverage");
                }

                var document = await fileInfo.ReadXml();

                var files    = new List <FileCoverageData>();
                var xElement = document.Root?.Element("modules");

                if (xElement != null)
                {
                    foreach (var module in xElement.Elements("module"))
                    {
                        var filesElement = module.Element("source_files");
                        if (filesElement != null)
                        {
                            foreach (var file in filesElement.Elements("source_file"))
                            {
                                var fileid   = file.Attribute("id").Value;
                                var fullPath = file.Attribute("path").Value;

                                var coverageBuilder = new FileCoverageDataBuilder(fullPath);

                                var classesElement = module.Element("functions");
                                if (classesElement != null)
                                {
                                    foreach (var @class in classesElement.Elements("function"))
                                    {
                                        var ranges = @class.Element("ranges");
                                        if (ranges != null)
                                        {
                                            foreach (var range in ranges.Elements("range"))
                                            {
                                                var rangeFileId = range.Attribute("source_id").Value;
                                                if (fileid == rangeFileId)
                                                {
                                                    var sourceStartLine = int.Parse(range.Attribute("start_line").Value);
                                                    var sourceEndLine   = int.Parse(range.Attribute("end_line").Value);
                                                    var covered         = range.Attribute("covered").Value == "yes";

                                                    foreach (
                                                        var lineNumber in
                                                        Enumerable.Range(sourceStartLine,
                                                                         sourceEndLine - sourceStartLine + 1))
                                                    {
                                                        coverageBuilder.RecordCoverage(lineNumber, covered ? 1 : 0);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }

                                files.Add(coverageBuilder.CreateFile());
                            }
                        }
                    }
                }

                return(files);
            }
        }