@@ -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,69 @@ 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
+ _ , _ = io .Copy (w , bytes .NewReader (manifest ))
121
+ })
122
+ r .Head (fmt .Sprintf ("/v2/%s/manifests/{tag}" , namespace ), func (w http.ResponseWriter , req * http.Request ) {
123
+ time .Sleep (time .Second )
124
+ w .Header ().Set ("Content-Length" , fmt .Sprintf ("%d" , len (manifest )))
125
+ w .Header ().Set ("Docker-Content-Digest" , digest .String ())
126
+ _ , _ = io .Copy (w , bytes .NewReader (manifest ))
127
+ })
128
+ addr , stop := testutil .StartServer (r )
129
+ defer stop ()
130
+
131
+ config := newTestConfig (addr )
132
+ config .ResponseHeaderTimeout = 100 * time .Millisecond
133
+ client , err := NewTagClient (config )
134
+ require .NoError (err )
135
+
136
+ _ , err = client .Stat (tag , tag )
137
+ if assert .NotNil (t , err ) {
138
+ assert .Contains (t , err .Error (), "timeout awaiting response headers" )
139
+ }
140
+
141
+ var b bytes.Buffer
142
+ err = client .Download (tag , tag , & b )
143
+ if assert .NotNil (t , err ) {
144
+ assert .Contains (t , err .Error (), "timeout awaiting response headers" )
145
+ }
146
+ }
147
+
148
+ func TestTagDownloadConnectTimeout (t * testing.T ) {
149
+ require := require .New (t )
150
+
151
+ // unroutable address, courtesy of https://stackoverflow.com/a/904609/4867444
152
+ config := newTestConfig ("10.255.255.1" )
153
+ config .ConnectTimeout = 100 * time .Millisecond
154
+ client , err := NewTagClient (config )
155
+ require .NoError (err )
156
+
157
+ _ , err = client .Stat ("dummynamespace" , "image:tag" )
158
+ if assert .NotNil (t , err ) {
159
+ assert .Contains (t , err .Error (), "i/o timeout" )
160
+ }
161
+
162
+ var b bytes.Buffer
163
+ err = client .Download ("dummynamespace" , "image:tag" , & b )
164
+ if assert .NotNil (t , err ) {
165
+ assert .Contains (t , err .Error (), "i/o timeout" )
166
+ }
167
+ }
0 commit comments