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  }