diff --git a/src/babashka/impl/nrepl_server.clj b/src/babashka/impl/nrepl_server.clj index 79fdcf51..e9bf05b7 100644 --- a/src/babashka/impl/nrepl_server.clj +++ b/src/babashka/impl/nrepl_server.clj @@ -101,8 +101,9 @@ (send o (response-for msg {"completions" [] "status" #{"done"}}))))) -(defn close-session [ctx msg _is os id] - (swap! (:sessions ctx) disj id) +(defn close-session [ctx msg _is os] + (let [session (:session msg)] + (swap! (:sessions ctx) disj session)) (send os (response-for msg {"status" #{"done" "session-closed"}}))) (defn ls-sessions [ctx msg os] @@ -146,7 +147,7 @@ "ops" (zipmap #{"clone" "eval" "load-file" "complete" "describe"} (repeat {}))})) (recur ctx is os id)) - :close (do (close-session ctx msg is os id) + :close (do (close-session ctx msg is os) (recur ctx is os id)) :ls-sessions (do (ls-sessions ctx msg os) (recur ctx is os id)) diff --git a/test/babashka/impl/nrepl_server_test.clj b/test/babashka/impl/nrepl_server_test.clj index f7215003..52613754 100644 --- a/test/babashka/impl/nrepl_server_test.clj +++ b/test/babashka/impl/nrepl_server_test.clj @@ -137,28 +137,36 @@ completions (mapv read-msg completions) completions (into #{} (map (juxt :ns :candidate)) completions)] (is (contains? completions ["clojure.test" "test/deftest"]))))) - (testing "ls-sessions" + (testing "close + ls-sessions" (bencode/write-bencode os {"op" "ls-sessions" "session" session "id" (new-id!)}) (let [reply (read-reply in session @id) sessions (set (:sessions reply))] (is (contains? sessions session)) - (bencode/write-bencode os {"op" "clone" "session" session "id" (new-id!)}) - (let [new-session (:new-session (read-reply in session @id))] + (let [new-sessions (loop [i 0 + sessions #{}] + (bencode/write-bencode os {"op" "clone" "session" session "id" (new-id!)}) + (let [new-session (:new-session (read-reply in session @id)) + sessions (conj sessions new-session)] + (if (= i 4) + sessions + (recur (inc i) sessions))))] (bencode/write-bencode os {"op" "ls-sessions" "session" session "id" (new-id!)}) (let [reply (read-reply in session @id) sessions (set (:sessions reply))] + (is (= 6 (count sessions))) (is (contains? sessions session)) - (is (contains? sessions new-session))) - (testing "close" - (bencode/write-bencode os {"op" "close" "session" new-session "id" (new-id!)}) - (let [reply (read-reply in new-session @id)] - (is (contains? (set (:status reply)) "session-closed")))) - (testing "session not listen in ls-sessions after close" - (bencode/write-bencode os {"op" "ls-sessions" "session" session "id" (new-id!)}) - (let [reply (read-reply in session @id) - sessions (set (:sessions reply))] - (is (contains? sessions session)) - (is (not (contains? sessions new-session)))))))) + (is (= new-sessions (disj sessions session))) + (testing "close" + (doseq [close-session (disj sessions session)] + (bencode/write-bencode os {"op" "close" "session" close-session "id" (new-id!)}) + (let [reply (read-reply in close-session @id)] + (is (contains? (set (:status reply)) "session-closed"))))) + (testing "session not listen in ls-sessions after close" + (bencode/write-bencode os {"op" "ls-sessions" "session" session "id" (new-id!)}) + (let [reply (read-reply in session @id) + sessions (set (:sessions reply))] + (is (contains? sessions session)) + (is (not (some #(contains? sessions %) new-sessions))))))))) (testing "output" (bencode/write-bencode os {"op" "eval" "code" "(dotimes [i 3] (println \"Hello\"))" "session" session "id" (new-id!)})