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 2021/03/12 12:25:25 UTC

[plc4x] branch develop updated: plc4go: initial work on ads driver + introduced zerolog github.com/rs/zerolog + introduced errors github.com/pkg/errors + Added some logging to DriverTestRunner + Fixed bug where delay lead to panic

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 3fb3e19  plc4go: initial work on ads driver + introduced zerolog github.com/rs/zerolog + introduced errors github.com/pkg/errors + Added some logging to DriverTestRunner + Fixed bug where delay lead to panic
3fb3e19 is described below

commit 3fb3e191ee06d10139ace831ad0c53789be6ae30
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Mar 12 13:25:11 2021 +0100

    plc4go: initial work on ads driver
    + introduced zerolog github.com/rs/zerolog
    + introduced errors github.com/pkg/errors
    + Added some logging to DriverTestRunner
    + Fixed bug where delay lead to panic
---
 plc4go/cmd/main/drivers/tests/ads_driver_test.go   | 11 ++-
 plc4go/cmd/main/drivers/tests/s7_driver_test.go    |  4 +-
 plc4go/go.mod                                      |  2 +
 plc4go/go.sum                                      | 14 ++++
 .../plc4go/ads/AdsDriver.go}                       | 31 ++++++--
 .../plc4go/ads/AdsFieldHandler.go}                 | 21 +++--
 .../plc4go/spi/testutils/DriverTestRunner.go       | 90 +++++++++++++---------
 plc4go/pkg/plc4go/drivers/drivers.go               |  6 ++
 8 files changed, 126 insertions(+), 53 deletions(-)

diff --git a/plc4go/cmd/main/drivers/tests/ads_driver_test.go b/plc4go/cmd/main/drivers/tests/ads_driver_test.go
index 5c8da5e..0db68a4 100644
--- a/plc4go/cmd/main/drivers/tests/ads_driver_test.go
+++ b/plc4go/cmd/main/drivers/tests/ads_driver_test.go
@@ -19,12 +19,19 @@
 package tests
 
 import (
-	"github.com/apache/plc4x/plc4go/internal/plc4go/modbus"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/ads"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/testutils"
+	"github.com/rs/zerolog"
+	"github.com/rs/zerolog/log"
+	"github.com/rs/zerolog/pkgerrors"
+	"os"
 	"testing"
 )
 
 func TestAdsDriver(t *testing.T) {
+	log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
+	zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
+	zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack
 	t.Skip("Still a work in progress")
-	testutils.RunDriverTestsuite(t, modbus.NewModbusDriver(), "assets/testing/protocols/ads/DriverTestsuite.xml")
+	testutils.RunDriverTestsuite(t, ads.NewAdsDriver(), "assets/testing/protocols/ads/DriverTestsuite.xml")
 }
diff --git a/plc4go/cmd/main/drivers/tests/s7_driver_test.go b/plc4go/cmd/main/drivers/tests/s7_driver_test.go
index 679b017..e2b482e 100644
--- a/plc4go/cmd/main/drivers/tests/s7_driver_test.go
+++ b/plc4go/cmd/main/drivers/tests/s7_driver_test.go
@@ -19,12 +19,12 @@
 package tests
 
 import (
-	"github.com/apache/plc4x/plc4go/internal/plc4go/modbus"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/s7"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/testutils"
 	"testing"
 )
 
 func TestS7Driver(t *testing.T) {
 	t.Skip("Still a work in progress")
-	testutils.RunDriverTestsuite(t, modbus.NewModbusDriver(), "assets/testing/protocols/s7/DriverTestsuite.xml")
+	testutils.RunDriverTestsuite(t, s7.NewS7Driver(), "assets/testing/protocols/s7/DriverTestsuite.xml")
 }
diff --git a/plc4go/go.mod b/plc4go/go.mod
index 0f873b7..2eb280c 100644
--- a/plc4go/go.mod
+++ b/plc4go/go.mod
@@ -23,6 +23,8 @@ go 1.15
 require (
 	github.com/ajankovic/xdiff v0.0.1
 	github.com/icza/bitio v1.0.0
+	github.com/pkg/errors v0.8.1
+	github.com/rs/zerolog v1.20.0
 	github.com/sirupsen/logrus v1.7.0
 	github.com/subchen/go-xmldom v1.1.2
 )
diff --git a/plc4go/go.sum b/plc4go/go.sum
index e7a4d67..dd76c29 100644
--- a/plc4go/go.sum
+++ b/plc4go/go.sum
@@ -2,19 +2,33 @@ github.com/ajankovic/xdiff v0.0.1 h1:V1cj8t5xwYzm6ZGPqPOlAc9AIajXuTEn41D/1MJBWMM
 github.com/ajankovic/xdiff v0.0.1/go.mod h1:SUmEZ67uB97I0zkiuQ+lb+LOms9ipn8X+p+2RdJV710=
 github.com/antchfx/xpath v0.0.0-20170515025933-1f3266e77307 h1:C735MoY/X+UOx6SECmHk5pVOj51h839Ph13pEoY8UmU=
 github.com/antchfx/xpath v0.0.0-20170515025933-1f3266e77307/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs=
 github.com/icza/bitio v1.0.0 h1:squ/m1SHyFeCA6+6Gyol1AxV9nmPPlJFT8c2vKdj3U8=
 github.com/icza/bitio v1.0.0/go.mod h1:0jGnlLAx8MKMr9VGnn/4YrvZiprkvBelsVIbA9Jjr9A=
 github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k=
 github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA=
+github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
+github.com/rs/zerolog v1.20.0 h1:38k9hgtUBdxFwE34yS8rTHmHBa4eN16E4DJlv177LNs=
+github.com/rs/zerolog v1.20.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo=
 github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
 github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/subchen/go-xmldom v1.1.2 h1:7evI2YqfYYOnuj+PBwyaOZZYjl3iWq35P6KfBUw9jeU=
 github.com/subchen/go-xmldom v1.1.2/go.mod h1:6Pg/HuX5/T4Jlj0IPJF1sRxKVoI/rrKP6LIMge9d5/8=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/plc4go/cmd/main/drivers/tests/ads_driver_test.go b/plc4go/internal/plc4go/ads/AdsDriver.go
similarity index 62%
copy from plc4go/cmd/main/drivers/tests/ads_driver_test.go
copy to plc4go/internal/plc4go/ads/AdsDriver.go
index 5c8da5e..5245058 100644
--- a/plc4go/cmd/main/drivers/tests/ads_driver_test.go
+++ b/plc4go/internal/plc4go/ads/AdsDriver.go
@@ -16,15 +16,32 @@
 // specific language governing permissions and limitations
 // under the License.
 //
-package tests
+package ads
 
 import (
-	"github.com/apache/plc4x/plc4go/internal/plc4go/modbus"
-	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/testutils"
-	"testing"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
+	"github.com/apache/plc4x/plc4go/pkg/plc4go"
 )
 
-func TestAdsDriver(t *testing.T) {
-	t.Skip("Still a work in progress")
-	testutils.RunDriverTestsuite(t, modbus.NewModbusDriver(), "assets/testing/protocols/ads/DriverTestsuite.xml")
+type AdsDriver struct {
+	fieldHandler spi.PlcFieldHandler
+	plc4go.PlcDriver
+}
+
+func NewAdsDriver() plc4go.PlcDriver {
+	return &AdsDriver{
+		fieldHandler: NewFieldHandler(),
+	}
+}
+
+func (m AdsDriver) GetProtocolCode() string {
+	return "ads"
+}
+
+func (m AdsDriver) GetProtocolName() string {
+	return "Beckhoff TwinCat ADS"
+}
+
+func (m AdsDriver) SupportsDiscovery() bool {
+	return false
 }
diff --git a/plc4go/cmd/main/drivers/tests/ads_driver_test.go b/plc4go/internal/plc4go/ads/AdsFieldHandler.go
similarity index 67%
copy from plc4go/cmd/main/drivers/tests/ads_driver_test.go
copy to plc4go/internal/plc4go/ads/AdsFieldHandler.go
index 5c8da5e..ce2a708 100644
--- a/plc4go/cmd/main/drivers/tests/ads_driver_test.go
+++ b/plc4go/internal/plc4go/ads/AdsFieldHandler.go
@@ -16,15 +16,22 @@
 // specific language governing permissions and limitations
 // under the License.
 //
-package tests
+package ads
 
 import (
-	"github.com/apache/plc4x/plc4go/internal/plc4go/modbus"
-	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/testutils"
-	"testing"
+	"errors"
+	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
+	apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 )
 
-func TestAdsDriver(t *testing.T) {
-	t.Skip("Still a work in progress")
-	testutils.RunDriverTestsuite(t, modbus.NewModbusDriver(), "assets/testing/protocols/ads/DriverTestsuite.xml")
+type FieldHandler struct {
+	spi.PlcFieldHandler
+}
+
+func NewFieldHandler() FieldHandler {
+	return FieldHandler{}
+}
+
+func (m FieldHandler) ParseQuery(query string) (apiModel.PlcField, error) {
+	return nil, errors.New("Invalid address format for address '" + query + "'")
 }
diff --git a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
index 00835ff..f48028d 100644
--- a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
+++ b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
@@ -21,7 +21,6 @@ package testutils
 import (
 	"encoding/hex"
 	"encoding/xml"
-	"errors"
 	"fmt"
 	model2 "github.com/apache/plc4x/plc4go/internal/plc4go/modbus/readwrite"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
@@ -30,6 +29,8 @@ import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go"
 	api "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
+	"github.com/pkg/errors"
+	"github.com/rs/zerolog/log"
 	"github.com/subchen/go-xmldom"
 	"os"
 	"strconv"
@@ -52,16 +53,16 @@ func (m DriverTestsuite) Run(driverManager plc4go.PlcDriverManager, testcase Tes
 	connectionResult := <-connectionChan
 
 	if connectionResult.Err != nil {
-		return errors.New("error getting a connection: " + connectionResult.Err.Error())
+		return errors.Wrap(connectionResult.Err, "error getting a connection")
 	}
 
-	fmt.Printf("\n\n-------------------------------------------------------\nExecuting testcase: %s \n", testcase.name)
+	log.Info().Msgf("\n\n-------------------------------------------------------\nExecuting testcase: %s \n", testcase.name)
 
 	// Run the setup steps
 	for _, testStep := range m.setupSteps {
 		err := m.ExecuteStep(connectionResult.Connection, &testcase, testStep)
 		if err != nil {
-			return errors.New("error in setup step " + testStep.name + ": " + err.Error())
+			return errors.Wrap(err, "error in setup step "+testStep.name)
 		}
 	}
 
@@ -69,7 +70,7 @@ func (m DriverTestsuite) Run(driverManager plc4go.PlcDriverManager, testcase Tes
 	for _, testStep := range testcase.steps {
 		err := m.ExecuteStep(connectionResult.Connection, &testcase, testStep)
 		if err != nil {
-			return errors.New("error in step " + testStep.name + ": " + err.Error())
+			return errors.Wrap(err, "error in step "+testStep.name)
 		}
 	}
 
@@ -77,11 +78,11 @@ func (m DriverTestsuite) Run(driverManager plc4go.PlcDriverManager, testcase Tes
 	for _, testStep := range m.teardownSteps {
 		err := m.ExecuteStep(connectionResult.Connection, &testcase, testStep)
 		if err != nil {
-			return errors.New("error in teardown step " + testStep.name + ": " + err.Error())
+			return errors.Wrap(err, "error in teardown step "+testStep.name)
 		}
 	}
 
-	fmt.Printf("-------------------------------------------------------\nDone\n-------------------------------------------------------\n")
+	log.Info().Msgf("-------------------------------------------------------\nDone\n-------------------------------------------------------\n")
 	return nil
 }
 
@@ -95,7 +96,7 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 		return errors.New("transport must be of type TestTransport")
 	}
 
-	fmt.Printf(" - Executing step: %s \n", step.name)
+	log.Info().Msgf(" - Executing step: %s \n", step.name)
 
 	switch step.stepType {
 	case StepType_API_REQUEST:
@@ -110,7 +111,7 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 			}
 			readRequest, err := rrb.Build()
 			if err != nil {
-				return errors.New("Error creating read-request: " + err.Error())
+				return errors.Wrap(err, "Error creating read-request")
 			}
 
 			// Execute the read-request and store the response-channel in the testcase.
@@ -130,7 +131,7 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 				}
 				field, err := he.GetPlcFieldHandler().ParseQuery(fieldAddress)
 				if err != nil {
-					return errors.New("error parsing address: " + fieldAddress + " got error " + err.Error())
+					return errors.Wrap(err, "error parsing address: "+fieldAddress)
 				}
 				if field.GetQuantity() > 1 {
 					var fieldValue []string
@@ -145,7 +146,7 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 			}
 			writeRequest, err := wrb.Build()
 			if err != nil {
-				return errors.New("Error creating write-request: " + err.Error())
+				return errors.Wrap(err, "Error creating write-request")
 			}
 			if testcase.writeRequestResultChannel != nil {
 				return errors.New("testcase write-request result channel already occupied")
@@ -162,14 +163,14 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 			// Serialize the response to XML
 			actualResponse, err := xml.Marshal(readRequestResult.Response)
 			if err != nil {
-				return errors.New("error serializing response: " + err.Error())
+				return errors.Wrap(err, "error serializing response")
 			}
 			// Get the reference XML
 			referenceSerialized := step.payload.XML()
 			// Compare the results
 			err = CompareResults(actualResponse, []byte(referenceSerialized))
 			if err != nil {
-				return errors.New("Error comparing the results: " + err.Error())
+				return errors.Wrap(err, "Error comparing the results")
 			}
 		case "PlcWriteResponse":
 			if testcase.writeRequestResultChannel == nil {
@@ -179,14 +180,14 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 			// Serialize the response to XML
 			actualResponse, err := xml.Marshal(writeResponseResult.Response)
 			if err != nil {
-				return errors.New("error serializing response: " + err.Error())
+				return errors.Wrap(err, "error serializing response")
 			}
 			// Get the reference XML
 			referenceSerialized := step.payload.XML()
 			// Compare the results
 			err = CompareResults(actualResponse, []byte(referenceSerialized))
 			if err != nil {
-				return errors.New("Error comparing the results: " + err.Error())
+				return errors.Wrap(err, "Error comparing the results")
 			}
 		}
 	case StepType_OUTGOING_PLC_MESSAGE:
@@ -196,7 +197,7 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 		// Parse the xml into a real model
 		message, err := model2.ModbusXmlParserHelper{}.Parse(typeName, payloadString)
 		if err != nil {
-			return errors.New("error parsing xml: " + err.Error())
+			return errors.Wrap(err, "error parsing xml")
 		}
 
 		// Serialize the model into bytes
@@ -207,7 +208,7 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 		wb := utils.NewWriteBuffer()
 		err = ser.Serialize(*wb)
 		if err != nil {
-			return errors.New("error serializing message: " + err.Error())
+			return errors.Wrap(err, "error serializing message")
 		}
 		expectedRawOutput := wb.GetBytes()
 		expectedRawOutputLength := uint32(len(expectedRawOutput))
@@ -218,7 +219,7 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 		}
 		rawOutput, err := testTransportInstance.DrainWriteBuffer(expectedRawOutputLength)
 		if err != nil {
-			return errors.New("error getting bytes from transport: " + err.Error())
+			return errors.Wrap(err, "error getting bytes from transport")
 		}
 
 		// Compare the bytes read with the ones we expect
@@ -232,11 +233,11 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 		// Read exactly this amount of bytes from the transport
 		expectedRawInput, err := hex.DecodeString(step.payload.Text)
 		if err != nil {
-			return errors.New("error decoding hex-encoded byte data: " + err.Error())
+			return errors.Wrap(err, "error decoding hex-encoded byte data")
 		}
 		rawInput, err := testTransportInstance.DrainWriteBuffer(uint32(len(expectedRawInput)))
 		if err != nil {
-			return errors.New("error getting bytes from transport: " + err.Error())
+			return errors.Wrap(err, "error getting bytes from transport")
 		}
 
 		// Compare the bytes read with the ones we expect
@@ -253,7 +254,7 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 		// Parse the xml into a real model
 		message, err := model2.ModbusXmlParserHelper{}.Parse(typeName, payloadString)
 		if err != nil {
-			return errors.New("error parsing xml: " + err.Error())
+			return errors.Wrap(err, "error parsing xml")
 		}
 
 		// Serialize the model into bytes
@@ -264,31 +265,31 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 		wb := utils.NewWriteBuffer()
 		err = ser.Serialize(*wb)
 		if err != nil {
-			return errors.New("error serializing message: " + err.Error())
+			return errors.Wrap(err, "error serializing message")
 		}
 
 		// Send these bytes to the transport
 		err = testTransportInstance.FillReadBuffer(wb.GetBytes())
 		if err != nil {
-			return errors.New("error writing data to transport: " + err.Error())
+			return errors.Wrap(err, "error writing data to transport")
 		}
 	case StepType_INCOMING_PLC_BYTES:
 		// Get the raw hex-data.
 		rawInput, err := hex.DecodeString(step.payload.Text)
 		if err != nil {
-			return errors.New("error decoding hex-encoded byte data: " + err.Error())
+			return errors.Wrap(err, "error decoding hex-encoded byte data: ")
 		}
 
 		// Send these bytes to the transport
 		err = testTransportInstance.FillReadBuffer(rawInput)
 		if err != nil {
-			return errors.New("error writing data to transport: " + err.Error())
+			return errors.Wrap(err, "error writing data to transport")
 		}
 	case StepType_DELAY:
 		// Get the number of milliseconds
 		delay, err := strconv.Atoi(step.payload.Text)
 		if err != nil {
-			return errors.New("invalid delay format: " + err.Error())
+			return errors.Wrap(err, "invalid delay format")
 		}
 		// Sleep for that long
 		time.Sleep(time.Duration(delay))
@@ -296,7 +297,7 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 		// Simply close the transport connection
 		err := testTransportInstance.Close()
 		if err != nil {
-			return errors.New("error closing transport: " + err.Error())
+			return errors.Wrap(err, "error closing transport")
 		}
 	}
 	return nil
@@ -346,7 +347,13 @@ func RunDriverTestsuite(t *testing.T, driver plc4go.PlcDriver, testPath string)
 	// Parse the contents of the test-specification
 	testsuite, err := ParseDriverTestsuite(*rootNode)
 	if err != nil {
-		t.Error(err.Error())
+		// TODO: zerolog doesn't render stack human readable :(
+		fmt.Printf("%+v\n", err)
+		log.Error().
+			Stack().
+			Err(err).
+			Msg("Failed to parse test-specification")
+		t.Error(err)
 		t.Fail()
 		return
 	}
@@ -359,12 +366,12 @@ func RunDriverTestsuite(t *testing.T, driver plc4go.PlcDriver, testPath string)
 	for _, testcase := range testsuite.testcases {
 		err := testsuite.Run(driverManager, testcase)
 		if err != nil {
-			fmt.Printf("-------------------------------------------------------\nFailure\n%s\n-------------------------------------------------------\n", err.Error())
+			log.Err(err).Msgf("-------------------------------------------------------\nFailure\n%s\n-------------------------------------------------------\n", err.Error())
 			t.Fail()
 		}
 	}
 	// Execute the tests in the testsuite
-	fmt.Printf(testsuite.name)
+	log.Info().Msgf(testsuite.name)
 }
 
 func ParseDriverTestsuiteXml(testPath string) (*xmldom.Node, error) {
@@ -377,7 +384,7 @@ func ParseDriverTestsuiteXml(testPath string) (*xmldom.Node, error) {
 	// Check if the test-file is available
 	info, err := os.Stat(path + "/../../../../" + testPath)
 	if os.IsNotExist(err) {
-		return nil, errors.New("test-File doesn't exist")
+		return nil, errors.Wrap(err, "test-File doesn't exist")
 	}
 	if info.IsDir() {
 		return nil, errors.New("test-file refers to a directory")
@@ -386,7 +393,7 @@ func ParseDriverTestsuiteXml(testPath string) (*xmldom.Node, error) {
 	// Open a reader for this file
 	dat, err := os.Open(path + "/../../../../" + testPath)
 	if err != nil {
-		return nil, errors.New("error opening file")
+		return nil, errors.Wrap(err, "error opening file")
 	}
 
 	// Read the xml
@@ -428,13 +435,13 @@ func ParseDriverTestsuite(node xmldom.Node) (*DriverTestsuite, error) {
 		} else if child.Name == "setup" {
 			steps, err := ParseDriverTestsuiteSteps(child)
 			if err != nil {
-				return nil, errors.New("error parsing setup steps")
+				return nil, errors.Wrap(err, "error parsing setup steps")
 			}
 			setupSteps = steps
 		} else if child.Name == "teardown" {
 			steps, err := ParseDriverTestsuiteSteps(child)
 			if err != nil {
-				return nil, errors.New("error teardown setup steps")
+				return nil, errors.Wrap(err, "error teardown setup steps")
 			}
 			teardownSteps = steps
 		} else if child.Name == "testcase" {
@@ -442,7 +449,7 @@ func ParseDriverTestsuite(node xmldom.Node) (*DriverTestsuite, error) {
 			stepsNode := child.FindOneByName("steps")
 			steps, err := ParseDriverTestsuiteSteps(*stepsNode)
 			if err != nil {
-				return nil, errors.New("error parsing testcase " + testcaseName + ": " + err.Error())
+				return nil, errors.Wrap(err, "error parsing testcase "+testcaseName)
 			}
 			testcase := Testcase{
 				name:  testcaseName,
@@ -453,6 +460,10 @@ func ParseDriverTestsuite(node xmldom.Node) (*DriverTestsuite, error) {
 			return nil, errors.New("invalid document structure. Unhandled element " + child.Name)
 		}
 	}
+	log.Info().
+		Str("testsuite name", testsuiteName).
+		Str("driver name", driverName).
+		Msgf("Parsed test suite %s", testsuiteName)
 
 	return &DriverTestsuite{
 		name:             testsuiteName,
@@ -465,9 +476,11 @@ func ParseDriverTestsuite(node xmldom.Node) (*DriverTestsuite, error) {
 }
 
 func ParseDriverTestsuiteSteps(node xmldom.Node) ([]TestStep, error) {
+	log.Debug().Str("rootElement", node.Name).Msg("Parsing driver testsuite steps")
 	var testSteps []TestStep
 	for _, step := range node.Children {
 		name := step.GetAttributeValue("name")
+		log.Debug().Str("rootElement", node.Name).Str("name", name).Msg("Parsing step")
 		var stepType StepType
 		switch step.Name {
 		case "api-request":
@@ -486,10 +499,14 @@ func ParseDriverTestsuiteSteps(node xmldom.Node) ([]TestStep, error) {
 			stepType = StepType_DELAY
 		case "terminate":
 			stepType = StepType_TERMINATE
+		default:
+			return nil, errors.Errorf("Unknown step with name %s", step.Name)
 		}
 		var parserArguments []string
 		var payload *xmldom.Node
+		log.Debug().Str("rootElement", node.Name).Msg("Looking for payload")
 		for _, childNode := range step.Children {
+			log.Debug().Str("child node name", childNode.Name).Str("rootElement", node.Name).Msg("Found payload candidate")
 			if childNode.Name == "parser-arguments" {
 				for _, parserArgumentNode := range childNode.Children {
 					parserArguments = append(parserArguments, parserArgumentNode.Text)
@@ -500,6 +517,9 @@ func ParseDriverTestsuiteSteps(node xmldom.Node) ([]TestStep, error) {
 				return nil, errors.New("test step can only contain a single payload element")
 			}
 		}
+		if stepType == StepType_DELAY {
+			payload = step
+		}
 		if payload == nil {
 			return nil, errors.New("missing payload element")
 		}
diff --git a/plc4go/pkg/plc4go/drivers/drivers.go b/plc4go/pkg/plc4go/drivers/drivers.go
index 10c613b..ce0d16f 100644
--- a/plc4go/pkg/plc4go/drivers/drivers.go
+++ b/plc4go/pkg/plc4go/drivers/drivers.go
@@ -19,12 +19,18 @@
 package drivers
 
 import (
+	"github.com/apache/plc4x/plc4go/internal/plc4go/ads"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/modbus"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/transports"
 )
 
+func RegisterAdsDriver(driverManager plc4go.PlcDriverManager) {
+	driverManager.RegisterDriver(ads.NewAdsDriver())
+	transports.RegisterTcpTransport(driverManager)
+}
+
 func RegisterKnxDriver(driverManager plc4go.PlcDriverManager) {
 	driverManager.RegisterDriver(knxnetip.NewKnxNetIpDriver())
 	transports.RegisterUdpTransport(driverManager)