@@ -21,6 +21,7 @@ import (
21
21
"golang.org/x/telemetry/counter/countertest"
22
22
"golang.org/x/telemetry/internal/configtest"
23
23
ic "golang.org/x/telemetry/internal/counter"
24
+ "golang.org/x/telemetry/internal/crashmonitor"
24
25
"golang.org/x/telemetry/internal/regtest"
25
26
it "golang.org/x/telemetry/internal/telemetry"
26
27
"golang.org/x/telemetry/internal/testenv"
@@ -48,7 +49,6 @@ func TestMain(m *testing.M) {
48
49
// runProg runs the given program.
49
50
// See the switch statement below.
50
51
func runProg (prog string ) int {
51
-
52
52
mustGetEnv := func (envvar string ) string {
53
53
v := os .Getenv (envvar )
54
54
if v == "" {
@@ -65,56 +65,80 @@ func runProg(prog string) int {
65
65
66
66
// Set global state.
67
67
ic .CounterTime = func () time.Time { return asof } // must be done before Open
68
- countertest .Open (mustGetEnv (telemetryDirEnv ))
68
+
69
+ telemetryDir := mustGetEnv (telemetryDirEnv )
69
70
70
71
switch prog {
71
72
case "setmode" :
73
+ countertest .Open (telemetryDir )
72
74
// Use the modified time above for the asof time.
73
75
if err := it .Default .SetModeAsOf ("on" , asof ); err != nil {
74
76
log .Fatalf ("setting mode: %v" , err )
75
77
}
76
78
case "inc" :
79
+ countertest .Open (telemetryDir )
77
80
// (CounterTime is already set above)
78
81
counter .Inc ("teststart/counter" )
79
82
80
- case "start" :
83
+ case "crash" :
84
+ telemetry .Start (telemetry.Config {
85
+ // Do not call Open, to assert that Start does it (golang/go#69681).
86
+ TelemetryDir : telemetryDir ,
87
+ ReportCrashes : true ,
88
+ })
89
+ // Note: don't await the result of start: the child process won't complete
90
+ // until the crash occurs.
91
+ panic ("crash!" )
92
+
93
+ case "upload" :
81
94
res := telemetry .Start (telemetry.Config {
82
- // No need to set TelemetryDir since the Default dir is already set by countertest.Open.
95
+ TelemetryDir : telemetryDir ,
83
96
Upload : true ,
84
97
UploadURL : mustGetEnv (uploadURLEnv ),
85
98
UploadStartTime : asof ,
86
99
})
87
100
res .Wait ()
101
+
88
102
default :
89
103
log .Fatalf ("unknown program %q" , prog )
90
104
}
91
105
return 0
92
106
}
93
107
94
- func execProg (t * testing.T , telemetryDir , prog string , asof time.Time , env ... string ) {
108
+ func execProg (t * testing.T , telemetryDir , prog string , asof time.Time , expectFailure bool , env ... string ) {
95
109
// Run the runStart function below, via a fork+exec trick.
96
110
exe , err := os .Executable ()
97
111
if err != nil {
98
112
t .Error (err )
99
113
return
100
114
}
101
115
cmd := exec .Command (exe , "** TestStart **" ) // this unused arg is just for ps(1)
102
- cmd .Stderr = os .Stderr
116
+ if ! expectFailure {
117
+ cmd .Stderr = os .Stderr
118
+ }
103
119
cmd .Env = os .Environ ()
104
120
cmd .Env = append (cmd .Env , asofEnv + "=" + asof .Format (it .DateOnly ))
105
121
cmd .Env = append (cmd .Env , telemetryDirEnv + "=" + telemetryDir )
106
122
cmd .Env = append (cmd .Env , runStartEnv + "=" + prog ) // see TestMain
107
123
cmd .Env = append (cmd .Env , env ... )
108
124
out , err := cmd .Output ()
109
- if err != nil {
110
- t .Errorf ("program failed unexpectedly (%v)\n %s" , err , out )
125
+ if expectFailure {
126
+ if err == nil {
127
+ t .Errorf ("program succeeded unexpectedly:\n %s" , out )
128
+ }
129
+ } else if err != nil {
130
+ t .Errorf ("program failed unexpectedly (%v):\n %s" , err , out )
111
131
}
112
132
}
113
133
114
134
func TestStart (t * testing.T ) {
115
135
testenv .SkipIfUnsupportedPlatform (t )
116
136
testenv .MustHaveExec (t )
117
137
138
+ if ! crashmonitor .Supported () {
139
+ t .Skip ("crashmonitor not supported" )
140
+ }
141
+
118
142
// This test sets up a telemetry environment, and then runs a test program
119
143
// that increments a counter, and uploads via telemetry.Start.
120
144
@@ -127,21 +151,26 @@ func TestStart(t *testing.T) {
127
151
if err != nil {
128
152
t .Errorf ("error reading body: %v" , err )
129
153
} else {
130
- if body := string (body ); ! strings .Contains (body , "teststart/counter" ) {
154
+ body := string (body )
155
+ if ! strings .Contains (body , "teststart/counter" ) {
131
156
t .Errorf ("upload does not contain \" teststart/counter\" :\n %s" , body )
132
157
}
158
+ if ! strings .Contains (body , "crash/crash" ) {
159
+ t .Errorf ("upload does not contain \" crash/crash\" :\n %s" , body )
160
+ }
133
161
}
134
162
}))
135
163
uploadEnv := []string {uploadURLEnv + "=" + server .URL }
136
164
137
- uc := regtest .CreateTestUploadConfig (t , []string {"teststart/counter" }, nil )
165
+ uc := regtest .CreateTestUploadConfig (t , []string {"teststart/counter" }, [] string { "crash/crash" } )
138
166
uploadEnv = append (uploadEnv , configtest .LocalProxyEnv (t , uc , "v1.2.3" )... )
139
167
140
168
// Script programs.
141
169
now := time .Now ()
142
- execProg (t , telemetryDir , "setmode" , now .Add (- 30 * 24 * time .Hour )) // back-date telemetry acceptance
143
- execProg (t , telemetryDir , "inc" , now .Add (- 8 * 24 * time .Hour )) // increment the counter
144
- execProg (t , telemetryDir , "start" , now , uploadEnv ... ) // run start
170
+ execProg (t , telemetryDir , "setmode" , now .Add (- 30 * 24 * time .Hour ), false ) // back-date telemetry acceptance
171
+ execProg (t , telemetryDir , "inc" , now .Add (- 8 * 24 * time .Hour ), false ) // increment the counter
172
+ execProg (t , telemetryDir , "crash" , now .Add (- 8 * 24 * time .Hour ), true ) // run start
173
+ execProg (t , telemetryDir , "upload" , now , false , uploadEnv ... ) // run start
145
174
146
175
if ! uploaded {
147
176
t .Fatalf ("no upload occurred on %v" , os .Getpid ())
@@ -171,12 +200,12 @@ func TestConcurrentStart(t *testing.T) {
171
200
uploadEnv = append (uploadEnv , configtest .LocalProxyEnv (t , uc , "v1.2.3" )... )
172
201
173
202
now := time .Now ()
174
- execProg (t , telemetryDir , "setmode" , now .Add (- 365 * 24 * time .Hour )) // back-date telemetry acceptance
175
- execProg (t , telemetryDir , "inc" , now .Add (- 8 * 24 * time .Hour )) // increment the counter
203
+ execProg (t , telemetryDir , "setmode" , now .Add (- 365 * 24 * time .Hour ), false ) // back-date telemetry acceptance
204
+ execProg (t , telemetryDir , "inc" , now .Add (- 8 * 24 * time .Hour ), false ) // increment the counter
176
205
177
206
// Populate three weeks of counters to upload.
178
207
for i := - 28 ; i < - 7 ; i ++ { // Populate three weeks of counters to upload.
179
- execProg (t , telemetryDir , "inc" , now .Add (time .Duration (i )* 24 * time .Hour ))
208
+ execProg (t , telemetryDir , "inc" , now .Add (time .Duration (i )* 24 * time .Hour ), false )
180
209
}
181
210
182
211
// Run start concurrently.
@@ -185,7 +214,7 @@ func TestConcurrentStart(t *testing.T) {
185
214
wg .Add (1 )
186
215
go func () {
187
216
defer wg .Done ()
188
- execProg (t , telemetryDir , "start " , now , uploadEnv ... )
217
+ execProg (t , telemetryDir , "upload " , now , false , uploadEnv ... )
189
218
}()
190
219
}
191
220
wg .Wait ()
0 commit comments