github.com/astaxie/beego@v1.12.3/httplib/httplib_test.go (about)

     1  // Copyright 2014 beego Author. All Rights Reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package httplib
    16  
    17  import (
    18  	"errors"
    19  	"io/ioutil"
    20  	"net"
    21  	"net/http"
    22  	"os"
    23  	"strings"
    24  	"testing"
    25  	"time"
    26  )
    27  
    28  func TestResponse(t *testing.T) {
    29  	req := Get("http://httpbin.org/get")
    30  	resp, err := req.Response()
    31  	if err != nil {
    32  		t.Fatal(err)
    33  	}
    34  	t.Log(resp)
    35  }
    36  
    37  func TestDoRequest(t *testing.T) {
    38  	req := Get("https://goolnk.com/33BD2j")
    39  	retryAmount := 1
    40  	req.Retries(1)
    41  	req.RetryDelay(1400 * time.Millisecond)
    42  	retryDelay := 1400 * time.Millisecond
    43  
    44  	req.setting.CheckRedirect = func(redirectReq *http.Request, redirectVia []*http.Request) error {
    45  		return errors.New("Redirect triggered")
    46  	}
    47  
    48  	startTime := time.Now().UnixNano() / int64(time.Millisecond)
    49  
    50  	_, err := req.Response()
    51  	if err == nil {
    52  		t.Fatal("Response should have yielded an error")
    53  	}
    54  
    55  	endTime := time.Now().UnixNano() / int64(time.Millisecond)
    56  	elapsedTime := endTime - startTime
    57  	delayedTime := int64(retryAmount) * retryDelay.Milliseconds()
    58  
    59  	if elapsedTime < delayedTime {
    60  		t.Errorf("Not enough retries. Took %dms. Delay was meant to take %dms", elapsedTime, delayedTime)
    61  	}
    62  
    63  }
    64  
    65  func TestGet(t *testing.T) {
    66  	req := Get("http://httpbin.org/get")
    67  	b, err := req.Bytes()
    68  	if err != nil {
    69  		t.Fatal(err)
    70  	}
    71  	t.Log(b)
    72  
    73  	s, err := req.String()
    74  	if err != nil {
    75  		t.Fatal(err)
    76  	}
    77  	t.Log(s)
    78  
    79  	if string(b) != s {
    80  		t.Fatal("request data not match")
    81  	}
    82  }
    83  
    84  func TestSimplePost(t *testing.T) {
    85  	v := "smallfish"
    86  	req := Post("http://httpbin.org/post")
    87  	req.Param("username", v)
    88  
    89  	str, err := req.String()
    90  	if err != nil {
    91  		t.Fatal(err)
    92  	}
    93  	t.Log(str)
    94  
    95  	n := strings.Index(str, v)
    96  	if n == -1 {
    97  		t.Fatal(v + " not found in post")
    98  	}
    99  }
   100  
   101  //func TestPostFile(t *testing.T) {
   102  //	v := "smallfish"
   103  //	req := Post("http://httpbin.org/post")
   104  //	req.Debug(true)
   105  //	req.Param("username", v)
   106  //	req.PostFile("uploadfile", "httplib_test.go")
   107  
   108  //	str, err := req.String()
   109  //	if err != nil {
   110  //		t.Fatal(err)
   111  //	}
   112  //	t.Log(str)
   113  
   114  //	n := strings.Index(str, v)
   115  //	if n == -1 {
   116  //		t.Fatal(v + " not found in post")
   117  //	}
   118  //}
   119  
   120  func TestSimplePut(t *testing.T) {
   121  	str, err := Put("http://httpbin.org/put").String()
   122  	if err != nil {
   123  		t.Fatal(err)
   124  	}
   125  	t.Log(str)
   126  }
   127  
   128  func TestSimpleDelete(t *testing.T) {
   129  	str, err := Delete("http://httpbin.org/delete").String()
   130  	if err != nil {
   131  		t.Fatal(err)
   132  	}
   133  	t.Log(str)
   134  }
   135  
   136  func TestSimpleDeleteParam(t *testing.T) {
   137  	str, err := Delete("http://httpbin.org/delete").Param("key", "val").String()
   138  	if err != nil {
   139  		t.Fatal(err)
   140  	}
   141  	t.Log(str)
   142  }
   143  
   144  func TestWithCookie(t *testing.T) {
   145  	v := "smallfish"
   146  	str, err := Get("http://httpbin.org/cookies/set?k1=" + v).SetEnableCookie(true).String()
   147  	if err != nil {
   148  		t.Fatal(err)
   149  	}
   150  	t.Log(str)
   151  
   152  	str, err = Get("http://httpbin.org/cookies").SetEnableCookie(true).String()
   153  	if err != nil {
   154  		t.Fatal(err)
   155  	}
   156  	t.Log(str)
   157  
   158  	n := strings.Index(str, v)
   159  	if n == -1 {
   160  		t.Fatal(v + " not found in cookie")
   161  	}
   162  }
   163  
   164  func TestWithBasicAuth(t *testing.T) {
   165  	str, err := Get("http://httpbin.org/basic-auth/user/passwd").SetBasicAuth("user", "passwd").String()
   166  	if err != nil {
   167  		t.Fatal(err)
   168  	}
   169  	t.Log(str)
   170  	n := strings.Index(str, "authenticated")
   171  	if n == -1 {
   172  		t.Fatal("authenticated not found in response")
   173  	}
   174  }
   175  
   176  func TestWithUserAgent(t *testing.T) {
   177  	v := "beego"
   178  	str, err := Get("http://httpbin.org/headers").SetUserAgent(v).String()
   179  	if err != nil {
   180  		t.Fatal(err)
   181  	}
   182  	t.Log(str)
   183  
   184  	n := strings.Index(str, v)
   185  	if n == -1 {
   186  		t.Fatal(v + " not found in user-agent")
   187  	}
   188  }
   189  
   190  func TestWithSetting(t *testing.T) {
   191  	v := "beego"
   192  	var setting BeegoHTTPSettings
   193  	setting.EnableCookie = true
   194  	setting.UserAgent = v
   195  	setting.Transport = &http.Transport{
   196  		DialContext: (&net.Dialer{
   197  			Timeout:   30 * time.Second,
   198  			KeepAlive: 30 * time.Second,
   199  			DualStack: true,
   200  		}).DialContext,
   201  		MaxIdleConns:          50,
   202  		IdleConnTimeout:       90 * time.Second,
   203  		ExpectContinueTimeout: 1 * time.Second,
   204  	}
   205  	setting.ReadWriteTimeout = 5 * time.Second
   206  	SetDefaultSetting(setting)
   207  
   208  	str, err := Get("http://httpbin.org/get").String()
   209  	if err != nil {
   210  		t.Fatal(err)
   211  	}
   212  	t.Log(str)
   213  
   214  	n := strings.Index(str, v)
   215  	if n == -1 {
   216  		t.Fatal(v + " not found in user-agent")
   217  	}
   218  }
   219  
   220  func TestToJson(t *testing.T) {
   221  	req := Get("http://httpbin.org/ip")
   222  	resp, err := req.Response()
   223  	if err != nil {
   224  		t.Fatal(err)
   225  	}
   226  	t.Log(resp)
   227  
   228  	// httpbin will return http remote addr
   229  	type IP struct {
   230  		Origin string `json:"origin"`
   231  	}
   232  	var ip IP
   233  	err = req.ToJSON(&ip)
   234  	if err != nil {
   235  		t.Fatal(err)
   236  	}
   237  	t.Log(ip.Origin)
   238  	ips := strings.Split(ip.Origin, ",")
   239  	if len(ips) == 0 {
   240  		t.Fatal("response is not valid ip")
   241  	}
   242  	for i := range ips {
   243  		if net.ParseIP(strings.TrimSpace(ips[i])).To4() == nil {
   244  			t.Fatal("response is not valid ip")
   245  		}
   246  	}
   247  
   248  }
   249  
   250  func TestToFile(t *testing.T) {
   251  	f := "beego_testfile"
   252  	req := Get("http://httpbin.org/ip")
   253  	err := req.ToFile(f)
   254  	if err != nil {
   255  		t.Fatal(err)
   256  	}
   257  	defer os.Remove(f)
   258  	b, err := ioutil.ReadFile(f)
   259  	if n := strings.Index(string(b), "origin"); n == -1 {
   260  		t.Fatal(err)
   261  	}
   262  }
   263  
   264  func TestToFileDir(t *testing.T) {
   265  	f := "./files/beego_testfile"
   266  	req := Get("http://httpbin.org/ip")
   267  	err := req.ToFile(f)
   268  	if err != nil {
   269  		t.Fatal(err)
   270  	}
   271  	defer os.RemoveAll("./files")
   272  	b, err := ioutil.ReadFile(f)
   273  	if n := strings.Index(string(b), "origin"); n == -1 {
   274  		t.Fatal(err)
   275  	}
   276  }
   277  
   278  func TestHeader(t *testing.T) {
   279  	req := Get("http://httpbin.org/headers")
   280  	req.Header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36")
   281  	str, err := req.String()
   282  	if err != nil {
   283  		t.Fatal(err)
   284  	}
   285  	t.Log(str)
   286  }