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

     1  package xio
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"net"
     7  	_ "net/http/pprof"
     8  	"testing"
     9  	"time"
    10  )
    11  
    12  func TestNetPiper(t *testing.T) {
    13  	listener, _ := net.Listen("tcp", ":0")
    14  	go func() {
    15  		for {
    16  			conn, err := listener.Accept()
    17  			if err != nil {
    18  				break
    19  			}
    20  			go io.Copy(conn, conn)
    21  		}
    22  	}()
    23  	dialer := PiperDialerF(DialNetPiper)
    24  	{
    25  		uri := listener.Addr().String()
    26  		piper, err := dialer.DialPiper(uri, 1024)
    27  		if err != nil {
    28  			t.Error(err)
    29  			return
    30  		}
    31  		conna, connb, _ := CreatePipedConn()
    32  		go piper.PipeConn(connb, uri)
    33  		fmt.Fprintf(conna, "abc")
    34  		buffer := make([]byte, 1024)
    35  		err = FullBuffer(conna, buffer, 3, nil)
    36  		if err != nil || string(buffer[0:3]) != "abc" {
    37  			t.Error(err)
    38  			return
    39  		}
    40  		conna.Close()
    41  		time.Sleep(10 * time.Millisecond)
    42  	}
    43  	{
    44  		uri := "tcp://" + listener.Addr().String()
    45  		piper, err := dialer.DialPiper(uri, 1024)
    46  		if err != nil {
    47  			t.Error(err)
    48  			return
    49  		}
    50  		conna, connb, _ := CreatePipedConn()
    51  		go piper.PipeConn(connb, uri)
    52  		fmt.Fprintf(conna, "abc")
    53  		buffer := make([]byte, 1024)
    54  		err = FullBuffer(conna, buffer, 3, nil)
    55  		if err != nil || string(buffer[0:3]) != "abc" {
    56  			t.Error(err)
    57  			return
    58  		}
    59  		conna.Close()
    60  		time.Sleep(10 * time.Millisecond)
    61  	}
    62  }
    63  
    64  func TestByteDistribute(t *testing.T) {
    65  	accept := make(chan net.Conn, 1)
    66  	processor := NewByteDistributeProcessor()
    67  	go processor.ProcAccept(ListenerF(func() (conn net.Conn, err error) {
    68  		conn = <-accept
    69  		if conn == nil {
    70  			err = fmt.Errorf("closed")
    71  		}
    72  		return
    73  	}))
    74  	processor.AddProcessor('A', ProcessorF(func(conn io.ReadWriteCloser) (err error) {
    75  		buf := make([]byte, 1024)
    76  		for {
    77  			err = FullBuffer(conn, buf, 4, nil)
    78  			if err != nil {
    79  				break
    80  			}
    81  			fmt.Fprintf(conn, "A:%v", string(buf[1:4]))
    82  		}
    83  		return
    84  	}))
    85  	processor.AddProcessor('*', ProcessorF(func(conn io.ReadWriteCloser) (err error) {
    86  		buf := make([]byte, 1024)
    87  		for {
    88  			err = FullBuffer(conn, buf, 4, nil)
    89  			if err != nil {
    90  				break
    91  			}
    92  			fmt.Fprintf(conn, "*:%v", string(buf[1:4]))
    93  		}
    94  		return
    95  	}))
    96  	buf := make([]byte, 1024)
    97  	//
    98  	//A
    99  	conna, connb, _ := CreatePipedConn()
   100  	accept <- connb
   101  	fmt.Fprintf(conna, "A123")
   102  	readed, err := conna.Read(buf)
   103  	if err != nil || string(buf[0:readed]) != "A:123" {
   104  		t.Errorf("err:%v,%v", err, string(buf[0:readed]))
   105  		return
   106  	}
   107  	conna.Close()
   108  	//
   109  	//B
   110  	conna, connb, _ = CreatePipedConn()
   111  	accept <- connb
   112  	fmt.Fprintf(conna, "B123")
   113  	readed, err = conna.Read(buf)
   114  	if err != nil || string(buf[0:readed]) != "*:123" {
   115  		t.Error(err)
   116  		return
   117  	}
   118  	//
   119  	//B
   120  	processor.RemoveProcessor('*')
   121  	conna, connb, _ = CreatePipedConn()
   122  	accept <- connb
   123  	fmt.Fprintf(conna, "B123")
   124  	_, err = conna.Read(buf)
   125  	if err == nil {
   126  		t.Error(err)
   127  		return
   128  	}
   129  	// conna.Close()
   130  	//
   131  	//error
   132  	conna, connb, _ = CreatePipedConn()
   133  	accept <- connb
   134  	conna.Close()
   135  	//
   136  	//
   137  	processor.Close()
   138  	accept <- nil
   139  	time.Sleep(10 * time.Millisecond)
   140  }