mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user