github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/api/http/response_test.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:43</date>
    10  //</624450111870603264>
    11  
    12  
    13  package http
    14  
    15  import (
    16  	"encoding/json"
    17  	"io/ioutil"
    18  	"net/http"
    19  	"strings"
    20  	"testing"
    21  
    22  	"golang.org/x/net/html"
    23  )
    24  
    25  func TestError(t *testing.T) {
    26  	srv := NewTestSwarmServer(t, serverFunc, nil)
    27  	defer srv.Close()
    28  
    29  	var resp *http.Response
    30  	var respbody []byte
    31  
    32  	url := srv.URL + "/this_should_fail_as_no_bzz_protocol_present"
    33  	resp, err := http.Get(url)
    34  
    35  	if err != nil {
    36  		t.Fatalf("Request failed: %v", err)
    37  	}
    38  	defer resp.Body.Close()
    39  	respbody, err = ioutil.ReadAll(resp.Body)
    40  
    41  	if resp.StatusCode != 404 && !strings.Contains(string(respbody), "Invalid URI &#34;/this_should_fail_as_no_bzz_protocol_present&#34;: unknown scheme") {
    42  		t.Fatalf("Response body does not match, expected: %v, to contain: %v; received code %d, expected code: %d", string(respbody), "Invalid bzz URI: unknown scheme", 400, resp.StatusCode)
    43  	}
    44  
    45  	_, err = html.Parse(strings.NewReader(string(respbody)))
    46  	if err != nil {
    47  		t.Fatalf("HTML validation failed for error page returned!")
    48  	}
    49  }
    50  
    51  func Test404Page(t *testing.T) {
    52  	srv := NewTestSwarmServer(t, serverFunc, nil)
    53  	defer srv.Close()
    54  
    55  	var resp *http.Response
    56  	var respbody []byte
    57  
    58  	url := srv.URL + "/bzz:/1234567890123456789012345678901234567890123456789012345678901234"
    59  	resp, err := http.Get(url)
    60  
    61  	if err != nil {
    62  		t.Fatalf("Request failed: %v", err)
    63  	}
    64  	defer resp.Body.Close()
    65  	respbody, err = ioutil.ReadAll(resp.Body)
    66  
    67  	if resp.StatusCode != 404 || !strings.Contains(string(respbody), "404") {
    68  		t.Fatalf("Invalid Status Code received, expected 404, got %d", resp.StatusCode)
    69  	}
    70  
    71  	_, err = html.Parse(strings.NewReader(string(respbody)))
    72  	if err != nil {
    73  		t.Fatalf("HTML validation failed for error page returned!")
    74  	}
    75  }
    76  
    77  func Test500Page(t *testing.T) {
    78  	srv := NewTestSwarmServer(t, serverFunc, nil)
    79  	defer srv.Close()
    80  
    81  	var resp *http.Response
    82  	var respbody []byte
    83  
    84  	url := srv.URL + "/bzz:/thisShouldFailWith500Code"
    85  	resp, err := http.Get(url)
    86  
    87  	if err != nil {
    88  		t.Fatalf("Request failed: %v", err)
    89  	}
    90  	defer resp.Body.Close()
    91  	respbody, err = ioutil.ReadAll(resp.Body)
    92  
    93  	if resp.StatusCode != 404 {
    94  		t.Fatalf("Invalid Status Code received, expected 404, got %d", resp.StatusCode)
    95  	}
    96  
    97  	_, err = html.Parse(strings.NewReader(string(respbody)))
    98  	if err != nil {
    99  		t.Fatalf("HTML validation failed for error page returned!")
   100  	}
   101  }
   102  func Test500PageWith0xHashPrefix(t *testing.T) {
   103  	srv := NewTestSwarmServer(t, serverFunc, nil)
   104  	defer srv.Close()
   105  
   106  	var resp *http.Response
   107  	var respbody []byte
   108  
   109  	url := srv.URL + "/bzz:/0xthisShouldFailWith500CodeAndAHelpfulMessage"
   110  	resp, err := http.Get(url)
   111  
   112  	if err != nil {
   113  		t.Fatalf("Request failed: %v", err)
   114  	}
   115  	defer resp.Body.Close()
   116  	respbody, err = ioutil.ReadAll(resp.Body)
   117  
   118  	if resp.StatusCode != 404 {
   119  		t.Fatalf("Invalid Status Code received, expected 404, got %d", resp.StatusCode)
   120  	}
   121  
   122  	if !strings.Contains(string(respbody), "The requested hash seems to be prefixed with") {
   123  		t.Fatalf("Did not receive the expected error message")
   124  	}
   125  
   126  	_, err = html.Parse(strings.NewReader(string(respbody)))
   127  	if err != nil {
   128  		t.Fatalf("HTML validation failed for error page returned!")
   129  	}
   130  }
   131  
   132  func TestJsonResponse(t *testing.T) {
   133  	srv := NewTestSwarmServer(t, serverFunc, nil)
   134  	defer srv.Close()
   135  
   136  	var resp *http.Response
   137  	var respbody []byte
   138  
   139  	url := srv.URL + "/bzz:/thisShouldFailWith500Code/"
   140  	req, err := http.NewRequest("GET", url, nil)
   141  	if err != nil {
   142  		t.Fatalf("Request failed: %v", err)
   143  	}
   144  	req.Header.Set("Accept", "application/json")
   145  	resp, err = http.DefaultClient.Do(req)
   146  	if err != nil {
   147  		t.Fatalf("Request failed: %v", err)
   148  	}
   149  
   150  	defer resp.Body.Close()
   151  	respbody, err = ioutil.ReadAll(resp.Body)
   152  
   153  	if resp.StatusCode != 404 {
   154  		t.Fatalf("Invalid Status Code received, expected 404, got %d", resp.StatusCode)
   155  	}
   156  
   157  	if !isJSON(string(respbody)) {
   158  		t.Fatalf("Expected response to be JSON, received invalid JSON: %s", string(respbody))
   159  	}
   160  
   161  }
   162  
   163  func isJSON(s string) bool {
   164  	var js map[string]interface{}
   165  	return json.Unmarshal([]byte(s), &js) == nil
   166  }
   167