github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/network/transport/http/http_transport_test.go (about)

     1  // Licensed under the Apache License, Version 2.0 (the "License");
     2  // you may not use this file except in compliance with the License.
     3  // You may obtain a copy of the License at
     4  //
     5  //     https://www.apache.org/licenses/LICENSE-2.0
     6  //
     7  // Unless required by applicable law or agreed to in writing, software
     8  // distributed under the License is distributed on an "AS IS" BASIS,
     9  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    10  // See the License for the specific language governing permissions and
    11  // limitations under the License.
    12  //
    13  // Original source: github.com/micro/go-micro/v3/network/transport/http/http_transport_test.go
    14  
    15  package http
    16  
    17  import (
    18  	"io"
    19  	"net"
    20  	"sync"
    21  	"testing"
    22  	"time"
    23  
    24  	"github.com/tickoalcantara12/micro/v3/service/network/transport"
    25  )
    26  
    27  func expectedPort(t *testing.T, expected string, lsn transport.Listener) {
    28  	_, port, err := net.SplitHostPort(lsn.Addr())
    29  	if err != nil {
    30  		t.Errorf("Expected address to be `%s`, got error: %v", expected, err)
    31  	}
    32  
    33  	if port != expected {
    34  		lsn.Close()
    35  		t.Errorf("Expected address to be `%s`, got `%s`", expected, port)
    36  	}
    37  }
    38  
    39  func TestHTTPTransportPortRange(t *testing.T) {
    40  	tp := NewTransport()
    41  
    42  	lsn1, err := tp.Listen(":44444-44448")
    43  	if err != nil {
    44  		t.Errorf("Did not expect an error, got %s", err)
    45  	}
    46  	expectedPort(t, "44444", lsn1)
    47  
    48  	lsn2, err := tp.Listen(":44444-44448")
    49  	if err != nil {
    50  		t.Errorf("Did not expect an error, got %s", err)
    51  	}
    52  	expectedPort(t, "44445", lsn2)
    53  
    54  	lsn, err := tp.Listen("127.0.0.1:0")
    55  	if err != nil {
    56  		t.Errorf("Did not expect an error, got %s", err)
    57  	}
    58  
    59  	lsn.Close()
    60  	lsn1.Close()
    61  	lsn2.Close()
    62  }
    63  
    64  func TestHTTPTransportCommunication(t *testing.T) {
    65  	tr := NewTransport()
    66  
    67  	l, err := tr.Listen("127.0.0.1:0")
    68  	if err != nil {
    69  		t.Errorf("Unexpected listen err: %v", err)
    70  	}
    71  	defer l.Close()
    72  
    73  	fn := func(sock transport.Socket) {
    74  		defer sock.Close()
    75  
    76  		for {
    77  			var m transport.Message
    78  			if err := sock.Recv(&m); err != nil {
    79  				return
    80  			}
    81  
    82  			if err := sock.Send(&m); err != nil {
    83  				return
    84  			}
    85  		}
    86  	}
    87  
    88  	done := make(chan bool)
    89  
    90  	go func() {
    91  		if err := l.Accept(fn); err != nil {
    92  			select {
    93  			case <-done:
    94  			default:
    95  				t.Errorf("Unexpected accept err: %v", err)
    96  			}
    97  		}
    98  	}()
    99  
   100  	c, err := tr.Dial(l.Addr())
   101  	if err != nil {
   102  		t.Errorf("Unexpected dial err: %v", err)
   103  	}
   104  	defer c.Close()
   105  
   106  	m := transport.Message{
   107  		Header: map[string]string{
   108  			"Content-Type": "application/json",
   109  		},
   110  		Body: []byte(`{"message": "Hello World"}`),
   111  	}
   112  
   113  	if err := c.Send(&m); err != nil {
   114  		t.Errorf("Unexpected send err: %v", err)
   115  	}
   116  
   117  	var rm transport.Message
   118  
   119  	if err := c.Recv(&rm); err != nil {
   120  		t.Errorf("Unexpected recv err: %v", err)
   121  	}
   122  
   123  	if string(rm.Body) != string(m.Body) {
   124  		t.Errorf("Expected %v, got %v", m.Body, rm.Body)
   125  	}
   126  
   127  	close(done)
   128  }
   129  
   130  func TestHTTPTransportError(t *testing.T) {
   131  	tr := NewTransport()
   132  
   133  	l, err := tr.Listen("127.0.0.1:0")
   134  	if err != nil {
   135  		t.Errorf("Unexpected listen err: %v", err)
   136  	}
   137  	defer l.Close()
   138  
   139  	fn := func(sock transport.Socket) {
   140  		defer sock.Close()
   141  
   142  		for {
   143  			var m transport.Message
   144  			if err := sock.Recv(&m); err != nil {
   145  				if err == io.EOF {
   146  					return
   147  				}
   148  				t.Fatal(err)
   149  			}
   150  
   151  			sock.(*httpTransportSocket).error(&transport.Message{
   152  				Body: []byte(`an error occurred`),
   153  			})
   154  		}
   155  	}
   156  
   157  	done := make(chan bool)
   158  
   159  	go func() {
   160  		if err := l.Accept(fn); err != nil {
   161  			select {
   162  			case <-done:
   163  			default:
   164  				t.Errorf("Unexpected accept err: %v", err)
   165  			}
   166  		}
   167  	}()
   168  
   169  	c, err := tr.Dial(l.Addr())
   170  	if err != nil {
   171  		t.Errorf("Unexpected dial err: %v", err)
   172  	}
   173  	defer c.Close()
   174  
   175  	m := transport.Message{
   176  		Header: map[string]string{
   177  			"Content-Type": "application/json",
   178  		},
   179  		Body: []byte(`{"message": "Hello World"}`),
   180  	}
   181  
   182  	if err := c.Send(&m); err != nil {
   183  		t.Errorf("Unexpected send err: %v", err)
   184  	}
   185  
   186  	var rm transport.Message
   187  
   188  	err = c.Recv(&rm)
   189  	if err == nil {
   190  		t.Fatal("Expected error but got nil")
   191  	}
   192  
   193  	if err.Error() != "500 Internal Server Error: an error occurred" {
   194  		t.Fatalf("Did not receive expected error, got: %v", err)
   195  	}
   196  
   197  	close(done)
   198  }
   199  
   200  func TestHTTPTransportTimeout(t *testing.T) {
   201  	tr := NewTransport(transport.Timeout(time.Millisecond * 100))
   202  
   203  	l, err := tr.Listen("127.0.0.1:0")
   204  	if err != nil {
   205  		t.Errorf("Unexpected listen err: %v", err)
   206  	}
   207  	defer l.Close()
   208  
   209  	done := make(chan bool)
   210  
   211  	fn := func(sock transport.Socket) {
   212  		defer func() {
   213  			sock.Close()
   214  			close(done)
   215  		}()
   216  
   217  		go func() {
   218  			select {
   219  			case <-done:
   220  				return
   221  			case <-time.After(time.Second):
   222  				t.Fatal("deadline not executed")
   223  			}
   224  		}()
   225  
   226  		for {
   227  			var m transport.Message
   228  
   229  			if err := sock.Recv(&m); err != nil {
   230  				return
   231  			}
   232  		}
   233  	}
   234  
   235  	go func() {
   236  		if err := l.Accept(fn); err != nil {
   237  			select {
   238  			case <-done:
   239  			default:
   240  				t.Errorf("Unexpected accept err: %v", err)
   241  			}
   242  		}
   243  	}()
   244  
   245  	c, err := tr.Dial(l.Addr())
   246  	if err != nil {
   247  		t.Errorf("Unexpected dial err: %v", err)
   248  	}
   249  	defer c.Close()
   250  
   251  	m := transport.Message{
   252  		Header: map[string]string{
   253  			"Content-Type": "application/json",
   254  		},
   255  		Body: []byte(`{"message": "Hello World"}`),
   256  	}
   257  
   258  	if err := c.Send(&m); err != nil {
   259  		t.Errorf("Unexpected send err: %v", err)
   260  	}
   261  
   262  	<-done
   263  }
   264  
   265  func TestHTTPTransportMultipleSendWhenRecv(t *testing.T) {
   266  	tr := NewTransport()
   267  
   268  	l, err := tr.Listen("127.0.0.1:0")
   269  	if err != nil {
   270  		t.Errorf("Unexpected listen err: %v", err)
   271  	}
   272  	defer l.Close()
   273  
   274  	readyToSend := make(chan struct{})
   275  	m := transport.Message{
   276  		Header: map[string]string{
   277  			"Content-Type": "application/json",
   278  		},
   279  		Body: []byte(`{"message": "Hello World"}`),
   280  	}
   281  
   282  	wgSend := sync.WaitGroup{}
   283  	fn := func(sock transport.Socket) {
   284  		defer sock.Close()
   285  
   286  		for {
   287  			var mr transport.Message
   288  			if err := sock.Recv(&mr); err != nil {
   289  				return
   290  			}
   291  			wgSend.Add(1)
   292  			go func() {
   293  				defer wgSend.Done()
   294  				<-readyToSend
   295  				if err := sock.Send(&m); err != nil {
   296  					return
   297  				}
   298  			}()
   299  		}
   300  	}
   301  
   302  	done := make(chan bool)
   303  
   304  	go func() {
   305  		if err := l.Accept(fn); err != nil {
   306  			select {
   307  			case <-done:
   308  			default:
   309  				t.Errorf("Unexpected accept err: %v", err)
   310  			}
   311  		}
   312  	}()
   313  
   314  	c, err := tr.Dial(l.Addr(), transport.WithStream())
   315  	if err != nil {
   316  		t.Errorf("Unexpected dial err: %v", err)
   317  	}
   318  	defer c.Close()
   319  
   320  	var wg sync.WaitGroup
   321  	wg.Add(1)
   322  	readyForRecv := make(chan struct{})
   323  	go func() {
   324  		defer wg.Done()
   325  		close(readyForRecv)
   326  		for {
   327  			var rm transport.Message
   328  			if err := c.Recv(&rm); err != nil {
   329  				if err == io.EOF {
   330  					return
   331  				}
   332  			}
   333  		}
   334  	}()
   335  	<-readyForRecv
   336  	for i := 0; i < 3; i++ {
   337  		if err := c.Send(&m); err != nil {
   338  			t.Errorf("Unexpected send err: %v", err)
   339  		}
   340  	}
   341  	close(readyToSend)
   342  	wgSend.Wait()
   343  	close(done)
   344  
   345  	c.Close()
   346  	wg.Wait()
   347  }
   348  
   349  func TestHttpTransportListenerNetListener(t *testing.T) {
   350  	address := "127.0.0.1:0"
   351  
   352  	customListener, err := net.Listen("tcp", address)
   353  	if err != nil {
   354  		return
   355  	}
   356  
   357  	tr := NewTransport(transport.Timeout(time.Millisecond * 100))
   358  
   359  	// injection
   360  	l, err := tr.Listen(address, NetListener(customListener))
   361  	if err != nil {
   362  		t.Errorf("Unexpected listen err: %v", err)
   363  	}
   364  	defer l.Close()
   365  
   366  	done := make(chan bool)
   367  
   368  	fn := func(sock transport.Socket) {
   369  		defer func() {
   370  			sock.Close()
   371  			close(done)
   372  		}()
   373  
   374  		go func() {
   375  			select {
   376  			case <-done:
   377  				return
   378  			case <-time.After(time.Second):
   379  				t.Fatal("deadline not executed")
   380  			}
   381  		}()
   382  
   383  		for {
   384  			var m transport.Message
   385  
   386  			if err := sock.Recv(&m); err != nil {
   387  				return
   388  			}
   389  		}
   390  	}
   391  
   392  	go func() {
   393  		if err := l.Accept(fn); err != nil {
   394  			select {
   395  			case <-done:
   396  			default:
   397  				t.Errorf("Unexpected accept err: %v", err)
   398  			}
   399  		}
   400  	}()
   401  
   402  	c, err := tr.Dial(l.Addr())
   403  	if err != nil {
   404  		t.Errorf("Unexpected dial err: %v", err)
   405  	}
   406  	defer c.Close()
   407  
   408  	m := transport.Message{
   409  		Header: map[string]string{
   410  			"Content-Type": "application/json",
   411  		},
   412  		Body: []byte(`{"message": "Hello World"}`),
   413  	}
   414  
   415  	if err := c.Send(&m); err != nil {
   416  		t.Errorf("Unexpected send err: %v", err)
   417  	}
   418  
   419  	<-done
   420  }