@@ -18,12 +18,18 @@ package docker
1818
1919import (
2020 "context"
21+ "encoding/json"
2122 "fmt"
23+ "io"
2224 "io/ioutil"
2325 "math/rand"
2426 "net/http"
2527 "net/http/httptest"
2628 "testing"
29+
30+ "github.com/docker/distribution/registry/api/errcode"
31+ "github.com/pkg/errors"
32+ "gotest.tools/assert"
2733)
2834
2935func TestFetcherOpen (t * testing.T ) {
@@ -92,3 +98,66 @@ func TestFetcherOpen(t *testing.T) {
9298 t .Fatal ("expected error opening with invalid server response" )
9399 }
94100}
101+
102+ // New set of tests to test new error cases
103+ func TestDockerFetcherOpen (t * testing.T ) {
104+ tests := []struct {
105+ name string
106+ mockedStatus int
107+ mockedErr error
108+ want io.ReadCloser
109+ wantErr bool
110+ wantServerMessageError bool
111+ wantPlainError bool
112+ }{
113+ {
114+ name : "should return status and error.message if it exists if the registry request fails" ,
115+ mockedStatus : 500 ,
116+ mockedErr : errcode.Errors {errcode.Error {
117+ Code : errcode .ErrorCodeUnknown ,
118+ Message : "Test Error" ,
119+ }},
120+ want : nil ,
121+ wantErr : true ,
122+ wantServerMessageError : true ,
123+ },
124+ {
125+ name : "should return just status if the registry request fails and does not return a docker error" ,
126+ mockedStatus : 500 ,
127+ mockedErr : fmt .Errorf ("Non-docker error" ),
128+ want : nil ,
129+ wantErr : true ,
130+ wantPlainError : true ,
131+ },
132+ }
133+ for _ , tt := range tests {
134+ t .Run (tt .name , func (t * testing.T ) {
135+
136+ s := httptest .NewServer (http .HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
137+ rw .WriteHeader (tt .mockedStatus )
138+ bytes , _ := json .Marshal (tt .mockedErr )
139+ rw .Write (bytes )
140+ }))
141+ defer s .Close ()
142+
143+ r := dockerFetcher {& dockerBase {
144+ client : s .Client (),
145+ }}
146+
147+ got , err := r .open (context .TODO (), s .URL , "" , 0 )
148+ assert .Equal (t , tt .wantErr , (err != nil ))
149+ assert .Equal (t , tt .want , got )
150+ if tt .wantErr {
151+ var expectedError error
152+ if tt .wantServerMessageError {
153+ expectedError = errors .Errorf ("unexpected status code %v: %v %s - Server message: %s" , s .URL , tt .mockedStatus , http .StatusText (tt .mockedStatus ), tt .mockedErr .Error ())
154+ } else if tt .wantPlainError {
155+ expectedError = errors .Errorf ("unexpected status code %v: %v %s" , s .URL , tt .mockedStatus , http .StatusText (tt .mockedStatus ))
156+ }
157+ assert .Equal (t , expectedError .Error (), err .Error ())
158+
159+ }
160+
161+ })
162+ }
163+ }
0 commit comments