Skip to content

Commit

Permalink
add test to reproduce this error
Browse files Browse the repository at this point in the history
  • Loading branch information
khushijain21 committed Nov 12, 2024
1 parent f6a0c7b commit bd5ba8d
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 6 deletions.
9 changes: 3 additions & 6 deletions transport/logging.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,10 @@ func LoggingDialer(d Dialer, logger *logp.Logger) Dialer {

func (l *loggingConn) Read(b []byte) (int, error) {
n, err := l.Conn.Read(b)
if err != nil && !errors.Is(err, io.EOF) {
if err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, net.ErrClosed) {
// Check for a closed network connection error
if errors.Is(err, net.ErrClosed) {
l.logger.Debugf("Connection is closed: %v", err)
} else {
l.logger.Debugf("Error reading from connection: %v", err)
}
l.logger.Debugf("Error reading from connection: %v", err)

}
return n, err
}
Expand Down
74 changes: 74 additions & 0 deletions transport/logging_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

package transport

import (
"fmt"
"io"
"net/http"
"net/http/httptest"
"testing"
"time"

"github.com/elastic/elastic-agent-libs/logp"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestIdleConnTimeoutError(t *testing.T) {
// observe all logs
logp.DevelopmentSetup(logp.ToObserverOutput())

Check failure on line 35 in transport/logging_test.go

View workflow job for this annotation

GitHub Actions / lint (windows)

Error return value of `logp.DevelopmentSetup` is not checked (errcheck)
logger := logp.NewLogger("test")

// Set up a test HTTP server
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, `{"status": "ok"}`)
}))
defer server.Close()

// Set IdleConnTimeout to 2 seconds and a custom dialer
transport := &http.Transport{
IdleConnTimeout: 2 * time.Second,
// uses our implementation of custom dialer
DialContext: LoggingDialer(NetDialer(10*time.Second), logger).DialContext,
}

client := &http.Client{
Transport: transport,
}

// First request to the test server
resp, err := client.Get(server.URL)

Check failure on line 56 in transport/logging_test.go

View workflow job for this annotation

GitHub Actions / lint (windows)

(*net/http.Client).Get must not be called (noctx)
require.NoError(t, err, "first request failed")
_, _ = io.ReadAll(resp.Body)
resp.Body.Close()

// Wait for a duration longer than IdleConnTimeout
waitTime := 6 * time.Second
time.Sleep(waitTime)

// Second request to the test server after idle timeout
resp, err = client.Get(server.URL)

Check failure on line 66 in transport/logging_test.go

View workflow job for this annotation

GitHub Actions / lint (windows)

(*net/http.Client).Get must not be called (noctx)
require.NoError(t, err, "second request failed")
_, _ = io.ReadAll(resp.Body)
resp.Body.Close()

logs := logp.ObserverLogs().FilterMessageSnippet("Error reading from connection:").TakeAll()
assert.Equal(t, 0, len(logs), "did not ignore use of closed connection error")

}

0 comments on commit bd5ba8d

Please sign in to comment.