235
)
236
238
>
globalFileCoreOnce.Do(func() {
239
>
logFile := os.Getenv(log.TestLogFileEnvVar)
240
>
if logFile == "" {
241
return
242
}
243
>
if err := os.MkdirAll(filepath.Dir(logFile), 0o755); err != nil {
testlogger.go
244
fmt.Fprintf(os.Stderr, "testlogger: failed to create log file dir %s: %v\n", filepath.Dir(logFile), err)
245
return
246
}
247
>
f, err := os.OpenFile(logFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644)
testlogger.go
248
>
if err != nil {
249
fmt.Fprintf(os.Stderr, "testlogger: failed to open log file %s: %v\n", logFile, err)
250
return
251
}
252
>
format := cmp.Or(os.Getenv(log.TestLogFileFormatEnvVar), "json")
testlogger.go
253
>
var enc zapcore.Encoder
254
>
switch strings.ToLower(format) {
255
case "console":
256
enc = zapcore.NewConsoleEncoder(log.DefaultZapEncoderConfig)
258
>
enc = zapcore.NewJSONEncoder(log.DefaultZapEncoderConfig)
259
}
261
>
if levelV := os.Getenv(log.TestLogFileLevelEnvVar); levelV != "" {
262
level = log.ParseZapLevel(levelV)
263
}
264
>
globalFileCore = zapcore.NewCore(enc, zapcore.AddSync(f), level)
testlogger.go
265
>
fmt.Fprintf(os.Stderr, "testlogger: file logging enabled → %s (format=%s level=%s)\n", logFile, format, level)
266
})
268
}
269
270
// NewTestLogger creates a new TestLogger that logs to the provided testing.T.
271
// Mode controls the behavior of the logger for when an expected or unexpected error is encountered.
272
>
func NewTestLogger(t TestingT, mode Mode, opts ...LoggerOption) *TestLogger {
testlogger.go
273
>
tl := &TestLogger{
274
>
state: &sharedTestLoggerState{
275
>
t: t,
276
>
logExpectations: false,
277
>
level: zapcore.DebugLevel,
278
>
logCaller: true,
279
>
mode: mode,
280
>
},
281
>
}
282
>
tl.state.mu.expectations = make(map[Level]*list.List)
283
>
tl.state.failOnError.Store(true)
284
>
tl.state.failOnDPanic.Store(true)
285
>
tl.state.failOnFatal.Store(true)
286
>
for _, opt := range opts {
287
opt(tl)
288
}
290
>
writer := zaptest.NewTestingWriter(t)
291
>
292
>
// Console core: format and level controlled by TEMPORAL_TEST_LOG_FORMAT / TEMPORAL_TEST_LOG_LEVEL.
293
>
var consoleEnc zapcore.Encoder
294
>
format := cmp.Or(os.Getenv(log.TestLogFormatEnvVar), "console")
295
>
switch strings.ToLower(format) {
296
>
case "console":
297
>
consoleEnc = zapcore.NewConsoleEncoder(log.DefaultZapEncoderConfig)
298
case "json":
299
consoleEnc = zapcore.NewJSONEncoder(log.DefaultZapEncoderConfig)