1- import { MockTraceEventFileSink } from '../../../mocks/sink.mock.js' ;
21import type { PerformanceEntryEncoder } from '../performance-observer.js' ;
32import type { ActionTrackEntryPayload } from '../user-timing-extensibility-api.type.js' ;
4- import { NodejsProfiler , Profiler } from './profiler.js' ;
3+ import { NodeJsProfiler , Profiler } from './profiler.js' ;
54
65describe ( 'Profiler Integration' , ( ) => {
76 let profiler : Profiler < Record < string , ActionTrackEntryPayload > > ;
@@ -306,25 +305,31 @@ describe('NodeJS Profiler Integration', () => {
306305 return [ ] ;
307306 } ;
308307
309- let mockSink : MockTraceEventFileSink ;
310- let nodejsProfiler : NodejsProfiler < string > ;
308+ let nodejsProfiler : NodeJsProfiler < string > ;
311309
312310 beforeEach ( ( ) => {
313- mockSink = new MockTraceEventFileSink ( ) ;
314-
315- nodejsProfiler = new NodejsProfiler ( {
311+ nodejsProfiler = new NodeJsProfiler ( {
316312 prefix : 'test' ,
317313 track : 'test-track' ,
318- sink : mockSink ,
314+ format : {
315+ baseName : 'test' ,
316+ walExtension : '.log' ,
317+ finalExtension : '.log' ,
318+ codec : {
319+ encode : ( v : string ) => v ,
320+ decode : ( v : string ) => v ,
321+ } ,
322+ finalizer : ( records : ( string | { __invalid : true ; raw : string } ) [ ] ) =>
323+ records . filter ( ( r ) : r is string => typeof r === 'string' ) . join ( '\n' ) ,
324+ } ,
319325 encodePerfEntry : simpleEncoder ,
320326 enabled : true ,
321327 } ) ;
322328 } ) ;
323329
324330 it ( 'should initialize with sink opened when enabled' , ( ) => {
325- expect ( mockSink . isClosed ( ) ) . toBeFalse ( ) ;
326331 expect ( nodejsProfiler . isEnabled ( ) ) . toBeTrue ( ) ;
327- expect ( mockSink . open ) . toHaveBeenCalledOnce ( ) ;
332+ expect ( nodejsProfiler . stats . walOpen ) . toBeTrue ( ) ;
328333 } ) ;
329334
330335 it ( 'should create performance entries and write to sink' , ( ) => {
@@ -340,41 +345,52 @@ describe('NodeJS Profiler Integration', () => {
340345 return 'async-result' ;
341346 } ) ,
342347 ) . resolves . toBe ( 'async-result' ) ;
348+
349+ const stats = nodejsProfiler . stats ;
350+ await expect ( JSON . stringify ( stats , null , 2 ) ) . toMatchFileSnapshot (
351+ '__snapshots__/profiler.int.test.async-operations.json' ,
352+ ) ;
343353 } ) ;
344354
345355 it ( 'should disable profiling and close sink' , ( ) => {
346356 nodejsProfiler . setEnabled ( false ) ;
347357 expect ( nodejsProfiler . isEnabled ( ) ) . toBeFalse ( ) ;
348- expect ( mockSink . isClosed ( ) ) . toBeTrue ( ) ;
349- expect ( mockSink . close ) . toHaveBeenCalledOnce ( ) ;
358+ expect ( nodejsProfiler . stats . walOpen ) . toBeFalse ( ) ;
350359
351360 expect ( nodejsProfiler . measure ( 'disabled-test' , ( ) => 'success' ) ) . toBe (
352361 'success' ,
353362 ) ;
354-
355- expect ( mockSink . getWrittenItems ( ) ) . toHaveLength ( 0 ) ;
356363 } ) ;
357364
358365 it ( 'should re-enable profiling correctly' , ( ) => {
359366 nodejsProfiler . setEnabled ( false ) ;
360367 nodejsProfiler . setEnabled ( true ) ;
361368
362369 expect ( nodejsProfiler . isEnabled ( ) ) . toBeTrue ( ) ;
363- expect ( mockSink . isClosed ( ) ) . toBeFalse ( ) ;
364- expect ( mockSink . open ) . toHaveBeenCalledTimes ( 2 ) ;
370+ expect ( nodejsProfiler . stats . walOpen ) . toBeTrue ( ) ;
365371
366372 expect ( nodejsProfiler . measure ( 're-enabled-test' , ( ) => 42 ) ) . toBe ( 42 ) ;
367373 } ) ;
368374
369375 it ( 'should support custom tracks' , ( ) => {
370- const profilerWithTracks = new NodejsProfiler ( {
376+ const profilerWithTracks = new NodeJsProfiler ( {
371377 prefix : 'api-server' ,
372378 track : 'HTTP' ,
373379 tracks : {
374380 db : { track : 'Database' , color : 'secondary' } ,
375381 cache : { track : 'Cache' , color : 'primary' } ,
376382 } ,
377- sink : mockSink ,
383+ format : {
384+ baseName : 'test' ,
385+ walExtension : '.log' ,
386+ finalExtension : '.log' ,
387+ codec : {
388+ encode : ( v : string ) => v ,
389+ decode : ( v : string ) => v ,
390+ } ,
391+ finalizer : ( records : ( string | { __invalid : true ; raw : string } ) [ ] ) =>
392+ records . filter ( ( r ) : r is string => typeof r === 'string' ) . join ( '\n' ) ,
393+ } ,
378394 encodePerfEntry : simpleEncoder ,
379395 } ) ;
380396
@@ -386,10 +402,20 @@ describe('NodeJS Profiler Integration', () => {
386402 } ) ;
387403
388404 it ( 'should capture buffered entries when buffered option is enabled' , ( ) => {
389- const bufferedProfiler = new NodejsProfiler ( {
405+ const bufferedProfiler = new NodeJsProfiler ( {
390406 prefix : 'buffered-test' ,
391407 track : 'Test' ,
392- sink : mockSink ,
408+ format : {
409+ baseName : 'test' ,
410+ walExtension : '.log' ,
411+ finalExtension : '.log' ,
412+ codec : {
413+ encode : ( v : string ) => v ,
414+ decode : ( v : string ) => v ,
415+ } ,
416+ finalizer : ( records : ( string | { __invalid : true ; raw : string } ) [ ] ) =>
417+ records . filter ( ( r ) : r is string => typeof r === 'string' ) . join ( '\n' ) ,
418+ } ,
393419 encodePerfEntry : simpleEncoder ,
394420 captureBufferedEntries : true ,
395421 enabled : true ,
@@ -407,10 +433,20 @@ describe('NodeJS Profiler Integration', () => {
407433 } ) ;
408434
409435 it ( 'should return correct getStats with dropped and written counts' , ( ) => {
410- const statsProfiler = new NodejsProfiler ( {
436+ const statsProfiler = new NodeJsProfiler ( {
411437 prefix : 'stats-test' ,
412438 track : 'Stats' ,
413- sink : mockSink ,
439+ format : {
440+ baseName : 'test' ,
441+ walExtension : '.log' ,
442+ finalExtension : '.log' ,
443+ codec : {
444+ encode : ( v : string ) => v ,
445+ decode : ( v : string ) => v ,
446+ } ,
447+ finalizer : ( records : ( string | { __invalid : true ; raw : string } ) [ ] ) =>
448+ records . filter ( ( r ) : r is string => typeof r === 'string' ) . join ( '\n' ) ,
449+ } ,
414450 encodePerfEntry : simpleEncoder ,
415451 maxQueueSize : 2 ,
416452 flushThreshold : 2 ,
@@ -431,10 +467,20 @@ describe('NodeJS Profiler Integration', () => {
431467 } ) ;
432468
433469 it ( 'should provide comprehensive queue statistics via getStats' , ( ) => {
434- const profiler = new NodejsProfiler ( {
470+ const profiler = new NodeJsProfiler ( {
435471 prefix : 'stats-profiler' ,
436472 track : 'Stats' ,
437- sink : mockSink ,
473+ format : {
474+ baseName : 'test' ,
475+ walExtension : '.log' ,
476+ finalExtension : '.log' ,
477+ codec : {
478+ encode : ( v : string ) => v ,
479+ decode : ( v : string ) => v ,
480+ } ,
481+ finalizer : ( records : ( string | { __invalid : true ; raw : string } ) [ ] ) =>
482+ records . filter ( ( r ) : r is string => typeof r === 'string' ) . join ( '\n' ) ,
483+ } ,
438484 encodePerfEntry : simpleEncoder ,
439485 maxQueueSize : 3 ,
440486 flushThreshold : 2 ,
@@ -462,4 +508,13 @@ describe('NodeJS Profiler Integration', () => {
462508 expect ( finalStats . isSubscribed ) . toBeFalse ( ) ;
463509 expect ( finalStats . queued ) . toBe ( 0 ) ;
464510 } ) ;
511+
512+ it ( 'should handle async operations' , async ( ) => {
513+ await expect (
514+ nodejsProfiler . measureAsync ( 'async-test' , async ( ) => {
515+ await new Promise ( resolve => setTimeout ( resolve , 1 ) ) ;
516+ return 'async-result' ;
517+ } ) ,
518+ ) . resolves . toBe ( 'async-result' ) ;
519+ } ) ;
465520} ) ;
0 commit comments