Merge branch '21504-arv-mount-reference'
[arvados.git] / sdk / go / arvados / client_test.go
index b7c60fbf8dbfe8e53ffa3180d057294062d7d5d4..55e2f998c4a88589efe1d917272e152a29210247 100644 (file)
@@ -170,6 +170,44 @@ func (*clientSuite) TestAnythingToValues(c *check.C) {
        }
 }
 
+// select=["uuid"] is added automatically when RequestAndDecode's
+// destination argument is nil.
+func (*clientSuite) TestAutoSelectUUID(c *check.C) {
+       var req *http.Request
+       var err error
+       server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+               c.Check(r.ParseForm(), check.IsNil)
+               req = r
+               w.Write([]byte("{}"))
+       }))
+       client := Client{
+               APIHost:   strings.TrimPrefix(server.URL, "https://"),
+               AuthToken: "zzz",
+               Insecure:  true,
+               Timeout:   2 * time.Second,
+       }
+
+       req = nil
+       err = client.RequestAndDecode(nil, http.MethodPost, "test", nil, nil)
+       c.Check(err, check.IsNil)
+       c.Check(req.FormValue("select"), check.Equals, `["uuid"]`)
+
+       req = nil
+       err = client.RequestAndDecode(nil, http.MethodGet, "test", nil, nil)
+       c.Check(err, check.IsNil)
+       c.Check(req.FormValue("select"), check.Equals, `["uuid"]`)
+
+       req = nil
+       err = client.RequestAndDecode(nil, http.MethodGet, "test", nil, map[string]interface{}{"select": []string{"blergh"}})
+       c.Check(err, check.IsNil)
+       c.Check(req.FormValue("select"), check.Equals, `["uuid"]`)
+
+       req = nil
+       err = client.RequestAndDecode(&struct{}{}, http.MethodGet, "test", nil, map[string]interface{}{"select": []string{"blergh"}})
+       c.Check(err, check.IsNil)
+       c.Check(req.FormValue("select"), check.Equals, `["blergh"]`)
+}
+
 func (*clientSuite) TestLoadConfig(c *check.C) {
        oldenv := os.Environ()
        defer func() {
@@ -303,6 +341,20 @@ func (s *clientRetrySuite) TestNonRetryableError(c *check.C) {
        c.Check(s.reqs, check.HasLen, 1)
 }
 
+// as of 0.7.2., retryablehttp does not recognize this as a
+// non-retryable error.
+func (s *clientRetrySuite) TestNonRetryableStdlibError(c *check.C) {
+       s.respStatus <- http.StatusOK
+       req, err := http.NewRequest(http.MethodGet, "https://"+s.client.APIHost+"/test", nil)
+       c.Assert(err, check.IsNil)
+       req.Header.Set("Good-Header", "T\033rrible header value")
+       err = s.client.DoAndDecode(&struct{}{}, req)
+       c.Check(err, check.ErrorMatches, `.*after 1 attempt.*net/http: invalid header .*`)
+       if !c.Check(s.reqs, check.HasLen, 0) {
+               c.Logf("%v", s.reqs[0])
+       }
+}
+
 func (s *clientRetrySuite) TestNonRetryableAfter503s(c *check.C) {
        time.AfterFunc(time.Second, func() { s.respStatus <- http.StatusNotFound })
        err := s.client.RequestAndDecode(&struct{}{}, http.MethodGet, "test", nil, nil)