babashka/test/babashka/impl/socket_repl_test.clj

142 lines
5.2 KiB
Clojure
Raw Normal View History

2019-08-31 18:17:36 +00:00
(ns babashka.impl.socket-repl-test
(:require
2020-11-26 11:06:49 +00:00
[babashka.impl.common :as common]
2021-07-31 12:44:26 +00:00
[babashka.impl.server :refer [clojure-core-server-namespace]]
2019-08-31 18:17:36 +00:00
[babashka.impl.socket-repl :refer [start-repl! stop-repl!]]
2020-11-26 11:06:49 +00:00
[babashka.process :as p]
2019-08-31 18:17:36 +00:00
[babashka.test-utils :as tu]
2020-11-27 08:37:39 +00:00
[babashka.wait :as w]
[clojure.edn :as edn]
2020-04-03 21:51:54 +00:00
[clojure.java.io :as io]
2019-08-31 18:17:36 +00:00
[clojure.string :as str]
2019-12-07 20:30:40 +00:00
[clojure.test :as t :refer [deftest is testing]]
[sci.impl.opts :refer [init]]))
2019-12-07 20:30:40 +00:00
(set! *warn-on-reflection* true)
2019-08-31 18:17:36 +00:00
2019-12-07 20:30:40 +00:00
(defn socket-command [expr expected]
(with-open [socket (java.net.Socket. "127.0.0.1" 1666)
reader (io/reader socket)
sw (java.io.StringWriter.)
writer (io/writer socket)]
2020-11-26 11:06:49 +00:00
(binding [*out* writer]
(println (str expr "\n")))
2019-12-07 20:30:40 +00:00
(loop []
2020-11-26 11:06:49 +00:00
(when-let [l (try (.readLine ^java.io.BufferedReader reader)
(catch java.net.SocketException _ nil))]
;; (prn :l l)
2019-12-07 20:30:40 +00:00
(binding [*out* sw]
(println l))
2020-11-26 11:06:49 +00:00
(let [s (str sw)]
;; (prn :s s :expected expected (str/includes? s expected))
(if (if (fn? expected)
(expected s)
(str/includes? s expected))
(is true)
(recur)))))
(binding [*out* writer]
(println ":repl/quit\n"))
:success))
(def server-process (volatile! nil))
2020-11-27 08:48:31 +00:00
(def exec? (System/getenv "BABASHKA_SOCKET_REPL_TEST"))
2019-08-31 18:17:36 +00:00
(deftest socket-repl-test
2020-11-27 08:48:31 +00:00
(when exec?
(try
(if tu/jvm?
2021-07-31 12:44:26 +00:00
(let [ctx (init {:namespaces {'clojure.core.server clojure-core-server-namespace}
2020-11-27 08:48:31 +00:00
:features #{:bb}})]
(vreset! common/ctx ctx)
(start-repl! "0.0.0.0:1666" ctx))
(do (vreset! server-process
2021-03-28 15:30:44 +00:00
(p/process ["./bb" "socket-repl" "localhost:1666"]))
2020-11-27 08:48:31 +00:00
(w/wait-for-port "localhost" 1666)))
(Thread/sleep 50)
(is (socket-command "(+ 1 2 3)" "user=> 6"))
(testing "&env"
(socket-command "(defmacro bindings [] (mapv #(list 'quote %) (keys &env)))" "bindings")
(socket-command "(defn bar [x y z] (bindings))" "bar")
(is (socket-command "(bar 1 2 3)" "[x y z]")))
(testing "reader conditionals"
(is (socket-command "#?(:bb 1337 :clj 8888)" "1337")))
(testing "*1, *2, *3, *e"
(is (socket-command "1\n*1" "1")))
(testing "*ns*"
(is (socket-command "(ns foo.bar) (ns-name *ns*)" "foo.bar")))
(finally
(if tu/jvm?
(do (stop-repl!)
(vreset! common/ctx nil)
(Thread/sleep 100))
(p/destroy-tree @server-process))))))
2020-11-26 11:06:49 +00:00
(deftest socket-repl-opts-test
2020-11-27 08:48:31 +00:00
(when exec?
(try
2020-11-26 11:06:49 +00:00
(if tu/jvm?
2020-11-27 08:48:31 +00:00
(let [ctx (init {:bindings {'*command-line-args*
["a" "b" "c"]}
:env (atom {})
2021-07-31 12:44:26 +00:00
:namespaces {'clojure.core.server clojure-core-server-namespace}
2020-11-27 08:48:31 +00:00
:features #{:bb}})]
(vreset! common/ctx ctx)
(start-repl! "{:address \"localhost\" :accept clojure.core.server/repl :port 1666}"
ctx))
(do (vreset! server-process
(p/process ["./bb" "--socket-repl" "{:address \"localhost\" :accept clojure.core.server/repl :port 1666}"]))
(w/wait-for-port "localhost" 1666)))
(Thread/sleep 50)
(is (socket-command "(+ 1 2 3)" "user=> 6"))
(finally
(if tu/jvm?
(do (stop-repl!)
(vreset! common/ctx nil)
(Thread/sleep 100))
(p/destroy-tree @server-process))))))
2020-11-26 11:06:49 +00:00
(deftest socket-prepl-test
2020-11-27 08:48:31 +00:00
(when exec?
(try
2020-11-26 11:06:49 +00:00
(if tu/jvm?
2020-11-27 08:48:31 +00:00
(let [ctx (init {:bindings {'*command-line-args*
["a" "b" "c"]}
:env (atom {})
2021-07-31 12:44:26 +00:00
:namespaces {'clojure.core.server clojure-core-server-namespace}
2020-11-27 08:48:31 +00:00
:features #{:bb}})]
(vreset! common/ctx ctx)
(start-repl! "{:address \"localhost\" :accept clojure.core.server/io-prepl :port 1666}"
ctx))
(do (vreset! server-process
(p/process ["./bb" "--socket-repl" "{:address \"localhost\" :accept clojure.core.server/io-prepl :port 1666}"]))
(w/wait-for-port "localhost" 1666)))
(Thread/sleep 50)
(is (socket-command "(+ 1 2 3)" (fn [s]
(let [m (edn/read-string s)]
(and (= "6" (:val m))
(= "user" (:ns m))
(= "(+ 1 2 3)" (:form m)))))))
(finally
(if tu/jvm?
(do (stop-repl!)
(vreset! common/ctx nil)
(Thread/sleep 100))
(p/destroy-tree @server-process))))))
2019-08-31 18:17:36 +00:00
;;;; Scratch
(comment
(socket-repl-test)
2019-12-07 22:10:34 +00:00
(dotimes [_ 1000]
(t/run-tests))
2019-12-07 20:30:40 +00:00
(stop-repl!)
2019-12-20 22:51:24 +00:00
(start-repl! "0.0.0.0:1666" {:bindings {(with-meta '*input*
2019-12-07 20:30:40 +00:00
{:sci/deref! true})
(delay [1 2 3])
'*command-line-args*
["a" "b" "c"]}
:env (atom {})})
(socket-command "(+ 1 2 3)" "6")
2019-08-31 18:17:36 +00:00
)