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  }