@@ -8,6 +8,10 @@ import (
88 "testing"
99 "time"
1010
11+ "github.com/filecoin-project/go-data-transfer/pushchannelmonitor"
12+
13+ logging "github.com/ipfs/go-log/v2"
14+
1115 "github.com/ipfs/go-blockservice"
1216 "github.com/ipfs/go-datastore"
1317 "github.com/ipfs/go-datastore/namespace"
@@ -526,33 +530,37 @@ func (dc *disconnectCoordinator) onDisconnect() {
526530// TestPushRequestAutoRestart tests that if the connection for a push request
527531// goes down, it will automatically restart (given the right config options)
528532func TestPushRequestAutoRestart (t * testing.T ) {
533+ //logging.SetLogLevel("dt-pushchanmon", "debug")
534+
529535 testCases := []struct {
530536 name string
537+ expectInitiatorDTFail bool
531538 disconnectOnRequestComplete bool
532539 registerResponder func (responder datatransfer.Manager , dc * disconnectCoordinator )
533540 }{{
534- // Test what happens when the disconnect happens right when the
535- // responder receives the open channel request (ie the responder
536- // doesn't get a chance to respond to the open channel request)
537- name : "when responder receives incoming request" ,
541+ // Verify that the client fires an error event when the disconnect
542+ // occurs right when the responder receives the open channel request
543+ // (ie the responder doesn't get a chance to respond to the open
544+ // channel request)
545+ name : "when responder receives incoming request" ,
546+ expectInitiatorDTFail : true ,
538547 registerResponder : func (responder datatransfer.Manager , dc * disconnectCoordinator ) {
539548 subscriber := func (event datatransfer.Event , channelState datatransfer.ChannelState ) {
540- t .Logf ("%s: %s\n " , datatransfer .Events [event .Code ], datatransfer .Statuses [channelState .Status ()])
541-
542549 if event .Code == datatransfer .Open {
543550 dc .signalReadyForDisconnect (true )
544551 }
545552 }
546553 responder .SubscribeToEvents (subscriber )
547554 },
548555 }, {
549- // Test what happens when the disconnect happens right after the
550- // responder receives the first block
556+ // Verify that if a disconnect happens right after the responder
557+ // receives the first block, the transfer will complete automatically
558+ // when the link comes back up
551559 name : "when responder receives first block" ,
552560 registerResponder : func (responder datatransfer.Manager , dc * disconnectCoordinator ) {
553561 rcvdCount := 0
554562 subscriber := func (event datatransfer.Event , channelState datatransfer.ChannelState ) {
555- t .Logf ("%s: %s\n " , datatransfer .Events [event .Code ], datatransfer .Statuses [channelState .Status ()])
563+ // t.Logf("resp: %s / %s\n", datatransfer.Events[event.Code], datatransfer.Statuses[channelState.Status()])
556564 if event .Code == datatransfer .DataReceived {
557565 rcvdCount ++
558566 if rcvdCount == 1 {
@@ -563,11 +571,12 @@ func TestPushRequestAutoRestart(t *testing.T) {
563571 responder .SubscribeToEvents (subscriber )
564572 },
565573 }, {
566- // Test what happens when the disconnect happens right before the
567- // requester sends the complete message (ie all blocks have been
568- // received but the responder doesn't get a chance to tell
574+ // Verify that the client fires an error event when disconnect occurs
575+ // right before the responder sends the complete message (ie all blocks
576+ // have been received but the responder doesn't get a chance to tell
569577 // the initiator before the disconnect)
570578 name : "before requester sends complete message" ,
579+ expectInitiatorDTFail : true ,
571580 disconnectOnRequestComplete : true ,
572581 }}
573582 for _ , tc := range testCases {
@@ -579,8 +588,8 @@ func TestPushRequestAutoRestart(t *testing.T) {
579588 // Create an object to coordinate disconnect events
580589 dc := newDisconnectCoordinator ()
581590
582- // If the test should disconnect before the request is complete,
583- // add a hook to do so
591+ // If the test should disconnect just before the responder sends
592+ // the Complete message, add a hook to do so
584593 var responderTransportOpts []tp.Option
585594 if tc .disconnectOnRequestComplete {
586595 responderTransportOpts = []tp.Option {
@@ -599,14 +608,27 @@ func TestPushRequestAutoRestart(t *testing.T) {
599608 initiatorGSTspt := gsData .SetupGSTransportHost1 ()
600609 responderGSTspt := gsData .SetupGSTransportHost2 (responderTransportOpts ... )
601610
602- restartConf := PushChannelRestartConfig (100 * time .Millisecond , 1 , 10 , 200 * time .Millisecond , 5 )
611+ restartConf := PushChannelRestartConfig (pushchannelmonitor.Config {
612+ AcceptTimeout : 100 * time .Millisecond ,
613+ Interval : 100 * time .Millisecond ,
614+ MinBytesSent : 1 ,
615+ ChecksPerInterval : 10 ,
616+ RestartBackoff : 200 * time .Millisecond ,
617+ MaxConsecutiveRestarts : 5 ,
618+ CompleteTimeout : 100 * time .Millisecond ,
619+ })
603620 initiator , err := NewDataTransfer (gsData .DtDs1 , gsData .TempDir1 , gsData .DtNet1 , initiatorGSTspt , gsData .StoredCounter1 , restartConf )
604621 require .NoError (t , err )
605622 testutil .StartAndWaitForReady (ctx , t , initiator )
606623 responder , err := NewDataTransfer (gsData .DtDs2 , gsData .TempDir2 , gsData .DtNet2 , responderGSTspt , gsData .StoredCounter2 )
607624 require .NoError (t , err )
608625 testutil .StartAndWaitForReady (ctx , t , responder )
609626
627+ //initiator.SubscribeToEvents(func(event datatransfer.Event, channelState datatransfer.ChannelState) {
628+ // t.Logf("clnt: evt %s / status %s", datatransfer.Events[event.Code], datatransfer.Statuses[channelState.Status()])
629+ //})
630+
631+ // Watch for successful completion
610632 finished := make (chan struct {}, 2 )
611633 var subscriber datatransfer.Subscriber = func (event datatransfer.Event , channelState datatransfer.ChannelState ) {
612634 if channelState .Status () == datatransfer .Completed {
@@ -633,6 +655,16 @@ func TestPushRequestAutoRestart(t *testing.T) {
633655 tc .registerResponder (responder , dc )
634656 }
635657
658+ // If the initiator is expected to fail, watch for the Failed event
659+ initiatorFailed := make (chan struct {})
660+ if tc .expectInitiatorDTFail {
661+ initiator .SubscribeToEvents (func (event datatransfer.Event , channelState datatransfer.ChannelState ) {
662+ if channelState .Status () == datatransfer .Failed {
663+ close (initiatorFailed )
664+ }
665+ })
666+ }
667+
636668 // Open a push channel
637669 chid , err := initiator .OpenPushDataChannel (ctx , host2 .ID (), & voucher , rootCid , gsData .AllSelector )
638670 require .NoError (t , err )
@@ -655,14 +687,25 @@ func TestPushRequestAutoRestart(t *testing.T) {
655687 t .Logf ("Sleep for a second" )
656688 time .Sleep (1 * time .Second )
657689
658- // Restore connection
659- t .Logf ("Restore connection " )
690+ // Restore link
691+ t .Logf ("Restore link " )
660692 require .NoError (t , gsData .Mn .LinkAll ())
661693 time .Sleep (200 * time .Millisecond )
662- conn , err := gsData .Mn .ConnectPeers (host1 .ID (), host2 .ID ())
663- require .NoError (t , err )
664- require .NotNil (t , conn )
665694
695+ // If we're expecting a Failed event, verify that it occurs
696+ if tc .expectInitiatorDTFail {
697+ select {
698+ case <- ctx .Done ():
699+ t .Fatal ("Initiator data-transfer did not fail as expected" )
700+ return
701+ case <- initiatorFailed :
702+ t .Logf ("Initiator data-transfer failed as expected" )
703+ return
704+ }
705+ }
706+
707+ // We're not expecting a failure event, wait for the transfer to
708+ // complete
666709 t .Logf ("Waiting for auto-restart on push channel %s" , chid )
667710
668711 (func () {
@@ -1584,3 +1627,11 @@ func (r *receiver) ReceiveRestartExistingChannelRequest(ctx context.Context,
15841627 incoming datatransfer.Request ) {
15851628
15861629}
1630+
1631+ func SetDTLogLevelDebug () {
1632+ logging .SetLogLevel ("dt-impl" , "debug" )
1633+ logging .SetLogLevel ("dt-pushchanmon" , "debug" )
1634+ logging .SetLogLevel ("dt_graphsync" , "debug" )
1635+ logging .SetLogLevel ("data_transfer" , "debug" )
1636+ logging .SetLogLevel ("data_transfer_network" , "debug" )
1637+ }
0 commit comments