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