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 }