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/30 09:57:10 UTC

[plc4x] branch develop updated: plc4go: ads works now with a simple read + Fixed MultiError as it returned wrong type (TIL (*utils.MultiError = nil) != nil) + Fixed proper error handling on DriverTestRunner.go

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 d875b78  plc4go: ads works now with a simple read + Fixed MultiError as it returned wrong type (TIL (*utils.MultiError = nil) != nil) + Fixed proper error handling on DriverTestRunner.go
d875b78 is described below

commit d875b7856e354797c1e7fa964e591af0bdc46f7a
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Mar 30 11:56:48 2021 +0200

    plc4go: ads works now with a simple read
    + Fixed MultiError as it returned wrong type (TIL (*utils.MultiError = nil) != nil)
    + Fixed proper error handling on DriverTestRunner.go
---
 plc4go/cmd/main/drivers/tests/ads_driver_test.go   | 10 ++++++--
 plc4go/internal/plc4go/ads/Field.go                | 12 ++++++---
 plc4go/internal/plc4go/ads/FieldHandler.go         | 29 +++++++++++-----------
 plc4go/internal/plc4go/ads/Reader.go               |  4 +--
 plc4go/internal/plc4go/ads/Writer.go               |  4 +--
 plc4go/internal/plc4go/ads/fieldtype_string.go     |  8 +++---
 plc4go/internal/plc4go/knxnetip/Connection.go      |  2 +-
 .../interceptors/SingleItemRequestInterceptor.go   |  8 +++---
 .../plc4go/spi/testutils/DriverTestRunner.go       |  9 +++++--
 9 files changed, 51 insertions(+), 35 deletions(-)

diff --git a/plc4go/cmd/main/drivers/tests/ads_driver_test.go b/plc4go/cmd/main/drivers/tests/ads_driver_test.go
index d872f10..7e2dca8 100644
--- a/plc4go/cmd/main/drivers/tests/ads_driver_test.go
+++ b/plc4go/cmd/main/drivers/tests/ads_driver_test.go
@@ -26,6 +26,12 @@ import (
 )
 
 func TestAdsDriver(t *testing.T) {
-	t.Skip("Still a work in progress")
-	testutils.RunDriverTestsuite(t, ads.NewDriver(), "assets/testing/protocols/ads/DriverTestsuite.xml")
+	//t.Skip("Still a work in progress")
+	testutils.RunDriverTestsuite(t, ads.NewDriver(), "assets/testing/protocols/ads/DriverTestsuite.xml",
+		// TODO: error in code-generator must be fixed first
+		"Multi-element direct read request",
+		// TODO: symbolic addressing not implemented yet
+		"Single element symbolic read request",
+		"Single element symbolic read request (Address previously resolved)",
+	)
 }
diff --git a/plc4go/internal/plc4go/ads/Field.go b/plc4go/internal/plc4go/ads/Field.go
index 21241ec..c79f746 100644
--- a/plc4go/internal/plc4go/ads/Field.go
+++ b/plc4go/internal/plc4go/ads/Field.go
@@ -93,11 +93,15 @@ func (m PlcField) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
 	if err := e.EncodeElement(m.IndexOffset, xml.StartElement{Name: xml.Name{Local: "indexOffset"}}); err != nil {
 		return err
 	}
-	if err := e.EncodeElement(m.SymbolicAddress, xml.StartElement{Name: xml.Name{Local: "symbolicAddress"}}); err != nil {
-		return err
+	if m.SymbolicAddress != "" {
+		if err := e.EncodeElement(m.SymbolicAddress, xml.StartElement{Name: xml.Name{Local: "symbolicAddress"}}); err != nil {
+			return err
+		}
 	}
-	if err := e.EncodeElement(m.StringLength, xml.StartElement{Name: xml.Name{Local: "stringLength"}}); err != nil {
-		return err
+	if m.StringLength > 0 {
+		if err := e.EncodeElement(m.StringLength, xml.StartElement{Name: xml.Name{Local: "stringLength"}}); err != nil {
+			return err
+		}
 	}
 	if err := e.EncodeElement(m.NumberOfElements, xml.StartElement{Name: xml.Name{Local: "numberOfElements"}}); err != nil {
 		return err
diff --git a/plc4go/internal/plc4go/ads/FieldHandler.go b/plc4go/internal/plc4go/ads/FieldHandler.go
index 14e657e..1825a62 100644
--- a/plc4go/internal/plc4go/ads/FieldHandler.go
+++ b/plc4go/internal/plc4go/ads/FieldHandler.go
@@ -21,7 +21,6 @@ package ads
 import (
 	"encoding/binary"
 	"encoding/hex"
-	"fmt"
 	model2 "github.com/apache/plc4x/plc4go/internal/plc4go/ads/readwrite/model"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
@@ -35,14 +34,14 @@ type FieldType uint8
 
 //go:generate stringer -type FieldType
 const (
-	StringField         FieldType = 0x00
-	Field               FieldType = 0x01
-	SymbolicStringField FieldType = 0x03
-	SymbolicField       FieldType = 0x04
+	DirectAdsStringField FieldType = 0x00
+	DirectAdsField       FieldType = 0x01
+	SymbolicStringField  FieldType = 0x03
+	SymbolicField        FieldType = 0x04
 )
 
 func (i FieldType) GetName() string {
-	return fmt.Sprintf("AdsField%s", i.String())
+	return i.String()
 }
 
 type FieldHandler struct {
@@ -54,10 +53,10 @@ type FieldHandler struct {
 
 func NewFieldHandler() FieldHandler {
 	return FieldHandler{
-		directAdsStringField:   regexp.MustCompile("^((0[xX](?P<indexGroupHex>[0-9a-fA-F]+))|(?P<indexGroup>\\d+))/((0[xX](?P<indexOffsetHex>[0-9a-fA-F]+))|(?P<indexOffset>\\d+)):(?P<adsDataType>STRING|WSTRING)\\((?P<stringLength>\\d{1,3})\\)(\\[(?P<numberOfElements>\\d+)])?"),
-		directAdsField:         regexp.MustCompile("^((0[xX](?P<indexGroupHex>[0-9a-fA-F]+))|(?P<indexGroup>\\d+))/((0[xX](?P<indexOffsetHex>[0-9a-fA-F]+))|(?P<indexOffset>\\d+)):(?P<adsDataType>\\w+)(\\[(?P<numberOfElements>\\d+)])?"),
-		symbolicAdsStringField: regexp.MustCompile("^(?P<symbolicAddress>.+):(?P<adsDataType>'STRING'|'WSTRING')\\((?P<stringLength>\\d{1,3})\\)(\\[(?P<numberOfElements>\\d+)])?"),
-		symbolicAdsField:       regexp.MustCompile("^(?P<symbolicAddress>.+):(?P<adsDataType>\\w+)(\\[(?P<numberOfElements>\\d+)])?"),
+		directAdsStringField:   regexp.MustCompile(`^((0[xX](?P<indexGroupHex>[0-9a-fA-F]+))|(?P<indexGroup>\d+))/((0[xX](?P<indexOffsetHex>[0-9a-fA-F]+))|(?P<indexOffset>\d+)):(?P<adsDataType>STRING|WSTRING)\((?P<stringLength>\d{1,3})\)(\[(?P<numberOfElements>\d+)])?`),
+		directAdsField:         regexp.MustCompile(`^((0[xX](?P<indexGroupHex>[0-9a-fA-F]+))|(?P<indexGroup>\d+))/((0[xX](?P<indexOffsetHex>[0-9a-fA-F]+))|(?P<indexOffset>\d+)):(?P<adsDataType>\w+)(\[(?P<numberOfElements>\d+)])?`),
+		symbolicAdsStringField: regexp.MustCompile(`^(?P<symbolicAddress>.+):(?P<adsDataType>'STRING'|'WSTRING')\((?P<stringLength>\d{1,3})\)(\[(?P<numberOfElements>\d+)])?`),
+		symbolicAdsField:       regexp.MustCompile(`^(?P<symbolicAddress>.+):(?P<adsDataType>\w+)(\[(?P<numberOfElements>\d+)])?`),
 	}
 }
 
@@ -101,7 +100,7 @@ func (m FieldHandler) ParseQuery(query string) (apiModel.PlcField, error) {
 			numberOfElements = 1
 		}
 
-		return NewAdsPlcField(StringField, indexGroup, indexOffset, model2.AdsDataTypeByName(match["datatype"]), int32(stringLength), int64(numberOfElements))
+		return NewAdsPlcField(DirectAdsStringField, indexGroup, indexOffset, model2.AdsDataTypeByName(match["adsDataType"]), int32(stringLength), int64(numberOfElements))
 	} else if match := utils.GetSubgroupMatches(m.directAdsField, query); match != nil {
 		var indexGroup uint32
 		if indexGroupHexString := match["indexGroupHex"]; indexGroupHexString != "" {
@@ -132,13 +131,13 @@ func (m FieldHandler) ParseQuery(query string) (apiModel.PlcField, error) {
 			indexOffset = uint32(parsedIndexOffset)
 		}
 
-		adsDataType := model2.AdsDataTypeByName(match["datatype"])
+		adsDataType := model2.AdsDataTypeByName(match["adsDataType"])
 		numberOfElements, err := strconv.Atoi(match["numberOfElements"])
 		if err != nil {
 			log.Trace().Msg("Falling back to number of elements 1")
 			numberOfElements = 1
 		}
-		return NewAdsPlcField(Field, indexGroup, indexOffset, adsDataType, int32(0), int64(numberOfElements))
+		return NewAdsPlcField(DirectAdsField, indexGroup, indexOffset, adsDataType, int32(0), int64(numberOfElements))
 	} else if match := utils.GetSubgroupMatches(m.symbolicAdsStringField, query); match != nil {
 		stringLength, err := strconv.Atoi(match["stringLength"])
 		if err != nil {
@@ -148,13 +147,13 @@ func (m FieldHandler) ParseQuery(query string) (apiModel.PlcField, error) {
 		if err != nil {
 			return nil, errors.Wrap(err, "Error decoding number of elements")
 		}
-		return NewAdsSymbolicPlcField(SymbolicStringField, match["symbolicAddress"], model2.AdsDataTypeByName(match["datatype"]), int32(stringLength), int64(numberOfElements))
+		return NewAdsSymbolicPlcField(SymbolicStringField, match["symbolicAddress"], model2.AdsDataTypeByName(match["adsDataType"]), int32(stringLength), int64(numberOfElements))
 	} else if match := utils.GetSubgroupMatches(m.symbolicAdsStringField, query); match != nil {
 		numberOfElements, err := strconv.Atoi(match["numberOfElements"])
 		if err != nil {
 			return nil, errors.Wrap(err, "Error decoding number of elements")
 		}
-		return NewAdsSymbolicPlcField(SymbolicField, match["symbolicAddress"], model2.AdsDataTypeByName(match["datatype"]), int32(0), int64(numberOfElements))
+		return NewAdsSymbolicPlcField(SymbolicField, match["symbolicAddress"], model2.AdsDataTypeByName(match["adsDataType"]), int32(0), int64(numberOfElements))
 	} else {
 		return nil, errors.Errorf("Invalid address format for address '%s'", query)
 	}
diff --git a/plc4go/internal/plc4go/ads/Reader.go b/plc4go/internal/plc4go/ads/Reader.go
index a3d0dea..e49f492 100644
--- a/plc4go/internal/plc4go/ads/Reader.go
+++ b/plc4go/internal/plc4go/ads/Reader.go
@@ -90,10 +90,10 @@ func (m *Reader) Read(readRequest model.PlcReadRequest) <-chan model.PlcReadRequ
 			Data:           nil,
 		}
 		switch adsField.FieldType {
-		case StringField:
+		case DirectAdsStringField:
 			// TODO: what is our read length?
 			userdata.Data = readWriteModel.NewAdsReadRequest(adsField.IndexGroup, adsField.IndexOffset, 1)
-		case Field:
+		case DirectAdsField:
 			// TODO: what is our read length?
 			userdata.Data = readWriteModel.NewAdsReadRequest(adsField.IndexGroup, adsField.IndexOffset, 1)
 		case SymbolicStringField:
diff --git a/plc4go/internal/plc4go/ads/Writer.go b/plc4go/internal/plc4go/ads/Writer.go
index 117a392..a5fd175 100644
--- a/plc4go/internal/plc4go/ads/Writer.go
+++ b/plc4go/internal/plc4go/ads/Writer.go
@@ -102,11 +102,11 @@ func (m Writer) Write(writeRequest model.PlcWriteRequest) <-chan model.PlcWriteR
 			Data:           nil,
 		}
 		switch adsField.FieldType {
-		case StringField:
+		case DirectAdsStringField:
 			// TODO: what is our read length?
 			userdata.Data = readWriteModel.NewAdsWriteRequest(adsField.IndexGroup, adsField.IndexOffset, data)
 			panic("implement me")
-		case Field:
+		case DirectAdsField:
 			panic("implement me")
 		case SymbolicStringField:
 			panic("implement me")
diff --git a/plc4go/internal/plc4go/ads/fieldtype_string.go b/plc4go/internal/plc4go/ads/fieldtype_string.go
index 86d1910..9611a20 100644
--- a/plc4go/internal/plc4go/ads/fieldtype_string.go
+++ b/plc4go/internal/plc4go/ads/fieldtype_string.go
@@ -25,19 +25,19 @@ func _() {
 	// An "invalid array index" compiler error signifies that the constant values have changed.
 	// Re-run the stringer command to generate them again.
 	var x [1]struct{}
-	_ = x[StringField-0]
-	_ = x[Field-1]
+	_ = x[DirectAdsStringField-0]
+	_ = x[DirectAdsField-1]
 	_ = x[SymbolicStringField-3]
 	_ = x[SymbolicField-4]
 }
 
 const (
-	_FieldType_name_0 = "StringFieldField"
+	_FieldType_name_0 = "DirectAdsStringFieldDirectAdsField"
 	_FieldType_name_1 = "SymbolicStringFieldSymbolicField"
 )
 
 var (
-	_FieldType_index_0 = [...]uint8{0, 11, 16}
+	_FieldType_index_0 = [...]uint8{0, 20, 34}
 	_FieldType_index_1 = [...]uint8{0, 19, 32}
 )
 
diff --git a/plc4go/internal/plc4go/knxnetip/Connection.go b/plc4go/internal/plc4go/knxnetip/Connection.go
index 4ad8c56..4d45325 100644
--- a/plc4go/internal/plc4go/knxnetip/Connection.go
+++ b/plc4go/internal/plc4go/knxnetip/Connection.go
@@ -1981,7 +1981,7 @@ func (m *Connection) resetTimeout() {
 }
 
 func (m *Connection) resetConnection() {
-	fmt.Println("Bad connection detected")
+	log.Warn().Msg("Bad connection detected")
 }
 
 func (m *Connection) getGroupAddressNumLevels() uint8 {
diff --git a/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go b/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
index 0ec0c71..3c6d4be 100644
--- a/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
+++ b/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
@@ -65,14 +65,16 @@ func (m SingleItemRequestInterceptor) ProcessReadResponses(readRequest apiModel.
 	log.Trace().Msg("Merging requests")
 	responseCodes := map[string]apiModel.PlcResponseCode{}
 	val := map[string]values.PlcValue{}
-	var err *utils.MultiError = nil
+	var err error = nil
 	for _, readResult := range readResults {
 		if readResult.Err != nil {
+			log.Debug().Err(readResult.Err).Msgf("Error during read")
 			if err == nil {
 				// Lazy initialization of multi error
-				err = &utils.MultiError{MainError: errors.New("while aggregating results"), Errors: []error{readResult.Err}}
+				err = utils.MultiError{MainError: errors.New("while aggregating results"), Errors: []error{readResult.Err}}
 			} else {
-				err.Errors = append(err.Errors, readResult.Err)
+				multiError := err.(utils.MultiError)
+				multiError.Errors = append(multiError.Errors, readResult.Err)
 			}
 		} else if readResult.Response != nil {
 			if len(readResult.Response.GetRequest().GetFieldNames()) > 1 {
diff --git a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
index 2150714..0f75d38 100644
--- a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
+++ b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
@@ -177,6 +177,9 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 			}
 			log.Trace().Msg("Waiting for read request result")
 			readRequestResult := <-testcase.readRequestResultChannel
+			if readRequestResult.Err != nil {
+				return errors.Wrap(readRequestResult.Err, "error sending response")
+			}
 			// Serialize the response to XML
 			actualResponse, err := xml.Marshal(readRequestResult.Response)
 			if err != nil {
@@ -195,6 +198,9 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
 			}
 			log.Trace().Msg("Waiting for write request result")
 			writeResponseResult := <-testcase.writeRequestResultChannel
+			if writeResponseResult.Err != nil {
+				return errors.Wrap(writeResponseResult.Err, "error sending response")
+			}
 			// Serialize the response to XML
 			actualResponse, err := xml.Marshal(writeResponseResult.Response)
 			if err != nil {
@@ -442,8 +448,7 @@ func RunDriverTestsuite(t *testing.T, driver plc4go.PlcDriver, testPath string,
 				return
 			}
 			log.Info().Msgf("Running testcase %s", testcase.name)
-			err := testsuite.Run(driverManager, testcase)
-			if err != nil {
+			if err := testsuite.Run(driverManager, testcase); err != nil {
 				log.Error().Err(err).Msgf("\n\n-------------------------------------------------------\nFailure\n%+v\n-------------------------------------------------------\n", err)
 				t.Fail()
 			}