github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xio/xio_test.go (about)

     1  package xio
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io"
     7  	"io/ioutil"
     8  	"net"
     9  	"net/http"
    10  	_ "net/http/pprof"
    11  	"os"
    12  	"testing"
    13  	"time"
    14  )
    15  
    16  func init() {
    17  	go http.ListenAndServe(":6060", nil)
    18  }
    19  
    20  func TestCopyPacketConn(t *testing.T) {
    21  	packet1, _ := net.ListenPacket("udp", ":12332")
    22  	go CopyPacketConn(packet1, packet1)
    23  	raw, err := net.Dial("udp", "127.0.0.1:12332")
    24  	if err != nil {
    25  		t.Error(err)
    26  		return
    27  	}
    28  	defer raw.Close()
    29  	udp := raw.(*net.UDPConn)
    30  	_, err = udp.Write([]byte("123"))
    31  	if err != nil {
    32  		t.Error(err)
    33  		return
    34  	}
    35  	buffer := make([]byte, 123)
    36  	n, err := udp.Read(buffer)
    37  	if err != nil {
    38  		t.Error(err)
    39  		return
    40  	}
    41  	if string(buffer[0:n]) != "123" {
    42  		t.Error("error")
    43  		return
    44  	}
    45  	packet1.Close()
    46  	time.Sleep(100 * time.Millisecond)
    47  }
    48  
    49  func TestCopyPacketConnToWriter(t *testing.T) {
    50  	packet1, _ := net.ListenPacket("udp", ":12332")
    51  	buffer := bytes.NewBuffer(nil)
    52  	go CopyPacketConn(buffer, packet1)
    53  	raw, err := net.Dial("udp", "127.0.0.1:12332")
    54  	if err != nil {
    55  		t.Error(err)
    56  		return
    57  	}
    58  	defer raw.Close()
    59  	udp := raw.(*net.UDPConn)
    60  	_, err = udp.Write([]byte("123"))
    61  	if err != nil {
    62  		t.Error(err)
    63  		return
    64  	}
    65  	time.Sleep(100 * time.Millisecond)
    66  	if buffer.String() != "123" {
    67  		t.Error("error")
    68  		return
    69  	}
    70  	packet1.Close()
    71  	time.Sleep(100 * time.Millisecond)
    72  }
    73  
    74  func TestCopyPacketConnErrorNotSupported(t *testing.T) {
    75  	packet1, _ := net.ListenPacket("udp", ":12332")
    76  	raw, err := net.Dial("udp", "127.0.0.1:12332")
    77  	if err != nil {
    78  		t.Error(err)
    79  		return
    80  	}
    81  	defer raw.Close()
    82  	udp := raw.(*net.UDPConn)
    83  	_, err = udp.Write([]byte("123"))
    84  	if err != nil {
    85  		t.Error(err)
    86  		return
    87  	}
    88  	_, err = CopyPacketConn(t, packet1)
    89  	if err == nil {
    90  		t.Error(nil)
    91  	}
    92  	packet1.Close()
    93  	time.Sleep(100 * time.Millisecond)
    94  }
    95  
    96  func TestCopyPacketTo(t *testing.T) {
    97  	packet1, _ := net.ListenPacket("udp", ":12332")
    98  	raw, err := net.Dial("udp", "127.0.0.1:12332")
    99  	if err != nil {
   100  		t.Error(err)
   101  		return
   102  	}
   103  	defer raw.Close()
   104  
   105  	//
   106  	udp := raw.(*net.UDPConn)
   107  	_, err = CopyPacketTo(packet1, udp.LocalAddr(), bytes.NewBuffer([]byte("123")))
   108  	if err != io.EOF {
   109  		t.Error(err)
   110  		return
   111  	}
   112  	buffer := make([]byte, 1024)
   113  	n, err := udp.Read(buffer)
   114  	if err != nil {
   115  		t.Error(err)
   116  		return
   117  	}
   118  	time.Sleep(100 * time.Millisecond)
   119  	if string(buffer[0:n]) != "123" {
   120  		t.Error("error")
   121  		return
   122  	}
   123  	packet1.Close()
   124  	time.Sleep(100 * time.Millisecond)
   125  }
   126  
   127  func TestCopyPacketToError(t *testing.T) {
   128  	packet1, _ := net.ListenPacket("udp", ":12332")
   129  	packet1.Close()
   130  	_, err := CopyPacketTo(packet1, packet1.LocalAddr(), bytes.NewBuffer([]byte("123")))
   131  	if err == nil {
   132  		t.Error(err)
   133  		return
   134  	}
   135  }
   136  
   137  type copyMultiTestReader struct {
   138  }
   139  
   140  func (c *copyMultiTestReader) Read(p []byte) (n int, err error) {
   141  	err = fmt.Errorf("test error")
   142  	return
   143  }
   144  
   145  func (c *copyMultiTestReader) Close() (err error) {
   146  	return
   147  }
   148  
   149  type copyMultiTestWriter struct {
   150  	n int
   151  }
   152  
   153  func (c *copyMultiTestWriter) Write(p []byte) (n int, err error) {
   154  	switch c.n {
   155  	case 0:
   156  		n = len(p)
   157  	case 1:
   158  		n = len(p) - 1
   159  	case 2:
   160  		err = fmt.Errorf("test error")
   161  	}
   162  	return
   163  }
   164  
   165  func (c *copyMultiTestWriter) Close() (err error) {
   166  	return
   167  }
   168  
   169  func TestCopyMulti(t *testing.T) {
   170  	var err error
   171  	writer1 := &copyMultiTestWriter{}
   172  	writer2 := &copyMultiTestWriter{}
   173  	//
   174  	writer1.n, writer2.n = 0, 0
   175  	_, err = CopyMulti([]io.Writer{writer1, writer2}, bytes.NewBufferString("123"))
   176  	if err != nil {
   177  		t.Error(err)
   178  		return
   179  	}
   180  	//
   181  	writer1.n, writer2.n = 0, 0
   182  	_, err = CopyMulti([]io.Writer{writer1, writer2}, &copyMultiTestReader{})
   183  	if err == nil {
   184  		t.Error(err)
   185  		return
   186  	}
   187  	//
   188  	writer1.n, writer2.n = 1, 1
   189  	_, err = CopyMulti([]io.Writer{writer1, writer2}, bytes.NewBufferString("123"))
   190  	if err != io.ErrShortWrite {
   191  		t.Error(err)
   192  		return
   193  	}
   194  	//
   195  	writer1.n, writer2.n = 2, 2
   196  	_, err = CopyMulti([]io.Writer{writer1, writer2}, bytes.NewBufferString("123"))
   197  	if err == nil {
   198  		t.Error(err)
   199  		return
   200  	}
   201  }
   202  
   203  func TestCopyMax(t *testing.T) {
   204  	var err error
   205  	//
   206  	_, err = CopyMax(bytes.NewBuffer(nil), bytes.NewBufferString("abc"), 10)
   207  	if err != nil {
   208  		t.Error(err)
   209  		return
   210  	}
   211  	//
   212  	_, err = CopyMax(bytes.NewBuffer(nil), bytes.NewBufferString("abc"), 2)
   213  	if err == nil {
   214  		t.Error(err)
   215  		return
   216  	}
   217  	//
   218  	_, err = CopyBufferMax(bytes.NewBuffer(nil), bytes.NewBufferString("abc"), 10, make([]byte, 2))
   219  	if err != nil {
   220  		t.Error(err)
   221  		return
   222  	}
   223  	//
   224  	writer1 := &copyMultiTestWriter{}
   225  	//
   226  	writer1.n = 1
   227  	_, err = CopyMax(writer1, bytes.NewBufferString("abc"), 1024)
   228  	if err == nil {
   229  		t.Error(err)
   230  		return
   231  	}
   232  	//
   233  	writer1.n = 2
   234  	_, err = CopyMax(writer1, bytes.NewBufferString("abc"), 1024)
   235  	if err == nil {
   236  		t.Error(err)
   237  		return
   238  	}
   239  	//
   240  	writer1.n = 0
   241  	_, err = CopyMax(ioutil.Discard, &copyMultiTestReader{}, 1024)
   242  	if err == nil {
   243  		t.Error(err)
   244  		return
   245  	}
   246  }
   247  
   248  func TestFullBuffer(t *testing.T) {
   249  	var err error
   250  	var latest time.Time
   251  	wait := make(chan int, 1)
   252  	reader, writer, _ := os.Pipe()
   253  	buf := make([]byte, 1024)
   254  	go func() {
   255  		err = FullBuffer(reader, buf, 9, &latest)
   256  		if err != nil {
   257  			t.Error(err)
   258  			return
   259  		}
   260  		err = FullBuffer(reader, buf, 9, &latest)
   261  		if err == nil {
   262  			t.Error(err)
   263  			return
   264  		}
   265  		wait <- 1
   266  	}()
   267  	writer.Write([]byte("1234"))
   268  	time.Sleep(10 * time.Millisecond)
   269  	writer.Write([]byte("56789"))
   270  	time.Sleep(10 * time.Millisecond)
   271  	writer.Close()
   272  	<-wait
   273  	if string(buf[0:9]) != "123456789" {
   274  		t.Error("error")
   275  		return
   276  	}
   277  }
   278  
   279  func TestStringConn(t *testing.T) {
   280  	netRaw := &net.TCPConn{}
   281  	fmt.Printf("%v\n", NewStringConn(netRaw))
   282  	fmt.Printf("%v\n", NewStringConn(os.Stdout))
   283  	conn := NewStringConn(os.Stdout)
   284  	conn.Name = "stdout"
   285  	fmt.Printf("%v\n", conn)
   286  }
   287  
   288  func TestTCPKeepAliveListener(t *testing.T) {
   289  	wait := make(chan int, 1)
   290  	listner, _ := net.Listen("tcp", ":0")
   291  	l := NewTCPKeepAliveListener(listner.(*net.TCPListener))
   292  	go func() {
   293  		c, err := l.Accept()
   294  		if err != nil {
   295  			t.Error(err)
   296  			return
   297  		}
   298  		ioutil.ReadAll(c)
   299  		wait <- 1
   300  	}()
   301  	conn, err := net.Dial("tcp", listner.Addr().String())
   302  	if err != nil {
   303  		t.Error(err)
   304  		return
   305  	}
   306  	conn.Close()
   307  	<-wait
   308  }