package cos import ( "bytes" "encoding/xml" "io/ioutil" "net/http" "net/http/httptest" "net/url" "reflect" "testing" "time" ) var ( // mux is the HTTP request multiplexer used with the test server. mux *http.ServeMux // client is the COS client being tested. client *Client // server is a test HTTP server used to provide mock API responses. server *httptest.Server ) // setup sets up a test HTTP server along with a cos.Client that is // configured to talk to that test server. Tests should register handlers on // mux which provide mock responses for the API method being tested. func setup() { // test server mux = http.NewServeMux() server = httptest.NewServer(mux) u, _ := url.Parse(server.URL) client = NewClient(&BaseURL{u, u, u, u}, nil) } // teardown closes the test HTTP server. func teardown() { server.Close() } type values map[string]string func testFormValues(t *testing.T, r *http.Request, values values) { want := url.Values{} for k, v := range values { want.Set(k, v) } r.ParseForm() if got := r.Form; !reflect.DeepEqual(got, want) { t.Errorf("Request parameters: %v, want %v", got, want) } } func testMethod(t *testing.T, r *http.Request, want string) { if got := r.Method; got != want { t.Errorf("Request method: %v, want %v", got, want) } } func testHeader(t *testing.T, r *http.Request, header string, want string) { if got := r.Header.Get(header); got != want { t.Errorf("Header.Get(%q) returned %q, want %q", header, got, want) } } func testURLParseError(t *testing.T, err error) { if err == nil { t.Errorf("Expected error to be returned") } if err, ok := err.(*url.Error); !ok || err.Op != "parse" { t.Errorf("Expected URL parse error, got %+v", err) } } func testBody(t *testing.T, r *http.Request, want string) { b, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Error reading request body: %v", err) } if got := string(b); got != want { t.Errorf("request Body is %s, want %s", got, want) } } // Helper function to test that a value is marshalled to XML as expected. func testXMLMarshal(t *testing.T, v interface{}, want string) { j, err := xml.Marshal(v) if err != nil { t.Errorf("Unable to marshal JSON for %v", v) } w := new(bytes.Buffer) err = xml.NewEncoder(w).Encode([]byte(want)) if err != nil { t.Errorf("String is not valid json: %s", want) } if w.String() != string(j) { t.Errorf("xml.Marshal(%q) returned %s, want %s", v, j, w) } // now go the other direction and make sure things unmarshal as expected u := reflect.ValueOf(v).Interface() if err := xml.Unmarshal([]byte(want), u); err != nil { t.Errorf("Unable to unmarshal XML for %v", want) } if !reflect.DeepEqual(v, u) { t.Errorf("xml.Unmarshal(%q) returned %s, want %s", want, u, v) } } func TestNewClient(t *testing.T) { c := NewClient(nil, nil) if got, want := c.BaseURL.ServiceURL.String(), defaultServiceBaseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UserAgent, userAgent; got != want { t.Errorf("NewClient UserAgent is %v, want %v", got, want) } } func TestNewBucketURL_secure_false(t *testing.T) { got := NewBucketURL("bname-idx", "ap-guangzhou", false).String() want := "http://bname-idx.cos.ap-guangzhou.myqcloud.com" if got != want { t.Errorf("NewBucketURL is %v, want %v", got, want) } } func TestNewBucketURL_secure_true(t *testing.T) { got := NewBucketURL("bname-idx", "ap-guangzhou", true).String() want := "https://bname-idx.cos.ap-guangzhou.myqcloud.com" if got != want { t.Errorf("NewBucketURL is %v, want %v", got, want) } } func TestClient_doAPI(t *testing.T) { setup() defer teardown() } func TestNewAuthTime(t *testing.T) { a := NewAuthTime(time.Hour) if a.SignStartTime != a.KeyStartTime || a.SignEndTime != a.SignEndTime || a.SignStartTime.Add(time.Hour) != a.SignEndTime { t.Errorf("NewAuthTime request got %+v is not valid", a) } }