aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/go.uber.org/zap/internal
diff options
context:
space:
mode:
authoruzhas <uzhas@ydb.tech>2023-11-16 16:04:50 +0300
committeruzhas <uzhas@ydb.tech>2023-11-16 17:46:46 +0300
commit46f0c0079bb50609d2eeb6586642bcf114fc5239 (patch)
tree84e4e4978d57fe5de321ba69bf9d0c290de60a66 /vendor/go.uber.org/zap/internal
parent73045e389397816cc2bdd6cd7818b4bce427b265 (diff)
downloadydb-46f0c0079bb50609d2eeb6586642bcf114fc5239.tar.gz
enable ya make for go projects
Diffstat (limited to 'vendor/go.uber.org/zap/internal')
-rw-r--r--vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go31
-rw-r--r--vendor/go.uber.org/zap/internal/bufferpool/ya.make9
-rw-r--r--vendor/go.uber.org/zap/internal/color/color.go44
-rw-r--r--vendor/go.uber.org/zap/internal/color/color_test.go36
-rw-r--r--vendor/go.uber.org/zap/internal/color/gotest/ya.make5
-rw-r--r--vendor/go.uber.org/zap/internal/color/ya.make15
-rw-r--r--vendor/go.uber.org/zap/internal/exit/exit.go66
-rw-r--r--vendor/go.uber.org/zap/internal/exit/exit_test.go48
-rw-r--r--vendor/go.uber.org/zap/internal/exit/gotest/ya.make5
-rw-r--r--vendor/go.uber.org/zap/internal/exit/ya.make15
-rw-r--r--vendor/go.uber.org/zap/internal/level_enabler.go37
-rw-r--r--vendor/go.uber.org/zap/internal/pool/gotest/ya.make5
-rw-r--r--vendor/go.uber.org/zap/internal/pool/pool.go58
-rw-r--r--vendor/go.uber.org/zap/internal/pool/pool_test.go106
-rw-r--r--vendor/go.uber.org/zap/internal/pool/ya.make15
-rw-r--r--vendor/go.uber.org/zap/internal/readme/readme.go244
-rw-r--r--vendor/go.uber.org/zap/internal/readme/ya.make9
-rw-r--r--vendor/go.uber.org/zap/internal/stacktrace/gotest/ya.make5
-rw-r--r--vendor/go.uber.org/zap/internal/stacktrace/stack.go181
-rw-r--r--vendor/go.uber.org/zap/internal/stacktrace/stack_test.go106
-rw-r--r--vendor/go.uber.org/zap/internal/stacktrace/ya.make15
-rw-r--r--vendor/go.uber.org/zap/internal/ya.make19
-rw-r--r--vendor/go.uber.org/zap/internal/ztest/clock.go153
-rw-r--r--vendor/go.uber.org/zap/internal/ztest/clock_test.go80
-rw-r--r--vendor/go.uber.org/zap/internal/ztest/doc.go24
-rw-r--r--vendor/go.uber.org/zap/internal/ztest/gotest/ya.make5
-rw-r--r--vendor/go.uber.org/zap/internal/ztest/timeout.go59
-rw-r--r--vendor/go.uber.org/zap/internal/ztest/writer.go96
-rw-r--r--vendor/go.uber.org/zap/internal/ztest/ya.make18
29 files changed, 1509 insertions, 0 deletions
diff --git a/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go b/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go
new file mode 100644
index 0000000000..dad583aaa5
--- /dev/null
+++ b/vendor/go.uber.org/zap/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/vendor/go.uber.org/zap/internal/bufferpool/ya.make b/vendor/go.uber.org/zap/internal/bufferpool/ya.make
new file mode 100644
index 0000000000..1ab106c924
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/bufferpool/ya.make
@@ -0,0 +1,9 @@
+GO_LIBRARY()
+
+LICENSE(MIT)
+
+SRCS(
+ bufferpool.go
+)
+
+END()
diff --git a/vendor/go.uber.org/zap/internal/color/color.go b/vendor/go.uber.org/zap/internal/color/color.go
new file mode 100644
index 0000000000..c4d5d02abc
--- /dev/null
+++ b/vendor/go.uber.org/zap/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/vendor/go.uber.org/zap/internal/color/color_test.go b/vendor/go.uber.org/zap/internal/color/color_test.go
new file mode 100644
index 0000000000..4982903aa1
--- /dev/null
+++ b/vendor/go.uber.org/zap/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/vendor/go.uber.org/zap/internal/color/gotest/ya.make b/vendor/go.uber.org/zap/internal/color/gotest/ya.make
new file mode 100644
index 0000000000..32cf4e2849
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/color/gotest/ya.make
@@ -0,0 +1,5 @@
+GO_TEST_FOR(vendor/go.uber.org/zap/internal/color)
+
+LICENSE(MIT)
+
+END()
diff --git a/vendor/go.uber.org/zap/internal/color/ya.make b/vendor/go.uber.org/zap/internal/color/ya.make
new file mode 100644
index 0000000000..3e9fbfcd47
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/color/ya.make
@@ -0,0 +1,15 @@
+GO_LIBRARY()
+
+LICENSE(MIT)
+
+SRCS(
+ color.go
+)
+
+GO_TEST_SRCS(color_test.go)
+
+END()
+
+RECURSE(
+ gotest
+)
diff --git a/vendor/go.uber.org/zap/internal/exit/exit.go b/vendor/go.uber.org/zap/internal/exit/exit.go
new file mode 100644
index 0000000000..f673f9947b
--- /dev/null
+++ b/vendor/go.uber.org/zap/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/vendor/go.uber.org/zap/internal/exit/exit_test.go b/vendor/go.uber.org/zap/internal/exit/exit_test.go
new file mode 100644
index 0000000000..2299584722
--- /dev/null
+++ b/vendor/go.uber.org/zap/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/vendor/go.uber.org/zap/internal/exit/gotest/ya.make b/vendor/go.uber.org/zap/internal/exit/gotest/ya.make
new file mode 100644
index 0000000000..c5e8098769
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/exit/gotest/ya.make
@@ -0,0 +1,5 @@
+GO_TEST_FOR(vendor/go.uber.org/zap/internal/exit)
+
+LICENSE(MIT)
+
+END()
diff --git a/vendor/go.uber.org/zap/internal/exit/ya.make b/vendor/go.uber.org/zap/internal/exit/ya.make
new file mode 100644
index 0000000000..73d0dd8e21
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/exit/ya.make
@@ -0,0 +1,15 @@
+GO_LIBRARY()
+
+LICENSE(MIT)
+
+SRCS(
+ exit.go
+)
+
+GO_XTEST_SRCS(exit_test.go)
+
+END()
+
+RECURSE(
+ gotest
+)
diff --git a/vendor/go.uber.org/zap/internal/level_enabler.go b/vendor/go.uber.org/zap/internal/level_enabler.go
new file mode 100644
index 0000000000..40bfed81e6
--- /dev/null
+++ b/vendor/go.uber.org/zap/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/vendor/go.uber.org/zap/internal/pool/gotest/ya.make b/vendor/go.uber.org/zap/internal/pool/gotest/ya.make
new file mode 100644
index 0000000000..8e1e7117ab
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/pool/gotest/ya.make
@@ -0,0 +1,5 @@
+GO_TEST_FOR(vendor/go.uber.org/zap/internal/pool)
+
+LICENSE(MIT)
+
+END()
diff --git a/vendor/go.uber.org/zap/internal/pool/pool.go b/vendor/go.uber.org/zap/internal/pool/pool.go
new file mode 100644
index 0000000000..60e9d2c432
--- /dev/null
+++ b/vendor/go.uber.org/zap/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/vendor/go.uber.org/zap/internal/pool/pool_test.go b/vendor/go.uber.org/zap/internal/pool/pool_test.go
new file mode 100644
index 0000000000..094edf9172
--- /dev/null
+++ b/vendor/go.uber.org/zap/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/vendor/go.uber.org/zap/internal/pool/ya.make b/vendor/go.uber.org/zap/internal/pool/ya.make
new file mode 100644
index 0000000000..cd2e0b4ab2
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/pool/ya.make
@@ -0,0 +1,15 @@
+GO_LIBRARY()
+
+LICENSE(MIT)
+
+SRCS(
+ pool.go
+)
+
+GO_XTEST_SRCS(pool_test.go)
+
+END()
+
+RECURSE(
+ gotest
+)
diff --git a/vendor/go.uber.org/zap/internal/readme/readme.go b/vendor/go.uber.org/zap/internal/readme/readme.go
new file mode 100644
index 0000000000..148765908b
--- /dev/null
+++ b/vendor/go.uber.org/zap/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/vendor/go.uber.org/zap/internal/readme/ya.make b/vendor/go.uber.org/zap/internal/readme/ya.make
new file mode 100644
index 0000000000..69bb063cfb
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/readme/ya.make
@@ -0,0 +1,9 @@
+GO_PROGRAM()
+
+LICENSE(MIT)
+
+SRCS(
+ readme.go
+)
+
+END()
diff --git a/vendor/go.uber.org/zap/internal/stacktrace/gotest/ya.make b/vendor/go.uber.org/zap/internal/stacktrace/gotest/ya.make
new file mode 100644
index 0000000000..e5045319ca
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/stacktrace/gotest/ya.make
@@ -0,0 +1,5 @@
+GO_TEST_FOR(vendor/go.uber.org/zap/internal/stacktrace)
+
+LICENSE(MIT)
+
+END()
diff --git a/vendor/go.uber.org/zap/internal/stacktrace/stack.go b/vendor/go.uber.org/zap/internal/stacktrace/stack.go
new file mode 100644
index 0000000000..82af7551f9
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/stacktrace/stack.go
@@ -0,0 +1,181 @@
+// 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 stacktrace provides support for gathering stack traces
+// efficiently.
+package stacktrace
+
+import (
+ "runtime"
+
+ "go.uber.org/zap/buffer"
+ "go.uber.org/zap/internal/bufferpool"
+ "go.uber.org/zap/internal/pool"
+)
+
+var _stackPool = pool.New(func() *Stack {
+ return &Stack{
+ storage: make([]uintptr, 64),
+ }
+})
+
+// Stack is a captured stack trace.
+type Stack struct {
+ pcs []uintptr // program counters; always a subslice of storage
+ frames *runtime.Frames
+
+ // The size of pcs varies depending on requirements:
+ // it will be one if the only the first frame was requested,
+ // and otherwise it will reflect the depth of the call stack.
+ //
+ // storage decouples the slice we need (pcs) from the slice we pool.
+ // We will always allocate a reasonably large storage, but we'll use
+ // only as much of it as we need.
+ storage []uintptr
+}
+
+// Depth specifies how deep of a stack trace should be captured.
+type Depth int
+
+const (
+ // First captures only the first frame.
+ First Depth = iota
+
+ // Full captures the entire call stack, allocating more
+ // storage for it if needed.
+ Full
+)
+
+// Capture captures a stack trace of the specified depth, skipping
+// the provided number of frames. skip=0 identifies the caller of
+// Capture.
+//
+// The caller must call Free on the returned stacktrace after using it.
+func Capture(skip int, depth Depth) *Stack {
+ stack := _stackPool.Get()
+
+ switch depth {
+ case First:
+ stack.pcs = stack.storage[:1]
+ case Full:
+ stack.pcs = stack.storage
+ }
+
+ // Unlike other "skip"-based APIs, skip=0 identifies runtime.Callers
+ // itself. +2 to skip captureStacktrace and runtime.Callers.
+ numFrames := runtime.Callers(
+ skip+2,
+ stack.pcs,
+ )
+
+ // runtime.Callers truncates the recorded stacktrace if there is no
+ // room in the provided slice. For the full stack trace, keep expanding
+ // storage until there are fewer frames than there is room.
+ if depth == Full {
+ pcs := stack.pcs
+ for numFrames == len(pcs) {
+ pcs = make([]uintptr, len(pcs)*2)
+ numFrames = runtime.Callers(skip+2, pcs)
+ }
+
+ // Discard old storage instead of returning it to the pool.
+ // This will adjust the pool size over time if stack traces are
+ // consistently very deep.
+ stack.storage = pcs
+ stack.pcs = pcs[:numFrames]
+ } else {
+ stack.pcs = stack.pcs[:numFrames]
+ }
+
+ stack.frames = runtime.CallersFrames(stack.pcs)
+ return stack
+}
+
+// Free releases resources associated with this stacktrace
+// and returns it back to the pool.
+func (st *Stack) Free() {
+ st.frames = nil
+ st.pcs = nil
+ _stackPool.Put(st)
+}
+
+// Count reports the total number of frames in this stacktrace.
+// Count DOES NOT change as Next is called.
+func (st *Stack) Count() int {
+ return len(st.pcs)
+}
+
+// Next returns the next frame in the stack trace,
+// and a boolean indicating whether there are more after it.
+func (st *Stack) Next() (_ runtime.Frame, more bool) {
+ return st.frames.Next()
+}
+
+// Take returns a string representation of the current stacktrace.
+//
+// skip is the number of frames to skip before recording the stack trace.
+// skip=0 identifies the caller of Take.
+func Take(skip int) string {
+ stack := Capture(skip+1, Full)
+ defer stack.Free()
+
+ buffer := bufferpool.Get()
+ defer buffer.Free()
+
+ stackfmt := NewFormatter(buffer)
+ stackfmt.FormatStack(stack)
+ return buffer.String()
+}
+
+// Formatter formats a stack trace into a readable string representation.
+type Formatter struct {
+ b *buffer.Buffer
+ nonEmpty bool // whehther we've written at least one frame already
+}
+
+// NewFormatter builds a new Formatter.
+func NewFormatter(b *buffer.Buffer) Formatter {
+ return Formatter{b: b}
+}
+
+// FormatStack formats all remaining frames in the provided stacktrace -- minus
+// the final runtime.main/runtime.goexit frame.
+func (sf *Formatter) FormatStack(stack *Stack) {
+ // Note: On the last iteration, frames.Next() returns false, with a valid
+ // frame, but we ignore this frame. The last frame is a runtime frame which
+ // adds noise, since it's only either runtime.main or runtime.goexit.
+ for frame, more := stack.Next(); more; frame, more = stack.Next() {
+ sf.FormatFrame(frame)
+ }
+}
+
+// FormatFrame formats the given frame.
+func (sf *Formatter) FormatFrame(frame runtime.Frame) {
+ if sf.nonEmpty {
+ sf.b.AppendByte('\n')
+ }
+ sf.nonEmpty = true
+ sf.b.AppendString(frame.Function)
+ sf.b.AppendByte('\n')
+ sf.b.AppendByte('\t')
+ sf.b.AppendString(frame.File)
+ sf.b.AppendByte(':')
+ sf.b.AppendInt(int64(frame.Line))
+}
diff --git a/vendor/go.uber.org/zap/internal/stacktrace/stack_test.go b/vendor/go.uber.org/zap/internal/stacktrace/stack_test.go
new file mode 100644
index 0000000000..195eeaeaee
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/stacktrace/stack_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 stacktrace
+
+import (
+ "bytes"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestTake(t *testing.T) {
+ trace := Take(0)
+ lines := strings.Split(trace, "\n")
+ require.NotEmpty(t, lines, "Expected stacktrace to have at least one frame.")
+ assert.Contains(
+ t,
+ lines[0],
+ "go.uber.org/zap/internal/stacktrace.TestTake",
+ "Expected stacktrace to start with the test.",
+ )
+}
+
+func TestTakeWithSkip(t *testing.T) {
+ trace := Take(1)
+ lines := strings.Split(trace, "\n")
+ require.NotEmpty(t, lines, "Expected stacktrace to have at least one frame.")
+ assert.Contains(
+ t,
+ lines[0],
+ "testing.",
+ "Expected stacktrace to start with the test runner (skipping our own frame).",
+ )
+}
+
+func TestTakeWithSkipInnerFunc(t *testing.T) {
+ var trace string
+ func() {
+ trace = Take(2)
+ }()
+ lines := strings.Split(trace, "\n")
+ require.NotEmpty(t, lines, "Expected stacktrace to have at least one frame.")
+ assert.Contains(
+ t,
+ lines[0],
+ "testing.",
+ "Expected stacktrace to start with the test function (skipping the test function).",
+ )
+}
+
+func TestTakeDeepStack(t *testing.T) {
+ const (
+ N = 500
+ withStackDepthName = "go.uber.org/zap/internal/stacktrace.withStackDepth"
+ )
+ withStackDepth(N, func() {
+ trace := Take(0)
+ for found := 0; found < N; found++ {
+ i := strings.Index(trace, withStackDepthName)
+ if i < 0 {
+ t.Fatalf(`expected %v occurrences of %q, found %d`,
+ N, withStackDepthName, found)
+ }
+ trace = trace[i+len(withStackDepthName):]
+ }
+ })
+}
+
+func BenchmarkTake(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ Take(0)
+ }
+}
+
+func withStackDepth(depth int, f func()) {
+ var recurse func(rune) rune
+ recurse = func(r rune) rune {
+ if r > 0 {
+ bytes.Map(recurse, []byte(string([]rune{r - 1})))
+ } else {
+ f()
+ }
+ return 0
+ }
+ recurse(rune(depth))
+}
diff --git a/vendor/go.uber.org/zap/internal/stacktrace/ya.make b/vendor/go.uber.org/zap/internal/stacktrace/ya.make
new file mode 100644
index 0000000000..de4f0672f0
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/stacktrace/ya.make
@@ -0,0 +1,15 @@
+GO_LIBRARY()
+
+LICENSE(MIT)
+
+SRCS(
+ stack.go
+)
+
+GO_TEST_SRCS(stack_test.go)
+
+END()
+
+RECURSE(
+ gotest
+)
diff --git a/vendor/go.uber.org/zap/internal/ya.make b/vendor/go.uber.org/zap/internal/ya.make
new file mode 100644
index 0000000000..4515b67ad1
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/ya.make
@@ -0,0 +1,19 @@
+GO_LIBRARY()
+
+LICENSE(MIT)
+
+SRCS(
+ level_enabler.go
+)
+
+END()
+
+RECURSE(
+ bufferpool
+ color
+ exit
+ pool
+ readme
+ stacktrace
+ ztest
+)
diff --git a/vendor/go.uber.org/zap/internal/ztest/clock.go b/vendor/go.uber.org/zap/internal/ztest/clock.go
new file mode 100644
index 0000000000..47b0b7f965
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/ztest/clock.go
@@ -0,0 +1,153 @@
+// 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 ztest
+
+import (
+ "sort"
+ "sync"
+ "time"
+)
+
+// MockClock is a fake source of time.
+// It implements standard time operations,
+// but allows the user to control the passage of time.
+//
+// Use the [Add] method to progress time.
+type MockClock struct {
+ mu sync.RWMutex
+ now time.Time
+
+ // The MockClock works by maintaining a list of waiters.
+ // Each waiter knows the time at which it should be resolved.
+ // When the clock advances, all waiters that are in range are resolved
+ // in chronological order.
+ waiters []waiter
+}
+
+// NewMockClock builds a new mock clock
+// using the current actual time as the initial time.
+func NewMockClock() *MockClock {
+ return &MockClock{
+ now: time.Now(),
+ }
+}
+
+// Now reports the current time.
+func (c *MockClock) Now() time.Time {
+ c.mu.RLock()
+ defer c.mu.RUnlock()
+ return c.now
+}
+
+// NewTicker returns a time.Ticker that ticks at the specified frequency.
+//
+// As with [time.NewTicker],
+// the ticker will drop ticks if the receiver is slow,
+// and the channel is never closed.
+//
+// Calling Stop on the returned ticker is a no-op.
+// The ticker only runs when the clock is advanced.
+func (c *MockClock) NewTicker(d time.Duration) *time.Ticker {
+ ch := make(chan time.Time, 1)
+
+ var tick func(time.Time)
+ tick = func(now time.Time) {
+ next := now.Add(d)
+ c.runAt(next, func() {
+ defer tick(next)
+
+ select {
+ case ch <- next:
+ // ok
+ default:
+ // The receiver is slow.
+ // Drop the tick and continue.
+ }
+ })
+ }
+ tick(c.Now())
+
+ return &time.Ticker{C: ch}
+}
+
+// runAt schedules the given function to be run at the given time.
+// The function runs without a lock held, so it may schedule more work.
+func (c *MockClock) runAt(t time.Time, fn func()) {
+ c.mu.Lock()
+ defer c.mu.Unlock()
+ c.waiters = append(c.waiters, waiter{until: t, fn: fn})
+}
+
+type waiter struct {
+ until time.Time
+ fn func()
+}
+
+// Add progresses time by the given duration.
+// Other operations waiting for the time to advance
+// will be resolved if they are within range.
+//
+// Side effects of operations waiting for the time to advance
+// will take effect on a best-effort basis.
+// Avoid racing with operations that have side effects.
+//
+// Panics if the duration is negative.
+func (c *MockClock) Add(d time.Duration) {
+ if d < 0 {
+ panic("cannot add negative duration")
+ }
+
+ c.mu.Lock()
+ defer c.mu.Unlock()
+
+ sort.Slice(c.waiters, func(i, j int) bool {
+ return c.waiters[i].until.Before(c.waiters[j].until)
+ })
+
+ newTime := c.now.Add(d)
+ // newTime won't be recorded until the end of this method.
+ // This ensures that any waiters that are resolved
+ // are resolved at the time they were expecting.
+
+ for len(c.waiters) > 0 {
+ w := c.waiters[0]
+ if w.until.After(newTime) {
+ break
+ }
+ c.waiters[0] = waiter{} // avoid memory leak
+ c.waiters = c.waiters[1:]
+
+ // The waiter is within range.
+ // Travel to the time of the waiter and resolve it.
+ c.now = w.until
+
+ // The waiter may schedule more work
+ // so we must release the lock.
+ c.mu.Unlock()
+ w.fn()
+ // Sleeping here is necessary to let the side effects of waiters
+ // take effect before we continue.
+ time.Sleep(1 * time.Millisecond)
+ c.mu.Lock()
+ }
+
+ c.now = newTime
+}
diff --git a/vendor/go.uber.org/zap/internal/ztest/clock_test.go b/vendor/go.uber.org/zap/internal/ztest/clock_test.go
new file mode 100644
index 0000000000..6db724bd97
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/ztest/clock_test.go
@@ -0,0 +1,80 @@
+// 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 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)
+}
+
+func TestMockClock_NewTicker_slowConsumer(t *testing.T) {
+ clock := NewMockClock()
+
+ ticker := clock.NewTicker(time.Microsecond)
+ defer ticker.Stop()
+
+ // Two ticks, only one consumed.
+ clock.Add(2 * time.Microsecond)
+ <-ticker.C
+
+ select {
+ case <-ticker.C:
+ t.Fatal("unexpected tick")
+ default:
+ // ok
+ }
+}
+
+func TestMockClock_Add_negative(t *testing.T) {
+ clock := NewMockClock()
+ assert.Panics(t, func() { clock.Add(-1) })
+}
diff --git a/vendor/go.uber.org/zap/internal/ztest/doc.go b/vendor/go.uber.org/zap/internal/ztest/doc.go
new file mode 100644
index 0000000000..cd4b98cbcb
--- /dev/null
+++ b/vendor/go.uber.org/zap/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/vendor/go.uber.org/zap/internal/ztest/gotest/ya.make b/vendor/go.uber.org/zap/internal/ztest/gotest/ya.make
new file mode 100644
index 0000000000..708f864916
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/ztest/gotest/ya.make
@@ -0,0 +1,5 @@
+GO_TEST_FOR(vendor/go.uber.org/zap/internal/ztest)
+
+LICENSE(MIT)
+
+END()
diff --git a/vendor/go.uber.org/zap/internal/ztest/timeout.go b/vendor/go.uber.org/zap/internal/ztest/timeout.go
new file mode 100644
index 0000000000..e4222f9479
--- /dev/null
+++ b/vendor/go.uber.org/zap/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/vendor/go.uber.org/zap/internal/ztest/writer.go b/vendor/go.uber.org/zap/internal/ztest/writer.go
new file mode 100644
index 0000000000..f54d8569ee
--- /dev/null
+++ b/vendor/go.uber.org/zap/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")
+}
diff --git a/vendor/go.uber.org/zap/internal/ztest/ya.make b/vendor/go.uber.org/zap/internal/ztest/ya.make
new file mode 100644
index 0000000000..f66ad3b511
--- /dev/null
+++ b/vendor/go.uber.org/zap/internal/ztest/ya.make
@@ -0,0 +1,18 @@
+GO_LIBRARY()
+
+LICENSE(MIT)
+
+SRCS(
+ clock.go
+ doc.go
+ timeout.go
+ writer.go
+)
+
+GO_TEST_SRCS(clock_test.go)
+
+END()
+
+RECURSE(
+ gotest
+)