@@ -728,6 +728,78 @@ func assertHandlerNoError(t *testing.T, server *BlipWebsocketServer, wg *sync.Wa
728
728
}
729
729
}
730
730
731
+ // TestWebSocketServerStopHandler tests stopping the handler with a specific error code.
732
+ func TestWebSocketServerStopHandler (t * testing.T ) {
733
+
734
+ opts := ContextOptions {
735
+ ProtocolIds : []string {BlipTestAppProtocolId },
736
+ }
737
+ blipContextEchoServer , err := NewContext (opts )
738
+ require .NoError (t , err )
739
+
740
+ receivedRequests := sync.WaitGroup {}
741
+
742
+ // ----------------- Setup Echo Server that will be closed via cancellation context -------------------------
743
+
744
+ // Create a blip profile handler to respond to echo requests
745
+ dispatchEcho := func (request * Message ) {
746
+ defer receivedRequests .Done ()
747
+ body , err := request .Body ()
748
+ require .NoError (t , err )
749
+ require .Equal (t , "application/octet-stream" , request .Properties ["Content-Type" ])
750
+ if response := request .Response (); response != nil {
751
+ response .SetBody (body )
752
+ response .Properties ["Content-Type" ] = request .Properties ["Content-Type" ]
753
+ }
754
+ }
755
+
756
+ // Blip setup
757
+ blipContextEchoServer .HandlerForProfile ["BLIPTest/EchoData" ] = dispatchEcho
758
+ blipContextEchoServer .LogMessages = true
759
+ blipContextEchoServer .LogFrames = true
760
+
761
+ // Websocket Server
762
+ server := blipContextEchoServer .WebSocketServer ()
763
+
764
+ // HTTP Handler wrapping websocket server
765
+ http .Handle ("/TestServerContextClose" , server )
766
+ listener , err := net .Listen ("tcp" , ":0" )
767
+ require .NoError (t , err )
768
+ defer listener .Close ()
769
+ go func () {
770
+ _ = http .Serve (listener , nil )
771
+ }()
772
+
773
+ // ----------------- Setup Echo Client ----------------------------------------
774
+ blipContextEchoClient , err := NewContext (defaultContextOptions )
775
+ require .NoError (t , err )
776
+ port := listener .Addr ().(* net.TCPAddr ).Port
777
+ destUrl := fmt .Sprintf ("ws://localhost:%d/TestServerContextClose" , port )
778
+ sender , err := blipContextEchoClient .Dial (destUrl )
779
+ require .NoError (t , err )
780
+
781
+ // Create echo request
782
+ echoResponseBody := []byte ("hello" )
783
+ echoRequest := NewRequest ()
784
+ echoRequest .SetProfile ("BLIPTest/EchoData" )
785
+ echoRequest .Properties ["Content-Type" ] = "application/octet-stream"
786
+ echoRequest .SetBody (echoResponseBody )
787
+ receivedRequests .Add (1 )
788
+ require .True (t , sender .Send (echoRequest ))
789
+
790
+ // Read the echo response. Closed connection will result in empty response, as EOF message
791
+ // isn't currently returned by blip client
792
+ response := echoRequest .Response ()
793
+ responseBody , err := response .Body ()
794
+ require .NoError (t , err )
795
+ require .Equal (t , echoResponseBody , responseBody )
796
+
797
+ fmt .Printf ("Closing connection\n " )
798
+ server .StopHandler (websocket .StatusAbnormalClosure )
799
+ //fmt.Printf("sender=%+v\n", sender.conn)
800
+ require .True (t , false )
801
+ }
802
+
731
803
// Wait for the WaitGroup, or return an error if the wg.Wait() doesn't return within timeout
732
804
// TODO: this code is duplicated with code in Sync Gateway utilities_testing.go. Should be refactored to common repo.
733
805
func WaitWithTimeout (wg * sync.WaitGroup , timeout time.Duration ) error {
0 commit comments