Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / internal / event / export / eventtest / eventtest.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/internal/event/export/eventtest/eventtest.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/internal/event/export/eventtest/eventtest.go
new file mode 100644 (file)
index 0000000..9e9da52
--- /dev/null
@@ -0,0 +1,64 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package eventtest supports logging events to a test.
+// You can use NewContext to create a context that knows how to deliver
+// telemetry events back to the test.
+// You must use this context or a derived one anywhere you want telemetry to be
+// correctly routed back to the test it was constructed with.
+// Any events delivered to a background context will be dropped.
+//
+// Importing this package will cause it to register a new global telemetry
+// exporter that understands the special contexts returned by NewContext.
+// This means you should not import this package if you are not going to call
+// NewContext.
+package eventtest
+
+import (
+       "bytes"
+       "context"
+       "sync"
+       "testing"
+
+       "golang.org/x/tools/internal/event"
+       "golang.org/x/tools/internal/event/core"
+       "golang.org/x/tools/internal/event/export"
+       "golang.org/x/tools/internal/event/label"
+)
+
+func init() {
+       e := &testExporter{buffer: &bytes.Buffer{}}
+       e.logger = export.LogWriter(e.buffer, false)
+
+       event.SetExporter(export.Spans(e.processEvent))
+}
+
+type testingKeyType int
+
+const testingKey = testingKeyType(0)
+
+// NewContext returns a context you should use for the active test.
+func NewContext(ctx context.Context, t testing.TB) context.Context {
+       return context.WithValue(ctx, testingKey, t)
+}
+
+type testExporter struct {
+       mu     sync.Mutex
+       buffer *bytes.Buffer
+       logger event.Exporter
+}
+
+func (w *testExporter) processEvent(ctx context.Context, ev core.Event, tm label.Map) context.Context {
+       w.mu.Lock()
+       defer w.mu.Unlock()
+       // build our log message in buffer
+       result := w.logger(ctx, ev, tm)
+       v := ctx.Value(testingKey)
+       // get the testing.TB
+       if w.buffer.Len() > 0 && v != nil {
+               v.(testing.TB).Log(w.buffer)
+       }
+       w.buffer.Truncate(0)
+       return result
+}