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 }