x.websocket: websocket server fix and bring back server autobahn (#8291)
							parent
							
								
									4065a0327a
								
							
						
					
					
						commit
						39e5f6e9df
					
				|  | @ -127,7 +127,6 @@ jobs: | |||
|           cd tutorials/code/blog | ||||
|           ../../../v . | ||||
| 
 | ||||
| 
 | ||||
|   # Alpine docker pre-built container | ||||
|   alpine-docker-musl-gcc: | ||||
|     name: alpine-musl | ||||
|  | @ -489,7 +488,6 @@ jobs: | |||
|   #    - name: V self compilation with -autofree | ||||
|   #      run: ./v -o v2 -autofree cmd/v && ./v2 -o v3 -autofree cmd/v && ./v3 -o v4 -autofree cmd/v | ||||
| 
 | ||||
| 
 | ||||
|   # Ubuntu docker pre-built container | ||||
|   ubuntu-musl: | ||||
|     name: ubuntu-musl | ||||
|  | @ -671,7 +669,6 @@ jobs: | |||
|   #    - name: v2 self compilation | ||||
|   #      run: .\v.exe -o v2.exe cmd/v && .\v2.exe -o v3.exe cmd/v | ||||
| 
 | ||||
| 
 | ||||
|   compilable-v-c-and-v-win-c: | ||||
|     runs-on: ubuntu-20.04 | ||||
|     timeout-minutes: 30 | ||||
|  | @ -781,8 +778,8 @@ jobs: | |||
|         run: docker exec autobahn_client "/src/v" "/src/vlib/x/websocket/tests/autobahn/autobahn_client_wss.v" | ||||
|       - name: Run client wss test | ||||
|         run: docker exec autobahn_client "/src/vlib/x/websocket/tests/autobahn/autobahn_client_wss" | ||||
| #      - name: Run server test | ||||
| #        run: docker exec autobahn_server "wstest" "-m" "fuzzingclient" "-s" "/config/fuzzingclient.json" | ||||
|       - name: Run server test | ||||
|         run: docker exec autobahn_server "wstest" "-m" "fuzzingclient" "-s" "/config/fuzzingclient.json" | ||||
|       - name: Copy reports | ||||
|         run: docker cp autobahn_server:/reports ${{github.workspace}}/reports | ||||
|       - name: Copy reports wss | ||||
|  | @ -802,11 +799,11 @@ jobs: | |||
|         with: | ||||
|           name: client | ||||
|           path: ${{github.workspace}}/reports/clients/index.html | ||||
| #      - name: Publish report server | ||||
| #        uses: actions/upload-artifact@v2 | ||||
| #        with: | ||||
| #            name: server | ||||
| #            path: ${{github.workspace}}/reports/servers/index.html | ||||
|       - name: Publish report server | ||||
|         uses: actions/upload-artifact@v2 | ||||
|         with: | ||||
|           name: server | ||||
|           path: ${{github.workspace}}/reports/servers/index.html | ||||
|       - name: Publish all reports WSS | ||||
|         uses: actions/upload-artifact@v2 | ||||
|         with: | ||||
|  |  | |||
|  | @ -19,17 +19,17 @@ with open("/reports/clients/index.json") as f: | |||
| 
 | ||||
|         nr_of_client_tests = nr_of_client_tests + 1 | ||||
| 
 | ||||
| # with open("/reports/servers/index.json") as f: | ||||
| #     data = json.load(f) | ||||
| with open("/reports/servers/index.json") as f: | ||||
|     data = json.load(f) | ||||
| 
 | ||||
| #     for i in data["AutobahnServer"]: | ||||
| #         if ( | ||||
| #             data["AutobahnServer"][i]["behavior"] == "FAILED" | ||||
| #             or data["AutobahnServer"][i]["behaviorClose"] == "FAILED" | ||||
| #         ): | ||||
| #             nr_of_server_errs = nr_of_server_errs + 1 | ||||
|     for i in data["AutobahnServer"]: | ||||
|         if ( | ||||
|             data["AutobahnServer"][i]["behavior"] == "FAILED" | ||||
|             or data["AutobahnServer"][i]["behaviorClose"] == "FAILED" | ||||
|         ): | ||||
|             nr_of_server_errs = nr_of_server_errs + 1 | ||||
| 
 | ||||
| #         nr_of_server_tests = nr_of_server_tests + 1 | ||||
|         nr_of_server_tests = nr_of_server_tests + 1 | ||||
| 
 | ||||
| if nr_of_client_errs > 0 or nr_of_server_errs > 0: | ||||
|     print( | ||||
|  |  | |||
|  | @ -73,8 +73,8 @@ fn (mut s Server) handle_ping() { | |||
| 	mut clients_to_remove := []string{} | ||||
| 	for s.state == .open { | ||||
| 		time.sleep(s.ping_interval) | ||||
| 		for _, cli in s.clients { | ||||
| 			mut c := cli | ||||
| 		for i, _ in s.clients { | ||||
| 			mut c := s.clients[i] | ||||
| 			if c.client.state == .open { | ||||
| 				c.client.ping() or { | ||||
| 					s.logger.debug('server-> error sending ping to client') | ||||
|  |  | |||
|  | @ -1,6 +1,12 @@ | |||
| import x.websocket | ||||
| import time | ||||
| 
 | ||||
| struct WebsocketTestResults { | ||||
| pub mut: | ||||
| 	nr_messages      int | ||||
| 	nr_pong_received int | ||||
| } | ||||
| 
 | ||||
| // tests with internal ws servers
 | ||||
| fn test_ws() { | ||||
| 	go start_server() | ||||
|  | @ -11,7 +17,8 @@ fn test_ws() { | |||
| fn start_server() ? { | ||||
| 	mut s := websocket.new_server(30000, '') | ||||
| 	// make that in execution test time give time to execute at least one time
 | ||||
| 	s.ping_interval = 100 | ||||
| 	s.ping_interval = 1 | ||||
| 
 | ||||
| 	s.on_connect(fn (mut s websocket.ServerClient) ?bool { | ||||
| 		// here you can look att the client info and accept or not accept
 | ||||
| 		// just returning a true/false
 | ||||
|  | @ -22,8 +29,12 @@ fn start_server() ? { | |||
| 		return true | ||||
| 	}) ? | ||||
| 	s.on_message(fn (mut ws websocket.Client, msg &websocket.Message) ? { | ||||
| 		ws.write(msg.payload, msg.opcode) or { panic(err) } | ||||
| 		match msg.opcode { | ||||
| 			.pong { ws.write_str('pong') } | ||||
| 			else { ws.write(msg.payload, msg.opcode) or { panic(err) } } | ||||
| 		} | ||||
| 	}) | ||||
| 
 | ||||
| 	s.on_close(fn (mut ws websocket.Client, code int, reason string) ? { | ||||
| 		// not used
 | ||||
| 	}) | ||||
|  | @ -33,10 +44,11 @@ fn start_server() ? { | |||
| // ws_test tests connect to the websocket server from websocket client
 | ||||
| fn ws_test(uri string) ? { | ||||
| 	eprintln('connecting to $uri ...') | ||||
| 
 | ||||
| 	mut test_results := WebsocketTestResults{} | ||||
| 	mut ws := websocket.new_client(uri) ? | ||||
| 	ws.on_open(fn (mut ws websocket.Client) ? { | ||||
| 		println('open!') | ||||
| 		ws.pong() | ||||
| 		ws.pong() ? | ||||
| 		assert true | ||||
| 	}) | ||||
| 	ws.on_error(fn (mut ws websocket.Client, err string) ? { | ||||
|  | @ -44,19 +56,26 @@ fn ws_test(uri string) ? { | |||
| 		// this can be thrown by internet connection problems
 | ||||
| 		assert false | ||||
| 	}) | ||||
| 	ws.on_close(fn (mut ws websocket.Client, code int, reason string) ? { | ||||
| 		println('closed') | ||||
| 	}) | ||||
| 	ws.on_message(fn (mut ws websocket.Client, msg &websocket.Message) ? { | ||||
| 
 | ||||
| 	ws.on_message_ref(fn (mut ws websocket.Client, msg &websocket.Message, mut res WebsocketTestResults) ? { | ||||
| 		println('client got type: $msg.opcode payload:\n$msg.payload') | ||||
| 		if msg.opcode == .text_frame { | ||||
| 			smessage := msg.payload.bytestr() | ||||
| 			println('Message: $smessage') | ||||
| 			assert smessage == 'a' | ||||
| 			match smessage { | ||||
| 				'pong' { | ||||
| 					res.nr_pong_received++ | ||||
| 				} | ||||
| 				'a' { | ||||
| 					res.nr_messages++ | ||||
| 				} | ||||
| 				else { | ||||
| 					assert false | ||||
| 				} | ||||
| 			} | ||||
| 		} else { | ||||
| 			println('Binary message: $msg') | ||||
| 		} | ||||
| 	}) | ||||
| 	}, test_results) | ||||
| 	ws.connect() or { panic('fail to connect') } | ||||
| 	go ws.listen() | ||||
| 	text := ['a'].repeat(2) | ||||
|  | @ -66,5 +85,8 @@ fn ws_test(uri string) ? { | |||
| 		time.sleep_ms(100) | ||||
| 	} | ||||
| 	// sleep to give time to recieve response before asserts
 | ||||
| 	time.sleep_ms(500) | ||||
| 	time.sleep_ms(1500) | ||||
| 	// We expect at least 2 pongs, one sent directly and one indirectly 
 | ||||
| 	assert test_results.nr_pong_received >= 2 | ||||
| 	assert test_results.nr_messages == 2 | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue