From 7d554b0e6743edf6c60f13dd252bdf2d949142a1 Mon Sep 17 00:00:00 2001
From: Philippe PITTOLI
Date: Thu, 16 Jan 2020 17:43:02 +0100
Subject: [PATCH] Adding some tests on websockets.
---
shard.yml | 6 ++++
tests/closing.cr | 24 ++++++++++++++++
tests/pong.cr | 72 ++++++++++++++++++++++++++++++++++++++++++++++++
tests/test-ws.cr | 57 ++++++++++++++++++++++++++++++++++++++
4 files changed, 159 insertions(+)
create mode 100644 tests/closing.cr
create mode 100644 tests/pong.cr
create mode 100644 tests/test-ws.cr
diff --git a/shard.yml b/shard.yml
index 43d617b..b5a26ef 100644
--- a/shard.yml
+++ b/shard.yml
@@ -34,4 +34,10 @@ targets:
websocketc:
main: src/websocketc.cr
+ # tests
+ test-ws-pong:
+ main: tests/pong.cr
+ test-closing:
+ main: tests/closing.cr
+
license: ISC
diff --git a/tests/closing.cr b/tests/closing.cr
new file mode 100644
index 0000000..6874fa3
--- /dev/null
+++ b/tests/closing.cr
@@ -0,0 +1,24 @@
+require "option_parser"
+require "./test-ws"
+
+uri = "ws://localhost:1234/pong.JSON"
+
+OptionParser.parse do |parser|
+ parser.on "-u uri", "--uri uri", "URI" do |opturi|
+ uri = opturi
+ end
+
+ parser.on "-h", "--help", "Show this help" do
+ puts parser
+ exit 0
+ end
+end
+
+begin
+ tws = TestWS.new uri
+ puts "connection done: closing it"
+ tws.close
+ tws.read
+rescue e
+ puts "Exception: #{e}"
+end
diff --git a/tests/pong.cr b/tests/pong.cr
new file mode 100644
index 0000000..18daa21
--- /dev/null
+++ b/tests/pong.cr
@@ -0,0 +1,72 @@
+require "option_parser"
+require "./test-ws"
+
+uri = "ws://localhost:1234/pong.JSON"
+rounds = 5
+
+OptionParser.parse do |parser|
+ parser.on "-r rounds", "--rounds rounds", "Rounds" do |r|
+ rounds = r.to_i
+ end
+
+ parser.on "-u uri", "--uri uri", "URI" do |opturi|
+ uri = opturi
+ end
+
+ parser.on "-h", "--help", "Show this help" do
+ puts parser
+ exit 0
+ end
+end
+
+def multiple_messages_and_responses(tws : TestWS, data)
+ tws.send 1, data
+ tws.send 2, data
+ tws.send 3, data
+ tws.send 4, data
+ tws.send 5, data
+
+ response = tws.read
+ puts "1. received a message: #{response}"
+ pp! response
+
+ response = tws.read
+ puts "2. received a message: #{response}"
+ pp! response
+
+ response = tws.read
+ puts "3. received a message: #{response}"
+ pp! response
+
+ response = tws.read
+ puts "4. received a message: #{response}"
+ pp! response
+
+ response = tws.read
+ puts "5. received a message: #{response}"
+ pp! response
+end
+
+def single_message_and_response(tws : TestWS, data)
+ tws.send 1, data
+ response = tws.read
+ pp! response
+end
+
+begin
+ tws = TestWS.new uri
+ # puts "connection done: sending pong"
+
+ data = STDIN.gets_to_end
+ data = data.chomp
+
+ rounds.times do |i|
+ single_message_and_response tws, "#{data} #{i}"
+ end
+
+ # puts "closing the connection"
+ tws.close
+ tws.read
+rescue e
+ puts "Exception: #{e}"
+end
diff --git a/tests/test-ws.cr b/tests/test-ws.cr
new file mode 100644
index 0000000..41240b6
--- /dev/null
+++ b/tests/test-ws.cr
@@ -0,0 +1,57 @@
+require "http/web_socket"
+
+require "../src/colors"
+require "../src/utils"
+
+require "../src/ws"
+
+require "json"
+
+class TestWS
+ property ws : WebSocket
+ property is_json : Bool
+
+ def initialize(uri : String)
+ @ws = WebSocket.new(URI.parse(uri))
+ @is_json = uri.ends_with? ".JSON"
+ @ws.on_close do |socket|
+ raise "socket is closing"
+ end
+ end
+
+ def read
+ m = @ws.read
+ if m.nil?
+ raise "empty message"
+ end
+
+ # remove ping messages, they are not application-relevent
+ while m.is_a?(HTTP::WebSocket::Ping)
+ puts "received a ping message, skipping"
+ m = @ws.read
+ if m.nil?
+ raise "empty message"
+ end
+ end
+
+ m
+ end
+
+ def send(type : Int32, data : String | Slice)
+ m = to_message type, data
+
+ # quick hack to send json messages
+ if @is_json
+ json_message = data.chomp
+ final_json_message = "{ \"mtype\": #{type}, \"payload\": \"#{json_message}\" }"
+ # puts "message: #{final_json_message}"
+ m = final_json_message
+ end
+
+ @ws.send m
+ end
+
+ def close
+ @ws.close
+ end
+end