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 009fbdd0aa6c5e30091c26729bb25fcefa6da640 Author: Sebastian Rühl <[email protected]> AuthorDate: Thu Nov 20 12:00:49 2025 +0100 test(plc4go): use sync test --- .../bacgopes/tests/test_bvll/test_foreign_test.go | 373 +++++++++++---------- .../bacgopes/tests/test_network/test_net_2_test.go | 263 ++++++++------- plc4go/internal/cbus/Browser_test.go | 33 +- plc4go/internal/cbus/Connection_test.go | 35 +- plc4go/internal/cbus/MessageCodec_test.go | 251 +++++++------- plc4go/spi/testutils/ParserSerializerTestRunner.go | 9 +- 6 files changed, 500 insertions(+), 464 deletions(-) diff --git a/plc4go/internal/bacnetip/bacgopes/tests/test_bvll/test_foreign_test.go b/plc4go/internal/bacnetip/bacgopes/tests/test_bvll/test_foreign_test.go index 2514426265..e620cf0f09 100644 --- a/plc4go/internal/bacnetip/bacgopes/tests/test_bvll/test_foreign_test.go +++ b/plc4go/internal/bacnetip/bacgopes/tests/test_bvll/test_foreign_test.go @@ -21,6 +21,7 @@ package test_bvll import ( "testing" + "testing/synctest" "time" "github.com/rs/zerolog" @@ -121,197 +122,207 @@ func (t *TFNetwork) Run(timeLimit time.Duration) { func TestForeign(t *testing.T) { t.Run("test_idle", func(t *testing.T) { //Test an idle network, nothing happens is success. - ExclusiveGlobalTimeMachine(t) + synctest.Test(t, func(t *testing.T) { + ExclusiveGlobalTimeMachine(t) - tnet := NewTFNetwork(t) + tnet := NewTFNetwork(t) - // all start state are successful - tnet.fd.GetStartState().Success("") - tnet.bbmd.GetStartState().Success("") + // all start state are successful + tnet.fd.GetStartState().Success("") + tnet.bbmd.GetStartState().Success("") - // run the group - tnet.Run(0) + // run the group + tnet.Run(0) + }) }) t.Run("test_registration", func(t *testing.T) { - ExclusiveGlobalTimeMachine(t) - testingLogger := testutils.ProduceTestingLogger(t) - - // create a network - tnet := NewTFNetwork(t) - - // tell the B/IP layer of the foreign device to register - tnet.fd.GetStartState(). - Call(func(args Args, _ KWArgs) error { - return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16)) - }, NA(tnet.bbmd.address, uint16(30)), NoKWArgs()). - Success("") - - // remote sniffer node - remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6) - require.NoError(t, err) - tnet.Append(remoteSniffer) - - // sniffer traffic - remoteSniffer.GetStartState().Doc("1-1-0"). - Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("1-1-1"). - Receive(NA((*Result)(nil)), NoKWArgs()).Doc("1-1-2"). - SetEvent("fd-registered").Doc("1-1-3"). - Success("") - - // the bbmd is idle - tnet.bbmd.GetStartState().Success("") - - // home snooper node - homeSnooper, err := NewBIPStateMachine(testingLogger, "192.168.5.2/24", tnet.vlan5) - tnet.Append(homeSnooper) - - // snooper will read foreign device table - homeSnooper.GetStartState().Doc("1-2-0"). - WaitEvent("fd-registered", nil).Doc("1-2-1"). - Send(quick.ReadForeignDeviceTable(tnet.bbmd.address), nil).Doc("1-2-2"). - Receive(NA((*ReadForeignDeviceTableAck)(nil)), NoKWArgs()).Doc("1-2-3"). - Success("") - - // home sniffer node - homeSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.5.254/24", tnet.vlan5) - require.NoError(t, err) - tnet.Append(homeSniffer) - - // sniffer traffic - homeSniffer.GetStartState().Doc("1-3-0"). - Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("1-3-1"). - Receive(NA((*Result)(nil)), NoKWArgs()).Doc("1-3-2"). - Receive(NA((*ReadForeignDeviceTable)(nil)), NoKWArgs()).Doc("1-3-3"). - Receive(NA((*ReadForeignDeviceTableAck)(nil)), NoKWArgs()).Doc("1-3-4"). - Success("") - - // run the group - tnet.Run(0) + synctest.Test(t, func(t *testing.T) { + ExclusiveGlobalTimeMachine(t) + testingLogger := testutils.ProduceTestingLogger(t) + + // create a network + tnet := NewTFNetwork(t) + + // tell the B/IP layer of the foreign device to register + tnet.fd.GetStartState(). + Call(func(args Args, _ KWArgs) error { + return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16)) + }, NA(tnet.bbmd.address, uint16(30)), NoKWArgs()). + Success("") + + // remote sniffer node + remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6) + require.NoError(t, err) + tnet.Append(remoteSniffer) + + // sniffer traffic + remoteSniffer.GetStartState().Doc("1-1-0"). + Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("1-1-1"). + Receive(NA((*Result)(nil)), NoKWArgs()).Doc("1-1-2"). + SetEvent("fd-registered").Doc("1-1-3"). + Success("") + + // the bbmd is idle + tnet.bbmd.GetStartState().Success("") + + // home snooper node + homeSnooper, err := NewBIPStateMachine(testingLogger, "192.168.5.2/24", tnet.vlan5) + tnet.Append(homeSnooper) + + // snooper will read foreign device table + homeSnooper.GetStartState().Doc("1-2-0"). + WaitEvent("fd-registered", nil).Doc("1-2-1"). + Send(quick.ReadForeignDeviceTable(tnet.bbmd.address), nil).Doc("1-2-2"). + Receive(NA((*ReadForeignDeviceTableAck)(nil)), NoKWArgs()).Doc("1-2-3"). + Success("") + + // home sniffer node + homeSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.5.254/24", tnet.vlan5) + require.NoError(t, err) + tnet.Append(homeSniffer) + + // sniffer traffic + homeSniffer.GetStartState().Doc("1-3-0"). + Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("1-3-1"). + Receive(NA((*Result)(nil)), NoKWArgs()).Doc("1-3-2"). + Receive(NA((*ReadForeignDeviceTable)(nil)), NoKWArgs()).Doc("1-3-3"). + Receive(NA((*ReadForeignDeviceTableAck)(nil)), NoKWArgs()).Doc("1-3-4"). + Success("") + + // run the group + tnet.Run(0) + }) }) t.Run("test_refresh_registration", func(t *testing.T) { - ExclusiveGlobalTimeMachine(t) - testingLogger := testutils.ProduceTestingLogger(t) - - // create a network - tnet := NewTFNetwork(t) - - // tell the B/IP layer of the foreign device to register - tnet.fd.GetStartState(). - Call(func(args Args, _ KWArgs) error { - return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16)) - }, NA(tnet.bbmd.address, uint16(10)), NoKWArgs()). - Success("") - - // the bbmd is idle - tnet.bbmd.GetStartState().Success("") - - // remote sniffer node - remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6) - require.NoError(t, err) - tnet.Append(remoteSniffer) - - // sniffer traffic - remoteSniffer.GetStartState().Doc("2-1-0"). - Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("2-1-1"). - Receive(NA((*Result)(nil)), NoKWArgs()).Doc("2-1-1"). - Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("2-1-3"). - Receive(NA((*Result)(nil)), NoKWArgs()).Doc("2-1-4"). - Success("") - - // run the group - tnet.Run(0) + synctest.Test(t, func(t *testing.T) { + ExclusiveGlobalTimeMachine(t) + testingLogger := testutils.ProduceTestingLogger(t) + + // create a network + tnet := NewTFNetwork(t) + + // tell the B/IP layer of the foreign device to register + tnet.fd.GetStartState(). + Call(func(args Args, _ KWArgs) error { + return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16)) + }, NA(tnet.bbmd.address, uint16(10)), NoKWArgs()). + Success("") + + // the bbmd is idle + tnet.bbmd.GetStartState().Success("") + + // remote sniffer node + remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6) + require.NoError(t, err) + tnet.Append(remoteSniffer) + + // sniffer traffic + remoteSniffer.GetStartState().Doc("2-1-0"). + Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("2-1-1"). + Receive(NA((*Result)(nil)), NoKWArgs()).Doc("2-1-1"). + Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("2-1-3"). + Receive(NA((*Result)(nil)), NoKWArgs()).Doc("2-1-4"). + Success("") + + // run the group + tnet.Run(0) + }) }) t.Run("test_unicast", func(t *testing.T) { //Test a unicast message from TD to IUT. - ExclusiveGlobalTimeMachine(t) - testingLogger := testutils.ProduceTestingLogger(t) - - tnet := NewTFNetwork(t) - - //make a PDU from node 1 to node 2 - pduData, err := Xtob("dead.beef") - require.NoError(t, err) - pdu := NewPDU(NA(pduData), NKW(KWCPCISource, tnet.fd.address, KWCPCIDestination, tnet.bbmd.address)) - t.Logf(" - pdu: %s", pdu) - - // register, wait for ack, send some beef - tnet.fd.GetStartState().Doc("3-1-0"). - Call(func(args Args, _ KWArgs) error { - return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16)) - }, NA(tnet.bbmd.address, uint16(60)), NoKWArgs()).Doc("3-1-1"). - WaitEvent("3-registered", nil).Doc("3-1-2"). - Send(pdu, nil).Doc("3-1-3"). - Success("") - - // the bbmd is happy when it gets the pdu - tnet.bbmd.GetStartState(). - Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)). - Success("") - - // remote sniffer node - remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6) - require.NoError(t, err) - tnet.Append(remoteSniffer) - - // sniffer traffic - remoteSniffer.GetStartState().Doc("3-2-0"). - Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("3-2-1"). - Receive(NA((*Result)(nil)), NoKWArgs()).Doc("3-2-2"). - SetEvent("3-registered").Doc("3-2-3"). - Receive(NA((*OriginalUnicastNPDU)(nil)), NoKWArgs()).Doc("3-2-4"). - Success("") - - // run the group - tnet.Run(0) + synctest.Test(t, func(t *testing.T) { + ExclusiveGlobalTimeMachine(t) + testingLogger := testutils.ProduceTestingLogger(t) + + tnet := NewTFNetwork(t) + + //make a PDU from node 1 to node 2 + pduData, err := Xtob("dead.beef") + require.NoError(t, err) + pdu := NewPDU(NA(pduData), NKW(KWCPCISource, tnet.fd.address, KWCPCIDestination, tnet.bbmd.address)) + t.Logf(" - pdu: %s", pdu) + + // register, wait for ack, send some beef + tnet.fd.GetStartState().Doc("3-1-0"). + Call(func(args Args, _ KWArgs) error { + return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16)) + }, NA(tnet.bbmd.address, uint16(60)), NoKWArgs()).Doc("3-1-1"). + WaitEvent("3-registered", nil).Doc("3-1-2"). + Send(pdu, nil).Doc("3-1-3"). + Success("") + + // the bbmd is happy when it gets the pdu + tnet.bbmd.GetStartState(). + Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)). + Success("") + + // remote sniffer node + remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6) + require.NoError(t, err) + tnet.Append(remoteSniffer) + + // sniffer traffic + remoteSniffer.GetStartState().Doc("3-2-0"). + Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("3-2-1"). + Receive(NA((*Result)(nil)), NoKWArgs()).Doc("3-2-2"). + SetEvent("3-registered").Doc("3-2-3"). + Receive(NA((*OriginalUnicastNPDU)(nil)), NoKWArgs()).Doc("3-2-4"). + Success("") + + // run the group + tnet.Run(0) + }) }) t.Run("test_broadcast", func(t *testing.T) { //Test a broadcast message from TD to IUT. - ExclusiveGlobalTimeMachine(t) - testingLogger := testutils.ProduceTestingLogger(t) - - tnet := NewTFNetwork(t) - - //make a PDU from node 1 to node 2 - pduData, err := Xtob("dead.beef") - require.NoError(t, err) - pdu := NewPDU(NA(pduData), NKW(KWCPCISource, tnet.fd.address, KWCPCIDestination, NewLocalBroadcast(nil))) - t.Logf("pdu: %v", pdu) - - // register, wait for ack, send some beef - tnet.fd.GetStartState().Doc("4-1-0"). - Call(func(args Args, _ KWArgs) error { - return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16)) - }, NA(tnet.bbmd.address, uint16(60)), NoKWArgs()).Doc("4-1-1"). - WaitEvent("4-registered", nil).Doc("4-1-2"). - Send(pdu, nil).Doc("4-1-3"). - Success("") - - // the bbmd is happy when it gets the pdu - tnet.bbmd.GetStartState(). - Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)).Doc("4-2-1"). - Success("") - - // home simple node - homeNode, err := NewBIPSimpleStateMachine(testingLogger, "192.168.5.254/24", tnet.vlan5) - require.NoError(t, err) - - // home node happy when getting the pdu, broadcast by the bbmd - homeNode.GetStartState().Doc("4-3-0"). - Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)).Doc("4-3-1"). - Success("") - - // remote sniffer node - remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6) - require.NoError(t, err) - tnet.Append(remoteSniffer) - - // sniffer traffic - remoteSniffer.GetStartState().Doc("4-4-0"). - Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("4-4-1"). - Receive(NA((*Result)(nil)), NoKWArgs()).Doc("4-4-2"). - SetEvent("4-registered"). - Receive(NA((*DistributeBroadcastToNetwork)(nil)), NoKWArgs()).Doc("4-4-3"). - Success("") - - // run the group - tnet.Run(0) + synctest.Test(t, func(t *testing.T) { + ExclusiveGlobalTimeMachine(t) + testingLogger := testutils.ProduceTestingLogger(t) + + tnet := NewTFNetwork(t) + + //make a PDU from node 1 to node 2 + pduData, err := Xtob("dead.beef") + require.NoError(t, err) + pdu := NewPDU(NA(pduData), NKW(KWCPCISource, tnet.fd.address, KWCPCIDestination, NewLocalBroadcast(nil))) + t.Logf("pdu: %v", pdu) + + // register, wait for ack, send some beef + tnet.fd.GetStartState().Doc("4-1-0"). + Call(func(args Args, _ KWArgs) error { + return tnet.fd.bip.Register(args[0].(*Address), args[1].(uint16)) + }, NA(tnet.bbmd.address, uint16(60)), NoKWArgs()).Doc("4-1-1"). + WaitEvent("4-registered", nil).Doc("4-1-2"). + Send(pdu, nil).Doc("4-1-3"). + Success("") + + // the bbmd is happy when it gets the pdu + tnet.bbmd.GetStartState(). + Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)).Doc("4-2-1"). + Success("") + + // home simple node + homeNode, err := NewBIPSimpleStateMachine(testingLogger, "192.168.5.254/24", tnet.vlan5) + require.NoError(t, err) + + // home node happy when getting the pdu, broadcast by the bbmd + homeNode.GetStartState().Doc("4-3-0"). + Receive(NA((PDU)(nil)), NKW(KWCPCISource, tnet.fd.address, KWTestPDUData, pduData)).Doc("4-3-1"). + Success("") + + // remote sniffer node + remoteSniffer, err := NewSnifferStateMachine(testingLogger, "192.168.6.254/24", tnet.vlan6) + require.NoError(t, err) + tnet.Append(remoteSniffer) + + // sniffer traffic + remoteSniffer.GetStartState().Doc("4-4-0"). + Receive(NA((*RegisterForeignDevice)(nil)), NoKWArgs()).Doc("4-4-1"). + Receive(NA((*Result)(nil)), NoKWArgs()).Doc("4-4-2"). + SetEvent("4-registered"). + Receive(NA((*DistributeBroadcastToNetwork)(nil)), NoKWArgs()).Doc("4-4-3"). + Success("") + + // run the group + tnet.Run(0) + }) }) } diff --git a/plc4go/internal/bacnetip/bacgopes/tests/test_network/test_net_2_test.go b/plc4go/internal/bacnetip/bacgopes/tests/test_network/test_net_2_test.go index b431add72a..80c693c212 100644 --- a/plc4go/internal/bacnetip/bacgopes/tests/test_network/test_net_2_test.go +++ b/plc4go/internal/bacnetip/bacgopes/tests/test_network/test_net_2_test.go @@ -21,6 +21,7 @@ package test_network import ( "testing" + "testing/synctest" "time" "github.com/rs/zerolog" @@ -150,141 +151,149 @@ func (t *TNetwork2) Run(timeLimit time.Duration) { func TestNet2(t *testing.T) { t.Run("TestSimple", func(t *testing.T) { t.Run("testIdle", func(t *testing.T) { - // create a network - ExclusiveGlobalTimeMachine(t) - tnet := NewTNetwork2(t) - - // all start states are successful - tnet.td.GetStartState().Success("") - tnet.sniffer1.GetStartState().Success("") - tnet.sniffer2.GetStartState().Success("") - tnet.sniffer3.GetStartState().Success("") - - // run the group - tnet.Run(0) + synctest.Test(t, func(t *testing.T) { + // create a network + ExclusiveGlobalTimeMachine(t) + tnet := NewTNetwork2(t) + + // all start states are successful + tnet.td.GetStartState().Success("") + tnet.sniffer1.GetStartState().Success("") + tnet.sniffer2.GetStartState().Success("") + tnet.sniffer3.GetStartState().Success("") + + // run the group + tnet.Run(0) + }) }) }) t.Run("TestWhoIsRouterToNetwork", func(t *testing.T) { t.Run("test_01", func(t *testing.T) { - //Test broadcast for any router. - ExclusiveGlobalTimeMachine(t) - - // create a network - tnet := NewTNetwork2(t) - - // test device sends request, sees response - whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil))) - require.NoError(t, err) - tnet.td.GetStartState().Doc("1-1-0"). - Send(whois, nil).Doc("1-1-1"). - Receive(NA((*IAmRouterToNetwork)(nil)), NKW(KWIartnNetworkList, []uint16{2})).Doc("1-1-2"). - Success("") - - // sniffer on network 1 sees the request and the response - tnet.sniffer1.GetStartState().Doc("1-2-0"). - Receive(NA(PDUMatcher), - NKW(KWTestPDUData, xtob( - "01.80"+ //version, network layer - "00", //message type, no network - )), - ).Doc("1-2-1"). - Receive(NA(PDUMatcher), - NKW(KWTestPDUData, xtob( - "01.80"+ //version, network layer - "01 0002", //message type and network list - )), - ).Doc("1-2-2"). - Success("") - - // nothing received on network 2 - tnet.sniffer2.GetStartState().Doc("1-3-0"). - Timeout(3*time.Second, nil).Doc("1-3-1"). - Success("") - - // nothing received on network 3 - tnet.sniffer3.GetStartState().Doc("1-4-0"). - Timeout(3*time.Second, nil).Doc("1-4-1"). - Success("") - - // run the group - tnet.Run(0) + synctest.Test(t, func(t *testing.T) { + //Test broadcast for any router. + ExclusiveGlobalTimeMachine(t) + + // create a network + tnet := NewTNetwork2(t) + + // test device sends request, sees response + whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil))) + require.NoError(t, err) + tnet.td.GetStartState().Doc("1-1-0"). + Send(whois, nil).Doc("1-1-1"). + Receive(NA((*IAmRouterToNetwork)(nil)), NKW(KWIartnNetworkList, []uint16{2})).Doc("1-1-2"). + Success("") + + // sniffer on network 1 sees the request and the response + tnet.sniffer1.GetStartState().Doc("1-2-0"). + Receive(NA(PDUMatcher), + NKW(KWTestPDUData, xtob( + "01.80"+ //version, network layer + "00", //message type, no network + )), + ).Doc("1-2-1"). + Receive(NA(PDUMatcher), + NKW(KWTestPDUData, xtob( + "01.80"+ //version, network layer + "01 0002", //message type and network list + )), + ).Doc("1-2-2"). + Success("") + + // nothing received on network 2 + tnet.sniffer2.GetStartState().Doc("1-3-0"). + Timeout(3*time.Second, nil).Doc("1-3-1"). + Success("") + + // nothing received on network 3 + tnet.sniffer3.GetStartState().Doc("1-4-0"). + Timeout(3*time.Second, nil).Doc("1-4-1"). + Success("") + + // run the group + tnet.Run(0) + }) }) t.Run("test_02", func(t *testing.T) { - //Test broadcast for existing router. - ExclusiveGlobalTimeMachine(t) - // create a network - tnet := NewTNetwork2(t) - - // test device sends request, sees response - whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil)), WithWhoIsRouterToNetworkNet(2)) - require.NoError(t, err) - tnet.td.GetStartState().Doc("2-1-0"). - Send(whois, nil).Doc("2-1-1"). - Receive(NA((*IAmRouterToNetwork)(nil)), NKW(KWIartnNetworkList, []uint16{2})).Doc("2-1-2"). - Success("") - - tnet.sniffer1.GetStartState().Success("") - - // nothing received on network 2 - tnet.sniffer2.GetStartState().Doc("2-2-0"). - Timeout(3*time.Second, nil).Doc("2-2-1"). - Success("") - - // nothing received on network 2 - tnet.sniffer3.GetStartState().Doc("2-3-0"). - Timeout(3*time.Second, nil).Doc("2-3-1"). - Success("") - - // run the group - tnet.Run(0) + synctest.Test(t, func(t *testing.T) { + //Test broadcast for existing router. + ExclusiveGlobalTimeMachine(t) + // create a network + tnet := NewTNetwork2(t) + + // test device sends request, sees response + whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil)), WithWhoIsRouterToNetworkNet(2)) + require.NoError(t, err) + tnet.td.GetStartState().Doc("2-1-0"). + Send(whois, nil).Doc("2-1-1"). + Receive(NA((*IAmRouterToNetwork)(nil)), NKW(KWIartnNetworkList, []uint16{2})).Doc("2-1-2"). + Success("") + + tnet.sniffer1.GetStartState().Success("") + + // nothing received on network 2 + tnet.sniffer2.GetStartState().Doc("2-2-0"). + Timeout(3*time.Second, nil).Doc("2-2-1"). + Success("") + + // nothing received on network 2 + tnet.sniffer3.GetStartState().Doc("2-3-0"). + Timeout(3*time.Second, nil).Doc("2-3-1"). + Success("") + + // run the group + tnet.Run(0) + }) }) t.Run("test_03", func(t *testing.T) { - //Test broadcast for non-existing router. - ExclusiveGlobalTimeMachine(t) - // create a network - tnet := NewTNetwork2(t) - - // test device sends request, sees response - whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil)), WithWhoIsRouterToNetworkNet(4)) - require.NoError(t, err) - tnet.td.GetStartState().Doc("3-1-0"). - Send(whois, nil).Doc("3-1-1"). - Timeout(3*time.Second, nil).Doc("3-1-2"). - Success("") - - // sniffer on network 1 sees the request and the response - tnet.sniffer1.GetStartState().Doc("3-2-0"). - Receive(NA(PDUMatcher), - NKW(KWTestPDUData, xtob( - "01.80"+ //version, network layer - "00 0004", //message type, and network - )), - ).Doc("3-2-1"). - Success("") - - // sniffer on network 2 sees request forwarded by router - tnet.sniffer2.GetStartState().Doc("3-3-0"). - Receive(NA(PDUMatcher), - NKW(KWTestPDUData, xtob( - "01.88"+ //version, network layer - "0001 01 01"+ // snet/slen/sadr - "00 0004", //message type, and network - )), - ).Doc("3-3-1"). - Success("") - - tnet.sniffer3.GetStartState().Doc("3-4-0"). - Receive(NA(PDUMatcher), - NKW(KWTestPDUData, xtob( - "01.88"+ //version, network layer - "0001 01 01"+ // snet/slen/sadr - "00 0004", //message type, and network - )), - ).Doc("3-4-1"). - Success("") - - // run the group - tnet.Run(0) + synctest.Test(t, func(t *testing.T) { + //Test broadcast for non-existing router. + ExclusiveGlobalTimeMachine(t) + // create a network + tnet := NewTNetwork2(t) + + // test device sends request, sees response + whois, err := NewWhoIsRouterToNetwork(NoArgs, NewKWArgs(KWCPCIDestination, NewLocalBroadcast(nil)), WithWhoIsRouterToNetworkNet(4)) + require.NoError(t, err) + tnet.td.GetStartState().Doc("3-1-0"). + Send(whois, nil).Doc("3-1-1"). + Timeout(3*time.Second, nil).Doc("3-1-2"). + Success("") + + // sniffer on network 1 sees the request and the response + tnet.sniffer1.GetStartState().Doc("3-2-0"). + Receive(NA(PDUMatcher), + NKW(KWTestPDUData, xtob( + "01.80"+ //version, network layer + "00 0004", //message type, and network + )), + ).Doc("3-2-1"). + Success("") + + // sniffer on network 2 sees request forwarded by router + tnet.sniffer2.GetStartState().Doc("3-3-0"). + Receive(NA(PDUMatcher), + NKW(KWTestPDUData, xtob( + "01.88"+ //version, network layer + "0001 01 01"+ // snet/slen/sadr + "00 0004", //message type, and network + )), + ).Doc("3-3-1"). + Success("") + + tnet.sniffer3.GetStartState().Doc("3-4-0"). + Receive(NA(PDUMatcher), + NKW(KWTestPDUData, xtob( + "01.88"+ //version, network layer + "0001 01 01"+ // snet/slen/sadr + "00 0004", //message type, and network + )), + ).Doc("3-4-1"). + Success("") + + // run the group + tnet.Run(0) + }) }) }) } diff --git a/plc4go/internal/cbus/Browser_test.go b/plc4go/internal/cbus/Browser_test.go index 699b2f0fd8..a762976fa8 100644 --- a/plc4go/internal/cbus/Browser_test.go +++ b/plc4go/internal/cbus/Browser_test.go @@ -27,6 +27,7 @@ import ( "sync" "sync/atomic" "testing" + "testing/synctest" "time" "github.com/pkg/errors" @@ -613,21 +614,23 @@ func TestBrowser_getInstalledUnitAddressBytes(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if tt.setup != nil { - tt.setup(t, &tt.fields, &tt.args) - } - m := Browser{ - DefaultBrowser: tt.fields.DefaultBrowser, - connection: tt.fields.connection, - sequenceCounter: tt.fields.sequenceCounter, - log: testutils.ProduceTestingLogger(t), - } - got, err := m.getInstalledUnitAddressBytes(tt.args.ctx) - if !tt.wantErr(t, err, fmt.Sprintf("getInstalledUnitAddressBytes(%v)", tt.args.ctx)) { - return - } - assert.Equalf(t, tt.want, got, "getInstalledUnitAddressBytes(%v)", tt.args.ctx) - t.Log("Banananaaaa") + synctest.Test(t, func(t *testing.T) { + if tt.setup != nil { + tt.setup(t, &tt.fields, &tt.args) + } + m := Browser{ + DefaultBrowser: tt.fields.DefaultBrowser, + connection: tt.fields.connection, + sequenceCounter: tt.fields.sequenceCounter, + log: testutils.ProduceTestingLogger(t), + } + got, err := m.getInstalledUnitAddressBytes(tt.args.ctx) + if !tt.wantErr(t, err, fmt.Sprintf("getInstalledUnitAddressBytes(%v)", tt.args.ctx)) { + return + } + assert.Equalf(t, tt.want, got, "getInstalledUnitAddressBytes(%v)", tt.args.ctx) + t.Log("Banananaaaa") + }) }) } } diff --git a/plc4go/internal/cbus/Connection_test.go b/plc4go/internal/cbus/Connection_test.go index fac6c4db37..5ac09fa61f 100644 --- a/plc4go/internal/cbus/Connection_test.go +++ b/plc4go/internal/cbus/Connection_test.go @@ -26,6 +26,7 @@ import ( "sync" "sync/atomic" "testing" + "testing/synctest" "time" "github.com/stretchr/testify/assert" @@ -1465,22 +1466,24 @@ func TestConnection_setupConnection(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if tt.setup != nil { - tt.setup(t, &tt.fields, &tt.args) - } - c := &Connection{ - messageCodec: tt.fields.messageCodec, - subscribers: tt.fields.subscribers, - tm: tt.fields.tm, - configuration: tt.fields.configuration, - driverContext: driverContextForTesting(), - connectionId: tt.fields.connectionId, - tracer: tt.fields.tracer, - log: testutils.ProduceTestingLogger(t), - } - c.DefaultConnection = _default.NewDefaultConnection(c, testutils.EnrichOptionsWithOptionsForTesting(t)...) - err := c.setupConnection(tt.args.ctx) - tt.wantErr(t, err) + synctest.Test(t, func(t *testing.T) { + if tt.setup != nil { + tt.setup(t, &tt.fields, &tt.args) + } + c := &Connection{ + messageCodec: tt.fields.messageCodec, + subscribers: tt.fields.subscribers, + tm: tt.fields.tm, + configuration: tt.fields.configuration, + driverContext: driverContextForTesting(), + connectionId: tt.fields.connectionId, + tracer: tt.fields.tracer, + log: testutils.ProduceTestingLogger(t), + } + c.DefaultConnection = _default.NewDefaultConnection(c, testutils.EnrichOptionsWithOptionsForTesting(t)...) + err := c.setupConnection(tt.args.ctx) + tt.wantErr(t, err) + }) }) } } diff --git a/plc4go/internal/cbus/MessageCodec_test.go b/plc4go/internal/cbus/MessageCodec_test.go index 86a33816e9..4668381006 100644 --- a/plc4go/internal/cbus/MessageCodec_test.go +++ b/plc4go/internal/cbus/MessageCodec_test.go @@ -24,6 +24,7 @@ import ( "fmt" "net/url" "testing" + "testing/synctest" "time" "github.com/stretchr/testify/assert" @@ -639,148 +640,154 @@ func TestMessageCodec_Receive(t *testing.T) { func TestMessageCodec_Receive_Delayed_Response(t *testing.T) { t.Run("instant data", func(t *testing.T) { - _options := testutils.EnrichOptionsWithOptionsForTesting(t) - - transport := test.NewTransport(_options...) - ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...) - require.NoError(t, err) - require.NoError(t, ti.Connect(t.Context())) - codec := NewMessageCodec(ti, _options...) - t.Cleanup(func() { - assert.Error(t, codec.Disconnect()) + synctest.Test(t, func(t *testing.T) { + _options := testutils.EnrichOptionsWithOptionsForTesting(t) + + transport := test.NewTransport(_options...) + ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...) + require.NoError(t, err) + require.NoError(t, ti.Connect(t.Context())) + codec := NewMessageCodec(ti, _options...) + t.Cleanup(func() { + assert.Error(t, codec.Disconnect()) + }) + codec.requestContext = readWriteModel.NewRequestContext(true) + + timeoutCtx := func(timeout time.Duration) context.Context { + withTimeout, cancelFunc := context.WithTimeout(t.Context(), timeout) + t.Cleanup(cancelFunc) + return withTimeout + } + + var msg spi.Message + msg, err = codec.Receive(timeoutCtx(1 * time.Second)) + // No data yet so this should return no error and no data + assert.NoError(t, err) + assert.Nil(t, msg) + // Now we add a confirmation + ti.(*test.TransportInstance).FillReadBuffer([]byte("i.")) + + // We should wait for more data, so no error, no message + msg, err = codec.Receive(timeoutCtx(1 * time.Second)) + assert.NoError(t, err) + assert.Nil(t, msg) + + // Now we fill in the payload + ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n")) + + // We should wait for more data, so no error + msg, err = codec.Receive(timeoutCtx(2 * time.Second)) + assert.NoError(t, err) + require.NotNil(t, msg) + + // The message should have a confirmation with an alpha + require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg) + assert.True(t, msg.(readWriteModel.CBusMessageToClient).GetReply().GetIsAlpha()) }) - codec.requestContext = readWriteModel.NewRequestContext(true) - - timeoutCtx := func(timeout time.Duration) context.Context { - withTimeout, cancelFunc := context.WithTimeout(t.Context(), timeout) - t.Cleanup(cancelFunc) - return withTimeout - } - - var msg spi.Message - msg, err = codec.Receive(timeoutCtx(1 * time.Second)) - // No data yet so this should return no error and no data - assert.NoError(t, err) - assert.Nil(t, msg) - // Now we add a confirmation - ti.(*test.TransportInstance).FillReadBuffer([]byte("i.")) - - // We should wait for more data, so no error, no message - msg, err = codec.Receive(timeoutCtx(1 * time.Second)) - assert.NoError(t, err) - assert.Nil(t, msg) - - // Now we fill in the payload - ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n")) - - // We should wait for more data, so no error - msg, err = codec.Receive(timeoutCtx(2 * time.Second)) - assert.NoError(t, err) - require.NotNil(t, msg) - - // The message should have a confirmation with an alpha - require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg) - assert.True(t, msg.(readWriteModel.CBusMessageToClient).GetReply().GetIsAlpha()) }) t.Run("data after 6 times", func(t *testing.T) { - _options := testutils.EnrichOptionsWithOptionsForTesting(t) + t.Run("instant data", func(t *testing.T) { + _options := testutils.EnrichOptionsWithOptionsForTesting(t) - transport := test.NewTransport(_options...) - ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...) - require.NoError(t, err) + transport := test.NewTransport(_options...) + ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...) + require.NoError(t, err) - require.NoError(t, ti.Connect(t.Context())) - codec := NewMessageCodec(ti, _options...) - t.Cleanup(func() { - assert.Error(t, codec.Disconnect()) - }) - codec.requestContext = readWriteModel.NewRequestContext(true) - - canceledCtx := func() context.Context { - ctx, cancelFunc := context.WithCancel(t.Context()) - cancelFunc() - return ctx - } - var msg spi.Message - msg, err = codec.Receive(canceledCtx()) - // No data yet so this should return no error and no data - assert.NoError(t, err) - assert.Nil(t, msg) - // Now we add a confirmation - ti.(*test.TransportInstance).FillReadBuffer([]byte("i.")) - - for i := 0; i < 8; i++ { - t.Logf("%d try", i+1) - // We should wait for more data, so no error, no message + require.NoError(t, ti.Connect(t.Context())) + codec := NewMessageCodec(ti, _options...) + t.Cleanup(func() { + assert.Error(t, codec.Disconnect()) + }) + codec.requestContext = readWriteModel.NewRequestContext(true) + + canceledCtx := func() context.Context { + ctx, cancelFunc := context.WithCancel(t.Context()) + cancelFunc() + return ctx + } + var msg spi.Message msg, err = codec.Receive(canceledCtx()) + // No data yet so this should return no error and no data assert.NoError(t, err) assert.Nil(t, msg) - } + // Now we add a confirmation + ti.(*test.TransportInstance).FillReadBuffer([]byte("i.")) - // Now we fill in the payload - ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n")) + for i := 0; i < 8; i++ { + t.Logf("%d try", i+1) + // We should wait for more data, so no error, no message + msg, err = codec.Receive(canceledCtx()) + assert.NoError(t, err) + assert.Nil(t, msg) + } - // We should wait for more data, so no error, no message - msg, err = codec.Receive(t.Context()) - assert.NoError(t, err) - assert.NotNil(t, msg) + // Now we fill in the payload + ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n")) - // The message should have a confirmation with an alpha - require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg) - cBusMessageToClient := msg.(readWriteModel.CBusMessageToClient) - assert.True(t, cBusMessageToClient.GetReply().GetIsAlpha()) + // We should wait for more data, so no error, no message + msg, err = codec.Receive(t.Context()) + assert.NoError(t, err) + assert.NotNil(t, msg) + + // The message should have a confirmation with an alpha + require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg) + cBusMessageToClient := msg.(readWriteModel.CBusMessageToClient) + assert.True(t, cBusMessageToClient.GetReply().GetIsAlpha()) + }) }) t.Run("data after 15 times", func(t *testing.T) { - _options := testutils.EnrichOptionsWithOptionsForTesting(t) + t.Run("instant data", func(t *testing.T) { + _options := testutils.EnrichOptionsWithOptionsForTesting(t) - transport := test.NewTransport(_options...) - ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...) - require.NoError(t, err) + transport := test.NewTransport(_options...) + ti, err := transport.CreateTransportInstance(url.URL{Scheme: "test"}, map[string][]string{"simulatedLatency": {"1ms"}}, _options...) + require.NoError(t, err) - require.NoError(t, ti.Connect(t.Context())) - codec := NewMessageCodec(ti, _options...) - t.Cleanup(func() { - assert.Error(t, codec.Disconnect()) - }) - codec.requestContext = readWriteModel.NewRequestContext(true) - - var msg spi.Message - msg, err = codec.Receive(t.Context()) - // No data yet so this should return no error and no data - assert.NoError(t, err) - assert.Nil(t, msg) - // Now we add a confirmation - ti.(*test.TransportInstance).FillReadBuffer([]byte("i.")) - - for i := 0; i <= 15; i++ { - t.Logf("%d try", i+1) - // We should wait for more data, so no error, no message + require.NoError(t, ti.Connect(t.Context())) + codec := NewMessageCodec(ti, _options...) + t.Cleanup(func() { + assert.Error(t, codec.Disconnect()) + }) + codec.requestContext = readWriteModel.NewRequestContext(true) + + var msg spi.Message msg, err = codec.Receive(t.Context()) - if i == 15 { - require.NoError(t, err) - require.NotNil(t, msg) - // This should be the confirmation only ... - reply := msg.(readWriteModel.CBusMessageToClient).GetReply() - assert.True(t, reply.GetIsAlpha()) - // ... and no content - assert.Nil(t, reply.(readWriteModel.ReplyOrConfirmationConfirmation).GetEmbeddedReply()) - } else { - assert.NoError(t, err) - assert.Nil(t, msg, "Got message at %d try", i+1) + // No data yet so this should return no error and no data + assert.NoError(t, err) + assert.Nil(t, msg) + // Now we add a confirmation + ti.(*test.TransportInstance).FillReadBuffer([]byte("i.")) + + for i := 0; i <= 15; i++ { + t.Logf("%d try", i+1) + // We should wait for more data, so no error, no message + msg, err = codec.Receive(t.Context()) + if i == 15 { + require.NoError(t, err) + require.NotNil(t, msg) + // This should be the confirmation only ... + reply := msg.(readWriteModel.CBusMessageToClient).GetReply() + assert.True(t, reply.GetIsAlpha()) + // ... and no content + assert.Nil(t, reply.(readWriteModel.ReplyOrConfirmationConfirmation).GetEmbeddedReply()) + } else { + assert.NoError(t, err) + assert.Nil(t, msg, "Got message at %d try", i+1) + } } - } - // Now we fill in the payload - ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n")) + // Now we fill in the payload + ti.(*test.TransportInstance).FillReadBuffer([]byte("86FD0201078900434C495053414C20C2\r\n")) - // We should wait for more data, so no error, no message - msg, err = codec.Receive(t.Context()) - assert.NoError(t, err) - assert.NotNil(t, msg) + // We should wait for more data, so no error, no message + msg, err = codec.Receive(t.Context()) + assert.NoError(t, err) + assert.NotNil(t, msg) - // The message should have a confirmation without an alpha - require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg) - assert.False(t, msg.(readWriteModel.CBusMessageToClient).GetReply().GetIsAlpha()) + // The message should have a confirmation without an alpha + require.Implements(t, (*readWriteModel.CBusMessageToClient)(nil), msg) + assert.False(t, msg.(readWriteModel.CBusMessageToClient).GetReply().GetIsAlpha()) + }) }) } diff --git a/plc4go/spi/testutils/ParserSerializerTestRunner.go b/plc4go/spi/testutils/ParserSerializerTestRunner.go index bebef56e57..5d1359da7e 100644 --- a/plc4go/spi/testutils/ParserSerializerTestRunner.go +++ b/plc4go/spi/testutils/ParserSerializerTestRunner.go @@ -28,6 +28,7 @@ import ( "strconv" "strings" "testing" + "testing/synctest" "github.com/pkg/errors" "github.com/stretchr/testify/assert" @@ -207,9 +208,11 @@ func RunParserSerializerTestsuite(t *testing.T, testPath string, parser Parser, return } t.Logf("Running testcase %s", testcase.name) - if err := testsuite.Run(t, testcase); err != nil { - t.Fatalf("\n-------------------------------------------------------\nFailure\n%+v\n-------------------------------------------------------\n\n", err) - } + synctest.Test(t, func(t *testing.T) { + if err := testsuite.Run(t, testcase); err != nil { + t.Fatalf("\n-------------------------------------------------------\nFailure\n%+v\n-------------------------------------------------------\n\n", err) + } + }) }) } t.Log("Done running testcases")
