public void PrepareModules() { string[] modules = InstrumentationHelper.GetCoverableModules(_module, _includeDirectories); string[] excludes = InstrumentationHelper.GetExcludedFiles(_excludedSourceFiles); _excludeFilters = _excludeFilters?.Where(f => InstrumentationHelper.IsValidFilterExpression(f)).ToArray(); _includeFilters = _includeFilters?.Where(f => InstrumentationHelper.IsValidFilterExpression(f)).ToArray(); foreach (var module in modules) { if (InstrumentationHelper.IsModuleExcluded(module, _excludeFilters) || !InstrumentationHelper.IsModuleIncluded(module, _includeFilters)) { continue; } var instrumenter = new Instrumenter(module, _identifier, _excludeFilters, _includeFilters, excludes, _excludeAttributes); if (instrumenter.CanInstrument()) { InstrumentationHelper.BackupOriginalModule(module, _identifier); // Guard code path and restore if instrumentation fails. try { var result = instrumenter.Instrument(); _results.Add(result); } catch (Exception) { // TODO: With verbose logging we should note that instrumentation failed. InstrumentationHelper.RestoreOriginalModule(module, _identifier); } } } }
public void PrepareModules() { string[] modules = InstrumentationHelper.GetCoverableModules(_module, _includeDirectories); string[] excludes = InstrumentationHelper.GetExcludedFiles(_excludedSourceFiles); _excludeFilters = _excludeFilters?.Where(f => InstrumentationHelper.IsValidFilterExpression(f)).ToArray(); _includeFilters = _includeFilters?.Where(f => InstrumentationHelper.IsValidFilterExpression(f)).ToArray(); foreach (var module in modules) { if (InstrumentationHelper.IsModuleExcluded(module, _excludeFilters) || !InstrumentationHelper.IsModuleIncluded(module, _includeFilters)) { continue; } var instrumenter = new Instrumenter(module, _identifier, _excludeFilters, _includeFilters, excludes, _excludeAttributes, _singleHit); if (instrumenter.CanInstrument()) { InstrumentationHelper.BackupOriginalModule(module, _identifier); // Guard code path and restore if instrumentation fails. try { var result = instrumenter.Instrument(); _results.Add(result); } catch (Exception ex) { _logger.LogWarning($"Unable to instrument module: {module} because : {ex.Message}"); InstrumentationHelper.RestoreOriginalModule(module, _identifier); } } } }
public void PrepareModules() { string[] modules = InstrumentationHelper.GetCoverableModules(_module, _includeDirectories); string[] excludes = InstrumentationHelper.GetExcludedFiles(_excludedSourceFiles); _excludeFilters = _excludeFilters?.Where(f => InstrumentationHelper.IsValidFilterExpression(f)).ToArray(); _includeFilters = _includeFilters?.Where(f => InstrumentationHelper.IsValidFilterExpression(f)).ToArray(); foreach (var module in modules) { if (InstrumentationHelper.IsModuleExcluded(module, _excludeFilters) || !InstrumentationHelper.IsModuleIncluded(module, _includeFilters)) { continue; } var instrumenter = new Instrumenter(module, _identifier, _excludeFilters, _includeFilters, excludes, _excludeAttributes); if (instrumenter.CanInstrument()) { InstrumentationHelper.BackupOriginalModule(module, _identifier); // Guard code path and restore if instrumentation fails. try { var result = instrumenter.Instrument(); _results.Add(result); } catch (Exception) { // TODO: With verbose logging we should note that instrumentation failed. InstrumentationHelper.RestoreOriginalModule(module, _identifier); } } } foreach (var result in _results) { var size = (result.HitCandidates.Count + ModuleTrackerTemplate.HitsResultHeaderSize) * sizeof(int); MemoryMappedFile mmap; try { // Try using a named memory map not backed by a file (currently only supported on Windows) mmap = MemoryMappedFile.CreateNew(result.HitsResultGuid, size); } catch (PlatformNotSupportedException) { // Fall back on a file-backed memory map mmap = MemoryMappedFile.CreateFromFile(result.HitsFilePath, FileMode.CreateNew, null, size); } _resultMemoryMaps.Add(result.HitsResultGuid, mmap); } }
public CoverageResult GetCoverageResult() { CalculateCoverage(); Modules modules = new Modules(); foreach (var result in _results) { Documents documents = new Documents(); foreach (var doc in result.Documents) { foreach (var line in doc.Lines) { if (documents.TryGetValue(doc.Path, out Classes classes)) { if (classes.TryGetValue(line.Class, out Methods methods)) { if (methods.TryGetValue(line.Method, out Lines lines)) { documents[doc.Path][line.Class][line.Method].Add(line.Number, line.Hits); } else { documents[doc.Path][line.Class].Add(line.Method, new Lines()); documents[doc.Path][line.Class][line.Method].Add(line.Number, line.Hits); } } else { documents[doc.Path].Add(line.Class, new Methods()); documents[doc.Path][line.Class].Add(line.Method, new Lines()); documents[doc.Path][line.Class][line.Method].Add(line.Number, line.Hits); } } else { documents.Add(doc.Path, new Classes()); documents[doc.Path].Add(line.Class, new Methods()); documents[doc.Path][line.Class].Add(line.Method, new Lines()); documents[doc.Path][line.Class][line.Method].Add(line.Number, line.Hits); } } } modules.Add(result.ModulePath, documents); InstrumentationHelper.RestoreOriginalModule(result.ModulePath, _identifier); } return(new CoverageResult { Identifier = _identifier, Modules = modules }); }
public CoveragePrepareResult PrepareModules() { string[] modules = InstrumentationHelper.GetCoverableModules(_module, _includeDirectories, _includeTestAssembly); string[] excludes = InstrumentationHelper.GetExcludedFiles(_excludedSourceFiles); Array.ForEach(_excludeFilters ?? Array.Empty <string>(), filter => _logger.LogVerbose($"Excluded module filter '{filter}'")); Array.ForEach(_includeFilters ?? Array.Empty <string>(), filter => _logger.LogVerbose($"Included module filter '{filter}'")); Array.ForEach(excludes ?? Array.Empty <string>(), filter => _logger.LogVerbose($"Excluded source files '{filter}'")); _excludeFilters = _excludeFilters?.Where(f => InstrumentationHelper.IsValidFilterExpression(f)).ToArray(); _includeFilters = _includeFilters?.Where(f => InstrumentationHelper.IsValidFilterExpression(f)).ToArray(); foreach (var module in modules) { if (InstrumentationHelper.IsModuleExcluded(module, _excludeFilters) || !InstrumentationHelper.IsModuleIncluded(module, _includeFilters)) { _logger.LogVerbose($"Excluded module: '{module}'"); continue; } var instrumenter = new Instrumenter(module, _identifier, _excludeFilters, _includeFilters, excludes, _excludeAttributes, _singleHit, _logger); if (instrumenter.CanInstrument()) { InstrumentationHelper.BackupOriginalModule(module, _identifier); // Guard code path and restore if instrumentation fails. try { var result = instrumenter.Instrument(); _results.Add(result); _logger.LogVerbose($"Instrumented module: '{module}'"); } catch (Exception ex) { _logger.LogWarning($"Unable to instrument module: {module} because : {ex.Message}"); InstrumentationHelper.RestoreOriginalModule(module, _identifier); } } } return(new CoveragePrepareResult() { Identifier = _identifier, Module = _module, MergeWith = _mergeWith, UseSourceLink = _useSourceLink, Results = _results.ToArray() }); }
public CoverageResult GetCoverageResult() { CalculateCoverage(); Modules modules = new Modules(); foreach (var result in _results) { Documents documents = new Documents(); foreach (var doc in result.Documents.Values) { // Construct Line Results foreach (var line in doc.Lines.Values) { if (documents.TryGetValue(doc.Path, out Classes classes)) { if (classes.TryGetValue(line.Class, out Methods methods)) { if (methods.TryGetValue(line.Method, out Method method)) { documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } else { documents[doc.Path][line.Class].Add(line.Method, new Method()); documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } } else { documents[doc.Path].Add(line.Class, new Methods()); documents[doc.Path][line.Class].Add(line.Method, new Method()); documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } } else { documents.Add(doc.Path, new Classes()); documents[doc.Path].Add(line.Class, new Methods()); documents[doc.Path][line.Class].Add(line.Method, new Method()); documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } } // Construct Branch Results foreach (var branch in doc.Branches.Values) { if (documents.TryGetValue(doc.Path, out Classes classes)) { if (classes.TryGetValue(branch.Class, out Methods methods)) { if (methods.TryGetValue(branch.Method, out Method method)) { method.Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } else { documents[doc.Path][branch.Class].Add(branch.Method, new Method()); documents[doc.Path][branch.Class][branch.Method].Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } } else { documents[doc.Path].Add(branch.Class, new Methods()); documents[doc.Path][branch.Class].Add(branch.Method, new Method()); documents[doc.Path][branch.Class][branch.Method].Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } } else { documents.Add(doc.Path, new Classes()); documents[doc.Path].Add(branch.Class, new Methods()); documents[doc.Path][branch.Class].Add(branch.Method, new Method()); documents[doc.Path][branch.Class][branch.Method].Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } } } modules.Add(result.ModulePath, documents); InstrumentationHelper.RestoreOriginalModule(result.ModulePath, _identifier); } var coverageResult = new CoverageResult { Identifier = _identifier, Modules = modules }; if (!string.IsNullOrEmpty(_mergeWith) && !string.IsNullOrWhiteSpace(_mergeWith)) { string json = File.ReadAllText(_mergeWith); coverageResult.Merge(JsonConvert.DeserializeObject <Modules>(json)); } return(coverageResult); }
public CoverageResult GetCoverageResult() { CalculateCoverage(); Modules modules = new Modules(); foreach (var result in _results) { Documents documents = new Documents(); foreach (var doc in result.Documents.Values) { // Construct Line Results foreach (var line in doc.Lines.Values) { if (documents.TryGetValue(doc.Path, out Classes classes)) { if (classes.TryGetValue(line.Class, out Methods methods)) { if (methods.TryGetValue(line.Method, out Method method)) { documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } else { documents[doc.Path][line.Class].Add(line.Method, new Method()); documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } } else { documents[doc.Path].Add(line.Class, new Methods()); documents[doc.Path][line.Class].Add(line.Method, new Method()); documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } } else { documents.Add(doc.Path, new Classes()); documents[doc.Path].Add(line.Class, new Methods()); documents[doc.Path][line.Class].Add(line.Method, new Method()); documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } } // Construct Branch Results foreach (var branch in doc.Branches.Values) { if (documents.TryGetValue(doc.Path, out Classes classes)) { if (classes.TryGetValue(branch.Class, out Methods methods)) { if (methods.TryGetValue(branch.Method, out Method method)) { method.Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } else { documents[doc.Path][branch.Class].Add(branch.Method, new Method()); documents[doc.Path][branch.Class][branch.Method].Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } } else { documents[doc.Path].Add(branch.Class, new Methods()); documents[doc.Path][branch.Class].Add(branch.Method, new Method()); documents[doc.Path][branch.Class][branch.Method].Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } } else { documents.Add(doc.Path, new Classes()); documents[doc.Path].Add(branch.Class, new Methods()); documents[doc.Path][branch.Class].Add(branch.Method, new Method()); documents[doc.Path][branch.Class][branch.Method].Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } } } modules.Add(result.ModulePath, documents); InstrumentationHelper.RestoreOriginalModule(result.ModulePath, _identifier); } return(new CoverageResult { Identifier = _identifier, Modules = modules }); }
public CoverageResult GetCoverageResult() { CalculateCoverage(); Modules modules = new Modules(); foreach (var result in _results) { Documents documents = new Documents(); foreach (var doc in result.Documents.Values) { // Construct Line Results foreach (var line in doc.Lines.Values) { if (documents.TryGetValue(doc.Path, out Classes classes)) { if (classes.TryGetValue(line.Class, out Methods methods)) { if (methods.TryGetValue(line.Method, out Method method)) { documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } else { documents[doc.Path][line.Class].Add(line.Method, new Method()); documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } } else { documents[doc.Path].Add(line.Class, new Methods()); documents[doc.Path][line.Class].Add(line.Method, new Method()); documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } } else { documents.Add(doc.Path, new Classes()); documents[doc.Path].Add(line.Class, new Methods()); documents[doc.Path][line.Class].Add(line.Method, new Method()); documents[doc.Path][line.Class][line.Method].Lines.Add(line.Number, line.Hits); } } // Construct Branch Results foreach (var branch in doc.Branches.Values) { if (documents.TryGetValue(doc.Path, out Classes classes)) { if (classes.TryGetValue(branch.Class, out Methods methods)) { if (methods.TryGetValue(branch.Method, out Method method)) { method.Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } else { documents[doc.Path][branch.Class].Add(branch.Method, new Method()); documents[doc.Path][branch.Class][branch.Method].Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } } else { documents[doc.Path].Add(branch.Class, new Methods()); documents[doc.Path][branch.Class].Add(branch.Method, new Method()); documents[doc.Path][branch.Class][branch.Method].Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } } else { documents.Add(doc.Path, new Classes()); documents[doc.Path].Add(branch.Class, new Methods()); documents[doc.Path][branch.Class].Add(branch.Method, new Method()); documents[doc.Path][branch.Class][branch.Method].Branches.Add(new BranchInfo { Line = branch.Number, Hits = branch.Hits, Offset = branch.Offset, EndOffset = branch.EndOffset, Path = branch.Path, Ordinal = branch.Ordinal } ); } } } modules.Add(Path.GetFileName(result.ModulePath), documents); InstrumentationHelper.RestoreOriginalModule(result.ModulePath, _identifier); } var coverageResult = new CoverageResult { Identifier = _identifier, Modules = modules, InstrumentedResults = _results }; if (!string.IsNullOrEmpty(_mergeWith) && !string.IsNullOrWhiteSpace(_mergeWith) && File.Exists(_mergeWith)) { // Possible concurrency access to merge file between write/read on parallel testing var json = RetryHelper.Do(() => { using (var file = File.Open(_mergeWith, FileMode.Open, FileAccess.Read, FileShare.None)) { using (var reader = new StreamReader(file)) { return(reader.ReadToEnd()); } } }, () => TimeSpan.FromMilliseconds(100), 5); coverageResult.Merge(JsonConvert.DeserializeObject <Modules>(json)); } return(coverageResult); }