Skip to content

[parity] node:perf_hooks — 61 failing node-suite tests (2026-07-22 baseline) #6766

Closed

Description

@TheHypnoo

Part of the node-suite parity sweep of 2026-07-22 (full run: 3,815 tests, 3,019 pass, 79.1% — report test-parity/reports/parity_report_20260722_120605.json, oracle Node 26.5.0 per .node-version). Umbrella: #793.

node:perf_hooks has 61 failing test(s) in test-parity/node-suite/perf_hooks/.

Reproduce:

./run_parity_tests.sh --suite node-suite --module perf_hooks

Failing tests

  • node-suite/perf_hooks/constants/all-gc-values — output mismatch
    • Node: NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE,NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY,NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED,NODE_PERFORMANCE_GC_FLAGS_FORCED,NODE_PERFORMANCE_GC_FLAGS_NO,NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE,NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING,NODE_PERFORMANCE_GC_INCREMENTAL,NODE_PERFORMANCE_GC_MAJOR,NODE_PERFORMANCE_GC_MINOR,NODE_PERFORMANCE_GC_MINOR_MARK_SWEEP,NODE_PERFORMANCE_GC_WEAKCB
    • Perry: Performance,PerformanceEntry,PerformanceMark,PerformanceMeasure,PerformanceObserver,PerformanceObserverEntryList,PerformanceResourceTiming,constants,createHistogram,eventLoopUtilization,monitorEventLoopDelay,performance,timerify
  • node-suite/perf_hooks/entries/argument-validation — output mismatch
    • Node: byName missing TypeError ERR_MISSING_ARGS
    • Perry: byName missing no throw
  • node-suite/perf_hooks/eventlooputil/two-arg-synthetic — output mismatch
    • Node: idle: 0
    • Perry: idle: 7
  • node-suite/perf_hooks/global/illegal-constructors — output mismatch
    • Node: Performance: TypeError ERR_ILLEGAL_CONSTRUCTOR
    • Perry: Performance: no throw
  • node-suite/perf_hooks/histogram/add-isolation — output mismatch
    • Node: add return: true
    • Perry: add return: true
  • node-suite/perf_hooks/histogram/add-validation — output mismatch
    • Node: undefined TypeError undefined
    • Perry: undefined no throw
  • node-suite/perf_hooks/histogram/empty-state — output mismatch
    • Node: counts: 0 true
    • Perry: counts: 0 false
  • node-suite/perf_hooks/histogram/illegal-constructor — output mismatch
    • Node: constructor: RecordableHistogram
    • Perry: TypeError: Cannot read properties of undefined (reading 'name')
  • node-suite/perf_hooks/histogram/monitor-disabled-reset — output mismatch
    • Node: surface: function function function
    • Perry: surface: function function function
  • node-suite/perf_hooks/histogram/monitor-distinct-handles — output mismatch
    • Node: distinct: true
    • Perry: distinct: true
  • node-suite/perf_hooks/histogram/monitor-lifecycle — output mismatch
    • Node: enable: true false
    • Perry: enable: undefined undefined
  • node-suite/perf_hooks/histogram/monitor-options-validation — output mismatch
    • Node: default ok
    • Perry: default ok
  • node-suite/perf_hooks/histogram/options-validation — output mismatch
    • Node: valid ok
    • Perry: valid ok
  • node-suite/perf_hooks/histogram/percentile-validation — output mismatch
    • Node: -1 RangeError ERR_OUT_OF_RANGE
    • Perry: -1 no throw
  • node-suite/perf_hooks/histogram/percentiles — output mismatch
    • Node: endpoints: true true
    • Perry: endpoints: false false
  • node-suite/perf_hooks/histogram/percentiles-maps — output mismatch
    • Node: maps: true true
    • Perry: maps: false false
  • node-suite/perf_hooks/histogram/record-delta — output mismatch
    • Node: first return: true 0
    • Perry: first return: true 0
  • node-suite/perf_hooks/histogram/record-number-bigint — output mismatch
    • Node: count pair: 2 true
    • Perry: count pair: 0 false
  • node-suite/perf_hooks/histogram/record-validation — output mismatch
    • Node: zero RangeError ERR_OUT_OF_RANGE
    • Perry: zero no throw
  • node-suite/perf_hooks/histogram/reset — output mismatch
    • Node: reset return: true
    • Perry: reset return: true
  • node-suite/perf_hooks/histogram/to-json — output mismatch
    • Node: keys: count,exceeds,max,mean,min,percentiles,stddev
    • Perry: TypeError: Cannot convert undefined or null to object
  • node-suite/perf_hooks/imports/function-aliases — compile error
  • node-suite/perf_hooks/imports/namespace-keys — output mismatch
    • Node: Performance,PerformanceEntry,PerformanceMark,PerformanceMeasure,PerformanceObserver,PerformanceObserverEntryList,PerformanceResourceTiming,constants,createHistogram,default,eventLoopUtilization,monitorEventLoopDelay,performance,timerify
    • Perry: Performance,PerformanceEntry,PerformanceMark,PerformanceMeasure,PerformanceObserver,PerformanceObserverEntryList,PerformanceResourceTiming,constants,createHistogram,eventLoopUtilization,monitorEventLoopDelay,performance,timerify
  • node-suite/perf_hooks/mark/detail-circular — output mismatch
    • Node: distinct clone: true
    • Perry: distinct clone: true
  • node-suite/perf_hooks/mark/direct-constructor — output mismatch
    • Node: shape: direct mark 7 0
    • Perry: shape: undefined undefined undefined undefined
  • node-suite/perf_hooks/mark/repeated-name-latest — output mismatch
    • Node: entries: 1,5
    • Perry: entries: 1,5
  • node-suite/perf_hooks/mark/reserved-node-milestone — output mismatch
    • Node: mark: TypeError ERR_INVALID_ARG_VALUE
    • Perry: mark no throw
  • node-suite/perf_hooks/measure/detail-clone-failures — output mismatch
    • Node: cycle: true true
    • Perry: cycle: true false
  • node-suite/perf_hooks/node-timing/shape-invariants — output mismatch
    • Node: identity: true
    • Perry: identity: false
  • node-suite/perf_hooks/node-timing/to-json — output mismatch
    • Node: keys: bootstrapComplete,duration,entryType,environment,idleTime,loopExit,loopStart,name,nodeStart,startTime,v8Start
    • Perry: TypeError: toJSON is not a function
  • node-suite/perf_hooks/observer/buffered — output mismatch
    • Node: buffered names: pre1,pre2
    • Perry: buffered names: not delivered
  • node-suite/perf_hooks/observer/callback-this — output mismatch
    • Node: this is observer: true
    • Perry: this is observer: false
  • node-suite/perf_hooks/observer/entry-list-snapshot — output mismatch
    • Node: fresh: true
    • Perry: callback: false
  • node-suite/perf_hooks/observer/entry-list-validation — output mismatch
    • Node: name missing TypeError ERR_MISSING_ARGS
    • Perry: name missing no throw
  • node-suite/perf_hooks/observer/list-methods — output mismatch
    • Node: getEntries: 1
    • Perry: Warning: Detected unsettled top-level await
  • node-suite/perf_hooks/observer/mode-switch-validation — output mismatch
    • Node: multi to single InvalidModificationError
    • Perry: multi to single no throw
  • node-suite/perf_hooks/observer/multiple-entry-types — output mismatch
    • Node: marks: 2
    • Perry: Warning: Detected unsettled top-level await
  • node-suite/perf_hooks/observer/observe-marks — output mismatch
    • Node: observed: a,b
    • Perry: Warning: Detected unsettled top-level await
  • node-suite/perf_hooks/observer/observe-measures — output mismatch
    • Node: observed: xy
    • Perry: Warning: Detected unsettled top-level await
  • node-suite/perf_hooks/observer/observe-single-type — output mismatch
    • Node: observed: a,b
    • Perry: Warning: Detected unsettled top-level await
  • node-suite/perf_hooks/observer/single-type-accumulates — output mismatch
    • Node: mark,measure
    • Perry: measure
  • node-suite/perf_hooks/observer/supported-entry-types-exact — output mismatch
    • Node: dns,function,gc,http,http2,mark,measure,net,quic,resource
    • Perry: function,mark,measure,resource
  • node-suite/perf_hooks/observer/take-records-suppresses-callback — output mismatch
    • Node: taken: 1
    • Perry: taken: 1
  • node-suite/perf_hooks/resource-timing/cache-mode-validation — output mismatch
    • Node: ok
    • Perry: ok
  • node-suite/perf_hooks/resource-timing/cache-transfer-size — output mismatch
    • Node: network: 450
    • Perry: network: undefined
  • node-suite/perf_hooks/resource-timing/controlled-fields — output mismatch
    • Node: instance: true true
    • Perry: instance: false false
  • node-suite/perf_hooks/resource-timing/illegal-constructor-tag — output mismatch
    • Node: tag: PerformanceResourceTiming
    • Perry: tag: undefined
  • node-suite/perf_hooks/resource-timing/mark-resource-entry — output mismatch
    • Node: returned object: object
    • Perry: returned object: object
  • node-suite/perf_hooks/resource-timing/observer-delivery — output mismatch
    • Node: observed: synthetic-resource
    • Perry: observed: not delivered
  • node-suite/perf_hooks/resource-timing/to-json-controlled — output mismatch
    • Node: keys: connectEnd,connectStart,decodedBodySize,deliveryType,domainLookupEnd,domainLookupStart,duration,encodedBodySize,entryType,fetchStart,initiatorType,name,nextHopProtocol,redirectEnd,redirectStart,requestStart,responseEnd,responseStart,responseStatus,secureConnectionStart,startTime,transferSize,workerStart
    • Perry: TypeError: toJSON is not a function
  • node-suite/perf_hooks/shapes/prototype-tags — output mismatch
    • Node: performance [object Performance]
    • Perry: performance [object Performance]
  • node-suite/perf_hooks/shapes/public-descriptors — output mismatch
    • Node: now function true true true
    • Perry: TypeError: Cannot read properties of undefined (reading 'value')
  • node-suite/perf_hooks/timerify/async-fulfill — output mismatch
    • Node: pending records: 0
    • Perry: pending records: 1
  • node-suite/perf_hooks/timerify/constructor — output mismatch
    • Node: instance: true 1
    • Perry: instance: false undefined
  • node-suite/perf_hooks/timerify/entry-arguments — output mismatch
    • Node: arguments: 2:1:true:1:true
    • Perry: arguments: not delivered
  • node-suite/perf_hooks/timerify/function-entry — output mismatch
    • Node: same fn: false
    • Perry: same fn: false
  • node-suite/perf_hooks/timerify/histogram-async — output mismatch
    • Node: pending: 0
    • Perry: pending: 0
  • node-suite/perf_hooks/timerify/histogram-sync — output mismatch
    • Node: before: 0
    • Perry: before: 0
  • node-suite/perf_hooks/timerify/invalid-histogram — output mismatch
    • Node: object TypeError ERR_INVALID_ARG_TYPE
    • Perry: object no throw
  • node-suite/perf_hooks/timerify/name-length-descriptors — output mismatch
    • Node: name timerified sample false true false
    • Perry: name timerified sample false false true
  • node-suite/perf_hooks/to-json/fresh-snapshots — output mismatch
    • Node: fresh root: true
    • Perry: fresh root: true

Activity

  1. added
    parityCompatibility gap with Node.js, ECMAScript, or the supported ecosystem
    on Jul 22, 2026
  2. proggeramlug commented on Aug 16, 2026

    @proggeramlug
    Contributor

    Working this in #8229 — the module's node-suite goes from 86/148 to 132/148 (46 tests, zero regressions, no compile failures), measured against the pinned Node 26.5.1 oracle.

    Two root causes did most of it. The histograms were a stub (every stat read 0, every mutator discarded input) and are now backed by a real HDR histogram ported from the parts of hdr_histogram.c Node's accessors reach — percentile(1) === min only holds because both sides quantize identically. Underneath that, perf_histogram / perf_observer / perf_observer_list are namespace tags that can never appear in user source, and codegen arms a module's dispatch bucket only where it sees the module named — so every method call on those objects resolved to undefined and silently did nothing. That is why the stub and the finished histogram behaved identically, and why list.getEntries() returned undefined inside an observer callback.

    16 of the original failures remain and are not fixed by that PR, because each needs machinery outside perf_hooks:

    • Prototype/descriptor model (6) — global/illegal-constructors, global/class-constructors, shapes/prototype-tags, shapes/public-descriptors, resource-timing/illegal-constructor-tag, mark/direct-constructor. These want throwing native constructors, Symbol.toStringTag on prototypes, and per-property descriptor attributes.
    • structuredClone cycle preservation (2) — mark/detail-circular, measure/detail-clone-failures.
    • Generic namespace-object gaps (2) — constants/all-gc-values needs Object.entries on a namespace object to consult the module surface the way Object.keys already does; imports/namespace-keys needs hooks.default on an import * as namespace. Neither is perf_hooks-specific: both affect every native module.
    • timerify (5) — async-fulfill, histogram-async (record on promise settlement), constructor (new through the wrapper), entry-arguments (entry detail + indexed access), name-length-descriptors (descriptor flags).
    • observer/entry-list-validation (1) — wants the ERR_INVALID_THIS code on a wrong-receiver TypeError.

    Suggest keeping this issue open until those are triaged into granular follow-ups; #8229 does not close it on merge if you'd prefer that — say the word and I'll drop the Closes keyword.

  3. proggeramlug commented on Aug 16, 2026

    @proggeramlug
    Contributor

    Correction on the last comment: #8229 is marked Part of this issue, not Closes — 16 of the 62 failures remain, so the issue should stay open after it merges.

  4. proggeramlug commented on Aug 16, 2026

    @proggeramlug
    Contributor

    The remaining 16 failures are now filed as granular issues, so this umbrella can close when #8229 merges. The residue had nothing in common except the module name — four of the six groups are fixed by someone working on a different subsystem entirely, and two aren't perf_hooks bugs at all.

    follow-up cases subsystem
    #8231 — the perf classes have no real prototype (illegal-constructor guard, Symbol.toStringTag, descriptors, ERR_INVALID_THIS) 6 object model
    #8232 — structuredClone loses cycle identity; non-cloneable throws TypeError not DataCloneError 2 structuredClone
    #8234 — timerify async settlement, construct, entry arguments, name/length descriptors 5 perf_hooks
    #8235 — Object.entries/values on a native-module namespace return the internal __module__ sentinel 1 native modules (all)
    #8236 — ns.default undefined for native modules whose default is the namespace itself 1 native modules (all)
    #8237 — PerformanceObserver.supportedEntryTypes undefined when chained into a method call 1 HIR/codegen

    16 of 16 accounted for. #8231 and #8234's descriptor arm are likely the same underlying work.

    Two notes on the accounting in this issue's original list:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    parityCompatibility gap with Node.js, ECMAScript, or the supported ecosystem

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions