gitee.com/sasukebo/go-micro/v4@v4.7.1/transport/http_transport_test.go (about)

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