X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/1e2ace543b5614023e30f77d85c19da954cbf1cb..436f5c768dbc97135490b6477efd1ff0482a9dda:/services/keepproxy/keepproxy_test.go diff --git a/services/keepproxy/keepproxy_test.go b/services/keepproxy/keepproxy_test.go index 7c5b362896..6a349dae21 100644 --- a/services/keepproxy/keepproxy_test.go +++ b/services/keepproxy/keepproxy_test.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "crypto/md5" "fmt" "git.curoverse.com/arvados.git/sdk/go/arvadosclient" @@ -9,6 +10,7 @@ import ( "io/ioutil" "log" "net/http" + "net/http/httptest" "os" "strings" "testing" @@ -43,7 +45,7 @@ func waitForListener() { const ( ms = 5 ) - for i := 0; listener == nil && i < 1000; i += ms { + for i := 0; listener == nil && i < 10000; i += ms { time.Sleep(ms * time.Millisecond) } if listener == nil { @@ -99,17 +101,72 @@ func runProxy(c *C, args []string, bogusClientToken bool) *keepclient.KeepClient if bogusClientToken { arv.ApiToken = "bogus-token" } - kc := keepclient.New(&arv) + kc := keepclient.New(arv) sr := map[string]string{ TestProxyUUID: "http://" + listener.Addr().String(), } kc.SetServiceRoots(sr, sr, sr) kc.Arvados.External = true - kc.Using_proxy = true return kc } +func (s *ServerRequiredSuite) TestDesiredReplicas(c *C) { + kc := runProxy(c, nil, false) + defer closeListener() + + content := []byte("TestDesiredReplicas") + hash := fmt.Sprintf("%x", md5.Sum(content)) + + for _, kc.Want_replicas = range []int{0, 1, 2} { + locator, rep, err := kc.PutB(content) + c.Check(err, Equals, nil) + c.Check(rep, Equals, kc.Want_replicas) + if rep > 0 { + c.Check(locator, Matches, fmt.Sprintf(`^%s\+%d(\+.+)?$`, hash, len(content))) + } + } +} + +func (s *ServerRequiredSuite) TestPutWrongContentLength(c *C) { + kc := runProxy(c, nil, false) + defer closeListener() + + content := []byte("TestPutWrongContentLength") + hash := fmt.Sprintf("%x", md5.Sum(content)) + + // If we use http.Client to send these requests to the network + // server we just started, the Go http library automatically + // fixes the invalid Content-Length header. In order to test + // our server behavior, we have to call the handler directly + // using an httptest.ResponseRecorder. + rtr := MakeRESTRouter(true, true, kc) + + type testcase struct { + sendLength string + expectStatus int + } + + for _, t := range []testcase{ + {"1", http.StatusBadRequest}, + {"", http.StatusLengthRequired}, + {"-1", http.StatusLengthRequired}, + {"abcdef", http.StatusLengthRequired}, + } { + req, err := http.NewRequest("PUT", + fmt.Sprintf("http://%s/%s+%d", listener.Addr().String(), hash, len(content)), + bytes.NewReader(content)) + c.Assert(err, IsNil) + req.Header.Set("Content-Length", t.sendLength) + req.Header.Set("Authorization", "OAuth2 4axaw8zxe0qm22wa6urpp5nskcne8z88cvbupv653y1njyi05h") + req.Header.Set("Content-Type", "application/octet-stream") + + resp := httptest.NewRecorder() + rtr.ServeHTTP(resp, req) + c.Check(resp.Code, Equals, t.expectStatus) + } +} + func (s *ServerRequiredSuite) TestPutAskGet(c *C) { kc := runProxy(c, nil, false) defer closeListener() @@ -447,7 +504,7 @@ func (s *ServerRequiredSuite) TestAskGetKeepProxyConnectionError(c *C) { c.Assert(err, Equals, nil) // keepclient with no such keep server - kc := keepclient.New(&arv) + kc := keepclient.New(arv) locals := map[string]string{ TestProxyUUID: "http://localhost:12345", } @@ -474,7 +531,7 @@ func (s *NoKeepServerSuite) TestAskGetNoKeepServerError(c *C) { defer closeListener() hash := fmt.Sprintf("%x", md5.Sum([]byte("foo"))) - for _, f := range []func()error { + for _, f := range []func() error{ func() error { _, _, err := kc.Ask(hash) return err