From c0ff0550bc286ad055d98697780c765d93b38e46 Mon Sep 17 00:00:00 2001 From: Jim Date: Fri, 29 Sep 2023 16:39:32 -0400 Subject: [PATCH 1/3] test: fixup some racing tests --- conn_test.go | 5 ++--- mux_test.go | 11 +++++++---- testdirectory/directory.go | 3 ++- testdirectory/directory_test.go | 27 ++++++++++++++++++++++++++- testing.go | 25 +++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 9 deletions(-) diff --git a/conn_test.go b/conn_test.go index b52e564..5b0ff86 100644 --- a/conn_test.go +++ b/conn_test.go @@ -1,7 +1,6 @@ package gldap import ( - "bytes" "context" "net" "testing" @@ -17,10 +16,10 @@ func Test_newConn(t *testing.T) { server, client := net.Pipe() t.Cleanup(func() { server.Close(); client.Close() }) - var buf bytes.Buffer + buf := testSafeBuf(t) testLogger := hclog.New(&hclog.LoggerOptions{ Name: "test", - Output: &buf, + Output: buf, }) tests := map[string]struct { diff --git a/mux_test.go b/mux_test.go index b8bfdd8..020013e 100644 --- a/mux_test.go +++ b/mux_test.go @@ -19,11 +19,11 @@ func TestMux_serve(t *testing.T) { t.Parallel() t.Run("no-matching-handler", func(t *testing.T) { assert, require := assert.New(t), require.New(t) - var buf bytes.Buffer + buf := testSafeBuf(t) testLogger := hclog.New(&hclog.LoggerOptions{ Name: "TestServer_Run-logger", Level: hclog.Debug, - Output: &buf, + Output: buf, }) s, err := NewServer(WithLogger(testLogger)) require.NoError(err) @@ -48,11 +48,14 @@ func TestMux_serve(t *testing.T) { }) t.Run("default-route", func(t *testing.T) { assert, require := assert.New(t), require.New(t) - var buf bytes.Buffer + buf := &safeBuf{ + mu: &sync.Mutex{}, + buf: &strings.Builder{}, + } testLogger := hclog.New(&hclog.LoggerOptions{ Name: "TestServer_Run-logger", Level: hclog.Debug, - Output: &buf, + Output: buf, }) s, err := NewServer(WithLogger(testLogger)) require.NoError(err) diff --git a/testdirectory/directory.go b/testdirectory/directory.go index 09b1ab3..0f66bf8 100644 --- a/testdirectory/directory.go +++ b/testdirectory/directory.go @@ -153,7 +153,8 @@ func Start(t TestingT, opt ...Option) *Directory { d.logger.Debug("not using TLS") } go func() { - _ = d.s.Run(fmt.Sprintf("%s:%d", opts.withHost, opts.withPort), connOpts...) + err := d.s.Run(fmt.Sprintf("%s:%d", opts.withHost, opts.withPort), connOpts...) + require.NoError(err) }() if v, ok := interface{}(t).(CleanupT); ok { diff --git a/testdirectory/directory_test.go b/testdirectory/directory_test.go index 326c4fa..c61c7fd 100644 --- a/testdirectory/directory_test.go +++ b/testdirectory/directory_test.go @@ -5,6 +5,7 @@ import ( "crypto/x509" "fmt" "strings" + "sync" "testing" "time" @@ -123,7 +124,7 @@ func Test_Start(t *testing.T) { }) t.Run("start-with-TestingT", func(t *testing.T) { assert, require := assert.New(t), require.New(t) - buf := &strings.Builder{} + buf := testSafeBuf(t) bufLogger := hclog.New(&hclog.LoggerOptions{ Name: "my-app", Level: hclog.LevelFromString("DEBUG"), @@ -144,6 +145,30 @@ func Test_Start(t *testing.T) { }) } +type safeBuf struct { + buf *strings.Builder + mu *sync.Mutex +} + +func testSafeBuf(t *testing.T) *safeBuf { + t.Helper() + return &safeBuf{ + mu: &sync.Mutex{}, + buf: &strings.Builder{}, + } +} +func (w *safeBuf) Write(p []byte) (n int, err error) { + w.mu.Lock() + defer w.mu.Unlock() + return w.buf.Write(p) +} + +func (w *safeBuf) String() string { + w.mu.Lock() + defer w.mu.Unlock() + return w.buf.String() +} + func TestDirectory_SimpleBindResponse(t *testing.T) { t.Parallel() testLogger := hclog.New(&hclog.LoggerOptions{ diff --git a/testing.go b/testing.go index c01cb20..db5232c 100644 --- a/testing.go +++ b/testing.go @@ -4,6 +4,7 @@ import ( "net" "os" "strings" + "sync" "testing" ber "github.com/go-asn1-ber/asn1-ber" @@ -247,3 +248,27 @@ func TestEncodeString(t *testing.T, tag ber.Tag, s string, opt ...Option) string require.NoError(t, err) return string(dec.Bytes()) } + +type safeBuf struct { + buf *strings.Builder + mu *sync.Mutex +} + +func testSafeBuf(t *testing.T) *safeBuf { + t.Helper() + return &safeBuf{ + mu: &sync.Mutex{}, + buf: &strings.Builder{}, + } +} +func (w *safeBuf) Write(p []byte) (n int, err error) { + w.mu.Lock() + defer w.mu.Unlock() + return w.buf.Write(p) +} + +func (w *safeBuf) String() string { + w.mu.Lock() + defer w.mu.Unlock() + return w.buf.String() +} From 7217553dcef587bebf37c8d037fbb33278261b1a Mon Sep 17 00:00:00 2001 From: Jim Date: Fri, 29 Sep 2023 16:44:36 -0400 Subject: [PATCH 2/3] chore: update coverage --- coverage/coverage.html | 30 ++++++++++++++++++++++++++++-- coverage/coverage.log | 1 + coverage/coverage.svg | 2 +- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/coverage/coverage.html b/coverage/coverage.html index c16808c..a65ebf7 100644 --- a/coverage/coverage.html +++ b/coverage/coverage.html @@ -101,7 +101,7 @@ - + @@ -4168,7 +4168,8 @@ d.logger.Debug("not using TLS") } go func() { - _ = d.s.Run(fmt.Sprintf("%s:%d", opts.withHost, opts.withPort), connOpts...) + err := d.s.Run(fmt.Sprintf("%s:%d", opts.withHost, opts.withPort), connOpts...) + require.NoError(err) }() if v, ok := interface{}(t).(CleanupT); ok { @@ -5475,6 +5476,7 @@ "net" "os" "strings" + "sync" "testing" ber "github.com/go-asn1-ber/asn1-ber" @@ -5718,6 +5720,30 @@ require.NoError(t, err) return string(dec.Bytes()) } + +type safeBuf struct { + buf *strings.Builder + mu *sync.Mutex +} + +func testSafeBuf(t *testing.T) *safeBuf { + t.Helper() + return &safeBuf{ + mu: &sync.Mutex{}, + buf: &strings.Builder{}, + } +} +func (w *safeBuf) Write(p []byte) (n int, err error) { + w.mu.Lock() + defer w.mu.Unlock() + return w.buf.Write(p) +} + +func (w *safeBuf) String() string { + w.mu.Lock() + defer w.mu.Unlock() + return w.buf.String() +} diff --git a/coverage/coverage.log b/coverage/coverage.log index 07ffc8b..02adb1b 100644 --- a/coverage/coverage.log +++ b/coverage/coverage.log @@ -1 +1,2 @@ 1695973415,88.6 +1696020265,88.5 diff --git a/coverage/coverage.svg b/coverage/coverage.svg index c1a8abd..bf0c64c 100644 --- a/coverage/coverage.svg +++ b/coverage/coverage.svg @@ -1 +1 @@ -coverage: 88.6%coverage88.6% \ No newline at end of file +coverage: 88.5%coverage88.5% \ No newline at end of file From 05db51a47bbb64c2f98969da19ed3d443d06e3b2 Mon Sep 17 00:00:00 2001 From: Jim Date: Fri, 29 Sep 2023 17:37:42 -0400 Subject: [PATCH 3/3] fixup! test: fixup some racing tests --- server_test.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/server_test.go b/server_test.go index 9b29afd..61d9c4a 100644 --- a/server_test.go +++ b/server_test.go @@ -2,6 +2,7 @@ package gldap_test import ( "crypto/tls" + "crypto/x509" "fmt" "sync" "testing" @@ -167,10 +168,18 @@ func TestServer_shutdownCtx(t *testing.T) { td := testdirectory.Start(fakeT, testdirectory.WithDefaults(t, &testdirectory.Defaults{AllowAnonymousBind: true})) time.Sleep(1 * time.Second) // allow time so the test directory will start up. go func() { - client := td.Conn() - defer client.Close() + certpool := x509.NewCertPool() + certpool.AppendCertsFromPEM([]byte(td.Cert())) + tlsConfig := &tls.Config{ + RootCAs: certpool, + } + conn, err := ldap.DialURL(fmt.Sprintf("ldaps://localhost:%d", td.Port()), ldap.DialWithTLSConfig(tlsConfig)) + if err != nil { + return + } + defer conn.Close() for { - err := client.UnauthenticatedBind("alice") + err := conn.UnauthenticatedBind("alice") if err != nil { return }