@@ -21,6 +21,7 @@ import (
2121 "net/http"
2222 "net/http/httptest"
2323 "testing"
24+ "time"
2425
2526 "github.com/arduino/arduino-cli/internal/cli/configuration"
2627 "github.com/stretchr/testify/require"
@@ -68,3 +69,41 @@ func TestProxy(t *testing.T) {
6869 require .NoError (t , err )
6970 require .Equal (t , http .StatusNoContent , response .StatusCode )
7071}
72+
73+ func TestConnectionTimeout (t * testing.T ) {
74+ ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
75+ time .Sleep (5 * time .Second )
76+ w .WriteHeader (http .StatusNoContent )
77+ }))
78+ defer ts .Close ()
79+
80+ doRequest := func (timeout int ) (* http.Response , time.Duration , error ) {
81+ settings := configuration .NewSettings ()
82+ settings .Set ("network.proxy" , ts .URL )
83+ if timeout != 0 {
84+ settings .Set ("network.connection_timeout" , 2 )
85+ }
86+ client , err := settings .NewHttpClient ()
87+ require .NoError (t , err )
88+
89+ request , err := http .NewRequest ("GET" , "http://arduino.cc" , nil )
90+ require .NoError (t , err )
91+
92+ start := time .Now ()
93+ resp , err := client .Do (request )
94+ duration := time .Since (start )
95+
96+ return resp , duration , err
97+ }
98+
99+ // Using default timeout (0), will wait indefinitely (in our case up to 5s)
100+ response , elapsed , err := doRequest (0 )
101+ require .NoError (t , err )
102+ require .Equal (t , http .StatusNoContent , response .StatusCode )
103+ require .True (t , elapsed .Seconds () >= 4 && elapsed .Seconds () <= 6 ) // Adding some tolerance just in case...
104+
105+ // Setting a timeout of 1 seconds, will drop the connection after 1s
106+ _ , elapsed , err = doRequest (1 )
107+ require .Error (t , err )
108+ require .True (t , elapsed .Seconds () >= 0.5 && elapsed .Seconds () <= 3 ) // Adding some tolerance just in case...
109+ }
0 commit comments