github.com/annwntech/go-micro/v2@v2.9.5/transport/http_transport_test.go (about)

     1  package transport
     2  
     3  import (
     4  	"io"
     5  	"net"
     6  	"testing"
     7  	"time"
     8  )
     9  
    10  func expectedPort(t *testing.T, expected string, lsn Listener) {
    11  	_, port, err := net.SplitHostPort(lsn.Addr())
    12  	if err != nil {
    13  		t.Errorf("Expected address to be `%s`, got error: %v", expected, err)
    14  	}
    15  
    16  	if port != expected {
    17  		lsn.Close()
    18  		t.Errorf("Expected address to be `%s`, got `%s`", expected, port)
    19  	}
    20  }
    21  
    22  func TestHTTPTransportPortRange(t *testing.T) {
    23  	tp := NewTransport()
    24  
    25  	lsn1, err := tp.Listen(":44444-44448")
    26  	if err != nil {
    27  		t.Errorf("Did not expect an error, got %s", err)
    28  	}
    29  	expectedPort(t, "44444", lsn1)
    30  
    31  	lsn2, err := tp.Listen(":44444-44448")
    32  	if err != nil {
    33  		t.Errorf("Did not expect an error, got %s", err)
    34  	}
    35  	expectedPort(t, "44445", lsn2)
    36  
    37  	lsn, err := tp.Listen("127.0.0.1:0")
    38  	if err != nil {
    39  		t.Errorf("Did not expect an error, got %s", err)
    40  	}
    41  
    42  	lsn.Close()
    43  	lsn1.Close()
    44  	lsn2.Close()
    45  }
    46  
    47  func TestHTTPTransportCommunication(t *testing.T) {
    48  	tr := NewTransport()
    49  
    50  	l, err := tr.Listen("127.0.0.1:0")
    51  	if err != nil {
    52  		t.Errorf("Unexpected listen err: %v", err)
    53  	}
    54  	defer l.Close()
    55  
    56  	fn := func(sock Socket) {
    57  		defer sock.Close()
    58  
    59  		for {
    60  			var m Message
    61  			if err := sock.Recv(&m); err != nil {
    62  				return
    63  			}
    64  
    65  			if err := sock.Send(&m); err != nil {
    66  				return
    67  			}
    68  		}
    69  	}
    70  
    71  	done := make(chan bool)
    72  
    73  	go func() {
    74  		if err := l.Accept(fn); err != nil {
    75  			select {
    76  			case <-done:
    77  			default:
    78  				t.Errorf("Unexpected accept err: %v", err)
    79  			}
    80  		}
    81  	}()
    82  
    83  	c, err := tr.Dial(l.Addr())
    84  	if err != nil {
    85  		t.Errorf("Unexpected dial err: %v", err)
    86  	}
    87  	defer c.Close()
    88  
    89  	m := Message{
    90  		Header: map[string]string{
    91  			"Content-Type": "application/json",
    92  		},
    93  		Body: []byte(`{"message": "Hello World"}`),
    94  	}
    95  
    96  	if err := c.Send(&m); err != nil {
    97  		t.Errorf("Unexpected send err: %v", err)
    98  	}
    99  
   100  	var rm Message
   101  
   102  	if err := c.Recv(&rm); err != nil {
   103  		t.Errorf("Unexpected recv err: %v", err)
   104  	}
   105  
   106  	if string(rm.Body) != string(m.Body) {
   107  		t.Errorf("Expected %v, got %v", m.Body, rm.Body)
   108  	}
   109  
   110  	close(done)
   111  }
   112  
   113  func TestHTTPTransportError(t *testing.T) {
   114  	tr := NewTransport()
   115  
   116  	l, err := tr.Listen("127.0.0.1:0")
   117  	if err != nil {
   118  		t.Errorf("Unexpected listen err: %v", err)
   119  	}
   120  	defer l.Close()
   121  
   122  	fn := func(sock Socket) {
   123  		defer sock.Close()
   124  
   125  		for {
   126  			var m Message
   127  			if err := sock.Recv(&m); err != nil {
   128  				if err == io.EOF {
   129  					return
   130  				}
   131  				t.Fatal(err)
   132  			}
   133  
   134  			sock.(*httpTransportSocket).error(&Message{
   135  				Body: []byte(`an error occurred`),
   136  			})
   137  		}
   138  	}
   139  
   140  	done := make(chan bool)
   141  
   142  	go func() {
   143  		if err := l.Accept(fn); err != nil {
   144  			select {
   145  			case <-done:
   146  			default:
   147  				t.Errorf("Unexpected accept err: %v", err)
   148  			}
   149  		}
   150  	}()
   151  
   152  	c, err := tr.Dial(l.Addr())
   153  	if err != nil {
   154  		t.Errorf("Unexpected dial err: %v", err)
   155  	}
   156  	defer c.Close()
   157  
   158  	m := Message{
   159  		Header: map[string]string{
   160  			"Content-Type": "application/json",
   161  		},
   162  		Body: []byte(`{"message": "Hello World"}`),
   163  	}
   164  
   165  	if err := c.Send(&m); err != nil {
   166  		t.Errorf("Unexpected send err: %v", err)
   167  	}
   168  
   169  	var rm Message
   170  
   171  	err = c.Recv(&rm)
   172  	if err == nil {
   173  		t.Fatal("Expected error but got nil")
   174  	}
   175  
   176  	if err.Error() != "500 Internal Server Error: an error occurred" {
   177  		t.Fatalf("Did not receive expected error, got: %v", err)
   178  	}
   179  
   180  	close(done)
   181  }
   182  
   183  func TestHTTPTransportTimeout(t *testing.T) {
   184  	tr := NewTransport(Timeout(time.Millisecond * 100))
   185  
   186  	l, err := tr.Listen("127.0.0.1:0")
   187  	if err != nil {
   188  		t.Errorf("Unexpected listen err: %v", err)
   189  	}
   190  	defer l.Close()
   191  
   192  	done := make(chan bool)
   193  
   194  	fn := func(sock Socket) {
   195  		defer func() {
   196  			sock.Close()
   197  			close(done)
   198  		}()
   199  
   200  		go func() {
   201  			select {
   202  			case <-done:
   203  				return
   204  			case <-time.After(time.Second):
   205  				t.Fatal("deadline not executed")
   206  			}
   207  		}()
   208  
   209  		for {
   210  			var m Message
   211  
   212  			if err := sock.Recv(&m); err != nil {
   213  				return
   214  			}
   215  		}
   216  	}
   217  
   218  	go func() {
   219  		if err := l.Accept(fn); err != nil {
   220  			select {
   221  			case <-done:
   222  			default:
   223  				t.Errorf("Unexpected accept err: %v", err)
   224  			}
   225  		}
   226  	}()
   227  
   228  	c, err := tr.Dial(l.Addr())
   229  	if err != nil {
   230  		t.Errorf("Unexpected dial err: %v", err)
   231  	}
   232  	defer c.Close()
   233  
   234  	m := Message{
   235  		Header: map[string]string{
   236  			"Content-Type": "application/json",
   237  		},
   238  		Body: []byte(`{"message": "Hello World"}`),
   239  	}
   240  
   241  	if err := c.Send(&m); err != nil {
   242  		t.Errorf("Unexpected send err: %v", err)
   243  	}
   244  
   245  	<-done
   246  }