2
2
3
3
process . env . DD_INJECTION_ENABLED = 'true'
4
4
5
+ const proxyquire = require ( 'proxyquire' )
6
+ const { EventEmitter } = require ( 'events' )
5
7
const { telemetryForwarder, assertTelemetryPoints } = require ( '../../../../integration-tests/helpers' )
6
8
7
9
describe ( 'sendTelemetry' , ( ) => {
@@ -16,7 +18,7 @@ describe('sendTelemetry', () => {
16
18
17
19
beforeEach ( ( ) => {
18
20
cleanup = telemetryForwarder ( )
19
- sendTelemetry = proxyquire ( '../src/guardrails/telemetry' , { } )
21
+ sendTelemetry = proxyquire ( '../../ src/guardrails/telemetry' , { } )
20
22
} )
21
23
22
24
it ( 'should send telemetry' , async ( ) => {
@@ -68,4 +70,99 @@ describe('sendTelemetry', () => {
68
70
assertTelemetryPoints ( process . pid , msgs , [ 'abort.integration' , '1' ] )
69
71
} )
70
72
} )
73
+
74
+ describe ( 'Error scenarios and metadata' , ( ) => {
75
+ let mockProc , telemetryModule , capturedStdinData
76
+
77
+ function createMockProcess ( ) {
78
+ const proc = new EventEmitter ( )
79
+ proc . stdin = new EventEmitter ( )
80
+ proc . stdin . end = ( data ) => {
81
+ capturedStdinData = data
82
+ }
83
+ return proc
84
+ }
85
+
86
+ function loadTelemetryModuleWithMockProc ( ) {
87
+ return proxyquire ( '../../src/guardrails/telemetry' , {
88
+ child_process : { spawn : ( ) => mockProc }
89
+ } )
90
+ }
91
+
92
+ function runTelemetry ( eventType , value ) {
93
+ const originalStringify = JSON . stringify
94
+ JSON . stringify = function ( obj ) {
95
+ if ( obj && obj . metadata && obj . points ) {
96
+ if ( eventType === 'spawn-error' ) {
97
+ mockProc . emit ( 'error' , new Error ( value ) )
98
+ } else if ( eventType === 'exit' ) {
99
+ mockProc . emit ( 'exit' , value )
100
+ } else if ( eventType === 'stdin-error' ) {
101
+ mockProc . stdin . emit ( 'error' , new Error ( value ) )
102
+ }
103
+ }
104
+ return originalStringify . apply ( this , arguments )
105
+ }
106
+
107
+ try {
108
+ telemetryModule ( [ { name : 'test' , tags : [ ] } ] )
109
+ } finally {
110
+ JSON . stringify = originalStringify
111
+ }
112
+ }
113
+
114
+ function assertStdinMetadata ( expected ) {
115
+ expect ( capturedStdinData ) . to . exist
116
+ const parsed = JSON . parse ( capturedStdinData )
117
+ expect ( parsed . metadata . result ) . to . equal ( expected . result )
118
+ expect ( parsed . metadata . result_class ) . to . equal ( expected . result_class )
119
+ expect ( parsed . metadata . result_reason ) . to . equal ( expected . result_reason )
120
+ }
121
+
122
+ beforeEach ( ( ) => {
123
+ mockProc = createMockProcess ( )
124
+ capturedStdinData = null
125
+ telemetryModule = loadTelemetryModuleWithMockProc ( )
126
+ } )
127
+
128
+ it ( 'should set error metadata when telemetry forwarder fails to spawn' , ( ) => {
129
+ runTelemetry ( 'spawn-error' , 'Spawn failed' )
130
+
131
+ assertStdinMetadata ( {
132
+ result : 'error' ,
133
+ result_class : 'internal_error' ,
134
+ result_reason : 'Failed to spawn telemetry forwarder'
135
+ } )
136
+ } )
137
+
138
+ it ( 'should set error metadata when telemetry forwarder exits with non-zero code' , ( ) => {
139
+ runTelemetry ( 'exit' , 1 )
140
+
141
+ assertStdinMetadata ( {
142
+ result : 'error' ,
143
+ result_class : 'internal_error' ,
144
+ result_reason : 'Telemetry forwarder exited with code 1'
145
+ } )
146
+ } )
147
+
148
+ it ( 'should set error metadata when writing to telemetry forwarder fails' , ( ) => {
149
+ runTelemetry ( 'stdin-error' , 'Write failed' )
150
+
151
+ assertStdinMetadata ( {
152
+ result : 'error' ,
153
+ result_class : 'internal_error' ,
154
+ result_reason : 'Failed to write telemetry data to telemetry forwarder'
155
+ } )
156
+ } )
157
+
158
+ it ( 'should set success metadata when telemetry forwarder exits successfully' , ( ) => {
159
+ runTelemetry ( 'exit' , 0 )
160
+
161
+ assertStdinMetadata ( {
162
+ result : 'success' ,
163
+ result_class : 'success' ,
164
+ result_reason : 'Successfully configured ddtrace package'
165
+ } )
166
+ } )
167
+ } )
71
168
} )
0 commit comments