You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2023/05/05 15:54:51 UTC

[plc4x] branch develop updated: test(plc4go/spi): add test for pcap transport

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 2e2b0eb800 test(plc4go/spi): add test for pcap transport
2e2b0eb800 is described below

commit 2e2b0eb8006de6d7a7b49c0fe541ea0d5477ea2c
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri May 5 17:54:44 2023 +0200

    test(plc4go/spi): add test for pcap transport
---
 plc4go/spi/transports/pcap/Transport.go      |   7 +-
 plc4go/spi/transports/pcap/Transport_test.go | 151 +++++++++++++++++++++------
 2 files changed, 125 insertions(+), 33 deletions(-)

diff --git a/plc4go/spi/transports/pcap/Transport.go b/plc4go/spi/transports/pcap/Transport.go
index 05013a4605..fa36ec2e87 100644
--- a/plc4go/spi/transports/pcap/Transport.go
+++ b/plc4go/spi/transports/pcap/Transport.go
@@ -39,8 +39,9 @@ import (
 type TransportType string
 
 const (
-	UDP TransportType = "udp"
-	TCP TransportType = "tcp"
+	UDP  TransportType = "udp"
+	TCP  TransportType = "tcp"
+	PCAP TransportType = "pcap"
 )
 
 type Transport struct {
@@ -59,7 +60,7 @@ func (m Transport) GetTransportName() string {
 }
 
 func (m Transport) CreateTransportInstance(transportUrl url.URL, options map[string][]string) (transports.TransportInstance, error) {
-	var transportType = TCP
+	var transportType = PCAP
 	if val, ok := options["transport-type"]; ok {
 		transportType = TransportType(val[0])
 	}
diff --git a/plc4go/spi/transports/pcap/Transport_test.go b/plc4go/spi/transports/pcap/Transport_test.go
index 848a35ac13..303c15a94d 100644
--- a/plc4go/spi/transports/pcap/Transport_test.go
+++ b/plc4go/spi/transports/pcap/Transport_test.go
@@ -22,11 +22,15 @@ package pcap
 import (
 	"bufio"
 	"github.com/apache/plc4x/plc4go/spi/transports"
+	"github.com/gopacket/gopacket"
+	"github.com/gopacket/gopacket/layers"
 	"github.com/gopacket/gopacket/pcap"
+	"github.com/gopacket/gopacket/pcapgo"
+	"github.com/stretchr/testify/assert"
 	"net/url"
-	"reflect"
-	"sync"
+	"os"
 	"testing"
+	"time"
 )
 
 func TestNewPcapTransportInstance(t *testing.T) {
@@ -42,11 +46,18 @@ func TestNewPcapTransportInstance(t *testing.T) {
 		args args
 		want *TransportInstance
 	}{
-		// TODO: Add test cases.
+		{
+			name: "create it",
+			want: func() *TransportInstance {
+				ti := &TransportInstance{}
+				ti.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(ti)
+				return ti
+			}(),
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			if got := NewPcapTransportInstance(tt.args.transportFile, tt.args.transportType, tt.args.portRange, tt.args.speedFactor, tt.args.transport); !reflect.DeepEqual(got, tt.want) {
+			if got := NewPcapTransportInstance(tt.args.transportFile, tt.args.transportType, tt.args.portRange, tt.args.speedFactor, tt.args.transport); !assert.Equal(t, tt.want, got) {
 				t.Errorf("NewPcapTransportInstance() = %v, want %v", got, tt.want)
 			}
 		})
@@ -58,11 +69,14 @@ func TestNewTransport(t *testing.T) {
 		name string
 		want *Transport
 	}{
-		// TODO: Add test cases.
+		{
+			name: "create it",
+			want: &Transport{},
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			if got := NewTransport(); !reflect.DeepEqual(got, tt.want) {
+			if got := NewTransport(); !assert.Equal(t, tt.want, got) {
 				t.Errorf("NewTransport() = %v, want %v", got, tt.want)
 			}
 		})
@@ -79,7 +93,6 @@ func TestTransportInstance_Close(t *testing.T) {
 		connected                        bool
 		transport                        *Transport
 		handle                           *pcap.Handle
-		mutex                            sync.Mutex
 		reader                           *bufio.Reader
 	}
 	tests := []struct {
@@ -87,7 +100,12 @@ func TestTransportInstance_Close(t *testing.T) {
 		fields  fields
 		wantErr bool
 	}{
-		// TODO: Add test cases.
+		{
+			name: "close it",
+			fields: fields{
+				handle: &pcap.Handle{},
+			},
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -100,7 +118,6 @@ func TestTransportInstance_Close(t *testing.T) {
 				connected:                        tt.fields.connected,
 				transport:                        tt.fields.transport,
 				handle:                           tt.fields.handle,
-				mutex:                            tt.fields.mutex,
 				reader:                           tt.fields.reader,
 			}
 			if err := m.Close(); (err != nil) != tt.wantErr {
@@ -120,7 +137,6 @@ func TestTransportInstance_Connect(t *testing.T) {
 		connected                        bool
 		transport                        *Transport
 		handle                           *pcap.Handle
-		mutex                            sync.Mutex
 		reader                           *bufio.Reader
 	}
 	tests := []struct {
@@ -128,7 +144,23 @@ func TestTransportInstance_Connect(t *testing.T) {
 		fields  fields
 		wantErr bool
 	}{
-		// TODO: Add test cases.
+		{
+			name: "already connected",
+			fields: fields{
+				connected: true,
+			},
+			wantErr: true,
+		},
+		{
+			name:    "connect no file",
+			wantErr: true,
+		},
+		{
+			name: "connect with file",
+			fields: fields{
+				transportFile: createPcap(t),
+			},
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -141,7 +173,6 @@ func TestTransportInstance_Connect(t *testing.T) {
 				connected:                        tt.fields.connected,
 				transport:                        tt.fields.transport,
 				handle:                           tt.fields.handle,
-				mutex:                            tt.fields.mutex,
 				reader:                           tt.fields.reader,
 			}
 			if err := m.Connect(); (err != nil) != tt.wantErr {
@@ -161,7 +192,6 @@ func TestTransportInstance_GetReader(t *testing.T) {
 		connected                        bool
 		transport                        *Transport
 		handle                           *pcap.Handle
-		mutex                            sync.Mutex
 		reader                           *bufio.Reader
 	}
 	tests := []struct {
@@ -169,7 +199,9 @@ func TestTransportInstance_GetReader(t *testing.T) {
 		fields fields
 		want   *bufio.Reader
 	}{
-		// TODO: Add test cases.
+		{
+			name: "get reader",
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -182,10 +214,9 @@ func TestTransportInstance_GetReader(t *testing.T) {
 				connected:                        tt.fields.connected,
 				transport:                        tt.fields.transport,
 				handle:                           tt.fields.handle,
-				mutex:                            tt.fields.mutex,
 				reader:                           tt.fields.reader,
 			}
-			if got := m.GetReader(); !reflect.DeepEqual(got, tt.want) {
+			if got := m.GetReader(); !assert.Equal(t, tt.want, got) {
 				t.Errorf("GetReader() = %v, want %v", got, tt.want)
 			}
 		})
@@ -202,7 +233,6 @@ func TestTransportInstance_IsConnected(t *testing.T) {
 		connected                        bool
 		transport                        *Transport
 		handle                           *pcap.Handle
-		mutex                            sync.Mutex
 		reader                           *bufio.Reader
 	}
 	tests := []struct {
@@ -210,7 +240,9 @@ func TestTransportInstance_IsConnected(t *testing.T) {
 		fields fields
 		want   bool
 	}{
-		// TODO: Add test cases.
+		{
+			name: "is connected",
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -223,7 +255,6 @@ func TestTransportInstance_IsConnected(t *testing.T) {
 				connected:                        tt.fields.connected,
 				transport:                        tt.fields.transport,
 				handle:                           tt.fields.handle,
-				mutex:                            tt.fields.mutex,
 				reader:                           tt.fields.reader,
 			}
 			if got := m.IsConnected(); got != tt.want {
@@ -243,7 +274,6 @@ func TestTransportInstance_String(t *testing.T) {
 		connected                        bool
 		transport                        *Transport
 		handle                           *pcap.Handle
-		mutex                            sync.Mutex
 		reader                           *bufio.Reader
 	}
 	tests := []struct {
@@ -251,7 +281,15 @@ func TestTransportInstance_String(t *testing.T) {
 		fields fields
 		want   string
 	}{
-		// TODO: Add test cases.
+		{
+			name: "get the string",
+			fields: fields{
+				transportFile: "plc4x",
+				portRange:     "is-the-best",
+				speedFactor:   3.14,
+			},
+			want: "pcap:plc4x(is-the-best)x3.140000",
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -264,7 +302,6 @@ func TestTransportInstance_String(t *testing.T) {
 				connected:                        tt.fields.connected,
 				transport:                        tt.fields.transport,
 				handle:                           tt.fields.handle,
-				mutex:                            tt.fields.mutex,
 				reader:                           tt.fields.reader,
 			}
 			if got := m.String(); got != tt.want {
@@ -284,7 +321,6 @@ func TestTransportInstance_Write(t *testing.T) {
 		connected                        bool
 		transport                        *Transport
 		handle                           *pcap.Handle
-		mutex                            sync.Mutex
 		reader                           *bufio.Reader
 	}
 	type args struct {
@@ -296,7 +332,10 @@ func TestTransportInstance_Write(t *testing.T) {
 		args    args
 		wantErr bool
 	}{
-		// TODO: Add test cases.
+		{
+			name:    "we can't write",
+			wantErr: true,
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -309,7 +348,6 @@ func TestTransportInstance_Write(t *testing.T) {
 				connected:                        tt.fields.connected,
 				transport:                        tt.fields.transport,
 				handle:                           tt.fields.handle,
-				mutex:                            tt.fields.mutex,
 				reader:                           tt.fields.reader,
 			}
 			if err := m.Write(tt.args.in0); (err != nil) != tt.wantErr {
@@ -330,7 +368,26 @@ func TestTransport_CreateTransportInstance(t *testing.T) {
 		want    transports.TransportInstance
 		wantErr bool
 	}{
-		// TODO: Add test cases.
+		{
+			name: "create it",
+			args: args{
+				options: map[string][]string{
+					"transport-type":       {"pcap"},
+					"transport-port-range": {"1-3"},
+					"speed-factor":         {"1.5"},
+				},
+			},
+			want: func() transports.TransportInstance {
+				ti := &TransportInstance{
+					transportType: "pcap",
+					speedFactor:   1.5,
+					transport:     NewTransport(),
+					portRange:     "1-3",
+				}
+				ti.DefaultBufferedTransportInstance = transports.NewDefaultBufferedTransportInstance(ti)
+				return ti
+			}(),
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -340,7 +397,7 @@ func TestTransport_CreateTransportInstance(t *testing.T) {
 				t.Errorf("CreateTransportInstance() error = %v, wantErr %v", err, tt.wantErr)
 				return
 			}
-			if !reflect.DeepEqual(got, tt.want) {
+			if !assert.Equal(t, tt.want, got) {
 				t.Errorf("CreateTransportInstance() got = %v, want %v", got, tt.want)
 			}
 		})
@@ -352,7 +409,10 @@ func TestTransport_GetTransportCode(t *testing.T) {
 		name string
 		want string
 	}{
-		// TODO: Add test cases.
+		{
+			name: "get it",
+			want: "pcap",
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -369,7 +429,10 @@ func TestTransport_GetTransportName(t *testing.T) {
 		name string
 		want string
 	}{
-		// TODO: Add test cases.
+		{
+			name: "get it",
+			want: "PCAP(NG) Playback Transport",
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -386,7 +449,10 @@ func TestTransport_String(t *testing.T) {
 		name string
 		want string
 	}{
-		// TODO: Add test cases.
+		{
+			name: "get it",
+			want: "pcap(PCAP(NG) Playback Transport)",
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -397,3 +463,28 @@ func TestTransport_String(t *testing.T) {
 		})
 	}
 }
+
+func createPcap(t *testing.T) string {
+	tempFile, err := os.CreateTemp(t.TempDir(), "some*.pcap")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	w := pcapgo.NewWriter(tempFile)
+	if err := w.WriteFileHeader(65536, layers.LinkTypeEthernet); err != nil {
+		t.Fatal(err)
+	}
+	ci := gopacket.CaptureInfo{
+		Timestamp:     time.Unix(0x01020304, 0xAA*1000),
+		Length:        0xABCD,
+		CaptureLength: 10,
+	}
+	data := []byte{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
+	if err := w.WritePacket(ci, data); err != nil {
+		t.Fatal(err)
+	}
+	if err := tempFile.Close(); err != nil {
+		t.Fatal(err)
+	}
+	return tempFile.Name()
+}