github.com/zhouyu0/docker-note@v0.0.0-20190722021225-b8d3825084db/internal/test/registry/registry_mock.go (about) 1 package registry // import "github.com/docker/docker/internal/test/registry" 2 3 import ( 4 "net/http" 5 "net/http/httptest" 6 "regexp" 7 "strings" 8 "sync" 9 10 "github.com/docker/docker/internal/test" 11 ) 12 13 type handlerFunc func(w http.ResponseWriter, r *http.Request) 14 15 // Mock represent a registry mock 16 type Mock struct { 17 server *httptest.Server 18 hostport string 19 handlers map[string]handlerFunc 20 mu sync.Mutex 21 } 22 23 // RegisterHandler register the specified handler for the registry mock 24 func (tr *Mock) RegisterHandler(path string, h handlerFunc) { 25 tr.mu.Lock() 26 defer tr.mu.Unlock() 27 tr.handlers[path] = h 28 } 29 30 // NewMock creates a registry mock 31 func NewMock(t testingT) (*Mock, error) { 32 if ht, ok := t.(test.HelperT); ok { 33 ht.Helper() 34 } 35 testReg := &Mock{handlers: make(map[string]handlerFunc)} 36 37 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 38 url := r.URL.String() 39 40 var matched bool 41 var err error 42 for re, function := range testReg.handlers { 43 matched, err = regexp.MatchString(re, url) 44 if err != nil { 45 t.Fatal("Error with handler regexp") 46 } 47 if matched { 48 function(w, r) 49 break 50 } 51 } 52 53 if !matched { 54 t.Fatalf("Unable to match %s with regexp", url) 55 } 56 })) 57 58 testReg.server = ts 59 testReg.hostport = strings.Replace(ts.URL, "http://", "", 1) 60 return testReg, nil 61 } 62 63 // URL returns the url of the registry 64 func (tr *Mock) URL() string { 65 return tr.hostport 66 } 67 68 // Close closes mock and releases resources 69 func (tr *Mock) Close() { 70 tr.server.Close() 71 }