GeezerVison is showing github.com — test_runner: improve code coverage cleanup · nodejs/node@de73d1e
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: lib/internal/test_runner/coverage.js +24-16Lines changed: 24 additions & 16 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -23,6 +23,7 @@ const { | 23 | 23 | mkdtempSync, | 24 | 24 | opendirSync, | 25 | 25 | readFileSync, | | 26 | + rmSync, | 26 | 27 | } = require('fs'); | 27 | 28 | const { setupCoverageHooks } = require('internal/util'); | 28 | 29 | const { tmpdir } = require('os'); | @@ -272,28 +273,35 @@ class TestCoverage { | 272 | 273 | cleanup() { | 273 | 274 | // Restore the original value of process.env.NODE_V8_COVERAGE. Then, copy | 274 | 275 | // all of the created coverage files to the original coverage directory. | | 276 | + internalBinding('profiler').endCoverage(); | | 277 | + | 275 | 278 | if (this.originalCoverageDirectory === undefined) { | 276 | 279 | delete process.env.NODE_V8_COVERAGE; | 277 | | - return; | 278 | | - } | 279 | | - | 280 | | - process.env.NODE_V8_COVERAGE = this.originalCoverageDirectory; | 281 | | - let dir; | | 280 | + } else { | | 281 | + process.env.NODE_V8_COVERAGE = this.originalCoverageDirectory; | | 282 | + let dir; | 282 | 283 |
| 283 | | - try { | 284 | | - mkdirSync(this.originalCoverageDirectory, { __proto__: null, recursive: true }); | 285 | | - dir = opendirSync(this.coverageDirectory); | | 284 | + try { | | 285 | + mkdirSync(this.originalCoverageDirectory, { __proto__: null, recursive: true }); | | 286 | + dir = opendirSync(this.coverageDirectory); | 286 | 287 |
| 287 | | - for (let entry; (entry = dir.readSync()) !== null;) { | 288 | | - const src = join(this.coverageDirectory, entry.name); | 289 | | - const dst = join(this.originalCoverageDirectory, entry.name); | 290 | | - copyFileSync(src, dst); | 291 | | - } | 292 | | - } finally { | 293 | | - if (dir) { | 294 | | - dir.closeSync(); | | 288 | + for (let entry; (entry = dir.readSync()) !== null;) { | | 289 | + const src = join(this.coverageDirectory, entry.name); | | 290 | + const dst = join(this.originalCoverageDirectory, entry.name); | | 291 | + copyFileSync(src, dst); | | 292 | + } | | 293 | + } finally { | | 294 | + if (dir) { | | 295 | + dir.closeSync(); | | 296 | + } | 295 | 297 | } | 296 | 298 | } | | 299 | + | | 300 | + try { | | 301 | + rmSync(this.coverageDirectory, { __proto__: null, recursive: true }); | | 302 | + } catch { | | 303 | + // Ignore cleanup errors. | | 304 | + } | 297 | 305 | } | 298 | 306 |
| 299 | 307 | getCoverageFromDirectory() { | |
Collapse file Copy file name to clipboardExpand all lines: lib/internal/test_runner/harness.js +7-4Lines changed: 7 additions & 4 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -159,12 +159,15 @@ function collectCoverage(rootTest, coverage) { | 159 | 159 |
| 160 | 160 | try { | 161 | 161 | summary = coverage.summary(); | 162 | | - coverage.cleanup(); | 163 | 162 | } catch (err) { | 164 | | - const op = summary ? 'clean up' : 'report'; | 165 | | - const msg = `Warning: Could not ${op} code coverage. ${err}`; | | 163 | + rootTest.diagnostic(`Warning: Could not report code coverage. ${err}`); | | 164 | + process.exitCode = kGenericUserError; | | 165 | + } | 166 | 166 |
| 167 | | - rootTest.diagnostic(msg); | | 167 | + try { | | 168 | + coverage.cleanup(); | | 169 | + } catch (err) { | | 170 | + rootTest.diagnostic(`Warning: Could not clean up code coverage. ${err}`); | 168 | 171 | process.exitCode = kGenericUserError; | 169 | 172 | } | 170 | 173 |
| |
Collapse file Copy file name to clipboardExpand all lines: src/inspector_profiler.cc +17Lines changed: 17 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -556,6 +556,21 @@ static void StopCoverage(const FunctionCallbackInfo<Value>& args) { | 556 | 556 | } | 557 | 557 | } | 558 | 558 |
| | 559 | +static void EndCoverage(const FunctionCallbackInfo<Value>& args) { | | 560 | + Environment* env = Environment::GetCurrent(args); | | 561 | + V8CoverageConnection* connection = env->coverage_connection(); | | 562 | + | | 563 | + Debug(env, | | 564 | + DebugCategory::INSPECTOR_PROFILER, | | 565 | + "EndCoverage, connection %s nullptr\n", | | 566 | + connection == nullptr ? "==" : "!="); | | 567 | + | | 568 | + if (connection != nullptr) { | | 569 | + Debug(env, DebugCategory::INSPECTOR_PROFILER, "Ending coverage\n"); | | 570 | + connection->End(); | | 571 | + } | | 572 | +} | | 573 | + | 559 | 574 | static void Initialize(Local<Object> target, | 560 | 575 | Local<Value> unused, | 561 | 576 | Local<Context> context, | @@ -565,13 +580,15 @@ static void Initialize(Local<Object> target, | 565 | 580 | context, target, "setSourceMapCacheGetter", SetSourceMapCacheGetter); | 566 | 581 | SetMethod(context, target, "takeCoverage", TakeCoverage); | 567 | 582 | SetMethod(context, target, "stopCoverage", StopCoverage); | | 583 | + SetMethod(context, target, "endCoverage", EndCoverage); | 568 | 584 | } | 569 | 585 |
| 570 | 586 | void RegisterExternalReferences(ExternalReferenceRegistry* registry) { | 571 | 587 | registry->Register(SetCoverageDirectory); | 572 | 588 | registry->Register(SetSourceMapCacheGetter); | 573 | 589 | registry->Register(TakeCoverage); | 574 | 590 | registry->Register(StopCoverage); | | 591 | + registry->Register(EndCoverage); | 575 | 592 | } | 576 | 593 |
| 577 | 594 | } // namespace profiler | |
|