diff --git a/tests/standalone/client/test-safe.ecf b/tests/standalone/client/test.ecf similarity index 81% rename from tests/standalone/client/test-safe.ecf rename to tests/standalone/client/test.ecf index cdfdc999..d13dcd3a 100644 --- a/tests/standalone/client/test-safe.ecf +++ b/tests/standalone/client/test.ecf @@ -6,8 +6,8 @@ - - + + diff --git a/tests/standalone/client/test_app.e b/tests/standalone/client/test_app.e new file mode 100644 index 00000000..1be80201 --- /dev/null +++ b/tests/standalone/client/test_app.e @@ -0,0 +1,253 @@ +note + description: "[ + Enter class description here! + ]" + +class + TEST_APP + +inherit + SHARED_EXECUTION_ENVIRONMENT + +create + make + +feature {NONE} -- Initialization + + make + -- Instantiate Current object. + local + h, res: STRING + i: INTEGER + l_test_name: detachable READABLE_STRING_GENERAL + choices: HASH_TABLE [READABLE_STRING_GENERAL, INTEGER] + do + create h.make_empty + h.append_character ((0).to_character_8) + h.append_character ((0).to_character_8) + h.append_character ((255).to_character_8) + h.append_character ((255).to_character_8) + + i := 0 + if attached execution_environment.arguments.argument (1) as tn then + l_test_name := tn + else + create choices.make (tests.count) + across + tests as ic + loop + i := i + 1 + choices.force (ic.key, i) + print (i.out + " - " + ic.key.out + "%N") + end + print (" > ") + io.read_line + res := io.last_string + res.adjust + if + res.is_integer and then + attached choices [res.to_integer] as tn + then + l_test_name := tn + end + end + if + l_test_name /= Void and then + attached tests [l_test_name] as proc + then + proc.call () + else + print ("Quit...%N") + end + end + + port_number: INTEGER = 9090 + + hostname: STRING = "localhost" + + has_error: BOOLEAN + + tests: STRING_TABLE [PROCEDURE] + once + create Result.make (10) + Result.force (agent cli_execute_get_request, "get_request") + Result.force (agent execute_get_request (1, 0), "get_request (1,0)") + Result.force (agent execute_get_request (10, 0), "get_request (10,0)") + Result.force (agent execute_get_request (1, 10_000), "get_request (1, 10000)") + Result.force (agent execute_get_request (10, 10_000), "get_request (10, 10000)") + Result.force (agent execute_wait_for_ever, "wait_for_ever") + end + +feature -- Execution + + wait_ms (a_delay_ms: INTEGER; m: detachable READABLE_STRING_8) + local + i64: INTEGER_64 + do + if a_delay_ms > 0 then + if has_error then + print ("[ERROR/WAIT] Skipped due to previous error%N") + else + + i64 := a_delay_ms.as_integer_64 * {INTEGER_64} 1_000_000 + if m /= Void then + print ("[WAIT] " + i64.out + " nanoseconds -> " + m + "%N") + else + print ("[WAIT] " + i64.out + " nanoseconds.%N") + end + execution_environment.sleep (i64) -- nanoseconds + print ("[WAIT] done.%N") + end + end + end + + cli_execute_get_request + local + i,n: INTEGER + rq_nb: INTEGER + sl_val: INTEGER + do + if attached execution_environment.arguments as args then + n := args.argument_count + rq_nb := 1 + sl_val := 0 + i := 1 + if n > i then + if args.argument (i).is_case_insensitive_equal_general ("get_request") then + if n >= i + 1 then + rq_nb := args.argument (i + 1).to_integer + if n >= i + 2 then + sl_val := args.argument (i + 2).to_integer + end + end + execute_get_request (rq_nb, sl_val) + end + end + end + end + + execute_get_request (rq_nb: INTEGER; a_delay_ms: INTEGER) + require + rq_nb > 0 + local + l_socket: NETWORK_STREAM_SOCKET + l_packet: PACKET + l_header_done, l_done: BOOLEAN + line, txt: READABLE_STRING_8 + h: STRING + len: INTEGER + i: INTEGER + do + create l_socket.make_client_by_port (port_number, hostname) + l_socket.connect + + from + i := rq_nb + until + i <= 0 + loop + i := i - 1 + + print ("GET /test/"+ i.out +" HTTP/1.1%N") +-- socket_put_string (l_socket, "GET /test/"+ i.out +" HTTP/1.1%R%N") + + socket_put_string (l_socket, "GET /test/"+ i.out) + wait_ms (a_delay_ms, "inside GET request line") + socket_put_string (l_socket, " HTTP/1.1%R%N") + wait_ms (a_delay_ms, "before Host") + socket_put_string (l_socket, "Host: localhost:9090%R%N") + wait_ms (a_delay_ms, "before Accept") + socket_put_string (l_socket, "Accept: */*%R%N") + wait_ms (a_delay_ms, "before CRNL") + socket_put_string (l_socket, "%R%N") + wait_ms (a_delay_ms, "before reading!") + + if not has_error then + from + l_done := False + l_header_done := False + create h.make_empty + until + l_done + loop + if l_header_done then + l_socket.read_stream (len) + txt := l_socket.last_string + print ("BODY:%N") + print (txt) + print ("%N") + if txt.count /= len then + print ("BAD len: " + txt.count.out + " /= " + len.out + "%N") + end + l_done := True + else + l_socket.read_line + line := l_socket.last_string + if l_socket.was_error then + l_done := True + elseif line.is_empty or (line.count = 1 and line[1] = '%R') then + l_header_done := True + else + if line.starts_with_general ("Content-Length:") then + len := line.substring (16, line.count).to_integer + end + h.append (line) + h.append ("%R%N") + + print ("HEADER:") + print (line) + print ("%N") + end + end + end + end + end + end + + execute_wait_for_ever + local + l_socket: NETWORK_STREAM_SOCKET + l_packet: PACKET + do + create l_socket.make_client_by_port(9090, "localhost") + l_socket.connect + + create l_packet.make(1) + l_packet.put_element('a', 0) + + l_socket.send(l_packet, 0) + + from + + until + not l_socket.is_connected + loop + + end + end + + socket_put_string (a_socket: NETWORK_STREAM_SOCKET; s: STRING_8) + local + retried: BOOLEAN + t: STRING + i: INTEGER + do + if has_error then + create t.make_from_string (s) + i := t.index_of ('%N', 1) + if i > 0 then + t.keep_head (i - 1) + end + t.adjust + print ("[ERROR] Skip put_string ("+ s +"..)%N") + elseif retried then + has_error := True + else + a_socket.put_string (s) + end + rescue + retried := True + retry + end + +end