@@ -17,7 +17,8 @@ jest.mock('../../../src/common/config/config', () => ({
17
17
} ) ,
18
18
isConfigured : jest . fn ( ) . mockReturnValue ( true ) ,
19
19
getRuntime : jest . fn ( ) . mockReturnValue ( {
20
- session : { state : { value : 'sessionID' } , write : jest . fn ( ) }
20
+ session : { state : { value : 'sessionID' } , write : jest . fn ( ) } ,
21
+ timeKeeper : { ready : true , correctedOriginTime : 0 , convertRelativeTimestamp : jest . fn ( ) }
21
22
} )
22
23
} ) )
23
24
jest . mock ( '../../../src/common/constants/runtime' , ( ) => ( {
@@ -56,51 +57,57 @@ describe('session trace', () => {
56
57
57
58
document . dispatchEvent ( new CustomEvent ( 'DOMContentLoaded' ) ) // simulate natural browser event
58
59
window . dispatchEvent ( new CustomEvent ( 'load' ) ) // load is actually ignored by Trace as it should be passed by the PVT feature, so it should not be in payload
59
- await traceInstrument . onAggregateImported
60
60
ee . get ( 'abcd' ) . emit ( 'rumresp-st' , [ 1 ] )
61
61
ee . get ( 'abcd' ) . emit ( 'rumresp-sts' , [ 1 ] )
62
- const traceAggregate = traceInstrument . featAggregate
63
62
traceAggregate . traceStorage . storeXhrAgg ( 'xhr' , '[200,null,null]' , { method : 'GET' , status : 200 } , { rxSize : 770 , duration : 99 , cbTime : 0 , time : 217 } ) // fake ajax data
64
63
traceAggregate . traceStorage . processPVT ( 'fi' , 30 , { fid : 8 } ) // fake pvt data
65
- setTimeout ( ( ) => {
66
- const payload = traceAggregate . prepareHarvest ( )
67
- let res = payload . body
68
64
69
- let node = res . filter ( node => node . n === 'DOMContentLoaded' ) [ 0 ]
70
- expect ( node ) . toBeTruthy ( )
71
- expect ( node . s ) . toBeGreaterThan ( 10 ) // that DOMContentLoaded node has start time
72
- expect ( node . o ) . toEqual ( 'document' ) // that DOMContentLoaded origin is the document
73
- node = res . filter ( node => node . n === 'load' && ( node . o === 'document' || node . o === 'window' ) ) [ 0 ]
74
- expect ( node ) . toBeUndefined ( )
65
+ const payload = traceAggregate . prepareHarvest ( )
66
+ let res = payload . body
67
+
68
+ let node = res . filter ( node => node . n === 'DOMContentLoaded' ) [ 0 ]
69
+ expect ( node ) . toBeTruthy ( )
70
+ expect ( node . s ) . toBeGreaterThan ( 10 ) // that DOMContentLoaded node has start time
71
+ expect ( node . o ) . toEqual ( 'document' ) // that DOMContentLoaded origin is the document
72
+ node = res . filter ( node => node . n === 'load' && ( node . o === 'document' || node . o === 'window' ) ) [ 0 ]
73
+ expect ( node ) . toBeUndefined ( )
74
+
75
+ let hist = res . filter ( node => node . n === 'history.pushState' ) [ 1 ]
76
+ const originalPath = window . location . pathname
77
+ expect ( hist . s ) . toEqual ( hist . e ) // that hist node has no duration
78
+ expect ( hist . n ) . toEqual ( 'history.pushState' )
79
+ expect ( hist . o ) . toEqual ( `${ originalPath } #bar` )
80
+ expect ( hist . t ) . toEqual ( `${ originalPath } #foo` )
75
81
76
- let hist = res . filter ( node => node . n === 'history.pushState' ) [ 1 ]
77
- const originalPath = window . location . pathname
78
- expect ( hist . s ) . toEqual ( hist . e ) // that hist node has no duration
79
- expect ( hist . n ) . toEqual ( 'history.pushState' )
80
- expect ( hist . o ) . toEqual ( `${ originalPath } #bar` )
81
- expect ( hist . t ) . toEqual ( `${ originalPath } #foo` )
82
+ let ajax = res . filter ( node => node . t === 'ajax' ) [ 0 ]
83
+ expect ( ajax . s ) . toBeLessThan ( ajax . e ) // that it has some duration
84
+ expect ( ajax . n ) . toEqual ( 'Ajax' )
85
+ expect ( ajax . t ) . toEqual ( 'ajax' )
82
86
83
- let ajax = res . filter ( node => node . t === 'ajax' ) [ 0 ]
84
- expect ( ajax . s ) . toBeLessThan ( ajax . e ) // that it has some duration
85
- expect ( ajax . n ) . toEqual ( 'Ajax' )
86
- expect ( ajax . t ) . toEqual ( 'ajax' )
87
+ let pvt = res . filter ( node => node . n === 'fi' ) [ 0 ]
88
+ expect ( pvt . o ) . toEqual ( 'document' )
89
+ expect ( pvt . s ) . toEqual ( pvt . e ) // that FI has no duration
90
+ expect ( pvt . t ) . toEqual ( 'timing' )
91
+ pvt = res . filter ( node => node . n === 'fid' ) [ 0 ]
92
+ expect ( pvt . o ) . toEqual ( 'document' )
93
+ expect ( pvt . s ) . toEqual ( 30 ) // that FID has a duration relative to FI'
94
+ expect ( pvt . e ) . toEqual ( 30 + 8 )
95
+ expect ( pvt . t ) . toEqual ( 'event' )
87
96
88
- let pvt = res . filter ( node => node . n === 'fi' ) [ 0 ]
89
- expect ( pvt . o ) . toEqual ( 'document' )
90
- expect ( pvt . s ) . toEqual ( pvt . e ) // that FI has no duration
91
- expect ( pvt . t ) . toEqual ( 'timing' )
92
- pvt = res . filter ( node => node . n === 'fid' ) [ 0 ]
93
- expect ( pvt . o ) . toEqual ( 'document' )
94
- expect ( pvt . s ) . toEqual ( 30 ) // that FID has a duration relative to FI'
95
- expect ( pvt . e ) . toEqual ( 30 + 8 )
96
- expect ( pvt . t ) . toEqual ( 'event' )
97
+ let unknown = res . filter ( n => n . o === 'unknown' )
98
+ expect ( unknown . length ) . toEqual ( 0 ) // no events with unknown origin
99
+ } )
97
100
98
- let unknown = res . filter ( n => n . o === 'unknown' )
99
- expect ( unknown . length ) . toEqual ( 0 ) // no events with unknown origin
100
- } , 1000 )
101
+ test ( 'prepareHarvest returns undefined if there are no trace nodes' , ( ) => {
102
+ const spy = jest . spyOn ( traceAggregate . traceStorage , 'takeSTNs' )
103
+ let payload
104
+ expect ( ( ) => ( payload = traceAggregate . prepareHarvest ( ) ) ) . not . toThrow ( )
105
+ expect ( spy ) . toHaveBeenCalled ( )
106
+ expect ( payload ) . toBeUndefined ( )
107
+ spy . mockRestore ( )
101
108
} )
102
109
103
- test ( 'tracks previously stored events and processes them once per occurrence' , ( ) => {
110
+ test ( 'tracks previously stored events and processes them once per occurrence' , done => {
104
111
document . addEventListener ( 'visibilitychange' , ( ) => 1 )
105
112
document . addEventListener ( 'visibilitychange' , ( ) => 2 )
106
113
document . addEventListener ( 'visibilitychange' , ( ) => 3 ) // additional listeners should not generate additional nodes
@@ -113,12 +120,12 @@ describe('session trace', () => {
113
120
} ) )
114
121
expect ( traceAggregate . traceStorage . prevStoredEvents . size ) . toEqual ( 1 )
115
122
116
- jest . advanceTimersToNextTimer ( 1 ) // this will increase perf.now by the default ~20ms to imitate some time gap
117
- document . dispatchEvent ( new Event ( 'visibilitychange' ) )
118
- expect ( traceAggregate . traceStorage . trace . visibilitychange . length ) . toEqual ( 2 )
119
- expect ( traceAggregate . traceStorage . trace . visibilitychange [ 0 ] . s ) . not . toEqual ( traceAggregate . traceStorage . trace . visibilitychange [ 1 ] . s ) // should not have same start times
120
- expect ( traceAggregate . traceStorage . prevStoredEvents . size ) . toEqual ( 2 )
121
-
122
- jest . useRealTimers ( )
123
+ setTimeout ( ( ) => { // some time gap
124
+ document . dispatchEvent ( new Event ( 'visibilitychange' ) )
125
+ expect ( traceAggregate . traceStorage . trace . visibilitychange . length ) . toEqual ( 2 )
126
+ expect ( traceAggregate . traceStorage . trace . visibilitychange [ 0 ] . s ) . not . toEqual ( traceAggregate . traceStorage . trace . visibilitychange [ 1 ] . s ) // should not have same start times
127
+ expect ( traceAggregate . traceStorage . prevStoredEvents . size ) . toEqual ( 2 )
128
+ done ( )
129
+ } , 1 )
123
130
} )
124
131
} )
0 commit comments