github.com/jshiv/can-go@v0.2.1-0.20210224011015-069e90e90bdf/pkg/socketcan/dial_test.go (about)

     1  package socketcan
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"testing"
     7  	"time"
     8  
     9  	"go.einride.tech/can"
    10  	"golang.org/x/sync/errgroup"
    11  	"gotest.tools/v3/assert"
    12  )
    13  
    14  func TestDial_TCP(t *testing.T) {
    15  	lis, err := net.Listen("tcp", "localhost:0")
    16  	assert.NilError(t, err)
    17  	var g errgroup.Group
    18  	g.Go(func() error {
    19  		conn, err := lis.Accept()
    20  		if err != nil {
    21  			return err
    22  		}
    23  		return conn.Close()
    24  	})
    25  	conn, err := Dial("tcp", lis.Addr().String())
    26  	assert.NilError(t, err)
    27  	assert.NilError(t, conn.Close())
    28  	assert.NilError(t, g.Wait())
    29  }
    30  
    31  func TestDialContext_TCP(t *testing.T) {
    32  	lis, err := net.Listen("tcp", "localhost:0")
    33  	assert.NilError(t, err)
    34  	var g errgroup.Group
    35  	g.Go(func() error {
    36  		conn, err := lis.Accept()
    37  		if err != nil {
    38  			return err
    39  		}
    40  		return conn.Close()
    41  	})
    42  	ctx, done := context.WithTimeout(context.Background(), time.Second)
    43  	defer done()
    44  	conn, err := DialContext(ctx, "tcp", lis.Addr().String())
    45  	assert.NilError(t, err)
    46  	assert.NilError(t, conn.Close())
    47  	assert.NilError(t, g.Wait())
    48  }
    49  
    50  func TestConn_TransmitReceiveTCP(t *testing.T) {
    51  	// Given: A TCP listener that writes a frame on an accepted connection
    52  	lis, err := net.Listen("tcp", "localhost:0")
    53  	assert.NilError(t, err)
    54  	var g errgroup.Group
    55  	frame := can.Frame{ID: 42, Length: 5, Data: can.Data{'H', 'e', 'l', 'l', 'o'}}
    56  	g.Go(func() error {
    57  		conn, err := lis.Accept()
    58  		if err != nil {
    59  			return err
    60  		}
    61  		tr := NewTransmitter(conn)
    62  		ctx, done := context.WithTimeout(context.Background(), time.Second)
    63  		defer done()
    64  		if err := tr.TransmitFrame(ctx, frame); err != nil {
    65  			return err
    66  		}
    67  		return conn.Close()
    68  	})
    69  	// When: We connect to the listener
    70  	ctx, done := context.WithTimeout(context.Background(), time.Second)
    71  	defer done()
    72  	conn, err := DialContext(ctx, "tcp", lis.Addr().String())
    73  	assert.NilError(t, err)
    74  	rec := NewReceiver(conn)
    75  	assert.Assert(t, rec.Receive())
    76  	assert.Assert(t, !rec.HasErrorFrame())
    77  	assert.DeepEqual(t, frame, rec.Frame())
    78  	assert.NilError(t, conn.Close())
    79  	assert.NilError(t, g.Wait())
    80  }