@@ -20,8 +20,10 @@ import (
20
20
"net/http"
21
21
"strings"
22
22
"testing"
23
+ "time"
23
24
24
25
"github.com/pressly/chi"
26
+ "github.com/stretchr/testify/assert"
25
27
"github.com/stretchr/testify/require"
26
28
"github.com/uber/kraken/core"
27
29
"github.com/uber/kraken/lib/backend/backenderrors"
@@ -97,3 +99,72 @@ func TestTagDownloadFileNotFound(t *testing.T) {
97
99
var b bytes.Buffer
98
100
require .Equal (backenderrors .ErrBlobNotFound , client .Download (tag , tag , & b ))
99
101
}
102
+
103
+ func TestTagDownloadHeaderTimeout (t * testing.T ) {
104
+ require := require .New (t )
105
+
106
+ imageConfig := core .NewBlobFixture ()
107
+ layer1 := core .NewBlobFixture ()
108
+ layer2 := core .NewBlobFixture ()
109
+ digest , manifest := dockerutil .ManifestFixture (
110
+ imageConfig .Digest , layer1 .Digest , layer2 .Digest )
111
+
112
+ tag := core .TagFixture ()
113
+ namespace := strings .Split (tag , ":" )[0 ]
114
+
115
+ r := chi .NewRouter ()
116
+ r .Get (fmt .Sprintf ("/v2/%s/manifests/{tag}" , namespace ), func (w http.ResponseWriter , req * http.Request ) {
117
+ time .Sleep (time .Second )
118
+ w .Header ().Set ("Content-Length" , fmt .Sprintf ("%d" , len (manifest )))
119
+ w .Header ().Set ("Docker-Content-Digest" , digest .String ())
120
+ _ , err := io .Copy (w , bytes .NewReader (manifest ))
121
+ require .NoError (err )
122
+ })
123
+ r .Head (fmt .Sprintf ("/v2/%s/manifests/{tag}" , namespace ), func (w http.ResponseWriter , req * http.Request ) {
124
+ time .Sleep (time .Second )
125
+ w .Header ().Set ("Content-Length" , fmt .Sprintf ("%d" , len (manifest )))
126
+ w .Header ().Set ("Docker-Content-Digest" , digest .String ())
127
+ _ , err := io .Copy (w , bytes .NewReader (manifest ))
128
+ require .NoError (err )
129
+ })
130
+ addr , stop := testutil .StartServer (r )
131
+ defer stop ()
132
+
133
+ config := newTestConfig (addr )
134
+ config .ResponseHeaderTimeout = 100 * time .Millisecond
135
+ client , err := NewTagClient (config )
136
+ require .NoError (err )
137
+
138
+ _ , err = client .Stat (tag , tag )
139
+ if assert .NotNil (t , err ) {
140
+ assert .Contains (t , err .Error (), "timeout awaiting response headers" )
141
+ }
142
+
143
+ var b bytes.Buffer
144
+ err = client .Download (tag , tag , & b )
145
+ if assert .NotNil (t , err ) {
146
+ assert .Contains (t , err .Error (), "timeout awaiting response headers" )
147
+ }
148
+ }
149
+
150
+ // FIXME: debugging failing tests on Travis
151
+ //func TestTagDownloadConnectTimeout(t *testing.T) {
152
+ // require := require.New(t)
153
+ //
154
+ // // unroutable address, courtesy of https://stackoverflow.com/a/904609/4867444
155
+ // config := newTestConfig("10.255.255.1")
156
+ // config.ConnectTimeout = 100 * time.Millisecond
157
+ // client, err := NewTagClient(config)
158
+ // require.NoError(err)
159
+ //
160
+ // _, err = client.Stat("dummynamespace", "image:tag")
161
+ // if assert.NotNil(t, err) {
162
+ // assert.Contains(t, err.Error(), "i/o timeout")
163
+ // }
164
+ //
165
+ // var b bytes.Buffer
166
+ // err = client.Download("dummynamespace", "image:tag", &b)
167
+ // if assert.NotNil(t, err) {
168
+ // assert.Contains(t, err.Error(), "i/o timeout")
169
+ // }
170
+ //}
0 commit comments