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)