package glog import ( "context" "flag" "testing" "github.com/golang/glog/internal/logsink" ) type contextKey string type fakeLogSink struct { context context.Context } var ctxKey = contextKey("key") var ctxValue = "some-value" var originalSinks = logsink.StructuredSinks func (s *fakeLogSink) Printf(meta *logsink.Meta, format string, args ...any) (int, error) { s.context = meta.Context return 0, nil } // Test that log.(Info|Error|Warning)Context functions behave the same as non context variants // and pass right context. func TestLogContext(t *testing.T) { fakeLogSink := &fakeLogSink{} logsink.StructuredSinks = append([]logsink.Structured{fakeLogSink}, originalSinks...) funcs := map[string]func(ctx context.Context, args ...any){ "InfoContext": InfoContext, "InfoContextDepth": func(ctx context.Context, args ...any) { InfoContextDepth(ctx, 2, args) }, "ErrorContext": ErrorContext, "WarningContext": WarningContext, } ctx := context.WithValue(context.Background(), ctxKey, ctxValue) for name, f := range funcs { f(ctx, "test") want := ctxValue if got := fakeLogSink.context.Value(ctxKey); got != want { t.Errorf("%s: context value unexpectedly missing: got %q, want %q", name, got, want) } } } // Test that V.InfoContext behaves the same as V.Info and passes right context. func TestVInfoContext(t *testing.T) { fakeLogSink := &fakeLogSink{} logsink.StructuredSinks = append([]logsink.Structured{fakeLogSink}, originalSinks...) if err := flag.Lookup("v").Value.Set("2"); err != nil { t.Fatalf("Failed to set -v=2: %v", err) } defer flag.Lookup("v").Value.Set("0") ctx := context.WithValue(context.Background(), ctxKey, ctxValue) V(2).InfoContext(ctx, "test") want := ctxValue if got := fakeLogSink.context.Value(ctxKey); got != want { t.Errorf("V.InfoContext: context value unexpectedly missing: got %q, want %q", got, want) } }