2023-03-12 16:00:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// GoToSocial  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Copyright (C) GoToSocial Authors admin@gotosocial.org  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// SPDX-License-Identifier: AGPL-3.0-or-later  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// This program is free software: you can redistribute it and/or modify  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// it under the terms of the GNU Affero General Public License as published by  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// the Free Software Foundation, either version 3 of the License, or  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// (at your option) any later version.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// This program is distributed in the hope that it will be useful,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// but WITHOUT ANY WARRANTY; without even the implied warranty of  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// GNU Affero General Public License for more details.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// You should have received a copy of the GNU Affero General Public License  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// along with this program.  If not, see <http://www.gnu.org/licenses/>.  
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								package  streaming_test  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"bufio" 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-28 11:05:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"encoding/base64" 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"errors" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"fmt" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"io/ioutil" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"net" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"net/http" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"net/http/httptest" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"testing" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"time" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/gin-gonic/gin" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/stretchr/testify/suite" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/api/client/streaming" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/db" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/email" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/federation" 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-27 13:22:05 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/filter/visibility" 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/media" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/oauth" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/processing" 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:26:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/state" 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/storage" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/typeutils" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/testrig" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  StreamingTestSuite  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// standard suite interfaces 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . Suite 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									db            db . DB 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-23 17:44:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tc            * typeutils . Converter 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-28 13:08:35 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mediaManager  * media . Manager 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-23 10:58:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									federator     * federation . Federator 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									emailSender   email . Sender 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-22 16:05:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									processor     * processing . Processor 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									storage       * storage . Driver 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:26:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									state         state . State 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// standard suite models 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testTokens        map [ string ] * gtsmodel . Token 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testClients       map [ string ] * gtsmodel . Client 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testApplications  map [ string ] * gtsmodel . Application 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testUsers         map [ string ] * gtsmodel . User 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testAccounts      map [ string ] * gtsmodel . Account 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testAttachments   map [ string ] * gtsmodel . MediaAttachment 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testStatuses      map [ string ] * gtsmodel . Status 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testFollows       map [ string ] * gtsmodel . Follow 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// module being tested 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									streamingModule  * streaming . Module 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * StreamingTestSuite )  SetupSuite ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . testTokens  =  testrig . NewTestTokens ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . testClients  =  testrig . NewTestClients ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . testApplications  =  testrig . NewTestApplications ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . testUsers  =  testrig . NewTestUsers ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . testAccounts  =  testrig . NewTestAccounts ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . testAttachments  =  testrig . NewTestAttachments ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . testStatuses  =  testrig . NewTestStatuses ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . testFollows  =  testrig . NewTestFollows ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * StreamingTestSuite )  SetupTest ( )  {  
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:26:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									suite . state . Caches . Init ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-14 15:57:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									testrig . StartNoopWorkers ( & suite . state ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:26:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									testrig . InitTestConfig ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testrig . InitTestLog ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:26:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									suite . db  =  testrig . NewTestDB ( & suite . state ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . state . DB  =  suite . db 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									suite . storage  =  testrig . NewInMemoryStorage ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:26:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									suite . state . Storage  =  suite . storage 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-23 17:44:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									suite . tc  =  typeutils . NewConverter ( & suite . state ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-25 10:37:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testrig . StartTimelines ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& suite . state , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										visibility . NewFilter ( & suite . state ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										suite . tc , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									testrig . StandardDBSetup ( suite . db ,  nil ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testrig . StandardStorageSetup ( suite . storage ,  "../../../../testrig/media" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:26:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									suite . mediaManager  =  testrig . NewTestMediaManager ( & suite . state ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . federator  =  testrig . NewTestFederator ( & suite . state ,  testrig . NewTestTransportController ( & suite . state ,  testrig . NewMockHTTPClient ( nil ,  "../../../../testrig/media" ) ) ,  suite . mediaManager ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									suite . emailSender  =  testrig . NewEmailSender ( "../../../../web/template/" ,  nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:26:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									suite . processor  =  testrig . NewTestProcessor ( & suite . state ,  suite . federator ,  suite . emailSender ,  suite . mediaManager ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-08 11:43:08 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									suite . streamingModule  =  streaming . New ( suite . processor ,  1 ,  4096 ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * StreamingTestSuite )  TearDownTest ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testrig . StandardDBTeardown ( suite . db ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testrig . StandardStorageTeardown ( suite . storage ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-01 18:26:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									testrig . StopWorkers ( & suite . state ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Addr is a fake network interface which implements the net.Addr interface  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  Addr  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NetworkString  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									AddrString     string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( a  Addr )  Network ( )  string  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  a . NetworkString 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( a  Addr )  String ( )  string  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  a . AddrString 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  connTester  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									deadline  time . Time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									writes    int 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( c  * connTester )  Read ( b  [ ] byte )  ( n  int ,  err  error )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( c  * connTester )  SetDeadline ( t  time . Time )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									c . deadline  =  t 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( c  * connTester )  SetReadDeadline ( t  time . Time )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( c  * connTester )  SetWriteDeadline ( t  time . Time )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( c  * connTester )  Write ( p  [ ] byte )  ( int ,  error )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									c . writes ++ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  c . writes  >  1  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ,  errors . New ( "timeout" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( c  * connTester )  Close ( )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( c  * connTester )  LocalAddr ( )  net . Addr  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  Addr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										NetworkString :  "tcp" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										AddrString :     "127.0.0.1" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( c  * connTester )  RemoteAddr ( )  net . Addr  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  Addr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										NetworkString :  "tcp" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										AddrString :     "127.0.0.1" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  TestResponseRecorder  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									* httptest . ResponseRecorder 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									w             gin . ResponseWriter 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									closeChannel  chan  bool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( r  * TestResponseRecorder )  CloseNotify ( )  <- chan  bool  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  r . closeChannel 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( r  * TestResponseRecorder )  closeClient ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									r . closeChannel  <-  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( r  * TestResponseRecorder )  Hijack ( )  ( net . Conn ,  * bufio . ReadWriter ,  error )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									conn  :=  & connTester { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										writes :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									brw  :=  bufio . NewReadWriter ( bufio . NewReader ( conn ) ,  bufio . NewWriter ( conn ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  conn ,  brw ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  CreateTestResponseRecorder ( )  * TestResponseRecorder  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									w  :=  new ( gin . ResponseWriter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  & TestResponseRecorder { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										httptest . NewRecorder ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* w , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										make ( chan  bool ,  1 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( suite  * StreamingTestSuite )  TestSecurityHeader ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// set up the context for the request 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									t  :=  suite . testTokens [ "local_account_1" ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									oauthToken  :=  oauth . DBTokenToToken ( t ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									recorder  :=  CreateTestResponseRecorder ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx ,  _  :=  testrig . CreateGinTestContext ( recorder ,  nil ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx . Set ( oauth . SessionAuthorizedApplication ,  suite . testApplications [ "application_1" ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx . Set ( oauth . SessionAuthorizedToken ,  oauthToken ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx . Set ( oauth . SessionAuthorizedUser ,  suite . testUsers [ "local_account_1" ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx . Set ( oauth . SessionAuthorizedAccount ,  suite . testAccounts [ "local_account_1" ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx . Request  =  httptest . NewRequest ( http . MethodGet ,  fmt . Sprintf ( "http://localhost:8080/%s?stream=user" ,  streaming . BasePath ) ,  nil )  // the endpoint we're hitting 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx . Request . Header . Set ( "accept" ,  "application/json" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx . Request . Header . Set ( streaming . AccessTokenHeader ,  oauthToken . Access ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx . Request . Header . Set ( "Connection" ,  "upgrade" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx . Request . Header . Set ( "Upgrade" ,  "websocket" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx . Request . Header . Set ( "Sec-Websocket-Version" ,  "13" ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-28 11:05:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									key  :=  [ 16 ] byte { 'h' ,  'e' ,  'l' ,  'l' ,  'o' ,  ' ' ,  'w' ,  'o' ,  'r' ,  'l' ,  'd' } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									key64  :=  base64 . StdEncoding . EncodeToString ( key [ : ] )  // sec-websocket-key must be base64 encoded and 16 bytes long 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx . Request . Header . Set ( "Sec-Websocket-Key" ,  key64 ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . streamingModule . StreamGETHandler ( ctx ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									result  :=  recorder . Result ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  result . Body . Close ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-28 11:05:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									b ,  err  :=  ioutil . ReadAll ( result . Body ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									suite . NoError ( err ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-28 11:05:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// check response 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ! suite . EqualValues ( http . StatusOK ,  recorder . Code )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										suite . T ( ) . Logf ( "%s" ,  b ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-14 04:56:42 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestStreamingTestSuite ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									suite . Run ( t ,  new ( StreamingTestSuite ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}