fn: tests for hung and bad docker repo during docker-pull (#1298)

* fn: tests for hung and bad docker repo during docker-pull
This commit is contained in:
Tolga Ceylan
2018-11-05 16:01:42 -08:00
committed by GitHub
parent 9b50eaddf1
commit 975b780695
7 changed files with 131 additions and 7 deletions

View File

@@ -436,6 +436,110 @@ type dummyReader struct {
io.Reader
}
func TestDockerPullHungRepo(t *testing.T) {
hung, cancel := context.WithCancel(context.Background())
garbageServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// version check seem to have a sane timeout in docker, let's serve this, then stop
if r.URL.String() == "/v2/" {
w.WriteHeader(200)
return
}
<-hung.Done()
}))
defer garbageServer.Close()
defer cancel()
dest := strings.TrimPrefix(garbageServer.URL, "http://")
app := &models.App{ID: "app_id"}
fn := &models.Fn{
ID: "fn_id",
Image: dest + "/fnproject/fn-test-utils",
ResourceConfig: models.ResourceConfig{
Timeout: 5,
IdleTimeout: 10,
Memory: 128,
},
}
url := "http://127.0.0.1:8080/invoke/" + fn.ID
ls := logs.NewMock()
cfg, err := NewConfig()
cfg.MaxDockerRetries = 1
cfg.HotStartTimeout = time.Duration(5) * time.Second
a := New(NewDirectCallDataAccess(ls, new(mqs.Mock)), WithConfig(cfg))
defer checkClose(t, a)
req, err := http.NewRequest("GET", url, &dummyReader{Reader: strings.NewReader(`{}`)})
if err != nil {
t.Fatal("unexpected error building request", err)
}
var out bytes.Buffer
callI, err := a.GetCall(FromHTTPFnRequest(app, fn, req), WithWriter(&out))
if err != nil {
t.Fatal(err)
}
err = a.Submit(callI)
if err == nil {
t.Fatal("submit should error!")
}
errS := err.Error()
if !strings.HasPrefix(errS, "Failed to pull image ") || !strings.Contains(errS, "context deadline exceeded") {
t.Fatalf("unexpected error %v", err)
}
}
func TestDockerPullBadRepo(t *testing.T) {
garbageServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "enjoy this lovely garbage")
}))
defer garbageServer.Close()
dest := strings.TrimPrefix(garbageServer.URL, "http://")
app := &models.App{ID: "app_id"}
fn := &models.Fn{
ID: "fn_id",
Image: dest + "/fnproject/fn-test-utils",
ResourceConfig: models.ResourceConfig{
Timeout: 5,
IdleTimeout: 10,
Memory: 128,
},
}
url := "http://127.0.0.1:8080/invoke/" + fn.ID
ls := logs.NewMock()
cfg, err := NewConfig()
cfg.MaxDockerRetries = 1
a := New(NewDirectCallDataAccess(ls, new(mqs.Mock)), WithConfig(cfg))
defer checkClose(t, a)
req, err := http.NewRequest("GET", url, &dummyReader{Reader: strings.NewReader(`{}`)})
if err != nil {
t.Fatal("unexpected error building request", err)
}
var out bytes.Buffer
callI, err := a.GetCall(FromHTTPFnRequest(app, fn, req), WithWriter(&out))
if err != nil {
t.Fatal(err)
}
err = a.Submit(callI)
if err == nil {
t.Fatal("submit should error!")
}
if !strings.HasPrefix(err.Error(), "Failed to pull image ") {
t.Fatalf("unexpected error %v", err)
}
}
func TestHTTPWithoutContentLengthWorks(t *testing.T) {
// TODO it may be a good idea to mock out the http server and use a real
// response writer with sync, and also test that this works with async + log