summaryrefslogtreecommitdiffstats
path: root/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:40:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:40:59 +0000
commitbc4e624732bd51c0dd1e9529cf228e8c23127732 (patch)
treed95dab8960e9d02d3b95f8653074ad2e54ca207c /dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal
parentInitial commit. (diff)
downloadicingadb-bc4e624732bd51c0dd1e9529cf228e8c23127732.tar.xz
icingadb-bc4e624732bd51c0dd1e9529cf228e8c23127732.zip
Adding upstream version 1.1.1.upstream/1.1.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal')
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/bufferpool/bufferpool.go31
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/color/color.go44
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/color/color_test.go36
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/exit/exit.go66
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/exit/exit_test.go48
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/level_enabler.go37
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/pool/pool.go58
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/pool/pool_test.go106
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/readme/readme.go244
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/clock.go50
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/clock_test.go57
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/doc.go24
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/timeout.go59
-rw-r--r--dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/writer.go96
14 files changed, 956 insertions, 0 deletions
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/bufferpool/bufferpool.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/bufferpool/bufferpool.go
new file mode 100644
index 0000000..dad583a
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/bufferpool/bufferpool.go
@@ -0,0 +1,31 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// Package bufferpool houses zap's shared internal buffer pool. Third-party
+// packages can recreate the same functionality with buffers.NewPool.
+package bufferpool
+
+import "go.uber.org/zap/buffer"
+
+var (
+ _pool = buffer.NewPool()
+ // Get retrieves a buffer from the pool, creating one if necessary.
+ Get = _pool.Get
+)
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/color/color.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/color/color.go
new file mode 100644
index 0000000..c4d5d02
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/color/color.go
@@ -0,0 +1,44 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// Package color adds coloring functionality for TTY output.
+package color
+
+import "fmt"
+
+// Foreground colors.
+const (
+ Black Color = iota + 30
+ Red
+ Green
+ Yellow
+ Blue
+ Magenta
+ Cyan
+ White
+)
+
+// Color represents a text color.
+type Color uint8
+
+// Add adds the coloring to the given string.
+func (c Color) Add(s string) string {
+ return fmt.Sprintf("\x1b[%dm%s\x1b[0m", uint8(c), s)
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/color/color_test.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/color/color_test.go
new file mode 100644
index 0000000..4982903
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/color/color_test.go
@@ -0,0 +1,36 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package color
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestColorFormatting(t *testing.T) {
+ assert.Equal(
+ t,
+ "\x1b[31mfoo\x1b[0m",
+ Red.Add("foo"),
+ "Unexpected colored output.",
+ )
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/exit/exit.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/exit/exit.go
new file mode 100644
index 0000000..f673f99
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/exit/exit.go
@@ -0,0 +1,66 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// Package exit provides stubs so that unit tests can exercise code that calls
+// os.Exit(1).
+package exit
+
+import "os"
+
+var _exit = os.Exit
+
+// With terminates the process by calling os.Exit(code). If the package is
+// stubbed, it instead records a call in the testing spy.
+func With(code int) {
+ _exit(code)
+}
+
+// A StubbedExit is a testing fake for os.Exit.
+type StubbedExit struct {
+ Exited bool
+ Code int
+ prev func(code int)
+}
+
+// Stub substitutes a fake for the call to os.Exit(1).
+func Stub() *StubbedExit {
+ s := &StubbedExit{prev: _exit}
+ _exit = s.exit
+ return s
+}
+
+// WithStub runs the supplied function with Exit stubbed. It returns the stub
+// used, so that users can test whether the process would have crashed.
+func WithStub(f func()) *StubbedExit {
+ s := Stub()
+ defer s.Unstub()
+ f()
+ return s
+}
+
+// Unstub restores the previous exit function.
+func (se *StubbedExit) Unstub() {
+ _exit = se.prev
+}
+
+func (se *StubbedExit) exit(code int) {
+ se.Exited = true
+ se.Code = code
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/exit/exit_test.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/exit/exit_test.go
new file mode 100644
index 0000000..2299584
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/exit/exit_test.go
@@ -0,0 +1,48 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package exit_test
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "go.uber.org/zap/internal/exit"
+)
+
+func TestStub(t *testing.T) {
+ type want struct {
+ exit bool
+ code int
+ }
+ tests := []struct {
+ f func()
+ want want
+ }{
+ {func() { exit.With(42) }, want{exit: true, code: 42}},
+ {func() {}, want{}},
+ }
+
+ for _, tt := range tests {
+ s := exit.WithStub(tt.f)
+ assert.Equal(t, tt.want.exit, s.Exited, "Stub captured unexpected exit value.")
+ assert.Equal(t, tt.want.code, s.Code, "Stub captured unexpected exit value.")
+ }
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/level_enabler.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/level_enabler.go
new file mode 100644
index 0000000..40bfed8
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/level_enabler.go
@@ -0,0 +1,37 @@
+// Copyright (c) 2022 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// Package internal and its subpackages hold types and functionality
+// that are not part of Zap's public API.
+package internal
+
+import "go.uber.org/zap/zapcore"
+
+// LeveledEnabler is an interface satisfied by LevelEnablers that are able to
+// report their own level.
+//
+// This interface is defined to use more conveniently in tests and non-zapcore
+// packages.
+// This cannot be imported from zapcore because of the cyclic dependency.
+type LeveledEnabler interface {
+ zapcore.LevelEnabler
+
+ Level() zapcore.Level
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/pool/pool.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/pool/pool.go
new file mode 100644
index 0000000..60e9d2c
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/pool/pool.go
@@ -0,0 +1,58 @@
+// Copyright (c) 2023 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// Package pool provides internal pool utilities.
+package pool
+
+import (
+ "sync"
+)
+
+// A Pool is a generic wrapper around [sync.Pool] to provide strongly-typed
+// object pooling.
+//
+// Note that SA6002 (ref: https://staticcheck.io/docs/checks/#SA6002) will
+// not be detected, so all internal pool use must take care to only store
+// pointer types.
+type Pool[T any] struct {
+ pool sync.Pool
+}
+
+// New returns a new [Pool] for T, and will use fn to construct new Ts when
+// the pool is empty.
+func New[T any](fn func() T) *Pool[T] {
+ return &Pool[T]{
+ pool: sync.Pool{
+ New: func() any {
+ return fn()
+ },
+ },
+ }
+}
+
+// Get gets a T from the pool, or creates a new one if the pool is empty.
+func (p *Pool[T]) Get() T {
+ return p.pool.Get().(T)
+}
+
+// Put returns x into the pool.
+func (p *Pool[T]) Put(x T) {
+ p.pool.Put(x)
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/pool/pool_test.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/pool/pool_test.go
new file mode 100644
index 0000000..094edf9
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/pool/pool_test.go
@@ -0,0 +1,106 @@
+// Copyright (c) 2023 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package pool_test
+
+import (
+ "runtime/debug"
+ "sync"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+ "go.uber.org/zap/internal/pool"
+)
+
+type pooledValue[T any] struct {
+ value T
+}
+
+func TestNew(t *testing.T) {
+ // Disable GC to avoid the victim cache during the test.
+ defer debug.SetGCPercent(debug.SetGCPercent(-1))
+
+ p := pool.New(func() *pooledValue[string] {
+ return &pooledValue[string]{
+ value: "new",
+ }
+ })
+
+ // Probabilistically, 75% of sync.Pool.Put calls will succeed when -race
+ // is enabled (see ref below); attempt to make this quasi-deterministic by
+ // brute force (i.e., put significantly more objects in the pool than we
+ // will need for the test) in order to avoid testing without race enabled.
+ //
+ // ref: https://cs.opensource.google/go/go/+/refs/tags/go1.20.2:src/sync/pool.go;l=100-103
+ for i := 0; i < 1_000; i++ {
+ p.Put(&pooledValue[string]{
+ value: t.Name(),
+ })
+ }
+
+ // Ensure that we always get the expected value. Note that this must only
+ // run a fraction of the number of times that Put is called above.
+ for i := 0; i < 10; i++ {
+ func() {
+ x := p.Get()
+ defer p.Put(x)
+ require.Equal(t, t.Name(), x.value)
+ }()
+ }
+
+ // Depool all objects that might be in the pool to ensure that it's empty.
+ for i := 0; i < 1_000; i++ {
+ p.Get()
+ }
+
+ // Now that the pool is empty, it should use the value specified in the
+ // underlying sync.Pool.New func.
+ require.Equal(t, "new", p.Get().value)
+}
+
+func TestNew_Race(t *testing.T) {
+ p := pool.New(func() *pooledValue[int] {
+ return &pooledValue[int]{
+ value: -1,
+ }
+ })
+
+ var wg sync.WaitGroup
+ defer wg.Wait()
+
+ // Run a number of goroutines that read and write pool object fields to
+ // tease out races.
+ for i := 0; i < 1_000; i++ {
+ i := i
+
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+
+ x := p.Get()
+ defer p.Put(x)
+
+ // Must both read and write the field.
+ if n := x.value; n >= -1 {
+ x.value = i
+ }
+ }()
+ }
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/readme/readme.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/readme/readme.go
new file mode 100644
index 0000000..1487659
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/readme/readme.go
@@ -0,0 +1,244 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// readme generates Zap's README from a template.
+package main
+
+import (
+ "flag"
+ "fmt"
+ "io"
+ "log"
+ "os"
+ "os/exec"
+ "sort"
+ "strconv"
+ "strings"
+ "text/template"
+ "time"
+)
+
+var (
+ libraryNameToMarkdownName = map[string]string{
+ "Zap": ":zap: zap",
+ "Zap.Sugar": ":zap: zap (sugared)",
+ "stdlib.Println": "standard library",
+ "sirupsen/logrus": "logrus",
+ "go-kit/kit/log": "go-kit",
+ "inconshreveable/log15": "log15",
+ "apex/log": "apex/log",
+ "rs/zerolog": "zerolog",
+ "slog": "slog",
+ }
+)
+
+func main() {
+ flag.Parse()
+ if err := do(); err != nil {
+ log.Fatal(err)
+ }
+}
+
+func do() error {
+ tmplData, err := getTmplData()
+ if err != nil {
+ return err
+ }
+ data, err := io.ReadAll(os.Stdin)
+ if err != nil {
+ return err
+ }
+ t, err := template.New("tmpl").Parse(string(data))
+ if err != nil {
+ return err
+ }
+ return t.Execute(os.Stdout, tmplData)
+}
+
+func getTmplData() (*tmplData, error) {
+ tmplData := &tmplData{}
+ rows, err := getBenchmarkRows("BenchmarkAddingFields")
+ if err != nil {
+ return nil, err
+ }
+ tmplData.BenchmarkAddingFields = rows
+ rows, err = getBenchmarkRows("BenchmarkAccumulatedContext")
+ if err != nil {
+ return nil, err
+ }
+ tmplData.BenchmarkAccumulatedContext = rows
+ rows, err = getBenchmarkRows("BenchmarkWithoutFields")
+ if err != nil {
+ return nil, err
+ }
+ tmplData.BenchmarkWithoutFields = rows
+ return tmplData, nil
+}
+
+func getBenchmarkRows(benchmarkName string) (string, error) {
+ benchmarkOutput, err := getBenchmarkOutput(benchmarkName)
+ if err != nil {
+ return "", err
+ }
+
+ // get the Zap time (unsugared) as baseline to compare with other loggers
+ baseline, err := getBenchmarkRow(benchmarkOutput, benchmarkName, "Zap", nil)
+ if err != nil {
+ return "", err
+ }
+
+ var benchmarkRows []*benchmarkRow
+ for libraryName := range libraryNameToMarkdownName {
+ benchmarkRow, err := getBenchmarkRow(
+ benchmarkOutput, benchmarkName, libraryName, baseline,
+ )
+ if err != nil {
+ return "", err
+ }
+ if benchmarkRow == nil {
+ continue
+ }
+ benchmarkRows = append(benchmarkRows, benchmarkRow)
+ }
+ sort.Sort(benchmarkRowsByTime(benchmarkRows))
+ rows := []string{
+ "| Package | Time | Time % to zap | Objects Allocated |",
+ "| :------ | :--: | :-----------: | :---------------: |",
+ }
+ for _, benchmarkRow := range benchmarkRows {
+ rows = append(rows, benchmarkRow.String())
+ }
+ return strings.Join(rows, "\n"), nil
+}
+
+func getBenchmarkRow(
+ input []string, benchmarkName string, libraryName string, baseline *benchmarkRow,
+) (*benchmarkRow, error) {
+ line, err := findUniqueSubstring(input, fmt.Sprintf("%s/%s-", benchmarkName, libraryName))
+ if err != nil {
+ return nil, err
+ }
+ if line == "" {
+ return nil, nil
+ }
+ split := strings.Split(line, "\t")
+ if len(split) < 5 {
+ return nil, fmt.Errorf("unknown benchmark line: %s", line)
+ }
+ duration, err := time.ParseDuration(strings.ReplaceAll(strings.TrimSuffix(strings.TrimSpace(split[2]), "/op"), " ", ""))
+ if err != nil {
+ return nil, err
+ }
+ allocatedBytes, err := strconv.Atoi(strings.TrimSuffix(strings.TrimSpace(split[3]), " B/op"))
+ if err != nil {
+ return nil, err
+ }
+ allocatedObjects, err := strconv.Atoi(strings.TrimSuffix(strings.TrimSpace(split[4]), " allocs/op"))
+ if err != nil {
+ return nil, err
+ }
+ r := &benchmarkRow{
+ Name: libraryNameToMarkdownName[libraryName],
+ Time: duration,
+ AllocatedBytes: allocatedBytes,
+ AllocatedObjects: allocatedObjects,
+ }
+
+ if baseline != nil {
+ r.ZapTime = baseline.Time
+ r.ZapAllocatedBytes = baseline.AllocatedBytes
+ r.ZapAllocatedObjects = baseline.AllocatedObjects
+ }
+
+ return r, nil
+}
+
+func findUniqueSubstring(input []string, substring string) (string, error) {
+ var output string
+ for _, line := range input {
+ if strings.Contains(line, substring) {
+ if output != "" {
+ return "", fmt.Errorf("input has duplicate substring %s", substring)
+ }
+ output = line
+ }
+ }
+ return output, nil
+}
+
+func getBenchmarkOutput(benchmarkName string) ([]string, error) {
+ cmd := exec.Command("go", "test", fmt.Sprintf("-bench=%s", benchmarkName), "-benchmem")
+ cmd.Dir = "benchmarks"
+ output, err := cmd.CombinedOutput()
+ if err != nil {
+ return nil, fmt.Errorf("error running 'go test -bench=%q': %v\n%s", benchmarkName, err, string(output))
+ }
+ return strings.Split(string(output), "\n"), nil
+}
+
+type tmplData struct {
+ BenchmarkAddingFields string
+ BenchmarkAccumulatedContext string
+ BenchmarkWithoutFields string
+}
+
+type benchmarkRow struct {
+ Name string
+
+ Time time.Duration
+ AllocatedBytes int
+ AllocatedObjects int
+
+ ZapTime time.Duration
+ ZapAllocatedBytes int
+ ZapAllocatedObjects int
+}
+
+func (b *benchmarkRow) String() string {
+ pct := func(val, baseline int64) string {
+ return fmt.Sprintf(
+ "%+0.f%%",
+ ((float64(val)/float64(baseline))*100)-100,
+ )
+ }
+ t := b.Time.Nanoseconds()
+ tp := pct(t, b.ZapTime.Nanoseconds())
+
+ return fmt.Sprintf(
+ "| %s | %d ns/op | %s | %d allocs/op", b.Name,
+ t, tp, b.AllocatedObjects,
+ )
+}
+
+type benchmarkRowsByTime []*benchmarkRow
+
+func (b benchmarkRowsByTime) Len() int { return len(b) }
+func (b benchmarkRowsByTime) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
+func (b benchmarkRowsByTime) Less(i, j int) bool {
+ left, right := b[i], b[j]
+ leftZap, rightZap := strings.Contains(left.Name, "zap"), strings.Contains(right.Name, "zap")
+
+ // If neither benchmark is for zap or both are, sort by time.
+ if leftZap == rightZap {
+ return left.Time.Nanoseconds() < right.Time.Nanoseconds()
+ }
+ // Sort zap benchmark first.
+ return leftZap
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/clock.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/clock.go
new file mode 100644
index 0000000..fe8026d
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/clock.go
@@ -0,0 +1,50 @@
+// Copyright (c) 2021 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package ztest
+
+import (
+ "time"
+
+ "github.com/benbjohnson/clock"
+)
+
+// MockClock provides control over the time.
+type MockClock struct{ m *clock.Mock }
+
+// NewMockClock builds a new mock clock that provides control of time.
+func NewMockClock() *MockClock {
+ return &MockClock{clock.NewMock()}
+}
+
+// Now reports the current time.
+func (c *MockClock) Now() time.Time {
+ return c.m.Now()
+}
+
+// NewTicker returns a time.Ticker that ticks at the specified frequency.
+func (c *MockClock) NewTicker(d time.Duration) *time.Ticker {
+ return &time.Ticker{C: c.m.Ticker(d).C}
+}
+
+// Add progresses time by the given duration.
+func (c *MockClock) Add(d time.Duration) {
+ c.m.Add(d)
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/clock_test.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/clock_test.go
new file mode 100644
index 0000000..3808ed7
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/clock_test.go
@@ -0,0 +1,57 @@
+// Copyright (c) 2021 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package ztest
+
+import (
+ "sync/atomic"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestMockClock_NewTicker(t *testing.T) {
+ var n atomic.Int32
+ clock := NewMockClock()
+
+ done := make(chan struct{})
+ defer func() { <-done }() // wait for end
+
+ quit := make(chan struct{})
+ // Create a channel to increment every microsecond.
+ go func(ticker *time.Ticker) {
+ defer close(done)
+ for {
+ select {
+ case <-quit:
+ ticker.Stop()
+ return
+ case <-ticker.C:
+ n.Add(1)
+ }
+ }
+ }(clock.NewTicker(time.Microsecond))
+
+ // Move clock forward.
+ clock.Add(2 * time.Microsecond)
+ assert.Equal(t, int32(2), n.Load())
+ close(quit)
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/doc.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/doc.go
new file mode 100644
index 0000000..cd4b98c
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/doc.go
@@ -0,0 +1,24 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// Package ztest provides low-level helpers for testing log output. These
+// utilities are helpful in zap's own unit tests, but any assertions using
+// them are strongly coupled to a single encoding.
+package ztest // import "go.uber.org/zap/internal/ztest"
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/timeout.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/timeout.go
new file mode 100644
index 0000000..e4222f9
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/timeout.go
@@ -0,0 +1,59 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package ztest
+
+import (
+ "log"
+ "os"
+ "strconv"
+ "time"
+)
+
+var _timeoutScale = 1.0
+
+// Timeout scales the provided duration by $TEST_TIMEOUT_SCALE.
+func Timeout(base time.Duration) time.Duration {
+ return time.Duration(float64(base) * _timeoutScale)
+}
+
+// Sleep scales the sleep duration by $TEST_TIMEOUT_SCALE.
+func Sleep(base time.Duration) {
+ time.Sleep(Timeout(base))
+}
+
+// Initialize checks the environment and alters the timeout scale accordingly.
+// It returns a function to undo the scaling.
+func Initialize(factor string) func() {
+ fv, err := strconv.ParseFloat(factor, 64)
+ if err != nil {
+ panic(err)
+ }
+ original := _timeoutScale
+ _timeoutScale = fv
+ return func() { _timeoutScale = original }
+}
+
+func init() {
+ if v := os.Getenv("TEST_TIMEOUT_SCALE"); v != "" {
+ Initialize(v)
+ log.Printf("Scaling timeouts by %vx.\n", _timeoutScale)
+ }
+}
diff --git a/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/writer.go b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/writer.go
new file mode 100644
index 0000000..f54d856
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/zap@v1.25.0/internal/ztest/writer.go
@@ -0,0 +1,96 @@
+// Copyright (c) 2016 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package ztest
+
+import (
+ "bytes"
+ "errors"
+ "io"
+ "strings"
+)
+
+// A Syncer is a spy for the Sync portion of zapcore.WriteSyncer.
+type Syncer struct {
+ err error
+ called bool
+}
+
+// SetError sets the error that the Sync method will return.
+func (s *Syncer) SetError(err error) {
+ s.err = err
+}
+
+// Sync records that it was called, then returns the user-supplied error (if
+// any).
+func (s *Syncer) Sync() error {
+ s.called = true
+ return s.err
+}
+
+// Called reports whether the Sync method was called.
+func (s *Syncer) Called() bool {
+ return s.called
+}
+
+// A Discarder sends all writes to io.Discard.
+type Discarder struct{ Syncer }
+
+// Write implements io.Writer.
+func (d *Discarder) Write(b []byte) (int, error) {
+ return io.Discard.Write(b)
+}
+
+// FailWriter is a WriteSyncer that always returns an error on writes.
+type FailWriter struct{ Syncer }
+
+// Write implements io.Writer.
+func (w FailWriter) Write(b []byte) (int, error) {
+ return len(b), errors.New("failed")
+}
+
+// ShortWriter is a WriteSyncer whose write method never fails, but
+// nevertheless fails to the last byte of the input.
+type ShortWriter struct{ Syncer }
+
+// Write implements io.Writer.
+func (w ShortWriter) Write(b []byte) (int, error) {
+ return len(b) - 1, nil
+}
+
+// Buffer is an implementation of zapcore.WriteSyncer that sends all writes to
+// a bytes.Buffer. It has convenience methods to split the accumulated buffer
+// on newlines.
+type Buffer struct {
+ bytes.Buffer
+ Syncer
+}
+
+// Lines returns the current buffer contents, split on newlines.
+func (b *Buffer) Lines() []string {
+ output := strings.Split(b.String(), "\n")
+ return output[:len(output)-1]
+}
+
+// Stripped returns the current buffer contents with the last trailing newline
+// stripped.
+func (b *Buffer) Stripped() string {
+ return strings.TrimRight(b.String(), "\n")
+}