diff --git a/internal/cli/configuration/network_test.go b/internal/cli/configuration/network_test.go index 6c8a7def80d..d4a9af384bc 100644 --- a/internal/cli/configuration/network_test.go +++ b/internal/cli/configuration/network_test.go @@ -21,6 +21,7 @@ import ( "net/http" "net/http/httptest" "testing" + "time" "github.com/arduino/arduino-cli/internal/cli/configuration" "github.com/stretchr/testify/require" @@ -68,3 +69,41 @@ func TestProxy(t *testing.T) { require.NoError(t, err) require.Equal(t, http.StatusNoContent, response.StatusCode) } + +func TestConnectionTimeout(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + time.Sleep(5 * time.Second) + w.WriteHeader(http.StatusNoContent) + })) + defer ts.Close() + + doRequest := func(timeout int) (*http.Response, time.Duration, error) { + settings := configuration.NewSettings() + settings.Set("network.proxy", ts.URL) + if timeout != 0 { + settings.Set("network.connection_timeout", 2) + } + client, err := settings.NewHttpClient() + require.NoError(t, err) + + request, err := http.NewRequest("GET", "http://arduino.cc", nil) + require.NoError(t, err) + + start := time.Now() + resp, err := client.Do(request) + duration := time.Since(start) + + return resp, duration, err + } + + // Using default timeout (0), will wait indefinitely (in our case up to 5s) + response, elapsed, err := doRequest(0) + require.NoError(t, err) + require.Equal(t, http.StatusNoContent, response.StatusCode) + require.True(t, elapsed.Seconds() >= 4 && elapsed.Seconds() <= 6) // Adding some tolerance just in case... + + // Setting a timeout of 1 seconds, will drop the connection after 1s + _, elapsed, err = doRequest(1) + require.Error(t, err) + require.True(t, elapsed.Seconds() >= 0.5 && elapsed.Seconds() <= 3) // Adding some tolerance just in case... +}