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