@@ -2,6 +2,7 @@ package basichost
2
2
3
3
import (
4
4
"context"
5
+ "encoding/binary"
5
6
"fmt"
6
7
"io"
7
8
"reflect"
@@ -941,3 +942,56 @@ func TestTrimHostAddrList(t *testing.T) {
941
942
})
942
943
}
943
944
}
945
+
946
+ func TestHostTimeoutNewStream (t * testing.T ) {
947
+ h1 , err := NewHost (swarmt .GenSwarm (t ), nil )
948
+ require .NoError (t , err )
949
+ h1 .Start ()
950
+ defer h1 .Close ()
951
+
952
+ const proto = "/testing"
953
+ h2 := swarmt .GenSwarm (t )
954
+
955
+ h2 .SetStreamHandler (func (s network.Stream ) {
956
+ // First message is multistream header. Just echo it
957
+ msHeader := []byte ("\x19 /multistream/1.0.0\n " )
958
+ _ , err := s .Read (msHeader )
959
+ assert .NoError (t , err )
960
+ _ , err = s .Write (msHeader )
961
+ assert .NoError (t , err )
962
+
963
+ buf := make ([]byte , 1024 )
964
+ n , err := s .Read (buf )
965
+ assert .NoError (t , err )
966
+
967
+ msgLen , varintN := binary .Uvarint (buf [:n ])
968
+ buf = buf [varintN :]
969
+ proto := buf [:int (msgLen )]
970
+ if string (proto ) == "/ipfs/id/1.0.0\n " {
971
+ // Signal we don't support identify
972
+ na := []byte ("na\n " )
973
+ n := binary .PutUvarint (buf , uint64 (len (na )))
974
+ copy (buf [n :], na )
975
+
976
+ _ , err = s .Write (buf [:int (n )+ len (na )])
977
+ assert .NoError (t , err )
978
+ } else {
979
+ // Stall
980
+ time .Sleep (5 * time .Second )
981
+ }
982
+ t .Log ("Resetting" )
983
+ s .Reset ()
984
+ })
985
+
986
+ err = h1 .Connect (context .Background (), peer.AddrInfo {
987
+ ID : h2 .LocalPeer (),
988
+ Addrs : h2 .ListenAddresses (),
989
+ })
990
+ require .NoError (t , err )
991
+
992
+ // No context passed in, fallback to negtimeout
993
+ h1 .negtimeout = time .Second
994
+ _ , err = h1 .NewStream (context .Background (), h2 .LocalPeer (), proto )
995
+ require .Error (t , err )
996
+ require .ErrorContains (t , err , "context deadline exceeded" )
997
+ }
0 commit comments