github.com/gogf/gf/v2@v2.7.4/net/gtcp/gtcp_z_unit_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/gogf/gf.
     6  
     7  package gtcp_test
     8  
     9  import (
    10  	"crypto/tls"
    11  	"fmt"
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/gogf/gf/v2/debug/gdebug"
    16  	"github.com/gogf/gf/v2/net/gtcp"
    17  	"github.com/gogf/gf/v2/os/gfile"
    18  	"github.com/gogf/gf/v2/test/gtest"
    19  	"github.com/gogf/gf/v2/text/gstr"
    20  )
    21  
    22  var (
    23  	simpleTimeout = time.Millisecond * 100
    24  	sendData      = []byte("hello")
    25  	invalidAddr   = "127.0.0.1:99999"
    26  	crtFile       = gfile.Dir(gdebug.CallerFilePath()) + gfile.Separator + "testdata/server.crt"
    27  	keyFile       = gfile.Dir(gdebug.CallerFilePath()) + gfile.Separator + "testdata/server.key"
    28  )
    29  
    30  func startTCPServer(addr string) *gtcp.Server {
    31  	s := gtcp.NewServer(addr, func(conn *gtcp.Conn) {
    32  		defer conn.Close()
    33  		for {
    34  			data, err := conn.Recv(-1)
    35  			if err != nil {
    36  				break
    37  			}
    38  			conn.Send(data)
    39  		}
    40  	})
    41  	go s.Run()
    42  	time.Sleep(simpleTimeout)
    43  	return s
    44  }
    45  
    46  func startTCPPkgServer(addr string) *gtcp.Server {
    47  	s := gtcp.NewServer(addr, func(conn *gtcp.Conn) {
    48  		defer conn.Close()
    49  		for {
    50  			data, err := conn.RecvPkg()
    51  			if err != nil {
    52  				break
    53  			}
    54  			conn.SendPkg(data)
    55  		}
    56  	})
    57  	go s.Run()
    58  	time.Sleep(simpleTimeout)
    59  	return s
    60  }
    61  
    62  func startTCPTLSServer(addr string) *gtcp.Server {
    63  	tlsConfig := &tls.Config{
    64  		InsecureSkipVerify: true,
    65  		Certificates: []tls.Certificate{
    66  			{},
    67  		},
    68  	}
    69  	s := gtcp.NewServerTLS(addr, tlsConfig, func(conn *gtcp.Conn) {
    70  		defer conn.Close()
    71  		for {
    72  			data, err := conn.Recv(-1)
    73  			if err != nil {
    74  				break
    75  			}
    76  			conn.Send(data)
    77  		}
    78  	})
    79  	go s.Run()
    80  	time.Sleep(simpleTimeout)
    81  	return s
    82  }
    83  
    84  func startTCPKeyCrtServer(addr string) *gtcp.Server {
    85  	s, _ := gtcp.NewServerKeyCrt(addr, crtFile, keyFile, func(conn *gtcp.Conn) {
    86  		defer conn.Close()
    87  		for {
    88  			data, err := conn.Recv(-1)
    89  			if err != nil {
    90  				break
    91  			}
    92  			conn.Send(data)
    93  		}
    94  	})
    95  	go s.Run()
    96  	time.Sleep(simpleTimeout)
    97  	return s
    98  }
    99  
   100  func TestGetFreePorts(t *testing.T) {
   101  	ports, _ := gtcp.GetFreePorts(2)
   102  	gtest.C(t, func(t *gtest.T) {
   103  		t.AssertGT(ports[0], 0)
   104  		t.AssertGT(ports[1], 0)
   105  	})
   106  
   107  	startTCPServer(fmt.Sprintf("%s:%d", "127.0.0.1", ports[0]))
   108  
   109  	gtest.C(t, func(t *gtest.T) {
   110  		conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", ports[0]))
   111  		t.AssertNil(err)
   112  		defer conn.Close()
   113  		result, err := conn.SendRecv(sendData, -1)
   114  		t.AssertNil(err)
   115  		t.Assert(result, sendData)
   116  	})
   117  	gtest.C(t, func(t *gtest.T) {
   118  		conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", 80))
   119  		t.AssertNE(err, nil)
   120  		t.AssertNil(conn)
   121  	})
   122  }
   123  
   124  func TestMustGetFreePort(t *testing.T) {
   125  	port := gtcp.MustGetFreePort()
   126  	addr := fmt.Sprintf("%s:%d", "127.0.0.1", port)
   127  	startTCPServer(addr)
   128  
   129  	gtest.C(t, func(t *gtest.T) {
   130  		result, err := gtcp.SendRecv(addr, sendData, -1)
   131  		t.AssertNil(err)
   132  		t.Assert(sendData, result)
   133  	})
   134  }
   135  
   136  func TestNewConn(t *testing.T) {
   137  	addr := gtcp.FreePortAddress
   138  
   139  	gtest.C(t, func(t *gtest.T) {
   140  		conn, err := gtcp.NewConn(addr, simpleTimeout)
   141  		t.AssertNil(conn)
   142  		t.AssertNE(err, nil)
   143  	})
   144  
   145  	gtest.C(t, func(t *gtest.T) {
   146  		s := startTCPServer(gtcp.FreePortAddress)
   147  
   148  		conn, err := gtcp.NewConn(s.GetListenedAddress(), simpleTimeout)
   149  		t.AssertNil(err)
   150  		t.AssertNE(conn, nil)
   151  		defer conn.Close()
   152  		result, err := conn.SendRecv(sendData, -1)
   153  		t.AssertNil(err)
   154  		t.Assert(result, sendData)
   155  	})
   156  }
   157  
   158  // TODO
   159  func TestNewConnTLS(t *testing.T) {
   160  	addr := gtcp.FreePortAddress
   161  
   162  	gtest.C(t, func(t *gtest.T) {
   163  		conn, err := gtcp.NewConnTLS(addr, &tls.Config{})
   164  		t.AssertNil(conn)
   165  		t.AssertNE(err, nil)
   166  	})
   167  
   168  	gtest.C(t, func(t *gtest.T) {
   169  		s := startTCPTLSServer(addr)
   170  
   171  		conn, err := gtcp.NewConnTLS(s.GetListenedAddress(), &tls.Config{
   172  			InsecureSkipVerify: true,
   173  			Certificates: []tls.Certificate{
   174  				{},
   175  			},
   176  		})
   177  		t.AssertNil(conn)
   178  		t.AssertNE(err, nil)
   179  	})
   180  }
   181  
   182  func TestNewConnKeyCrt(t *testing.T) {
   183  	addr := gtcp.FreePortAddress
   184  
   185  	gtest.C(t, func(t *gtest.T) {
   186  		conn, err := gtcp.NewConnKeyCrt(addr, crtFile, keyFile)
   187  		t.AssertNil(conn)
   188  		t.AssertNE(err, nil)
   189  	})
   190  
   191  	gtest.C(t, func(t *gtest.T) {
   192  		s := startTCPKeyCrtServer(addr)
   193  
   194  		conn, err := gtcp.NewConnKeyCrt(s.GetListenedAddress(), crtFile, keyFile)
   195  		t.AssertNil(conn)
   196  		t.AssertNE(err, nil)
   197  	})
   198  }
   199  
   200  func TestConn_Send(t *testing.T) {
   201  	s := startTCPServer(gtcp.FreePortAddress)
   202  
   203  	gtest.C(t, func(t *gtest.T) {
   204  		conn, err := gtcp.NewConn(s.GetListenedAddress())
   205  		t.AssertNil(err)
   206  		t.AssertNE(conn, nil)
   207  		err = conn.Send(sendData, gtcp.Retry{Count: 1})
   208  		t.AssertNil(err)
   209  		result, err := conn.Recv(-1)
   210  		t.AssertNil(err)
   211  		t.Assert(result, sendData)
   212  	})
   213  }
   214  
   215  func TestConn_SendWithTimeout(t *testing.T) {
   216  	s := startTCPServer(gtcp.FreePortAddress)
   217  
   218  	gtest.C(t, func(t *gtest.T) {
   219  		conn, err := gtcp.NewConn(s.GetListenedAddress())
   220  		t.AssertNil(err)
   221  		t.AssertNE(conn, nil)
   222  		err = conn.SendWithTimeout(sendData, time.Second, gtcp.Retry{Count: 1})
   223  		t.AssertNil(err)
   224  		result, err := conn.Recv(-1)
   225  		t.AssertNil(err)
   226  		t.Assert(result, sendData)
   227  	})
   228  }
   229  
   230  func TestConn_SendRecv(t *testing.T) {
   231  	s := startTCPServer(gtcp.FreePortAddress)
   232  
   233  	gtest.C(t, func(t *gtest.T) {
   234  		conn, err := gtcp.NewConn(s.GetListenedAddress())
   235  		t.AssertNil(err)
   236  		t.AssertNE(conn, nil)
   237  		result, err := conn.SendRecv(sendData, -1, gtcp.Retry{Count: 1})
   238  		t.AssertNil(err)
   239  		t.Assert(result, sendData)
   240  	})
   241  }
   242  
   243  func TestConn_SendRecvWithTimeout(t *testing.T) {
   244  	s := startTCPServer(gtcp.FreePortAddress)
   245  
   246  	gtest.C(t, func(t *gtest.T) {
   247  		conn, err := gtcp.NewConn(s.GetListenedAddress())
   248  		t.AssertNil(err)
   249  		t.AssertNE(conn, nil)
   250  		result, err := conn.SendRecvWithTimeout(sendData, -1, time.Second, gtcp.Retry{Count: 1})
   251  		t.AssertNil(err)
   252  		t.Assert(result, sendData)
   253  	})
   254  }
   255  
   256  func TestConn_RecvWithTimeout(t *testing.T) {
   257  	s := startTCPServer(gtcp.FreePortAddress)
   258  
   259  	gtest.C(t, func(t *gtest.T) {
   260  		conn, err := gtcp.NewConn(s.GetListenedAddress())
   261  		t.AssertNil(err)
   262  		t.AssertNE(conn, nil)
   263  		conn.Send(sendData)
   264  		result, err := conn.RecvWithTimeout(-1, time.Second, gtcp.Retry{Count: 1})
   265  		t.AssertNil(err)
   266  		t.Assert(result, sendData)
   267  	})
   268  }
   269  
   270  func TestConn_RecvLine(t *testing.T) {
   271  	s := startTCPServer(gtcp.FreePortAddress)
   272  
   273  	gtest.C(t, func(t *gtest.T) {
   274  		conn, err := gtcp.NewConn(s.GetListenedAddress())
   275  		t.AssertNil(err)
   276  		t.AssertNE(conn, nil)
   277  		data := []byte("hello\n")
   278  		conn.Send(data)
   279  		result, err := conn.RecvLine(gtcp.Retry{Count: 1})
   280  		t.AssertNil(err)
   281  		splitData := gstr.Split(string(data), "\n")
   282  		t.Assert(result, splitData[0])
   283  	})
   284  }
   285  
   286  func TestConn_RecvTill(t *testing.T) {
   287  	s := startTCPServer(gtcp.FreePortAddress)
   288  
   289  	gtest.C(t, func(t *gtest.T) {
   290  		conn, err := gtcp.NewConn(s.GetListenedAddress())
   291  		t.AssertNil(err)
   292  		t.AssertNE(conn, nil)
   293  		conn.Send(sendData)
   294  		result, err := conn.RecvTill([]byte("hello"), gtcp.Retry{Count: 1})
   295  		t.AssertNil(err)
   296  		t.Assert(result, sendData)
   297  	})
   298  }
   299  
   300  func TestConn_SetDeadline(t *testing.T) {
   301  	s := startTCPServer(gtcp.FreePortAddress)
   302  
   303  	gtest.C(t, func(t *gtest.T) {
   304  		conn, err := gtcp.NewConn(s.GetListenedAddress())
   305  		t.AssertNil(err)
   306  		t.AssertNE(conn, nil)
   307  		conn.SetDeadline(time.Time{})
   308  		err = conn.Send(sendData, gtcp.Retry{Count: 1})
   309  		t.AssertNil(err)
   310  		result, err := conn.Recv(-1)
   311  		t.AssertNil(err)
   312  		t.Assert(result, sendData)
   313  	})
   314  }
   315  
   316  func TestConn_SetReceiveBufferWait(t *testing.T) {
   317  	s := startTCPServer(gtcp.FreePortAddress)
   318  
   319  	gtest.C(t, func(t *gtest.T) {
   320  		conn, err := gtcp.NewConn(s.GetListenedAddress())
   321  		t.AssertNil(err)
   322  		t.AssertNE(conn, nil)
   323  		conn.SetBufferWaitRecv(time.Millisecond * 100)
   324  		err = conn.Send(sendData, gtcp.Retry{Count: 1})
   325  		t.AssertNil(err)
   326  		result, err := conn.Recv(-1)
   327  		t.AssertNil(err)
   328  		t.Assert(result, sendData)
   329  	})
   330  }
   331  
   332  func TestNewNetConnKeyCrt(t *testing.T) {
   333  	addr := gtcp.FreePortAddress
   334  
   335  	startTCPKeyCrtServer(addr)
   336  
   337  	gtest.C(t, func(t *gtest.T) {
   338  		conn, err := gtcp.NewNetConnKeyCrt(addr, "crtFile", keyFile, time.Second)
   339  		t.AssertNil(conn)
   340  		t.AssertNE(err, nil)
   341  	})
   342  
   343  	gtest.C(t, func(t *gtest.T) {
   344  		conn, err := gtcp.NewNetConnKeyCrt(addr, crtFile, keyFile, time.Second)
   345  		t.AssertNil(conn)
   346  		t.AssertNE(err, nil)
   347  	})
   348  }
   349  
   350  func TestSend(t *testing.T) {
   351  	s := startTCPServer(gtcp.FreePortAddress)
   352  
   353  	gtest.C(t, func(t *gtest.T) {
   354  		err := gtcp.Send(invalidAddr, sendData, gtcp.Retry{Count: 1})
   355  		t.AssertNE(err, nil)
   356  	})
   357  
   358  	gtest.C(t, func(t *gtest.T) {
   359  		err := gtcp.Send(s.GetListenedAddress(), sendData, gtcp.Retry{Count: 1})
   360  		t.AssertNil(err)
   361  	})
   362  }
   363  
   364  func TestSendRecv(t *testing.T) {
   365  	s := startTCPServer(gtcp.FreePortAddress)
   366  
   367  	gtest.C(t, func(t *gtest.T) {
   368  		result, err := gtcp.SendRecv(invalidAddr, sendData, -1)
   369  		t.AssertNE(err, nil)
   370  		t.Assert(result, nil)
   371  	})
   372  
   373  	gtest.C(t, func(t *gtest.T) {
   374  		result, err := gtcp.SendRecv(s.GetListenedAddress(), sendData, -1)
   375  		t.AssertNil(err)
   376  		t.Assert(result, sendData)
   377  	})
   378  }
   379  
   380  func TestSendWithTimeout(t *testing.T) {
   381  	s := startTCPServer(gtcp.FreePortAddress)
   382  
   383  	gtest.C(t, func(t *gtest.T) {
   384  		err := gtcp.SendWithTimeout(invalidAddr, sendData, time.Millisecond*500)
   385  		t.AssertNE(err, nil)
   386  		err = gtcp.SendWithTimeout(s.GetListenedAddress(), sendData, time.Millisecond*500)
   387  		t.AssertNil(err)
   388  	})
   389  }
   390  
   391  func TestSendRecvWithTimeout(t *testing.T) {
   392  	s := startTCPServer(gtcp.FreePortAddress)
   393  
   394  	gtest.C(t, func(t *gtest.T) {
   395  		result, err := gtcp.SendRecvWithTimeout(invalidAddr, sendData, -1, time.Millisecond*500)
   396  		t.AssertNil(result)
   397  		t.AssertNE(err, nil)
   398  		result, err = gtcp.SendRecvWithTimeout(s.GetListenedAddress(), sendData, -1, time.Millisecond*500)
   399  		t.AssertNil(err)
   400  		t.Assert(result, sendData)
   401  	})
   402  }
   403  
   404  func TestSendPkg(t *testing.T) {
   405  	s := startTCPPkgServer(gtcp.FreePortAddress)
   406  
   407  	gtest.C(t, func(t *gtest.T) {
   408  		err := gtcp.SendPkg(s.GetListenedAddress(), sendData)
   409  		t.AssertNil(err)
   410  		err = gtcp.SendPkg(invalidAddr, sendData)
   411  		t.AssertNE(err, nil)
   412  	})
   413  
   414  	gtest.C(t, func(t *gtest.T) {
   415  		err := gtcp.SendPkg(s.GetListenedAddress(), sendData, gtcp.PkgOption{Retry: gtcp.Retry{Count: 3}})
   416  		t.AssertNil(err)
   417  		err = gtcp.SendPkg(s.GetListenedAddress(), sendData)
   418  		t.AssertNil(err)
   419  	})
   420  }
   421  
   422  func TestSendRecvPkg(t *testing.T) {
   423  	s := startTCPPkgServer(gtcp.FreePortAddress)
   424  
   425  	gtest.C(t, func(t *gtest.T) {
   426  		err := gtcp.SendPkg(s.GetListenedAddress(), sendData)
   427  		t.AssertNil(err)
   428  		_, err = gtcp.SendRecvPkg(invalidAddr, sendData)
   429  		t.AssertNE(err, nil)
   430  	})
   431  
   432  	gtest.C(t, func(t *gtest.T) {
   433  		err := gtcp.SendPkg(s.GetListenedAddress(), sendData)
   434  		t.AssertNil(err)
   435  		result, err := gtcp.SendRecvPkg(s.GetListenedAddress(), sendData)
   436  		t.AssertNil(err)
   437  		t.Assert(result, sendData)
   438  	})
   439  }
   440  
   441  func TestSendPkgWithTimeout(t *testing.T) {
   442  	s := startTCPPkgServer(gtcp.FreePortAddress)
   443  
   444  	gtest.C(t, func(t *gtest.T) {
   445  		err := gtcp.SendPkg(s.GetListenedAddress(), sendData)
   446  		t.AssertNil(err)
   447  		err = gtcp.SendPkgWithTimeout(invalidAddr, sendData, time.Second)
   448  		t.AssertNE(err, nil)
   449  	})
   450  
   451  	gtest.C(t, func(t *gtest.T) {
   452  		err := gtcp.SendPkg(s.GetListenedAddress(), sendData)
   453  		t.AssertNil(err)
   454  		err = gtcp.SendPkgWithTimeout(s.GetListenedAddress(), sendData, time.Second)
   455  		t.AssertNil(err)
   456  	})
   457  }
   458  
   459  func TestSendRecvPkgWithTimeout(t *testing.T) {
   460  	s := startTCPPkgServer(gtcp.FreePortAddress)
   461  
   462  	gtest.C(t, func(t *gtest.T) {
   463  		err := gtcp.SendPkg(s.GetListenedAddress(), sendData)
   464  		t.AssertNil(err)
   465  		_, err = gtcp.SendRecvPkgWithTimeout(invalidAddr, sendData, time.Second)
   466  		t.AssertNE(err, nil)
   467  	})
   468  
   469  	gtest.C(t, func(t *gtest.T) {
   470  		err := gtcp.SendPkg(s.GetListenedAddress(), sendData)
   471  		t.AssertNil(err)
   472  		result, err := gtcp.SendRecvPkgWithTimeout(s.GetListenedAddress(), sendData, time.Second)
   473  		t.AssertNil(err)
   474  		t.Assert(result, sendData)
   475  	})
   476  }
   477  
   478  func TestNewServer(t *testing.T) {
   479  	gtest.C(t, func(t *gtest.T) {
   480  		s := gtcp.NewServer(gtcp.FreePortAddress, func(conn *gtcp.Conn) {
   481  			defer conn.Close()
   482  			for {
   483  				data, err := conn.Recv(-1)
   484  				if err != nil {
   485  					break
   486  				}
   487  				conn.Send(data)
   488  			}
   489  		}, "NewServer")
   490  		defer s.Close()
   491  		go s.Run()
   492  
   493  		time.Sleep(simpleTimeout)
   494  
   495  		result, err := gtcp.SendRecv(s.GetListenedAddress(), sendData, -1)
   496  		t.AssertNil(err)
   497  		t.Assert(result, sendData)
   498  	})
   499  }
   500  
   501  func TestGetServer(t *testing.T) {
   502  	gtest.C(t, func(t *gtest.T) {
   503  		s := gtcp.GetServer("GetServer")
   504  		defer s.Close()
   505  		go s.Run()
   506  
   507  		t.Assert(s.GetAddress(), "")
   508  	})
   509  
   510  	gtest.C(t, func(t *gtest.T) {
   511  		gtcp.NewServer(gtcp.FreePortAddress, func(conn *gtcp.Conn) {
   512  			defer conn.Close()
   513  			for {
   514  				data, err := conn.Recv(-1)
   515  				if err != nil {
   516  					break
   517  				}
   518  				conn.Send(data)
   519  			}
   520  		}, "NewServer")
   521  
   522  		s := gtcp.GetServer("NewServer")
   523  		defer s.Close()
   524  		go s.Run()
   525  
   526  		time.Sleep(simpleTimeout)
   527  
   528  		result, err := gtcp.SendRecv(s.GetListenedAddress(), sendData, -1)
   529  		t.AssertNil(err)
   530  		t.Assert(result, sendData)
   531  	})
   532  }
   533  
   534  func TestServer_SetAddress(t *testing.T) {
   535  	gtest.C(t, func(t *gtest.T) {
   536  		s := gtcp.NewServer("", func(conn *gtcp.Conn) {
   537  			defer conn.Close()
   538  			for {
   539  				data, err := conn.Recv(-1)
   540  				if err != nil {
   541  					break
   542  				}
   543  				conn.Send(data)
   544  			}
   545  		})
   546  		defer s.Close()
   547  		t.Assert(s.GetAddress(), "")
   548  		s.SetAddress(gtcp.FreePortAddress)
   549  		go s.Run()
   550  
   551  		time.Sleep(simpleTimeout)
   552  
   553  		result, err := gtcp.SendRecv(s.GetListenedAddress(), sendData, -1)
   554  		t.AssertNil(err)
   555  		t.Assert(result, sendData)
   556  	})
   557  }
   558  
   559  func TestServer_SetHandler(t *testing.T) {
   560  	gtest.C(t, func(t *gtest.T) {
   561  		s := gtcp.NewServer(gtcp.FreePortAddress, nil)
   562  		defer s.Close()
   563  		s.SetHandler(func(conn *gtcp.Conn) {
   564  			defer conn.Close()
   565  			for {
   566  				data, err := conn.Recv(-1)
   567  				if err != nil {
   568  					break
   569  				}
   570  				conn.Send(data)
   571  			}
   572  		})
   573  		go s.Run()
   574  
   575  		time.Sleep(simpleTimeout)
   576  
   577  		result, err := gtcp.SendRecv(s.GetListenedAddress(), sendData, -1)
   578  		t.AssertNil(err)
   579  		t.Assert(result, sendData)
   580  	})
   581  }
   582  
   583  func TestServer_Run(t *testing.T) {
   584  	gtest.C(t, func(t *gtest.T) {
   585  		s := gtcp.NewServer(gtcp.FreePortAddress, func(conn *gtcp.Conn) {
   586  			defer conn.Close()
   587  			for {
   588  				data, err := conn.Recv(-1)
   589  				if err != nil {
   590  					break
   591  				}
   592  				conn.Send(data)
   593  			}
   594  		})
   595  		defer s.Close()
   596  		go s.Run()
   597  
   598  		time.Sleep(simpleTimeout)
   599  
   600  		result, err := gtcp.SendRecv(s.GetListenedAddress(), sendData, -1)
   601  		t.AssertNil(err)
   602  		t.Assert(result, sendData)
   603  	})
   604  
   605  	gtest.C(t, func(t *gtest.T) {
   606  		s := gtcp.NewServer(gtcp.FreePortAddress, nil)
   607  		defer s.Close()
   608  		go func() {
   609  			err := s.Run()
   610  			t.AssertNE(err, nil)
   611  		}()
   612  	})
   613  }