1
0
mirror of https://github.com/janet-lang/janet synced 2024-10-18 16:05:47 +00:00

Add regression test for chat server issues. Address #1496

This commit is contained in:
Calvin Rose 2024-09-06 07:56:46 -05:00
parent 4f65c2707e
commit e4f4a42751
3 changed files with 92 additions and 3 deletions

View File

@ -30,7 +30,6 @@
(printf "STARTING SERVER...") (printf "STARTING SERVER...")
(flush) (flush)
(def my-server (net/listen "127.0.0.1" "8000")) (def my-server (net/listen "127.0.0.1" "8000"))
'(handler (net/accept my-server))
(forever (forever
(def connection (net/accept my-server)) (def connection (net/accept my-server))
(ev/call handler connection))) (ev/call handler connection)))

View File

@ -497,8 +497,8 @@ int janet_scan_numeric(
Janet *out) { Janet *out) {
int result; int result;
double num; double num;
int64_t i64; int64_t i64 = 0;
uint64_t u64; uint64_t u64 = 0;
if (len < 2 || str[len - 2] != ':') { if (len < 2 || str[len - 2] != ':') {
result = janet_scan_number_base(str, len, 0, &num); result = janet_scan_number_base(str, len, 0, &num);
*out = janet_wrap_number(num); *out = janet_wrap_number(num);

View File

@ -375,4 +375,94 @@
(ev/cancel f (gensym)) (ev/cancel f (gensym))
(ev/take superv) (ev/take superv)
# Chat server test
(def conmap @{})
(defn broadcast [em msg]
(eachk par conmap
(if (not= par em)
(if-let [tar (get conmap par)]
(net/write tar (string/format "[%s]:%s" em msg))))))
(defn handler
[connection]
(net/write connection "Whats your name?\n")
(def name (string/trim (string (ev/read connection 100))))
(if (get conmap name)
(do
(net/write connection "Name already taken!")
(:close connection))
(do
(put conmap name connection)
(net/write connection (string/format "Welcome %s\n" name))
(defer (do
(put conmap name nil)
(:close connection))
(while (def msg (ev/read connection 100))
(broadcast name (string msg)))))))
# Now launch the chat server
(def chat-server (net/listen test-host test-port))
(ev/spawn
(forever
(def [ok connection] (protect (net/accept chat-server)))
(if (and ok connection)
(ev/call handler connection)
(break))))
# Read from socket
(defn expect-read
[stream text]
(def result (string (net/read stream 100)))
(assert (= result text) (string/format "expected %v, got %v" text result)))
# Now do our telnet chat
(def bob (net/connect test-host test-port))
(expect-read bob "Whats your name?\n")
(net/write bob "bob")
(expect-read bob "Welcome bob\n")
(def alice (net/connect test-host test-port))
(expect-read alice "Whats your name?\n")
(net/write alice "alice")
(expect-read alice "Welcome alice\n")
# Bob says hello, alice gets the message
(net/write bob "hello\n")
(expect-read alice "[bob]:hello\n")
# Alice says hello, bob gets the message
(net/write alice "hi\n")
(expect-read bob "[alice]:hi\n")
# Ted joins the chat server
(def ted (net/connect test-host test-port))
(expect-read ted "Whats your name?\n")
(net/write ted "ted")
(expect-read ted "Welcome ted\n")
# Ted says hi, alice and bob get message
(net/write ted "hi\n")
(expect-read alice "[ted]:hi\n")
(expect-read bob "[ted]:hi\n")
# Bob leaves for work. Now it's just ted and alice
(:close bob)
# Alice messages ted, ted gets message
(net/write alice "wuzzup\n")
(expect-read ted "[alice]:wuzzup\n")
(net/write ted "not much\n")
(expect-read alice "[ted]:not much\n")
# Alice bounces
(:close alice)
# Ted can send messages, nobody gets them :(
(net/write ted "hello?\n")
(:close ted)
# Close chat server
(:close chat-server)
(end-suite) (end-suite)