From ebb0d7272b493365121acf9f258eabcde2a00166 Mon Sep 17 00:00:00 2001 From: Chengzhong Wu Date: Mon, 27 Jul 2026 14:27:49 -0400 Subject: [PATCH 1/2] test: disable trace events tests when perfetto is enabled Signed-off-by: Chengzhong Wu --- benchmark/misc/trace.js | 4 ++-- test/common/index.js | 15 +++++++++++++++ test/parallel/test-inspector-tracing-domain.js | 1 + test/parallel/test-trace-events-all.js | 2 ++ test/parallel/test-trace-events-api.js | 2 ++ .../test-trace-events-async-hooks-dynamic.js | 2 ++ .../test-trace-events-async-hooks-worker.js | 2 ++ test/parallel/test-trace-events-async-hooks.js | 2 ++ test/parallel/test-trace-events-binding.js | 2 ++ test/parallel/test-trace-events-bootstrap.js | 2 ++ test/parallel/test-trace-events-console.js | 2 ++ test/parallel/test-trace-events-dynamic-enable.js | 1 + test/parallel/test-trace-events-environment.js | 2 ++ test/parallel/test-trace-events-file-pattern.js | 2 ++ test/parallel/test-trace-events-fs-async.js | 2 ++ test/parallel/test-trace-events-fs-sync.js | 2 ++ ...st-trace-events-get-category-enabled-buffer.js | 2 ++ test/parallel/test-trace-events-http.js | 2 ++ test/parallel/test-trace-events-metadata.js | 2 ++ .../test-trace-events-net-abstract-socket.js | 1 + test/parallel/test-trace-events-net.js | 2 ++ test/parallel/test-trace-events-none.js | 2 ++ test/parallel/test-trace-events-process-exit.js | 2 ++ test/parallel/test-trace-events-promises.js | 2 ++ test/parallel/test-trace-events-threadpool.js | 2 ++ test/parallel/test-trace-events-v8.js | 2 ++ test/parallel/test-trace-events-vm.js | 2 ++ ...test-trace-events-worker-metadata-with-name.js | 2 ++ .../parallel/test-trace-events-worker-metadata.js | 2 ++ 29 files changed, 68 insertions(+), 2 deletions(-) diff --git a/benchmark/misc/trace.js b/benchmark/misc/trace.js index f308232804352a..077b8bff2c29cf 100644 --- a/benchmark/misc/trace.js +++ b/benchmark/misc/trace.js @@ -14,13 +14,13 @@ const bench = common.createBenchmark(main, { }); const { - TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN: kBeforeEvent, + TRACE_EVENT_PHASE_BEGIN: kBeginEvent, } = common.binding('constants').trace; function doTrace(n, trace) { bench.start(); for (let i = 0; i < n; i++) { - trace(kBeforeEvent, 'foo', 'test', 0, 'test'); + trace(kBeginEvent, 'foo', 'test', 0, 'test'); } bench.end(n); } diff --git a/test/common/index.js b/test/common/index.js index ac0c400581c439..e37b354f8259cf 100755 --- a/test/common/index.js +++ b/test/common/index.js @@ -71,6 +71,7 @@ const hasCrypto = Boolean(process.versions.openssl) && const hasInspector = Boolean(process.features.inspector); const hasSQLite = Boolean(process.versions.sqlite); const hasFFI = Boolean(process.config.variables.node_use_ffi); +const hasPerfetto = Boolean(process.config.variables.v8_use_perfetto); const hasDtls = hasCrypto && !!process.features.dtls; const hasQuic = hasCrypto && !!process.features.quic; @@ -769,6 +770,18 @@ function skipIfFFIMissing() { } } +function skipIfPerfettoEnabled() { + if (hasPerfetto) { + skip('Perfetto is enabled'); + } +} + +function skipIfPerfettoDisabled() { + if (!hasPerfetto) { + skip('Perfetto is disabled'); + } +} + function getArrayBufferViews(buf) { const { buffer, byteOffset, byteLength } = buf; @@ -1047,6 +1060,8 @@ const common = { skipIfInspectorDisabled, skipIfFFIMissing, skipIfSQLiteMissing, + skipIfPerfettoEnabled, + skipIfPerfettoDisabled, spawnPromisified, sleepSync, usesSharedLibrary, diff --git a/test/parallel/test-inspector-tracing-domain.js b/test/parallel/test-inspector-tracing-domain.js index aa31d63a01577d..b9e62a483e8371 100644 --- a/test/parallel/test-inspector-tracing-domain.js +++ b/test/parallel/test-inspector-tracing-domain.js @@ -3,6 +3,7 @@ const common = require('../common'); common.skipIfInspectorDisabled(); +common.skipIfPerfettoEnabled(); const { isMainThread } = require('worker_threads'); diff --git a/test/parallel/test-trace-events-all.js b/test/parallel/test-trace-events-all.js index 9b0549eeb8bef0..107a9ca3a00a03 100644 --- a/test/parallel/test-trace-events-all.js +++ b/test/parallel/test-trace-events-all.js @@ -4,6 +4,8 @@ const assert = require('assert'); const cp = require('child_process'); const fs = require('fs'); +common.skipIfPerfettoEnabled(); + const CODE = 'setTimeout(() => { for (let i = 0; i < 100000; i++) { "test" + i } }, 1)'; diff --git a/test/parallel/test-trace-events-api.js b/test/parallel/test-trace-events-api.js index 9bffb3b78c4ba3..dcbc0ac237e3e2 100644 --- a/test/parallel/test-trace-events-api.js +++ b/test/parallel/test-trace-events-api.js @@ -4,6 +4,8 @@ const common = require('../common'); const { isMainThread } = require('worker_threads'); +common.skipIfPerfettoEnabled(); + if (!isMainThread) { // https://github.com/nodejs/node/issues/22767 common.skip('This test only works on a main thread'); diff --git a/test/parallel/test-trace-events-async-hooks-dynamic.js b/test/parallel/test-trace-events-async-hooks-dynamic.js index 8144632a71381c..b64582633fb00b 100644 --- a/test/parallel/test-trace-events-async-hooks-dynamic.js +++ b/test/parallel/test-trace-events-async-hooks-dynamic.js @@ -10,6 +10,8 @@ try { common.skip('missing trace events'); } +common.skipIfPerfettoEnabled(); + const assert = require('assert'); const cp = require('child_process'); const fs = require('fs'); diff --git a/test/parallel/test-trace-events-async-hooks-worker.js b/test/parallel/test-trace-events-async-hooks-worker.js index 5204a50e3e159c..f4c56653e280ac 100644 --- a/test/parallel/test-trace-events-async-hooks-worker.js +++ b/test/parallel/test-trace-events-async-hooks-worker.js @@ -10,6 +10,8 @@ try { common.skip('missing trace events'); } +common.skipIfPerfettoEnabled(); + const assert = require('assert'); const cp = require('child_process'); const fs = require('fs'); diff --git a/test/parallel/test-trace-events-async-hooks.js b/test/parallel/test-trace-events-async-hooks.js index 90d4fbc8b7aaa0..e81d686c22883e 100644 --- a/test/parallel/test-trace-events-async-hooks.js +++ b/test/parallel/test-trace-events-async-hooks.js @@ -5,6 +5,8 @@ const cp = require('child_process'); const fs = require('fs'); const util = require('util'); +common.skipIfPerfettoEnabled(); + const CODE = 'setTimeout(() => { for (let i = 0; i < 100000; i++) { "test" + i } }, 1)'; diff --git a/test/parallel/test-trace-events-binding.js b/test/parallel/test-trace-events-binding.js index 0f14614994085e..b4cba883024b29 100644 --- a/test/parallel/test-trace-events-binding.js +++ b/test/parallel/test-trace-events-binding.js @@ -4,6 +4,8 @@ const assert = require('assert'); const cp = require('child_process'); const fs = require('fs'); +common.skipIfPerfettoEnabled(); + const CODE = ` const { internalBinding } = require('internal/test/binding'); const { trace } = internalBinding('trace_events'); diff --git a/test/parallel/test-trace-events-bootstrap.js b/test/parallel/test-trace-events-bootstrap.js index 0ad9c33800d799..56a35ee8c75990 100644 --- a/test/parallel/test-trace-events-bootstrap.js +++ b/test/parallel/test-trace-events-bootstrap.js @@ -5,6 +5,8 @@ const cp = require('child_process'); const fs = require('fs'); const tmpdir = require('../common/tmpdir'); +common.skipIfPerfettoEnabled(); + const names = [ 'environment', 'nodeStart', diff --git a/test/parallel/test-trace-events-console.js b/test/parallel/test-trace-events-console.js index 745ca77f5b946c..4b48695c56881b 100644 --- a/test/parallel/test-trace-events-console.js +++ b/test/parallel/test-trace-events-console.js @@ -5,6 +5,8 @@ const cp = require('child_process'); const fs = require('fs'); const tmpdir = require('../common/tmpdir'); +common.skipIfPerfettoEnabled(); + // Tests that node.console trace events for counters and time methods are // emitted as expected. diff --git a/test/parallel/test-trace-events-dynamic-enable.js b/test/parallel/test-trace-events-dynamic-enable.js index bf65f80eef530a..af8f9095b00b47 100644 --- a/test/parallel/test-trace-events-dynamic-enable.js +++ b/test/parallel/test-trace-events-dynamic-enable.js @@ -4,6 +4,7 @@ const common = require('../common'); common.skipIfInspectorDisabled(); +common.skipIfPerfettoEnabled(); const { isMainThread } = require('worker_threads'); diff --git a/test/parallel/test-trace-events-environment.js b/test/parallel/test-trace-events-environment.js index 13127cb494ddac..46de418caf134c 100644 --- a/test/parallel/test-trace-events-environment.js +++ b/test/parallel/test-trace-events-environment.js @@ -7,6 +7,8 @@ const cp = require('child_process'); const fs = require('fs'); const tmpdir = require('../common/tmpdir'); +common.skipIfPerfettoEnabled(); + // This tests the emission of node.environment trace events const names = new Set([ diff --git a/test/parallel/test-trace-events-file-pattern.js b/test/parallel/test-trace-events-file-pattern.js index d1b02c2e49c163..3e6e339173f68d 100644 --- a/test/parallel/test-trace-events-file-pattern.js +++ b/test/parallel/test-trace-events-file-pattern.js @@ -5,6 +5,8 @@ const assert = require('assert'); const cp = require('child_process'); const fs = require('fs'); +common.skipIfPerfettoEnabled(); + tmpdir.refresh(); const CODE = diff --git a/test/parallel/test-trace-events-fs-async.js b/test/parallel/test-trace-events-fs-async.js index 848d0e5f558870..04149dae2e724c 100644 --- a/test/parallel/test-trace-events-fs-async.js +++ b/test/parallel/test-trace-events-fs-async.js @@ -5,6 +5,8 @@ const cp = require('child_process'); const fs = require('fs'); const util = require('util'); +common.skipIfPerfettoEnabled(); + const tests = { __proto__: null }; let gid = 1; diff --git a/test/parallel/test-trace-events-fs-sync.js b/test/parallel/test-trace-events-fs-sync.js index a8a6aa11c76533..800d1a83b64f65 100644 --- a/test/parallel/test-trace-events-fs-sync.js +++ b/test/parallel/test-trace-events-fs-sync.js @@ -5,6 +5,8 @@ const cp = require('child_process'); const fs = require('fs'); const util = require('util'); +common.skipIfPerfettoEnabled(); + const tests = { __proto__: null }; let gid = 1; diff --git a/test/parallel/test-trace-events-get-category-enabled-buffer.js b/test/parallel/test-trace-events-get-category-enabled-buffer.js index 3017b8e6dc87d7..79d2a1cf30dae5 100644 --- a/test/parallel/test-trace-events-get-category-enabled-buffer.js +++ b/test/parallel/test-trace-events-get-category-enabled-buffer.js @@ -10,6 +10,8 @@ try { common.skip('missing trace events'); } +common.skipIfPerfettoEnabled(); + const { createTracing, getEnabledCategories } = require('trace_events'); const assert = require('assert'); diff --git a/test/parallel/test-trace-events-http.js b/test/parallel/test-trace-events-http.js index 07a6b28fa5b273..47ac4dff9b3392 100644 --- a/test/parallel/test-trace-events-http.js +++ b/test/parallel/test-trace-events-http.js @@ -5,6 +5,8 @@ const cp = require('child_process'); const fs = require('fs'); const tmpdir = require('../common/tmpdir'); +common.skipIfPerfettoEnabled(); + const CODE = ` const http = require('http'); const server = http.createServer((req, res) => { diff --git a/test/parallel/test-trace-events-metadata.js b/test/parallel/test-trace-events-metadata.js index 3a86698e1f7db6..d92615fb94ec24 100644 --- a/test/parallel/test-trace-events-metadata.js +++ b/test/parallel/test-trace-events-metadata.js @@ -4,6 +4,8 @@ const assert = require('assert'); const cp = require('child_process'); const fs = require('fs'); +common.skipIfPerfettoEnabled(); + const CODE = 'setTimeout(() => { for (let i = 0; i < 100000; i++) { "test" + i } }, 1);' + 'process.title = "foo"'; diff --git a/test/parallel/test-trace-events-net-abstract-socket.js b/test/parallel/test-trace-events-net-abstract-socket.js index d2e1546743c958..9505fb214ad4f9 100644 --- a/test/parallel/test-trace-events-net-abstract-socket.js +++ b/test/parallel/test-trace-events-net-abstract-socket.js @@ -6,6 +6,7 @@ const fs = require('fs'); const tmpdir = require('../common/tmpdir'); if (!common.isLinux) common.skip(); +common.skipIfPerfettoEnabled(); const CODE = ` const net = require('net'); diff --git a/test/parallel/test-trace-events-net.js b/test/parallel/test-trace-events-net.js index a1a93b19080b8a..98a5167f957c01 100644 --- a/test/parallel/test-trace-events-net.js +++ b/test/parallel/test-trace-events-net.js @@ -5,6 +5,8 @@ const cp = require('child_process'); const fs = require('fs'); const tmpdir = require('../common/tmpdir'); +common.skipIfPerfettoEnabled(); + const CODE = ` const net = require('net'); const socket = net.connect('${common.PIPE}'); diff --git a/test/parallel/test-trace-events-none.js b/test/parallel/test-trace-events-none.js index 53121ac7df056f..641787b3b56df3 100644 --- a/test/parallel/test-trace-events-none.js +++ b/test/parallel/test-trace-events-none.js @@ -4,6 +4,8 @@ const assert = require('assert'); const cp = require('child_process'); const fs = require('fs'); +common.skipIfPerfettoEnabled(); + const CODE = 'setTimeout(() => { for (let i = 0; i < 100000; i++) { "test" + i } }, 1)'; diff --git a/test/parallel/test-trace-events-process-exit.js b/test/parallel/test-trace-events-process-exit.js index fc81c1eb7ce466..c4066809f3f294 100644 --- a/test/parallel/test-trace-events-process-exit.js +++ b/test/parallel/test-trace-events-process-exit.js @@ -4,6 +4,8 @@ const assert = require('assert'); const cp = require('child_process'); const fs = require('fs'); +common.skipIfPerfettoEnabled(); + const tmpdir = require('../common/tmpdir'); tmpdir.refresh(); const FILE_NAME = tmpdir.resolve('node_trace.1.log'); diff --git a/test/parallel/test-trace-events-promises.js b/test/parallel/test-trace-events-promises.js index 91e3c4fcda7104..4626ed9f08a32e 100644 --- a/test/parallel/test-trace-events-promises.js +++ b/test/parallel/test-trace-events-promises.js @@ -5,6 +5,8 @@ const cp = require('child_process'); const fs = require('fs'); const tmpdir = require('../common/tmpdir'); +common.skipIfPerfettoEnabled(); + if (process.argv[2] === 'child') { const p = Promise.reject(1); // Handled later Promise.reject(2); // Unhandled diff --git a/test/parallel/test-trace-events-threadpool.js b/test/parallel/test-trace-events-threadpool.js index 52d5a65c6035a3..36d3b306d0e50f 100644 --- a/test/parallel/test-trace-events-threadpool.js +++ b/test/parallel/test-trace-events-threadpool.js @@ -6,6 +6,8 @@ const fs = require('fs'); const tmpdir = require('../common/tmpdir'); const { scheduler } = require('timers/promises'); +common.skipIfPerfettoEnabled(); + if (!common.hasCrypto) common.skip('missing crypto'); diff --git a/test/parallel/test-trace-events-v8.js b/test/parallel/test-trace-events-v8.js index f3724ce6df44c6..f71c4a057afe2d 100644 --- a/test/parallel/test-trace-events-v8.js +++ b/test/parallel/test-trace-events-v8.js @@ -4,6 +4,8 @@ const assert = require('assert'); const cp = require('child_process'); const fs = require('fs'); +common.skipIfPerfettoEnabled(); + const CODE = 'setTimeout(() => { for (let i = 0; i < 100000; i++) { "test" + i } }, 1)'; diff --git a/test/parallel/test-trace-events-vm.js b/test/parallel/test-trace-events-vm.js index d85a2cefd645af..d2156245ab5d2b 100644 --- a/test/parallel/test-trace-events-vm.js +++ b/test/parallel/test-trace-events-vm.js @@ -5,6 +5,8 @@ const cp = require('child_process'); const fs = require('fs'); const tmpdir = require('../common/tmpdir'); +common.skipIfPerfettoEnabled(); + const names = [ 'ContextifyScript::New', 'RunInContext', diff --git a/test/parallel/test-trace-events-worker-metadata-with-name.js b/test/parallel/test-trace-events-worker-metadata-with-name.js index bf6e1005aa458f..0140d08a5f0106 100644 --- a/test/parallel/test-trace-events-worker-metadata-with-name.js +++ b/test/parallel/test-trace-events-worker-metadata-with-name.js @@ -5,6 +5,8 @@ const cp = require('child_process'); const fs = require('fs'); const { isMainThread } = require('worker_threads'); +common.skipIfPerfettoEnabled(); + if (isMainThread) { const CODE = 'const { Worker } = require(\'worker_threads\'); ' + `new Worker(${JSON.stringify(__filename)}, { name: 'foo' })`; diff --git a/test/parallel/test-trace-events-worker-metadata.js b/test/parallel/test-trace-events-worker-metadata.js index 844b3769ce201c..2e6c20255ce75f 100644 --- a/test/parallel/test-trace-events-worker-metadata.js +++ b/test/parallel/test-trace-events-worker-metadata.js @@ -5,6 +5,8 @@ const cp = require('child_process'); const fs = require('fs'); const { isMainThread } = require('worker_threads'); +common.skipIfPerfettoEnabled(); + if (isMainThread) { const CODE = 'const { Worker } = require(\'worker_threads\'); ' + `new Worker(${JSON.stringify(__filename)})`; From 55fccd2b57a0b4b6c6fcc01453b9a05b930222b2 Mon Sep 17 00:00:00 2001 From: Chengzhong Wu Date: Fri, 24 Jul 2026 14:31:21 -0400 Subject: [PATCH 2/2] build: run perfetto build and test on GHA Signed-off-by: Chengzhong Wu --- .github/workflows/test-shared.yml | 5 ++++- shell.nix | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-shared.yml b/.github/workflows/test-shared.yml index 3638aa51371f54..077e9e21a981ea 100644 --- a/.github/workflows/test-shared.yml +++ b/.github/workflows/test-shared.yml @@ -141,6 +141,8 @@ jobs: include: - runner: ubuntu-24.04 system: x86_64-linux + # Exercise the trace-event code against a perfetto-enabled V8. + perfetto: true # built separately in build-aarch64-linux-v8 # - runner: ubuntu-24.04-arm # system: aarch64-linux @@ -148,13 +150,14 @@ jobs: system: x86_64-darwin - runner: macos-latest system: aarch64-darwin - name: '${{ matrix.system }}: with shared libraries' + name: '${{ matrix.system }}: with shared libraries${{ matrix.perfetto && '' and perfetto'' || '''' }}' uses: ./.github/workflows/build-shared.yml with: runner: ${{ matrix.runner }} with-sccache: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} extra-nix-flags: | --arg useSeparateDerivationForV8 true \ + ${{ matrix.perfetto && '--arg withPerfetto true \' || '\' }} ${{ endsWith(matrix.system, '-darwin') && '--arg withAmaro false --arg withLief false --arg withSQLite false --arg withFFI false --arg extraConfigFlags ''["--without-inspector" "--without-node-options"]'' \' || '\' }} secrets: CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }} diff --git a/shell.nix b/shell.nix index 8a873741072e1e..b97bcac5d7a8d6 100644 --- a/shell.nix +++ b/shell.nix @@ -19,6 +19,7 @@ withFFI ? true, withSSL ? true, withTemporal ? false, + withPerfetto ? false, sharedLibDeps ? ( import ./tools/nix/sharedLibDeps.nix { inherit @@ -67,7 +68,8 @@ let ) "--v8-${if withTemporal then "enable" else "disable"}-temporal-support" ] - ++ pkgs.lib.optional (withTemporal && useSharedTemporal) "--shared-temporal_capi"; + ++ pkgs.lib.optional (withTemporal && useSharedTemporal) "--shared-temporal_capi" + ++ pkgs.lib.optional withPerfetto "--with-perfetto"; in pkgs.mkShell { inherit nativeBuildInputs;