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/06/07 13:08:07 UTC

[plc4x] 02/03: refactor(plc4go): general QC pass

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

commit 41b82bd16f83ed6e0b4f94e64fc6996b2e599523
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Jun 7 14:20:22 2023 +0200

    refactor(plc4go): general QC pass
---
 plc4go/internal/ads/Browser.go                   |   2 +-
 plc4go/internal/bacnetip/ApplicationModule.go    |   2 +-
 plc4go/internal/bacnetip/Discoverer.go           |   4 +-
 plc4go/internal/eip/Reader.go                    |   8 +-
 plc4go/internal/eip/Tag.go                       |   4 +-
 plc4go/internal/eip/Writer.go                    |   2 +-
 plc4go/internal/eip/mock_EIPPlcTag_test.go       |   2 +-
 plc4go/internal/modbus/Reader.go                 |   4 +-
 plc4go/internal/modbus/Tag.go                    |   4 +-
 plc4go/internal/modbus/Writer.go                 |   2 +-
 plc4go/internal/simulated/Device.go              |  21 ++--
 plc4go/internal/simulated/Device_test.go         |  30 ++++--
 plc4go/internal/simulated/Reader_test.go         |   8 +-
 plc4go/internal/simulated/Tag.go                 |   6 +-
 plc4go/internal/simulated/Tag_test.go            |   2 +-
 plc4go/internal/simulated/Writer_test.go         |  14 +--
 plc4go/pkg/api/cache/connectionContainer_test.go |   7 +-
 plc4go/pkg/api/model/plc_response_code.go        |   2 +-
 plc4go/pkg/api/model/plc_response_code_test.go   |   7 +-
 plc4go/spi/default/testTransportInstance_test.go |  83 ---------------
 plc4go/spi/model/DefaultPlcTagRequest_test.go    |  17 ++-
 plc4go/spi/tracer/Tracer.go                      |   2 +-
 plc4go/spi/tracer/mock_Provider_test.go          | 127 +++++++++++++++++++++++
 plc4go/spi/tracer/mock_TracerProvider_test.go    | 127 -----------------------
 plc4go/spi/utils/ReadBufferJsonBased_test.go     |   5 +-
 plc4go/tools/plc4xgenerator/gen.go               |   3 +-
 26 files changed, 223 insertions(+), 272 deletions(-)

diff --git a/plc4go/internal/ads/Browser.go b/plc4go/internal/ads/Browser.go
index 4a0590d2ba..e380903fe7 100644
--- a/plc4go/internal/ads/Browser.go
+++ b/plc4go/internal/ads/Browser.go
@@ -109,7 +109,7 @@ func (m *Connection) filterSymbols(filterExpression string) []apiModel.PlcBrowse
 
 func (m *Connection) filterDataTypes(parentName string, currentType driverModel.AdsDataTypeTableEntry, currentPath string, remainingAddressSegments []string) []apiModel.PlcBrowseItem {
 	if len(remainingAddressSegments) == 0 {
-		arrayInfo := []apiModel.ArrayInfo{}
+		var arrayInfo []apiModel.ArrayInfo
 		for _, ai := range currentType.GetArrayInfo() {
 			arrayInfo = append(arrayInfo, &spiModel.DefaultArrayInfo{
 				LowerBound: ai.GetLowerBound(),
diff --git a/plc4go/internal/bacnetip/ApplicationModule.go b/plc4go/internal/bacnetip/ApplicationModule.go
index 7cc45b36ff..39a04d9812 100644
--- a/plc4go/internal/bacnetip/ApplicationModule.go
+++ b/plc4go/internal/bacnetip/ApplicationModule.go
@@ -355,7 +355,7 @@ func (a *Application) IterObjects() []*LocalDeviceObject {
 // TODO: match that with readWriteModel.BACnetServicesSupported
 func (a *Application) GetServicesSupported() []string {
 	servicesSupported := make([]string, 0, len(a.helpers))
-	for key, _ := range a.helpers {
+	for key := range a.helpers {
 		servicesSupported = append(servicesSupported, key)
 	}
 	return servicesSupported
diff --git a/plc4go/internal/bacnetip/Discoverer.go b/plc4go/internal/bacnetip/Discoverer.go
index 9989a0d6b3..6507a86b96 100644
--- a/plc4go/internal/bacnetip/Discoverer.go
+++ b/plc4go/internal/bacnetip/Discoverer.go
@@ -498,7 +498,7 @@ func whoHasObjectName(objectName string) option {
 	}
 }
 
-func NewProtocolSpecificOptions(options ...option) (*protocolSpecificOptions, error) {
+func newProtocolSpecificOptions(options ...option) (*protocolSpecificOptions, error) {
 	var specificOptions protocolSpecificOptions
 	for _, _option := range options {
 		if parseErr := _option(&specificOptions); parseErr != nil {
@@ -620,7 +620,7 @@ func extractProtocolSpecificOptions(discoveryOptions []options.WithDiscoveryOpti
 			collectedOptions = append(collectedOptions, whoHasObjectName(name))
 		}
 	}
-	return NewProtocolSpecificOptions(collectedOptions...)
+	return newProtocolSpecificOptions(collectedOptions...)
 }
 
 func exactlyOneInt(filteredOptionMap map[string][]any, key string) (int, error) {
diff --git a/plc4go/internal/eip/Reader.go b/plc4go/internal/eip/Reader.go
index 81459228a4..83980fc6d2 100644
--- a/plc4go/internal/eip/Reader.go
+++ b/plc4go/internal/eip/Reader.go
@@ -75,7 +75,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 		classSegment := readWriteModel.NewLogicalSegment(readWriteModel.NewClassID(0, 6))
 		instanceSegment := readWriteModel.NewLogicalSegment(readWriteModel.NewInstanceID(0, 1))
 		for _, tagName := range readRequest.GetTagNames() {
-			plcTag := readRequest.GetTag(tagName).(EIPPlcTag)
+			plcTag := readRequest.GetTag(tagName).(PlcTag)
 			tag := plcTag.GetTag()
 			elementsNb := uint16(1)
 			if plcTag.GetElementNb() > 1 {
@@ -206,7 +206,7 @@ func (m *Reader) ToPlc4xReadResponse(response readWriteModel.CipService, readReq
 	case readWriteModel.CipReadResponseExactly: // only 1 tag
 		cipReadResponse := response
 		tagName := readRequest.GetTagNames()[0]
-		tag := readRequest.GetTag(tagName).(EIPPlcTag)
+		tag := readRequest.GetTag(tagName).(PlcTag)
 		code := decodeResponseCode(cipReadResponse.GetStatus())
 		var plcValue values.PlcValue
 		_type := cipReadResponse.GetData().GetDataType()
@@ -244,7 +244,7 @@ func (m *Reader) ToPlc4xReadResponse(response readWriteModel.CipService, readReq
 		}
 		services := readWriteModel.NewServices(multipleServiceResponse.GetOffsets(), arr, uint16(0))
 		for i, tagName := range readRequest.GetTagNames() {
-			tag := readRequest.GetTag(tagName).(EIPPlcTag)
+			tag := readRequest.GetTag(tagName).(PlcTag)
 			if cipReadResponse, ok := services.Services[i].(readWriteModel.CipReadResponse); ok {
 				code := decodeResponseCode(cipReadResponse.GetStatus())
 				_type := cipReadResponse.GetData().GetDataType()
@@ -273,7 +273,7 @@ func (m *Reader) ToPlc4xReadResponse(response readWriteModel.CipService, readReq
 	return spiModel.NewDefaultPlcReadResponse(readRequest, responseCodes, plcValues), nil
 }
 
-func parsePlcValue(tag EIPPlcTag, data utils.ReadBufferByteBased, _type readWriteModel.CIPDataTypeCode) (values.PlcValue, error) {
+func parsePlcValue(tag PlcTag, data utils.ReadBufferByteBased, _type readWriteModel.CIPDataTypeCode) (values.PlcValue, error) {
 	nb := tag.GetElementNb()
 	if nb > 1 {
 		list := make([]values.PlcValue, 0)
diff --git a/plc4go/internal/eip/Tag.go b/plc4go/internal/eip/Tag.go
index 799e24cbf1..c7029c59c3 100644
--- a/plc4go/internal/eip/Tag.go
+++ b/plc4go/internal/eip/Tag.go
@@ -29,7 +29,7 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-type EIPPlcTag interface {
+type PlcTag interface {
 	apiModel.PlcTag
 	utils.Serializable
 
@@ -44,7 +44,7 @@ type plcTag struct {
 	ElementNb uint16
 }
 
-func NewTag(tag string, _type readWriteModel.CIPDataTypeCode, elementNb uint16) plcTag {
+func NewTag(tag string, _type readWriteModel.CIPDataTypeCode, elementNb uint16) PlcTag {
 	return plcTag{
 		Tag:       tag,
 		Type:      _type,
diff --git a/plc4go/internal/eip/Writer.go b/plc4go/internal/eip/Writer.go
index 7700df8c60..7b198264d6 100644
--- a/plc4go/internal/eip/Writer.go
+++ b/plc4go/internal/eip/Writer.go
@@ -70,7 +70,7 @@ func (m Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteRequest
 		}()
 		items := make([]readWriteModel.CipService, len(writeRequest.GetTagNames()))
 		for i, tagName := range writeRequest.GetTagNames() {
-			eipTag := writeRequest.GetTag(tagName).(EIPPlcTag)
+			eipTag := writeRequest.GetTag(tagName).(PlcTag)
 			value := writeRequest.GetValue(tagName)
 			tag := eipTag.GetTag()
 			elements := uint16(1)
diff --git a/plc4go/internal/eip/mock_EIPPlcTag_test.go b/plc4go/internal/eip/mock_EIPPlcTag_test.go
index 28a92726fd..449e7f6298 100644
--- a/plc4go/internal/eip/mock_EIPPlcTag_test.go
+++ b/plc4go/internal/eip/mock_EIPPlcTag_test.go
@@ -34,7 +34,7 @@ import (
 	values "github.com/apache/plc4x/plc4go/pkg/api/values"
 )
 
-// MockEIPPlcTag is an autogenerated mock type for the EIPPlcTag type
+// MockEIPPlcTag is an autogenerated mock type for the PlcTag type
 type MockEIPPlcTag struct {
 	mock.Mock
 }
diff --git a/plc4go/internal/modbus/Reader.go b/plc4go/internal/modbus/Reader.go
index 6f37d5ef12..4985f65b26 100644
--- a/plc4go/internal/modbus/Reader.go
+++ b/plc4go/internal/modbus/Reader.go
@@ -72,7 +72,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 		// If we are requesting only one tag, use a
 		tagName := readRequest.GetTagNames()[0]
 		tag := readRequest.GetTag(tagName)
-		modbusTagVar, err := CastToModbusTagFromPlcTag(tag)
+		modbusTagVar, err := castToModbusTagFromPlcTag(tag)
 		if err != nil {
 			result <- spiModel.NewDefaultPlcReadRequestResult(
 				readRequest,
@@ -193,7 +193,7 @@ func (m *Reader) ToPlc4xReadResponse(responseAdu readWriteModel.ModbusTcpADU, re
 	// Get the tag from the request
 	m.log.Trace().Msg("get a tag from request")
 	tagName := readRequest.GetTagNames()[0]
-	tag, err := CastToModbusTagFromPlcTag(readRequest.GetTag(tagName))
+	tag, err := castToModbusTagFromPlcTag(readRequest.GetTag(tagName))
 	if err != nil {
 		return nil, errors.Wrap(err, "error casting to modbus-tag")
 	}
diff --git a/plc4go/internal/modbus/Tag.go b/plc4go/internal/modbus/Tag.go
index eaa027d317..d8ca982038 100644
--- a/plc4go/internal/modbus/Tag.go
+++ b/plc4go/internal/modbus/Tag.go
@@ -48,7 +48,7 @@ type modbusTag struct {
 	Datatype readWriteModel.ModbusDataType
 }
 
-func NewTag(tagType TagType, address uint16, quantity uint16, datatype readWriteModel.ModbusDataType) modbusTag {
+func NewTag(tagType TagType, address uint16, quantity uint16, datatype readWriteModel.ModbusDataType) apiModel.PlcTag {
 	return modbusTag{
 		TagType:  tagType,
 		Address:  address - AddressOffset,
@@ -99,7 +99,7 @@ func (m modbusTag) GetArrayInfo() []apiModel.ArrayInfo {
 	return []apiModel.ArrayInfo{}
 }
 
-func CastToModbusTagFromPlcTag(plcTag apiModel.PlcTag) (modbusTag, error) {
+func castToModbusTagFromPlcTag(plcTag apiModel.PlcTag) (modbusTag, error) {
 	if modbusTagVar, ok := plcTag.(modbusTag); ok {
 		return modbusTagVar, nil
 	}
diff --git a/plc4go/internal/modbus/Writer.go b/plc4go/internal/modbus/Writer.go
index 6c21dbff56..54da7a4fb3 100644
--- a/plc4go/internal/modbus/Writer.go
+++ b/plc4go/internal/modbus/Writer.go
@@ -65,7 +65,7 @@ func (m Writer) Write(ctx context.Context, writeRequest apiModel.PlcWriteRequest
 
 		// Get the modbus tag instance from the request
 		tag := writeRequest.GetTag(tagName)
-		modbusTag, err := CastToModbusTagFromPlcTag(tag)
+		modbusTag, err := castToModbusTagFromPlcTag(tag)
 		if err != nil {
 			result <- spiModel.NewDefaultPlcWriteRequestResult(writeRequest, nil, errors.Wrap(err, "invalid tag item type"))
 			return
diff --git a/plc4go/internal/simulated/Device.go b/plc4go/internal/simulated/Device.go
index 89fcb47ea7..bd4b09a691 100644
--- a/plc4go/internal/simulated/Device.go
+++ b/plc4go/internal/simulated/Device.go
@@ -21,17 +21,17 @@ package simulated
 
 import (
 	"context"
-	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/rs/zerolog"
 	"math/rand"
 
-	"github.com/apache/plc4x/plc4go/pkg/api/values"
-	"github.com/apache/plc4x/plc4go/protocols/simulated/readwrite/model"
+	apiValues "github.com/apache/plc4x/plc4go/pkg/api/values"
+	readWriteModel "github.com/apache/plc4x/plc4go/protocols/simulated/readwrite/model"
+	"github.com/apache/plc4x/plc4go/spi/options"
 )
 
 type Device struct {
 	Name  string
-	State map[simulatedTag]*values.PlcValue
+	State map[simulatedTag]*apiValues.PlcValue
 
 	log zerolog.Logger
 }
@@ -39,12 +39,12 @@ type Device struct {
 func NewDevice(name string, _options ...options.WithOption) *Device {
 	return &Device{
 		Name:  name,
-		State: make(map[simulatedTag]*values.PlcValue),
+		State: make(map[simulatedTag]*apiValues.PlcValue),
 		log:   options.ExtractCustomLogger(_options...),
 	}
 }
 
-func (d *Device) Get(tag simulatedTag) *values.PlcValue {
+func (d *Device) Get(tag simulatedTag) *apiValues.PlcValue {
 	switch tag.TagType {
 	case TagState:
 		return d.State[tag]
@@ -54,7 +54,7 @@ func (d *Device) Get(tag simulatedTag) *values.PlcValue {
 	return nil
 }
 
-func (d *Device) Set(tag simulatedTag, value *values.PlcValue) {
+func (d *Device) Set(tag simulatedTag, value *apiValues.PlcValue) {
 	switch tag.TagType {
 	case TagState:
 		d.State[tag] = value
@@ -68,13 +68,14 @@ func (d *Device) Set(tag simulatedTag, value *values.PlcValue) {
 	}
 }
 
-func (d *Device) getRandomValue(tag simulatedTag) *values.PlcValue {
+func (d *Device) getRandomValue(tag simulatedTag) *apiValues.PlcValue {
 	size := tag.GetDataTypeSize().DataTypeSize()
 	data := make([]byte, uint16(size)*tag.Quantity)
 	rand.Read(data)
-	plcValue, err := model.DataItemParse(context.Background(), data, tag.DataTypeSize.String(), tag.Quantity)
+	plcValue, err := readWriteModel.DataItemParse(context.Background(), data, tag.DataTypeSize.String(), tag.Quantity)
 	if err != nil {
-		panic("Unable to parse random bytes")
+		d.log.Err(err).Msg("Unable to parse random bytes")
+		return nil
 	}
 	return &plcValue
 }
diff --git a/plc4go/internal/simulated/Device_test.go b/plc4go/internal/simulated/Device_test.go
index 729a694185..04eb113340 100644
--- a/plc4go/internal/simulated/Device_test.go
+++ b/plc4go/internal/simulated/Device_test.go
@@ -20,6 +20,7 @@
 package simulated
 
 import (
+	"github.com/apache/plc4x/plc4go/spi/options"
 	"github.com/stretchr/testify/assert"
 	"testing"
 
@@ -48,11 +49,11 @@ func TestDevice_Get(t1 *testing.T) {
 			fields: fields{
 				Name: "hurz",
 				State: map[simulatedTag]*apiValues.PlcValue{
-					NewSimulatedTag(TagState, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(true)),
+					NewSimulatedTag(TagState, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(true)),
 				},
 			},
 			args: args{
-				field:        NewSimulatedTag(TagState, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1),
+				field:        NewSimulatedTag(TagState, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag),
 				verifyOutput: true,
 			},
 			want: ToReference(spiValues.NewPlcBOOL(true)),
@@ -64,7 +65,7 @@ func TestDevice_Get(t1 *testing.T) {
 				State: map[simulatedTag]*apiValues.PlcValue{},
 			},
 			args: args{
-				field:        NewSimulatedTag(TagRandom, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1),
+				field:        NewSimulatedTag(TagRandom, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag),
 				verifyOutput: false,
 			},
 			want: ToReference(spiValues.NewPlcBOOL(true)),
@@ -76,7 +77,7 @@ func TestDevice_Get(t1 *testing.T) {
 				State: map[simulatedTag]*apiValues.PlcValue{},
 			},
 			args: args{
-				field:        NewSimulatedTag(TagStdOut, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1),
+				field:        NewSimulatedTag(TagStdOut, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag),
 				verifyOutput: false,
 			},
 			want: nil,
@@ -127,7 +128,7 @@ func TestDevice_Random(t *testing.T) {
 				State: map[simulatedTag]*apiValues.PlcValue{},
 			},
 			args: args{
-				field:   NewSimulatedTag(TagRandom, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1),
+				field:   NewSimulatedTag(TagRandom, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag),
 				numRuns: 1000,
 			},
 			want: ToReference(spiValues.NewPlcBOOL(true)),
@@ -181,7 +182,7 @@ func TestDevice_Set(t1 *testing.T) {
 				State: map[simulatedTag]*apiValues.PlcValue{},
 			},
 			args: args{
-				field:         NewSimulatedTag(TagState, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1),
+				field:         NewSimulatedTag(TagState, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag),
 				value:         ToReference(spiValues.NewPlcBOOL(true)),
 				shouldBeSaved: true,
 			},
@@ -193,7 +194,7 @@ func TestDevice_Set(t1 *testing.T) {
 				State: map[simulatedTag]*apiValues.PlcValue{},
 			},
 			args: args{
-				field:         NewSimulatedTag(TagRandom, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1),
+				field:         NewSimulatedTag(TagRandom, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag),
 				value:         ToReference(spiValues.NewPlcBOOL(true)),
 				shouldBeSaved: false,
 			},
@@ -205,7 +206,7 @@ func TestDevice_Set(t1 *testing.T) {
 				State: map[simulatedTag]*apiValues.PlcValue{},
 			},
 			args: args{
-				field:         NewSimulatedTag(TagStdOut, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1),
+				field:         NewSimulatedTag(TagStdOut, "boolTag", readWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag),
 				value:         ToReference(spiValues.NewPlcBOOL(true)),
 				shouldBeSaved: false,
 			},
@@ -248,7 +249,9 @@ func TestDevice_getRandomValue(t1 *testing.T) {
 		args   args
 		want   *apiValues.PlcValue
 	}{
-		// TODO: Add test cases.
+		{
+			name: "get it",
+		},
 	}
 	for _, tt := range tests {
 		t1.Run(tt.name, func(t1 *testing.T) {
@@ -272,7 +275,14 @@ func TestNewDevice(t *testing.T) {
 		args args
 		want *Device
 	}{
-		// TODO: Add test cases.
+		{
+			name: "create it",
+			want: &Device{
+				Name:  "",
+				State: make(map[simulatedTag]*apiValues.PlcValue),
+				log:   options.ExtractCustomLogger(),
+			},
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
diff --git a/plc4go/internal/simulated/Reader_test.go b/plc4go/internal/simulated/Reader_test.go
index 8bf5b1b9b7..f34eac9696 100644
--- a/plc4go/internal/simulated/Reader_test.go
+++ b/plc4go/internal/simulated/Reader_test.go
@@ -59,7 +59,7 @@ func TestReader_Read(t *testing.T) {
 				device: &Device{
 					Name: "hurz",
 					State: map[simulatedTag]*apiValues.PlcValue{
-						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(true)),
+						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(true)),
 					},
 				},
 				options: map[string][]string{},
@@ -85,7 +85,7 @@ func TestReader_Read(t *testing.T) {
 				device: &Device{
 					Name: "hurz",
 					State: map[simulatedTag]*apiValues.PlcValue{
-						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(true)),
+						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(true)),
 					},
 				},
 				options: map[string][]string{
@@ -113,7 +113,7 @@ func TestReader_Read(t *testing.T) {
 				device: &Device{
 					Name: "hurz",
 					State: map[simulatedTag]*apiValues.PlcValue{
-						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(true)),
+						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(true)),
 					},
 				},
 				options: map[string][]string{},
@@ -140,7 +140,7 @@ func TestReader_Read(t *testing.T) {
 				device: &Device{
 					Name: "hurz",
 					State: map[simulatedTag]*apiValues.PlcValue{
-						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(true)),
+						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(true)),
 					},
 				},
 				options: map[string][]string{},
diff --git a/plc4go/internal/simulated/Tag.go b/plc4go/internal/simulated/Tag.go
index a9fca79db0..6c6d8e73b1 100644
--- a/plc4go/internal/simulated/Tag.go
+++ b/plc4go/internal/simulated/Tag.go
@@ -31,9 +31,9 @@ import (
 type Tag interface {
 	apiModel.PlcTag
 
-	GetTagType() *TagType
+	GetTagType() TagType
 	GetName() string
-	GetDataTypeSize() *model.SimulatedDataTypeSizes
+	GetDataTypeSize() model.SimulatedDataTypeSizes
 }
 
 type simulatedTag struct {
@@ -43,7 +43,7 @@ type simulatedTag struct {
 	Quantity     uint16
 }
 
-func NewSimulatedTag(tagType TagType, name string, dataTypeSize model.SimulatedDataTypeSizes, quantity uint16) simulatedTag {
+func NewSimulatedTag(tagType TagType, name string, dataTypeSize model.SimulatedDataTypeSizes, quantity uint16) Tag {
 	return simulatedTag{
 		TagType:      tagType,
 		Name:         name,
diff --git a/plc4go/internal/simulated/Tag_test.go b/plc4go/internal/simulated/Tag_test.go
index 04616ef6ed..f7a3770c68 100644
--- a/plc4go/internal/simulated/Tag_test.go
+++ b/plc4go/internal/simulated/Tag_test.go
@@ -36,7 +36,7 @@ func TestNewSimulatedField(t *testing.T) {
 	tests := []struct {
 		name string
 		args args
-		want simulatedTag
+		want Tag
 	}{
 		{
 			name: "simple",
diff --git a/plc4go/internal/simulated/Writer_test.go b/plc4go/internal/simulated/Writer_test.go
index 4f6adea84b..58eb9d9919 100644
--- a/plc4go/internal/simulated/Writer_test.go
+++ b/plc4go/internal/simulated/Writer_test.go
@@ -78,7 +78,7 @@ func TestWriter_Write(t *testing.T) {
 					"test": apiModel.PlcResponseCode_OK,
 				}),
 			newState: map[simulatedTag]*apiValues.PlcValue{
-				NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(true)),
+				NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(true)),
 			},
 			delayAtLeast: 0,
 		},
@@ -88,7 +88,7 @@ func TestWriter_Write(t *testing.T) {
 				device: &Device{
 					Name: "hurz",
 					State: map[simulatedTag]*apiValues.PlcValue{
-						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(true)),
+						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(true)),
 					},
 				},
 				options: map[string][]string{},
@@ -107,7 +107,7 @@ func TestWriter_Write(t *testing.T) {
 					"test": apiModel.PlcResponseCode_OK,
 				}),
 			newState: map[simulatedTag]*apiValues.PlcValue{
-				NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(false)),
+				NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(false)),
 			},
 			delayAtLeast: 0,
 		},
@@ -117,7 +117,7 @@ func TestWriter_Write(t *testing.T) {
 				device: &Device{
 					Name: "hurz",
 					State: map[simulatedTag]*apiValues.PlcValue{
-						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(true)),
+						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(true)),
 					},
 				},
 				options: map[string][]string{
@@ -138,7 +138,7 @@ func TestWriter_Write(t *testing.T) {
 					"test": apiModel.PlcResponseCode_OK,
 				}),
 			newState: map[simulatedTag]*apiValues.PlcValue{
-				NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(false)),
+				NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(false)),
 			},
 			delayAtLeast: 1000,
 		},
@@ -149,7 +149,7 @@ func TestWriter_Write(t *testing.T) {
 				device: &Device{
 					Name: "hurz",
 					State: map[simulatedTag]*apiValues.PlcValue{
-						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(true)),
+						NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(true)),
 					},
 				},
 				options: map[string][]string{},
@@ -168,7 +168,7 @@ func TestWriter_Write(t *testing.T) {
 					"test": apiModel.PlcResponseCode_INVALID_ADDRESS,
 				}),
 			newState: map[simulatedTag]*apiValues.PlcValue{
-				NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1): ToReference(spiValues.NewPlcBOOL(true)),
+				NewSimulatedTag(TagState, "test", simulatedReadWriteModel.SimulatedDataTypeSizes_BOOL, 1).(simulatedTag): ToReference(spiValues.NewPlcBOOL(true)),
 			},
 			delayAtLeast: 0,
 		},
diff --git a/plc4go/pkg/api/cache/connectionContainer_test.go b/plc4go/pkg/api/cache/connectionContainer_test.go
index 44bb7f2295..863454eeae 100644
--- a/plc4go/pkg/api/cache/connectionContainer_test.go
+++ b/plc4go/pkg/api/cache/connectionContainer_test.go
@@ -105,7 +105,12 @@ func Test_connectionContainer_addListener(t1 *testing.T) {
 		fields fields
 		args   args
 	}{
-		// TODO: Add test cases.
+		{
+			name: "add it",
+			fields: fields{
+				lock: lock.NewCASMutex(),
+			},
+		},
 	}
 	for _, tt := range tests {
 		t1.Run(tt.name, func(t1 *testing.T) {
diff --git a/plc4go/pkg/api/model/plc_response_code.go b/plc4go/pkg/api/model/plc_response_code.go
index 989a0355ff..ee0fb53cb0 100644
--- a/plc4go/pkg/api/model/plc_response_code.go
+++ b/plc4go/pkg/api/model/plc_response_code.go
@@ -85,6 +85,6 @@ func (m PlcResponseCode) Serialize() ([]byte, error) {
 	return wb.GetBytes(), nil
 }
 
-func (m PlcResponseCode) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+func (m PlcResponseCode) SerializeWithWriteBuffer(_ context.Context, writeBuffer utils.WriteBuffer) error {
 	return writeBuffer.WriteUint8("ResponseCode", 8, uint8(m), utils.WithAdditionalStringRepresentation(m.GetName()))
 }
diff --git a/plc4go/pkg/api/model/plc_response_code_test.go b/plc4go/pkg/api/model/plc_response_code_test.go
index 554d178bdc..927cc14c0a 100644
--- a/plc4go/pkg/api/model/plc_response_code_test.go
+++ b/plc4go/pkg/api/model/plc_response_code_test.go
@@ -92,7 +92,12 @@ func TestPlcResponseCode_SerializeWithWriteBuffer(t *testing.T) {
 		args    args
 		wantErr bool
 	}{
-		// TODO: Add test cases.
+		{
+			name: "serialize it",
+			args: args{
+				writeBuffer: utils.NewWriteBufferByteBased(),
+			},
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
diff --git a/plc4go/spi/default/testTransportInstance_test.go b/plc4go/spi/default/testTransportInstance_test.go
deleted file mode 100644
index 5b1c7e107b..0000000000
--- a/plc4go/spi/default/testTransportInstance_test.go
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package _default
-
-import (
-	"bufio"
-	"context"
-)
-
-// TODO: replace with proper mock
-type testTransportInstance struct {
-	connected          bool
-	connectWithContext func(ctx context.Context) error
-}
-
-func (t testTransportInstance) String() string {
-	// NO-OP
-	return ""
-}
-
-func (t testTransportInstance) Connect() error {
-	// NO-OP
-	return nil
-}
-
-func (t testTransportInstance) ConnectWithContext(ctx context.Context) error {
-	if t.connectWithContext != nil {
-		return t.connectWithContext(ctx)
-	}
-	// NO-OP
-	return nil
-}
-
-func (t testTransportInstance) Close() error {
-	// NO-OP
-	return nil
-}
-
-func (t testTransportInstance) IsConnected() bool {
-	return t.connected
-}
-
-func (t testTransportInstance) FillBuffer(until func(pos uint, currentByte byte, reader *bufio.Reader) bool) error {
-	// NO-OP
-	return nil
-}
-
-func (t testTransportInstance) GetNumBytesAvailableInBuffer() (uint32, error) {
-	// NO-OP
-	return 0, nil
-}
-
-func (t testTransportInstance) PeekReadableBytes(numBytes uint32) ([]byte, error) {
-	// NO-OP
-	return nil, nil
-}
-
-func (t testTransportInstance) Read(numBytes uint32) ([]byte, error) {
-	// NO-OP
-	return nil, nil
-}
-
-func (t testTransportInstance) Write(data []byte) error {
-	// NO-OP
-	return nil
-}
diff --git a/plc4go/spi/model/DefaultPlcTagRequest_test.go b/plc4go/spi/model/DefaultPlcTagRequest_test.go
index 6ac7c6daaf..2be7b86372 100644
--- a/plc4go/spi/model/DefaultPlcTagRequest_test.go
+++ b/plc4go/spi/model/DefaultPlcTagRequest_test.go
@@ -77,7 +77,9 @@ func TestDefaultPlcTagRequest_GetTagNames(t *testing.T) {
 		fields fields
 		want   []string
 	}{
-		// TODO: Add test cases.
+		{
+			name: "get em",
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -100,7 +102,10 @@ func TestDefaultPlcTagRequest_IsAPlcMessage(t *testing.T) {
 		fields fields
 		want   bool
 	}{
-		// TODO: Add test cases.
+		{
+			name: "it is",
+			want: true,
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -123,7 +128,13 @@ func TestNewDefaultPlcTagRequest(t *testing.T) {
 		args args
 		want *DefaultPlcTagRequest
 	}{
-		// TODO: Add test cases.
+		{
+			name: "create it",
+			want: &DefaultPlcTagRequest{
+				tags:     func() map[string]apiModel.PlcTag { return nil }(),
+				tagNames: func() []string { return nil }(),
+			},
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
diff --git a/plc4go/spi/tracer/Tracer.go b/plc4go/spi/tracer/Tracer.go
index 9a78bc7360..9d09de03cf 100644
--- a/plc4go/spi/tracer/Tracer.go
+++ b/plc4go/spi/tracer/Tracer.go
@@ -37,7 +37,7 @@ type TraceEntry struct {
 	Message       string
 }
 
-type TracerProvider interface {
+type Provider interface {
 	EnableTracer()
 	GetTracer() *Tracer
 }
diff --git a/plc4go/spi/tracer/mock_Provider_test.go b/plc4go/spi/tracer/mock_Provider_test.go
new file mode 100644
index 0000000000..fb1127f7e0
--- /dev/null
+++ b/plc4go/spi/tracer/mock_Provider_test.go
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// Code generated by mockery v2.28.2. DO NOT EDIT.
+
+package tracer
+
+import mock "github.com/stretchr/testify/mock"
+
+// MockProvider is an autogenerated mock type for the Provider type
+type MockProvider struct {
+	mock.Mock
+}
+
+type MockProvider_Expecter struct {
+	mock *mock.Mock
+}
+
+func (_m *MockProvider) EXPECT() *MockProvider_Expecter {
+	return &MockProvider_Expecter{mock: &_m.Mock}
+}
+
+// EnableTracer provides a mock function with given fields:
+func (_m *MockProvider) EnableTracer() {
+	_m.Called()
+}
+
+// MockProvider_EnableTracer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EnableTracer'
+type MockProvider_EnableTracer_Call struct {
+	*mock.Call
+}
+
+// EnableTracer is a helper method to define mock.On call
+func (_e *MockProvider_Expecter) EnableTracer() *MockProvider_EnableTracer_Call {
+	return &MockProvider_EnableTracer_Call{Call: _e.mock.On("EnableTracer")}
+}
+
+func (_c *MockProvider_EnableTracer_Call) Run(run func()) *MockProvider_EnableTracer_Call {
+	_c.Call.Run(func(args mock.Arguments) {
+		run()
+	})
+	return _c
+}
+
+func (_c *MockProvider_EnableTracer_Call) Return() *MockProvider_EnableTracer_Call {
+	_c.Call.Return()
+	return _c
+}
+
+func (_c *MockProvider_EnableTracer_Call) RunAndReturn(run func()) *MockProvider_EnableTracer_Call {
+	_c.Call.Return(run)
+	return _c
+}
+
+// GetTracer provides a mock function with given fields:
+func (_m *MockProvider) GetTracer() *Tracer {
+	ret := _m.Called()
+
+	var r0 *Tracer
+	if rf, ok := ret.Get(0).(func() *Tracer); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*Tracer)
+		}
+	}
+
+	return r0
+}
+
+// MockProvider_GetTracer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTracer'
+type MockProvider_GetTracer_Call struct {
+	*mock.Call
+}
+
+// GetTracer is a helper method to define mock.On call
+func (_e *MockProvider_Expecter) GetTracer() *MockProvider_GetTracer_Call {
+	return &MockProvider_GetTracer_Call{Call: _e.mock.On("GetTracer")}
+}
+
+func (_c *MockProvider_GetTracer_Call) Run(run func()) *MockProvider_GetTracer_Call {
+	_c.Call.Run(func(args mock.Arguments) {
+		run()
+	})
+	return _c
+}
+
+func (_c *MockProvider_GetTracer_Call) Return(_a0 *Tracer) *MockProvider_GetTracer_Call {
+	_c.Call.Return(_a0)
+	return _c
+}
+
+func (_c *MockProvider_GetTracer_Call) RunAndReturn(run func() *Tracer) *MockProvider_GetTracer_Call {
+	_c.Call.Return(run)
+	return _c
+}
+
+type mockConstructorTestingTNewMockProvider interface {
+	mock.TestingT
+	Cleanup(func())
+}
+
+// NewMockProvider creates a new instance of MockProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+func NewMockProvider(t mockConstructorTestingTNewMockProvider) *MockProvider {
+	mock := &MockProvider{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/plc4go/spi/tracer/mock_TracerProvider_test.go b/plc4go/spi/tracer/mock_TracerProvider_test.go
deleted file mode 100644
index d93aff0bde..0000000000
--- a/plc4go/spi/tracer/mock_TracerProvider_test.go
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by mockery v2.28.2. DO NOT EDIT.
-
-package tracer
-
-import mock "github.com/stretchr/testify/mock"
-
-// MockTracerProvider is an autogenerated mock type for the TracerProvider type
-type MockTracerProvider struct {
-	mock.Mock
-}
-
-type MockTracerProvider_Expecter struct {
-	mock *mock.Mock
-}
-
-func (_m *MockTracerProvider) EXPECT() *MockTracerProvider_Expecter {
-	return &MockTracerProvider_Expecter{mock: &_m.Mock}
-}
-
-// EnableTracer provides a mock function with given fields:
-func (_m *MockTracerProvider) EnableTracer() {
-	_m.Called()
-}
-
-// MockTracerProvider_EnableTracer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EnableTracer'
-type MockTracerProvider_EnableTracer_Call struct {
-	*mock.Call
-}
-
-// EnableTracer is a helper method to define mock.On call
-func (_e *MockTracerProvider_Expecter) EnableTracer() *MockTracerProvider_EnableTracer_Call {
-	return &MockTracerProvider_EnableTracer_Call{Call: _e.mock.On("EnableTracer")}
-}
-
-func (_c *MockTracerProvider_EnableTracer_Call) Run(run func()) *MockTracerProvider_EnableTracer_Call {
-	_c.Call.Run(func(args mock.Arguments) {
-		run()
-	})
-	return _c
-}
-
-func (_c *MockTracerProvider_EnableTracer_Call) Return() *MockTracerProvider_EnableTracer_Call {
-	_c.Call.Return()
-	return _c
-}
-
-func (_c *MockTracerProvider_EnableTracer_Call) RunAndReturn(run func()) *MockTracerProvider_EnableTracer_Call {
-	_c.Call.Return(run)
-	return _c
-}
-
-// GetTracer provides a mock function with given fields:
-func (_m *MockTracerProvider) GetTracer() *Tracer {
-	ret := _m.Called()
-
-	var r0 *Tracer
-	if rf, ok := ret.Get(0).(func() *Tracer); ok {
-		r0 = rf()
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*Tracer)
-		}
-	}
-
-	return r0
-}
-
-// MockTracerProvider_GetTracer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTracer'
-type MockTracerProvider_GetTracer_Call struct {
-	*mock.Call
-}
-
-// GetTracer is a helper method to define mock.On call
-func (_e *MockTracerProvider_Expecter) GetTracer() *MockTracerProvider_GetTracer_Call {
-	return &MockTracerProvider_GetTracer_Call{Call: _e.mock.On("GetTracer")}
-}
-
-func (_c *MockTracerProvider_GetTracer_Call) Run(run func()) *MockTracerProvider_GetTracer_Call {
-	_c.Call.Run(func(args mock.Arguments) {
-		run()
-	})
-	return _c
-}
-
-func (_c *MockTracerProvider_GetTracer_Call) Return(_a0 *Tracer) *MockTracerProvider_GetTracer_Call {
-	_c.Call.Return(_a0)
-	return _c
-}
-
-func (_c *MockTracerProvider_GetTracer_Call) RunAndReturn(run func() *Tracer) *MockTracerProvider_GetTracer_Call {
-	_c.Call.Return(run)
-	return _c
-}
-
-type mockConstructorTestingTNewMockTracerProvider interface {
-	mock.TestingT
-	Cleanup(func())
-}
-
-// NewMockTracerProvider creates a new instance of MockTracerProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
-func NewMockTracerProvider(t mockConstructorTestingTNewMockTracerProvider) *MockTracerProvider {
-	mock := &MockTracerProvider{}
-	mock.Mock.Test(t)
-
-	t.Cleanup(func() { mock.AssertExpectations(t) })
-
-	return mock
-}
diff --git a/plc4go/spi/utils/ReadBufferJsonBased_test.go b/plc4go/spi/utils/ReadBufferJsonBased_test.go
index ce06d02a54..9f7aa825c3 100644
--- a/plc4go/spi/utils/ReadBufferJsonBased_test.go
+++ b/plc4go/spi/utils/ReadBufferJsonBased_test.go
@@ -189,7 +189,10 @@ func Test_jsonReadBuffer_HasMore(t *testing.T) {
 		args   args
 		want   bool
 	}{
-		// TODO: Add test cases.
+		{
+			name: "has it",
+			want: true,
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
diff --git a/plc4go/tools/plc4xgenerator/gen.go b/plc4go/tools/plc4xgenerator/gen.go
index 0591b0d2b9..cd2dbfc2d5 100644
--- a/plc4go/tools/plc4xgenerator/gen.go
+++ b/plc4go/tools/plc4xgenerator/gen.go
@@ -27,7 +27,6 @@ import (
 	"go/format"
 	"go/token"
 	"go/types"
-	"io/ioutil"
 	"log"
 	"os"
 	"path/filepath"
@@ -115,7 +114,7 @@ func main() {
 		baseName := fmt.Sprintf("%s_plc4xgen.go", typeList[0])
 		outputName = filepath.Join(dir, baseName)
 	}
-	err := ioutil.WriteFile(outputName, src, 0644)
+	err := os.WriteFile(outputName, src, 0644)
 	if err != nil {
 		log.Fatalf("writing output: %s", err)
 	}