github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/http_client/http_client_test.go (about)

     1  //go:build unit
     2  // +build unit
     3  
     4  package http_client
     5  
     6  import (
     7  	"context"
     8  	"io"
     9  	"net/http"
    10  	"net/http/httptest"
    11  	"net/url"
    12  	"strings"
    13  	"testing"
    14  
    15  	clientv1 "github.com/qiniu/go-sdk/v7/client"
    16  	"github.com/qiniu/go-sdk/v7/storagev2/credentials"
    17  	"github.com/qiniu/go-sdk/v7/storagev2/region"
    18  )
    19  
    20  func TestHttpClient(t *testing.T) {
    21  	type Req struct {
    22  		id  int
    23  		url *url.URL
    24  	}
    25  	reqs := make([]Req, 0, 3)
    26  	mux_1 := http.NewServeMux()
    27  	mux_1.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
    28  		reqs = append(reqs, Req{id: 1, url: r.URL})
    29  		if auth := r.Header.Get("Authorization"); !strings.HasPrefix(auth, "Qiniu TestAk:") {
    30  			t.Fatalf("Unexpected authorization: %s", auth)
    31  		}
    32  		w.Header().Add("X-ReqId", "fakereqid")
    33  		w.WriteHeader(http.StatusInternalServerError)
    34  		io.WriteString(w, "test error")
    35  	})
    36  	server_1 := httptest.NewServer(mux_1)
    37  	defer server_1.Close()
    38  
    39  	mux_2 := http.NewServeMux()
    40  	mux_2.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
    41  		reqs = append(reqs, Req{id: 2, url: r.URL})
    42  		if auth := r.Header.Get("Authorization"); !strings.HasPrefix(auth, "Qiniu TestAk:") {
    43  			t.Fatalf("Unexpected authorization: %s", auth)
    44  		}
    45  		w.Header().Add("X-ReqId", "fakereqid")
    46  		w.WriteHeader(http.StatusInternalServerError)
    47  		io.WriteString(w, "test error")
    48  	})
    49  	server_2 := httptest.NewServer(mux_2)
    50  	defer server_2.Close()
    51  
    52  	mux_3 := http.NewServeMux()
    53  	mux_3.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
    54  		reqs = append(reqs, Req{id: 3, url: r.URL})
    55  		if auth := r.Header.Get("Authorization"); !strings.HasPrefix(auth, "Qiniu TestAk:") {
    56  			t.Fatalf("Unexpected authorization: %s", auth)
    57  		}
    58  		w.Header().Add("X-ReqId", "fakereqid")
    59  		w.WriteHeader(http.StatusInternalServerError)
    60  		io.WriteString(w, "test error")
    61  	})
    62  	server_3 := httptest.NewServer(mux_3)
    63  	defer server_3.Close()
    64  
    65  	httpClient := NewClient(&Options{
    66  		HostRetryConfig: &RetryConfig{},
    67  		Regions: &region.Region{
    68  			Api: region.Endpoints{
    69  				Preferred:   []string{server_1.URL, server_2.URL},
    70  				Alternative: []string{server_3.URL},
    71  			},
    72  		},
    73  	})
    74  	_, err := httpClient.Do(context.Background(), &Request{
    75  		ServiceNames: []region.ServiceName{region.ServiceApi},
    76  		Method:       http.MethodGet,
    77  		Path:         "/test",
    78  		RawQuery:     "fakeRawQuery",
    79  		Query: url.Values{
    80  			"x-query-1": {"x-value-1"},
    81  			"x-query-2": {"x-value-2"},
    82  		},
    83  		Header: http.Header{
    84  			"x-qiniu-1": {"x-value-1"},
    85  			"x-qiniu-2": {"x-value-2"},
    86  		},
    87  		Credentials: credentials.NewCredentials("TestAk", "TestSk"),
    88  	})
    89  	if err == nil {
    90  		t.Fatalf("Expected error")
    91  	}
    92  	if clientErr, ok := err.(*clientv1.ErrorInfo); ok {
    93  		if clientErr.Code != http.StatusInternalServerError {
    94  			t.Fatalf("Unexpected status code: %d", clientErr.Code)
    95  		}
    96  	}
    97  	if len(reqs) != 12 {
    98  		t.Fatalf("Unexpected reqs: %#v", reqs)
    99  	}
   100  	for i, req := range reqs {
   101  		if i/4+1 != req.id || req.url.String() != "/test?fakeRawQuery&x-query-1=x-value-1&x-query-2=x-value-2" {
   102  			t.Fatalf("Unexpected req: %d, %d, %s", i, req.id, req.url)
   103  		}
   104  	}
   105  }
   106  
   107  func TestHttpClientJson(t *testing.T) {
   108  	mux_1 := http.NewServeMux()
   109  	mux_1.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
   110  		if auth := r.Header.Get("Authorization"); !strings.HasPrefix(auth, "Qiniu TestAk:") {
   111  			t.Fatalf("Unexpected authorization: %s", auth)
   112  		}
   113  		w.Header().Add("X-ReqId", "fakereqid")
   114  		io.WriteString(w, "{\"Test\":\"AccessKey\"}")
   115  	})
   116  	server_1 := httptest.NewServer(mux_1)
   117  	defer server_1.Close()
   118  
   119  	httpClient := NewClient(&Options{
   120  		Regions: &region.Region{
   121  			Api: region.Endpoints{
   122  				Preferred: []string{server_1.URL},
   123  			},
   124  		},
   125  	})
   126  
   127  	var body struct {
   128  		Test string `json:"Test"`
   129  	}
   130  
   131  	err := httpClient.DoAndAcceptJSON(context.Background(), &Request{
   132  		ServiceNames: []region.ServiceName{region.ServiceApi},
   133  		Method:       http.MethodGet,
   134  		Path:         "/test",
   135  		RawQuery:     "fakeRawQuery",
   136  		Query: url.Values{
   137  			"x-query-1": {"x-value-1"},
   138  			"x-query-2": {"x-value-2"},
   139  		},
   140  		Header: http.Header{
   141  			"x-qiniu-1": {"x-value-1"},
   142  			"x-qiniu-2": {"x-value-2"},
   143  		},
   144  		Credentials: credentials.NewCredentials("TestAk", "TestSk"),
   145  	}, &body)
   146  	if err != nil {
   147  		t.Fatalf("Unexpected error: %s", err)
   148  	}
   149  	if body.Test != "AccessKey" {
   150  		t.Fatalf("Unexpected body: %#v", body)
   151  	}
   152  }