...

Source file src/internal/testlog/log.go

     1	// Copyright 2017 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	// Package testlog provides a back-channel communication path
     6	// between tests and package os, so that cmd/go can see which
     7	// environment variables and files a test consults.
     8	package testlog
     9	
    10	import "sync/atomic"
    11	
    12	// Interface is the interface required of test loggers.
    13	// The os package will invoke the interface's methods to indicate that
    14	// it is inspecting the given environment variables or files.
    15	// Multiple goroutines may call these methods simultaneously.
    16	type Interface interface {
    17		Getenv(key string)
    18		Stat(file string)
    19		Open(file string)
    20		Chdir(dir string)
    21	}
    22	
    23	// logger is the current logger Interface.
    24	// We use an atomic.Value in case test startup
    25	// is racing with goroutines started during init.
    26	// That must not cause a race detector failure,
    27	// although it will still result in limited visibility
    28	// into exactly what those goroutines do.
    29	var logger atomic.Value
    30	
    31	// SetLogger sets the test logger implementation for the current process.
    32	// It must be called only once, at process startup.
    33	func SetLogger(impl Interface) {
    34		if logger.Load() != nil {
    35			panic("testlog: SetLogger must be called only once")
    36		}
    37		logger.Store(&impl)
    38	}
    39	
    40	// Logger returns the current test logger implementation.
    41	// It returns nil if there is no logger.
    42	func Logger() Interface {
    43		impl := logger.Load()
    44		if impl == nil {
    45			return nil
    46		}
    47		return *impl.(*Interface)
    48	}
    49	
    50	// Getenv calls Logger().Getenv, if a logger has been set.
    51	func Getenv(name string) {
    52		if log := Logger(); log != nil {
    53			log.Getenv(name)
    54		}
    55	}
    56	
    57	// Open calls Logger().Open, if a logger has been set.
    58	func Open(name string) {
    59		if log := Logger(); log != nil {
    60			log.Open(name)
    61		}
    62	}
    63	
    64	// Stat calls Logger().Stat, if a logger has been set.
    65	func Stat(name string) {
    66		if log := Logger(); log != nil {
    67			log.Stat(name)
    68		}
    69	}
    70	

View as plain text