github.com/golazy/golazy@v0.0.7-0.20221012133820-968fe65a0b65/lazydev/protocolmux/protocolmux_test.go (about) 1 package protocolmux 2 3 import ( 4 "fmt" 5 "math/rand" 6 "net" 7 "runtime" 8 "sync" 9 "testing" 10 "time" 11 ) 12 13 func TestProtocolMux(t *testing.T) { 14 rand.Seed(time.Now().UnixNano()) 15 d := func(s string, args ...interface{}) { t.Logf("T: "+s, args...) } 16 //e := func(s string, args ...interface{}) { t.Errorf("T: "+s, args...) } 17 18 var wg sync.WaitGroup 19 20 min := 2000 21 max := 56000 22 port := rand.Intn(max-min) + min 23 addr := fmt.Sprintf(":%d", port) 24 25 wg.Add(1) 26 27 // Create the listener 28 l, err := net.Listen("tcp", addr) 29 if err != nil { 30 t.Fatal(err) 31 } 32 33 // Create muxer 34 mux := &Mux{L: l} 35 holaListener := mux.ListenTo([][]byte{[]byte("hola")}) 36 37 // Start Listening 38 go func() { 39 defer wg.Done() 40 t.Log("S: Listening in", addr) 41 err := mux.Listen() 42 if err != nil { 43 t.Error(err) 44 return 45 } 46 }() 47 48 runtime.Gosched() 49 50 wg.Add(1) 51 // A client that writes "hola mundo" and expects "adios". Then clsoes 52 go func() { 53 d := func(s string, args ...interface{}) { t.Logf("C: "+s, args...) } 54 e := func(s string, args ...interface{}) { t.Errorf("C: "+s, args...) } 55 defer wg.Done() 56 d("Dialing") 57 conn, err := net.Dial("tcp", addr) 58 if err != nil { 59 t.Error(err) 60 } 61 d("Writing 'hola mundo'") 62 for b := []byte("hola mundo"); len(b) > 0; { 63 n, err := conn.Write(b) 64 if err != nil { 65 e("%v", err) 66 return 67 } 68 d("Wrote %q", b[:n]) 69 b = b[n:] 70 } 71 72 b := make([]byte, 100) 73 d("Waiting for reading") 74 n, err := conn.Read(b) 75 if err != nil { 76 t.Error(err) 77 return 78 } 79 d("Read: %q", string(b[:n])) 80 if string(b[:n]) != "adios" { 81 e("Expectin 'adios' got: %v", b[:n]) 82 return 83 } 84 85 err = conn.Close() 86 if err != nil { 87 e("%v", err) 88 return 89 } 90 }() 91 92 d("Waiting for client to holaListener connection") 93 conn, err := holaListener.Accept() 94 if err != nil { 95 t.Fatal(err) 96 return 97 } 98 d("Got a connection. Reading now") 99 100 b := make([]byte, 50) 101 n, err := conn.Read(b) 102 if err != nil { 103 t.Fatal(err) 104 return 105 } 106 d("Read: %q", string(b[:n])) 107 108 if string(b[:n]) != "hola mundo" { 109 t.Fatal("Expecting 'hola mundo' got", string(b[:n])) 110 return 111 } 112 113 }